코딩굼벵이
구르는 중
코딩굼벵이
  • 분류 전체보기 (116)
    • [C_C++]이론 공부 (17)
      • 알고리즘 (11)
      • 이론+STL (6)
    • [C_C++]코딩테스트 연습 (45)
      • [프로그래머스] level 1 (26)
      • [프로그래머스] level 2 (5)
      • [백준] 일반 문제 (12)
      • 기타 (2)
    • Solana (28)
      • Documentation (9)
      • Validator - 공부 (10)
      • Validator - 실행 (devnet & te.. (6)
      • 그 외 (3)
    • React (4)
    • Linux (2)
    • Javascript (2)
    • 블록체인 기반 핀테크 및 응용 SW 개발 (8)
      • React (1)
      • Javascript (3)
      • Solidity (3)
      • 프로젝트 (1)
    • 기타 (10)

블로그 메뉴

  • 🌟 깃허브
  • 🌿 Portfolio(2021)
  • 홈
  • 태그
  • 방명록

티스토리

최근 글

태그

  • grafana
  • 밸리데이터
  • Hooks #React
  • Immer #ContextAPI
  • 솔라나
  • 모니터링

인기 글

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
코딩굼벵이

구르는 중

[Solana] 공부 - 솔라나 블록, 슬롯, 에포크
Solana/그 외

[Solana] 공부 - 솔라나 블록, 슬롯, 에포크

2021. 10. 19. 18:31
728x90

요약

  1. 슬롯은 시간단위라고 보면 된다. 한 슬롯은 0.4~0.5초 대다.
  2. Validator는 리더로 지정되면 한 슬롯당 한 블록까지 생성할 수 있다. 블록을 생성하지 못하면 빈 슬롯이 된다.
  3. 한 슬롯 동안 리더는 하나 뿐이다.
  4. 리더는 한번 지정되면 4번의 슬롯 동안 유지되고 다음 리더로 바뀐다.
  5. 한 에포크는 슬롯 432000개다.

Block

투표로 처리되는 원장의 연속적인 항목 집합. 리더 한명은 슬롯당 최대 하나의 블록만 생성 가능.

트랜잭션이 생성 > 전파 > 검증 단계를 거쳐 블록으로 완성된다.

Slot

각 리더가 트랜잭션을 수집하고 블록을 생성하는 기간.

종합적으로 슬롯은 논리적 클록을 생성한다. 슬롯은 PoH 에 따라 거의 동일한 실제 시간으로 구성되며 겹치지 않고 순차적으로 정렬된다.

 

슬롯은 시계초 역할을 하는 솔라나의 시간 단위라고 볼 수 있다. 

PoH 알고리즘과 함께 움직여서인지 완전히 고정되진 않지만 한 슬롯은 약 0.4~0.5초를 소요한다.

 

슬롯은 단 하나의 블록을 생성할 수 있는 슬롯리더(slot leader)가 존재한다. 슬롯의 수와 슬롯리더의 수는 일치한다. 슬롯은 입증된 블록으로 채워져 있고 비어있을 수도 있다.

Block Height

현재 블록 아래의 블록 수. (제네시스 블록의 블록 높이는 0)

=> 총 블록 수 - 1 

Slot Height

현재 슬롯 아래의 슬롯 수.

즉 솔라나의 누적 시간이라고 생각할 수 있다. (한 슬롯은 약 0.4초~0.5초)

leader schedule

slot에 매핑된 validator 공개키의 시퀀스. 클러스터는 리더 스케줄을 보고 어떤 validator가 그 시점의 리더인지 확인한다.

위의 솔라나 비치 사이트의 대시보드에서 한 리더당 네 슬롯씩 처리하고 다음 리더로 바뀌고 있는 것을 볼 수 있다.

 

 

Dashboard | Solana Beach

Explore the Solana blockchain: statistics, validators, token metrics and news about the overall ecosystem

solanabeach.io

 

솔라나의 대시보드를 보면 실시간 슬롯 height와 현재의 슬롯 시간(약 0.4~5초)을 볼 수 있다.

이처럼 슬롯당 시간은 매우 짧고 슬롯마다 블록이 채워질수도, 채워지지 않을 수도 있다.

그래서 일반적으로 슬롯 height는 블록 height보다 높을 수밖에 없다.

 

Epoch

리더 스케줄이 유효한 기간. 에포크 당 슬롯 수가 정해져 있다. 

 

 

JSON RPC API | Solana Docs

Solana nodes accept HTTP requests using the JSON-RPC 2.0 specification.

docs.solana.com

 

위 사이트에는 JSON RPC API가 나와있다.

 

# request
curl http://api.mainnet-beta.solana.com -X POST -H "Content-Type: application/json" -d '
{"jsonrpc":"2.0","id":1, "method":"getEpochSchedule"}
'

# result
{
    "jsonrpc":"2.0",
    "result":
    	{"firstNormalEpoch":0,
    	"firstNormalSlot":0,
    	"leaderScheduleSlotOffset":432000,
    	"slotsPerEpoch":432000,
    	"warmup":false},
    "id":1
}

 

이 중 getEpochSchedule 메소드로 json을 보내보면 설정된 slotsPerEpoch 가 나온다.

나와있는 api는 그냥 터미널에서 보내도 되고 postman에서 옵션을 맞춰서 보내도 된다.

포스트맨이 가독성도 좋고 사이트도 매번 입력하지 않아도 돼서 더 편리하다.

 

에포크당 슬롯 수

현재 에포크당 슬롯수는 432,000으로 설정되어있다.

즉, 현재 슬롯수를 432,000으로 나누면 그 슬롯이 몇 에포크 때 생성되었는지 알 수 있다.


실험 1: 최근 에포크 7개 기준

에포크당 평균 소요기간

또한 한 에포크는 432,000개의 슬롯으로 이뤄지므로,

한 슬롯당 평균 0.5초가 걸린다고 가정하면 한 에포크당 216,000초 = 3,600분 = 60시간 = 2일 12시간이 된다.

그러므로 한 에포크의 범위는 약 2일~3일 정도라고 생각하면 되겠다.

 

단 이는 그저 최소 소요시간과 최대 소요시간으로 계산한 범위일 뿐이며, 슬롯당 평균 소요시간이 매번 바뀌므로 보다 실제 슬롯 평균 소요시간을 얻으려면 지금까지의 슬롯 기록들을 관찰해봐야할 것이다.

 

블록도 매 슬롯마다 무조건 채워지는 것이 아니기 때문에, 에포크당 블록수를 알아보려면 일정 기간 동안의 블록들을 기준으로 평균치를 내봐야할 것 같다.

 

postman에서 getEpochInfo api를 사용해봤다.

 

postman 화면

 

getEpochInfo를 하면 현재 슬롯, 현재 블록높이, 현재 epoch, 현재 에포크 시작에서 상대적인 현재 슬롯, 에포크당 슬롯수를 반환받는다.

 

 

Explorer | Solana

 

explorer.solana.com

 

위 사이트는 솔라나 익스플로러 사이트다. 메인에 슬롯 height를 검색하면 그 슬롯의 블록 정보를 보여준다.

포스트맨에서 받아온 슬롯 높이(absoluteSlot)를 입력해봤다.

 

포스트맨으로 불러온 현재 슬롯의 블록 정보

 

에포크의 첫번째 슬롯을 알고 싶어서 (absoluteSlot) - (slotIndex) 인 102,384,000 을 검색해봤는데, 블록이 조회되지 않았다.

혹시 해서 그 뒤의 것도 검색해봤는데 마찬가지로 조회되지 않다가, 102,384,008부터 조회가 됐다.

 

8슬롯이면 리더 2명이 지나갈 시간인데, 새 에포크가 시작되면서 리더가 지정되지 않았거나 블록 검증이 잘되지 않았거나 등의 이유로 블록이 채워지지 않았던게 아닐까 싶다.

 

그렇다고 매 에포크 경계마다 블록이 없는 것은 아니다. 432,000의 경우도 에포크 1의 시작 슬롯에 해당하는데, 검색해보면 블록 정보가 나온다.

 

236에포크의 마지막 슬롯

 

이런 식으로 익스플로러에서 229~236(8개) 에포크에서의 마지막 슬롯(의 블록) timestamp로 에포크당 평균 소요 시간을 구해보겠다.

시작 슬롯에는 블록이 없는 경우가 있어서 마지막 슬롯 타임스탬프만 이용했다.

 

Epoch 시작 슬롯 시작 슬롯 timestamp 마지막 슬롯 마지막 슬롯 timestamp 소요 시간
229 98,928,000 - 99,359,999 2021.10.2. 14:38:27 -
230 99,360,000 - 99,791,999 2021.10.5. 8:43:37 2일 13시간 5분 10초
231 99,792,000 2021.10.5. 8:43:38 100,223,999 2021.10.8. 1:38:49 2일 16시간 55분 12초
232 100,224,000 2021.10.8. 1:38:49 100,655,999 2021.10.10. 12:19:49 2일 10시간 41분
233 100,656,000 2021.10.10. 12:19:50 101,087,999 2021.10.12. 22:35:24 2일 10시간 15분 35초
234 101,088,000 2021.10.12. 22:35:25 101,519,999 2021.10.15. 06:30:59 2일 7시간 55분 35초
235 101,520,000 2021.10.15. 6:31:00 101,951,999 2021.10.17. 15:12:10 2일 8시간 35분 11초
236 101,952,000 - 102,383,999 2021.10.19. 23:43:33 2일 8시간 31분 23초

 

=> 최근 7개 에포크의 에포크당 평균 소요시간 : 약 2일 11시간 35분 1초

 

최근 에포크 7개에 약 17일 9시간이 걸렸고, 한 에포크당 평균 2일 11시간반 정도가 걸렸음을 확인했다.

이 실험군에서 가장 오래 걸렸던 에포크에서의 평균 슬롯 시간은 0.541초, 가장 짧게 걸렸던 에포크에서의 평균 슬롯 시간은 약 0.466초다.

 

에포크당 평균 블록 수

위에서 에포크의 마지막 슬롯을 구했으므로 이를 매개변수로 getBlock api를 이용해 블록 수를 구할 수 있다.

 

# Postman Body(json raw)
{"jsonrpc":"2.0","id":1, "method":"getBlock", "params":[99359999,
{"encoding": "json","transactionDetails”:”none,”rewards":false}]}

 

Epoch 마지막 슬롯 블록높이 블록 수
229 88,989,690 -
230 89,392,644 402,954
231 89,795,754 403,110
232 90,214,456 418,702
233 90,635,818 421,362
234 91,058,840 423,022
235 91,482,356 423,516
236 91,905,762 423,406

 

=> 최근 7개 에포크의 에포크당 평균 블록 수 : 약 416,582 개

 

이 때 에포크당 슬롯 수는 432,000개이므로,

=> 슬롯당 블록 생성율 : 약 96.4%

 

+) getBlock api로 최근의 아무 슬롯이나 찍어서 블록높이/슬롯 을 해보면 슬롯당 블록 생성율이 89.8%정도가 나오더라.

정상적으로 돌아갈 때는 생성율이 높겠지만, 서버 이슈들이 있어왔고 안정화 과정에서 블록 생성이 끊기기도 하면서 누적 생성율은 낮아진 게 아닐까 싶다.

 

하루 평균 블록 수

에포크당 평균 블록수가 416,582개고 한 에포크는 평균 2일 11시간 35분 1초(=214501초)였으므로,

=> 최근 7개 에포크에 대해 구한 하루 평균 블록 수 : 약 167,797개


실험 2: 최근 7일 기준

하루 평균 블록 수

기준 시간을 정하기 > 해당 시간 슬롯, 전날 해당 시간 슬롯 찾기 > 반복해서 8개 만들기 > Getblock으로 블록 높이 구하기

 

기준 시간을 10월 20일 오후 12:00:00(정오) 로 하겠다.

해당 시간을 timestamp로 가지고 있는 슬롯을 찾아보니 102477822~4이므로, 기준점을 102477822 슬롯으로 정하겠다.

 

여기서 하루 전인 10월 19일 오후 12:00:00을 가지고 있는 슬롯을 찾아봤다.

한 슬롯이 대략 0.5초라고 치면, 하루는 86,400초이므로 172,800 슬롯이다.

이런식으로 대략의 12시 근처 슬롯을 찾아 전날 12시 슬롯을 찾고, 비슷한 방식으로 또 전날 12시를 찾는 식으로 일주일치를 구해보았다.

 

날짜(12:00:00) 슬롯 블록 높이 블록 수
2021.10.20. 102,477,822 91,997,510 -
2021.10.19. 102,293,952 91,817,329 180181
2021.10.18. 102,111,493 91,638,975 178354
2021.10.17. 101,927,490 91,458,313 180662
2021.10.16. 101,742,913 91,276,986 181327
2021.10.15. 101,561,802 91,099,896 177090
2021.10.14. 101,378,392 90,919,824 180072
2021.10.13. 101,192,096 90,738,218 181606

 

=> 최근 7일간 하루 평균 블록 수 : 약 179,899개

 

그러니 대강 에포크당 평균 소요일은 약 2.5일, 하루당 평균 블록 수는 약 18만개로 볼 수 있을 것 같다.

물론 7일치와 7개 에포크로 낸 수치라 신뢰성을 높이려면 예전 것도 해야겠지만...

이거 구하자고 새로 코드 짜긴 귀찮고 노가다로 돌리려면 너무 오래 걸릴 것 같아서 패스^.^


이렇게 최근 7개 에포크와 최근 7일을 기준으로 하루 평균 블록 수를 구해보았다.

각각 다른 범위를 기준으로 평균치를 내긴 했지만, 결과를 보면 하루 평균 블록 수가 약 16.8만개와 18만개로 꽤 큰 차이가 난다.

 

실제로 일수를 기준으로 구한 하루 평균 블록 수와 에포크 수를 기준으로 구한 에포크 평균 소요기간을 섞어서 이용하여 슬롯당 블록 생성율을 구하려고 해보면

 

에포크당 평균 블록 수는 179,899 / (24*60*60) * 214,501 = 446,626.34 로 에포크당 슬롯수로 정해진 값인 432,000 을 넘어서버린다.

그러므로 지금 낸 평균치는 그저 평균치에 지나지 않으며,

실제로 이 평균치를 수익성 등을 계산하는 상황에 적용할 경우 오차 범위가 클 수 있음을 인지해야 할 것 같다.

'Solana > 그 외' 카테고리의 다른 글

[Solana] Solana beach에서 Validators 탭 확인하기  (0) 2021.10.07
[Solana] 솔라나는 왜 급성장했을까?  (0) 2021.10.07
    'Solana/그 외' 카테고리의 다른 글
    • [Solana] Solana beach에서 Validators 탭 확인하기
    • [Solana] 솔라나는 왜 급성장했을까?
    코딩굼벵이
    코딩굼벵이
    구르는 재주 연마 중

    티스토리툴바