ZooBC 위키
참여 증명 (PoP)

영수증과 네트워크 토폴로지

블록체인은 노드들이 서로 블록과 트랜잭션을 전달하는 것으로 살아 움직입니다. 참여 증명은 바로 그 서비스를 측정합니다. 등록 노드가 다른 등록 노드로부터 데이터를 받으면, 노드 키로 서명한 짧은 진술인 영수증으로 응답합니다. 따라서 일의 증명은 일을 했다고 주장하는 노드가 아니라 데이터를 받은 피어에게서 나옵니다. 어떤 피어가 인정되는지도 노드가 정하지 않습니다. 40블록마다 프로토콜이 블록 시드로 레지스트리를 뒤섞어 각 노드에 우선 피어를 배정합니다.

노드 A가 노드 B에 블록을 중계하고, B는 자신이 서명한 영수증을 돌려보냅니다. A의 다음 블록이 그 영수증을 담으면 A의 참여 점수가 움직이고, 그에 따라 새 ZBC에서 A의 몫이 달라집니다.
노드 A가 노드 B에 블록을 중계하고, B는 자신이 서명한 영수증을 돌려보냅니다. A의 다음 블록이 그 영수증을 담으면 A의 참여 점수가 움직이고, 그에 따라 새 ZBC에서 A의 몫이 달라집니다.

우선 피어: 토폴로지

레지스트리는 40블록(topology_period_blocks), 약 10분의 기간마다 한 번 다시 뒤섞입니다. 기간의 첫 블록에서 각 등록 노드는 정렬 키를 받습니다.

key = SHA3-256(seed of the period's first block (64 bytes)
               ‖ node id (8 bytes, little-endian)
               ‖ period height (8 bytes, little-endian)
               ‖ "zbc-topology-v2")

이 키로 레지스트리를 정렬하면 뒤섞인 목록이 나옵니다. 각 노드는 그 목록에서 연속된 P개 노드의 창을 우선 피어로 배정받습니다. P는 max_assigned_peers로, mainnet에서는 12, devnet에서는 8입니다. 위치 i에 있는 노드의 창은 위치 (i × P) mod L에서 시작하며, L은 목록의 길이입니다. 창은 언제나 P개 노드를 꽉 채우며, P와 L이 공약수를 가질 때는 창의 시작 위치가 분산됩니다. 이 관계는 한 방향입니다. A가 B의 우선 피어라고 해서 B가 A의 우선 피어가 되지는 않습니다.

순서는 어느 노드도 조종할 수 없는 시드에 달려 있고 10분마다 바뀌므로, 공모하는 노드 무리가 서로의 피어가 되도록 짜고 서로만 보증해 줄 수 없습니다. 연결 속도는 아무 역할도 하지 않으며, 아무도 피어 목록을 공개하지 않습니다.

노드 id 순의 레지스트리를 시드, 노드 id, 기간, 태그의 SHA3-256 키로 정렬합니다. 뒤섞인 목록에서 한 노드의 우선 피어 12개 창이 표시되어 있으며, 40블록마다 다시 뒤섞입니다.
노드 id 순의 레지스트리를 시드, 노드 id, 기간, 태그의 SHA3-256 키로 정렬합니다. 뒤섞인 목록에서 한 노드의 우선 피어 12개 창이 표시되어 있으며, 40블록마다 다시 뒤섞입니다.

영수증의 내용

영수증은 232바이트입니다.

필드바이트
송신자의 노드 키 (데이터를 보낸 노드)32
수신자의 노드 키 (서명하는 노드)32
참조 블록: 수신자의 최신 블록, 높이4
참조 블록: 해시32
데이터 유형: 블록은 1, 트랜잭션은 24
데이터 해시: 어떤 블록이나 트랜잭션을 받았는지32
수신자의 최신 영수증 배치 루트32
위 168바이트에 대한 수신자의 Ed25519 서명64

영수증은 등록 노드만 주고받으며, 다른 등록 노드가 보낸 데이터에 대해서만 주고받습니다. 등록되지 않은 노드는 체인을 따라가며 검증할 수는 있지만 영수증을 주지도 얻지도 않습니다. 영수증은 어떤 체인도 명시하지 않으므로, 트랜잭션과 달리(체인 결속 서명 참조) 체인 결속이 없습니다.

영수증은 지갑의 확인 표시나 수수료 환불과는 아무 관계가 없습니다. 그것들은 트랜잭션과 잔액에 대한 일반 기록입니다.

배치와 공개

송신자는 자신이 얻은 영수증을 보관합니다. 높이마다 영수증을 최대 1,000개의 배치로 묶어 서명 순으로 정렬하고 머클 루트 아래에 둡니다. 자기 블록을 만들 때 그 블록에 영수증 표본을 공개하는데, 두 종류가 있습니다. 있는 그대로 보여 주는 비연결 영수증과, 이전 배치 루트에 대한 머클 증명과 함께 보여 주는 연결 영수증입니다. 참조 소프트웨어는 약 40블록 전의 영수증을 표본으로 고릅니다. 이는 참조 소프트웨어의 동작일 뿐 유효성 규칙은 아닙니다.

검증자가 검사하는 것

블록에 공개된 모든 영수증에 대해 모든 노드는 다음을 검사합니다. 여기서 n은 등록 노드의 수입니다.

  • 수신자의 서명
  • 참조 블록 해시가 그 높이에서 이 체인의 블록인지
  • 나이: 영수증은 max(max(100, 2 × n) + 1, receipt_lifecycle)블록이 지나면 만료되며, mainnet에서는 518,400블록(약 90일)입니다.
  • 높이 40부터, 비연결 영수증의 서명자가 그 영수증이 나온 기간에 블록 생산자의 우선 피어였는지
  • 높이 80부터, 모든 연결 영수증의 머클 증명
  • 개수: 최대 2 × min(n − 1, P)개이며, 결코 200개를 넘지 않습니다.

유효성 규칙이 아닌 것들도 있으며, 이를 규칙으로 오해해서는 안 됩니다. 검증자는 영수증의 송신자가 블록의 생산자인지, 영수증이 새것인지, 그 데이터가 약 40블록 전의 것인지, 연결된 루트가 이전에 체인에 나타났는지를 검사하지 않습니다.

영수증에서 점수로

중계로 얻는 것은 점수가 아니라 영수증입니다. 점수는 노드가 자기 블록에 영수증을 공개할 때만 움직입니다. 보여 줄 수 있는 양의 약 절반인 기준점보다 많이 보여 주면 점수가 오르고, 적게 보여 주면 떨어집니다. 높이 40 이전에는 어떤 점수도 움직이지 않습니다. 자세한 내용은 참여 점수를, 점수가 수입으로 바뀌는 방식은 코인베이스 추첨을 참조하십시오.

같이 보기