요약
- 슬롯은 시간단위라고 보면 된다. 한 슬롯은 0.4~0.5초 대다.
- Validator는 리더로 지정되면 한 슬롯당 한 블록까지 생성할 수 있다. 블록을 생성하지 못하면 빈 슬롯이 된다.
- 한 슬롯 동안 리더는 하나 뿐이다.
- 리더는 한번 지정되면 4번의 슬롯 동안 유지되고 다음 리더로 바뀐다.
- 한 에포크는 슬롯 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가 그 시점의 리더인지 확인한다.
위의 솔라나 비치 사이트의 대시보드에서 한 리더당 네 슬롯씩 처리하고 다음 리더로 바뀌고 있는 것을 볼 수 있다.
솔라나의 대시보드를 보면 실시간 슬롯 height와 현재의 슬롯 시간(약 0.4~5초)을 볼 수 있다.
이처럼 슬롯당 시간은 매우 짧고 슬롯마다 블록이 채워질수도, 채워지지 않을 수도 있다.
그래서 일반적으로 슬롯 height는 블록 height보다 높을 수밖에 없다.
Epoch
리더 스케줄이 유효한 기간. 에포크 당 슬롯 수가 정해져 있다.
위 사이트에는 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를 사용해봤다.
getEpochInfo를 하면 현재 슬롯, 현재 블록높이, 현재 epoch, 현재 에포크 시작에서 상대적인 현재 슬롯, 에포크당 슬롯수를 반환받는다.
위 사이트는 솔라나 익스플로러 사이트다. 메인에 슬롯 height를 검색하면 그 슬롯의 블록 정보를 보여준다.
포스트맨에서 받아온 슬롯 높이(absoluteSlot)를 입력해봤다.
에포크의 첫번째 슬롯을 알고 싶어서 (absoluteSlot) - (slotIndex) 인 102,384,000 을 검색해봤는데, 블록이 조회되지 않았다.
혹시 해서 그 뒤의 것도 검색해봤는데 마찬가지로 조회되지 않다가, 102,384,008부터 조회가 됐다.
8슬롯이면 리더 2명이 지나갈 시간인데, 새 에포크가 시작되면서 리더가 지정되지 않았거나 블록 검증이 잘되지 않았거나 등의 이유로 블록이 채워지지 않았던게 아닐까 싶다.
그렇다고 매 에포크 경계마다 블록이 없는 것은 아니다. 432,000의 경우도 에포크 1의 시작 슬롯에 해당하는데, 검색해보면 블록 정보가 나온다.
이런 식으로 익스플로러에서 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 |