블록 시드 (VRF)
모든 ZooBC 블록은 체인의 무작위성 원천인 64바이트 시드를 담고 있습니다. 시드는 다음 블록을 누가 만들 수 있는지, 누가 코인베이스 추첨에 당첨되는지, 생산자가 어떤 영수증을 보여 주는지, 피어들이 서로 어떻게 배정되는지를 결정합니다. 버전 0.5.8부터 시드는 검증 가능한 난수 함수(VRF)의 출력입니다. 주어진 생산자와 주어진 이전 시드에 대해 유효한 값은 정확히 하나뿐이며, 블록 헤더에 담긴 짧은 증명으로 모든 노드가 이를 확인할 수 있습니다.
시드를 고를 수 없어야 하는 이유
생산자가 여러 후보 중에서 자기 블록의 시드를 고를 수 있다면, 다음 생산자 추첨을 자신이나 협력자에게 유리하게 이끌거나, 코인베이스 추첨을 기울이거나, 앱 베팅의 결과를 정할 수 있을 것입니다. 일반 디지털 서명은 시드로 충분하지 않습니다. 같은 메시지에 대해 유효한 서명이 여러 개 존재할 수 있으므로, 생산자가 여러 서명을 시도해 보고 마음에 드는 것을 남길 수 있기 때문입니다.
VRF는 그 문을 닫습니다. VRF는 유효한 결과가 단 하나뿐인 서명처럼 작동합니다. 키를 가진 사람은 출력과 증명을 계산할 수 있고, 공개 키를 가진 사람은 누구나 증명을 검증할 수 있으며, 같은 키와 입력에 대한 유효한 증명은 모두 같은 출력을 냅니다.
시드를 만드는 방법
- alpha라고 부르는 입력은 이전 블록의 64바이트 시드에 대한 SHA3-256 해시(32바이트)입니다.
- 생산자는 자신의 노드 키로 Ed25519 위의 ECVRF를 ZooBC 변형으로 실행합니다(노드의 키 참조).
- 출력이 새 64바이트 시드입니다. 증명은 80바이트로, 32바이트 곡선 점, 16바이트 챌린지, 32바이트 스칼라로 이루어집니다.
- 증명은 블록 서명이 포함하는 블록 헤더에 들어갑니다. 헤더 중 284바이트가 서명되고(다른 필드 204바이트와 80바이트 증명), 348바이트가 해시됩니다.
검증자는 증명을 요구하고, 그 증명을 alpha에 대해 생산자의 키로 검증하며, 시드가 증명의 출력이 아닌 블록은 거부합니다.
새 블록의 어떤 것도 입력이 되지 않습니다. 트랜잭션도, 타임스탬프도 아닙니다. 따라서 생산자는 블록을 재배열해 시드를 조종할 수 없으며, 시드의 사슬은 어느 블록에서든 시드가 모두 0인 제네시스 블록까지 거슬러 올라가며 확인할 수 있습니다. 생산자 자신의 컴퓨터에서 나온 난수는 누구도 검증할 수 없으므로 사용하지 않습니다.
ZooBC 변형
ZooBC의 ECVRF는 ECVRF-EDWARDS25519-SHA512-TAI의 변형입니다. 곡선으로의 해싱은 소수 위수의 후보 점만 받아들이고 이를 코팩터 없이 사용하며, 검증 단계에서는 챌린지나 스칼라가 0인 증명도 거부합니다. 따라서 표준 RFC 9381 라이브러리는 다른 출력을 냅니다. 노드나 검증기를 작성하는 사람은 이 변형을 구현해야 합니다.
키와 입력의 쌍 약 1,500만 개 중 하나꼴로(확률 (15/16)^256, 약 6.7 × 10^-8) 유효한 증명이 존재하지 않습니다. 이 경우 추첨된 생산자는 그 블록을 만들 수 없고, 차례는 다음 라운드의 생산자에게 넘어갑니다.
남은 단 하나의 수단: 기권
추첨된 생산자가 자기 블록이 담게 될 시드가 마음에 들지 않을 때 택할 수 있는 길은 하나뿐입니다. 블록을 내지 않는 것입니다. 그러면 차례는 15초 뒤 다음에 추첨된 노드로 넘어가고, 그 노드는 똑같이 예측할 수 없는 자신의 시드로 블록을 만듭니다. 블록을 내지 않으면 주사위를 한 번 다시 굴리게 될 뿐, 결과를 고를 수는 없습니다.
여기에는 대가도 따릅니다. 건너뛴 생산자는 놓친 차례 하나로 집계되고 다음 자기 블록까지 "누락 상태"가 되어 아무것도 벌지 못하고 참여 점수를 잃습니다(놓친 차례, 정지, 퇴출 참조). 나중에 만들어진 블록은 포크 선택에서도 덜 무겁습니다. 참여 증명의 설계 분석에 따르면, 좌석의 비율 a를 가진 공격자가 n블록 앞의 시드를 예측할 확률은 대략 a의 n제곱입니다. 좌석의 3분의 1을 가졌다면 세 블록 앞을 예측할 확률은 약 27분의 1입니다.
두 가지 규칙이 더 있어 샛길을 막습니다.
- 노드 키 변경은 그것을 포함한 블록 이후 120블록(30분)이 지나야 효력이 생기므로, 생산자가 미리 서명해 둔 키 교체로 협력자의 다음 시드를 조종할 수 없습니다.
- 이전 블록의 생산자는 다음 추첨에서 강등되므로, 다른 노드가 응답할 수 있는 동안에는 어떤 노드도 블록의 내용과 그 결과를 확정하는 시드를 둘 다 쥐지 않습니다(우선 라운드, 빈 블록, 이전 생산자 참조).
시드가 결정하는 것
- 다음 블록의 생산자 추첨(추첨 참조)
- 코인베이스 추첨의 당첨자
- 생산자가 보여 주어야 하는 영수증(영수증과 네트워크 토폴로지 참조)
- 각 40블록 기간의 첫 블록 시드로 정하는 피어 토폴로지
- 앱의 무작위 추첨
시드는 공개되어 있습니다. 누구나 체인에서 시드를 읽어 이 모든 추첨을 그대로 재현할 수 있습니다.