ZooBC 위키
참여 증명 (PoP)

추첨: 다음 블록은 누가 만드는가

참여 증명에서는 아무도 블록을 만들려고 경쟁하지 않습니다. 새 높이마다 노드 레지스트리를 대상으로 한 무작위 추첨이 생산자를 순서대로 지명합니다. 첫 번째 추첨은 1라운드의 생산자를, 두 번째 추첨은 2라운드의 생산자를 지명하는 식입니다. 모든 노드가 같은 데이터로 같은 추첨을 실행해 같은 목록을 얻으므로, 모든 노드는 다음 블록을 누가 만들 수 있는지 알고 그 밖의 노드가 만든 블록은 거부합니다.

누구나 재현할 수 있는 추첨

공정한 추첨에는 아무도 조종할 수 없으면서 누구나 재현할 수 있는 무작위성이 필요합니다. ZooBC는 이를 이전 블록에서 가져옵니다. 모든 블록은 64바이트 시드를 담고 있으며, 이 값은 블록의 생산자가 고를 수 없습니다(블록 시드 (VRF) 참조). 시드는 의사 난수 생성기를 시작시키고, 생성기가 내놓는 각 숫자는 추첨 대상이 될 수 있는 노드 목록에서 항목 하나를 고릅니다.

블록의 시드는 그 블록이 생겨야 비로소 존재하므로, 아무도 그다음 블록의 순서를 미리 알 수 없습니다. 순서는 보통 한 블록 앞까지만 알려집니다. (좌석을 많이 가진 공격자는 가끔 더 멀리 내다볼 수 있습니다. 블록 시드 (VRF) 참조.) 그리고 모든 노드가 같은 이전 블록과 같은 레지스트리를 가지고 있으므로, 모든 노드가 같은 목록을 계산합니다. 풀어야 할 퍼즐도, 공개된 순번표도, 조정자도 없습니다.

이전 블록의 시드를 zbc-blocksmith 태그와 함께 해시하여 각 라운드의 생산자를 지명하는 생성기를 구동하며, 모든 노드가 같은 목록을 계산합니다.
이전 블록의 시드를 zbc-blocksmith 태그와 함께 해시하여 각 라운드의 생산자를 지명하는 생성기를 구동하며, 모든 노드가 같은 목록을 계산합니다.

추첨 대상 목록

추첨은 선택 가능한 집합에서 고릅니다.

  • 이전 블록 시점의 활성 레지스트리, 즉 입회한(등록된) 노드들입니다. 대기열의 노드는 포함되지 않습니다.
  • 노드 id 순으로, 가장 낮은 것부터 가장 높은 것까지 정렬됩니다(노드의 id는 노드 키의 처음 8바이트에서 가져옵니다).
  • 정지가 적용 중인 노드는 모두 뺍니다(놓친 차례, 정지, 퇴출 참조). 이들을 빼면 아무도 남지 않는 경우에는 활성 집합 전체를 대신 사용합니다.

모든 활성 노드가 정지된 경우에는 참석을 꾸준히 유지해 온 가장 좋은 대기열 노드가 재개 후보로 추가되어(대기열 참조) 체인이 언제든 다시 시작될 수 있게 합니다. 이 노드가 블록을 만들면 그 즉시 입회합니다.

블록은 엄격하게 이전 블록 시점의 레지스트리를 기준으로 판정되며, 다른 높이로 대체하는 일은 없습니다. 자기 라운드에 추첨되지 않은 노드가 만든 블록은 모든 노드가 거부합니다.

생성기

모든 구현이 비트 단위까지 그대로 따라야 하는 정확한 방법은 다음과 같습니다.

h = SHA3-256("zbc-blocksmith" ‖ seed of the previous block)
v = bytes 24 to 31 of h, read as a big-endian 64-bit number
Splitmix64(v) seeds a xoroshiro128+ generator
each draw: r = the next non-negative 63-bit number
the draw names entry (r mod n) of the selectable set, n = its size

1번째 추첨은 1라운드 생산자를, 2번째 추첨은 2라운드 생산자를 지명하는 식으로 이어집니다(라운드, 타이밍, 시간 창 참조). 추첨들은 서로 독립적이므로 한 목록에서 같은 노드가 두 번 이상 지명될 수 있습니다.

태그 zbc-blocksmith는 이 추첨을 블록 시드에서 얻는 다른 무작위 선택들과 분리합니다. 다른 선택들은 각자 고유한 태그를 사용합니다. 코인베이스 추첨에는 zbc-coinbase, 영수증에는 zbc-receipt와 zbc-receipt-datum, 피어 토폴로지에는 zbc-topology-v2, 앱에는 zbc-apps를 씁니다.

모든 좌석은 같은 기회를 갖습니다

각 추첨은 선택 가능한 집합의 모든 항목을 같은 확률로 고릅니다. 그 밖의 것은 아무것도 반영되지 않습니다. 노드의 하드웨어도, 소유자의 잔액도, 스테이크도, 참여 점수도 반영되지 않습니다. 활성 좌석 30개 중 3개를 가진 운영자는 대략 열 블록에 하나를 만듭니다.

이것이 참여 증명의 첫 번째 설계 목표인 균일한 블록 생산 권한입니다. 더 큰 권한을 얻는 유일한 길은 더 많은 좌석이며, 좌석은 오직 대기열을 통해, 한 번에 한 입회씩, 프로토콜이 정한 속도로만 주어집니다(입회 속도 참조). 점수를 추첨에서 배제한 것은 의도적인 설계입니다. 점수가 높은 노드는 더 많이 벌지만, 블록을 더 많이 만들지도, 시드를 더 많이 고르지도, 트랜잭션을 빼놓을 기회를 더 많이 얻지도 않습니다.

두 가지 보완 규칙

  • 이전 생산자. 이전 블록을 만든 노드는 선택 가능한 집합에 남지만, 그 추첨 결과는 10라운드보다 이르게 계산되지 않습니다. 따라서 이 노드는 다음 블록을 늦은 대체 생산자로서만 만듭니다. 우선 라운드, 빈 블록, 이전 생산자를 참조하십시오.
  • 늦은 라운드. 11라운드부터의 생산자는 트랜잭션이 없는 블록만 만들 수 있습니다. 이 역시 우선 라운드, 빈 블록, 이전 생산자를 참조하십시오.

같이 보기