抽選:次のブロックを作るのは誰か
Proof of Participation では、ブロックを作るために競争する者はいません。新しい高さごとに、ノードレジストリを対象としたランダムな抽選が生成者を順番に指名します。最初の抽選がラウンド 1 の生成者を、2 回目の抽選がラウンド 2 の生成者を指名し、以下同様に続きます。すべてのノードが同じデータに対して同じ抽選を行い、同じリストを得るため、どのノードも次のブロックを作ってよいのが誰かを知っており、それ以外の者からのブロックは拒否します。
誰もが再現できる抽選
公平な抽選には、誰も制御できず、誰もが再現できるランダム性が必要です。ZooBC はそれを直前のブロックから得ます。すべてのブロックは 64 バイトのシードを持っており、これはその生成者が選ぶことのできない値です(ブロックシード(VRF) を参照)。シードは擬似乱数生成器を初期化し、生成器が出す各数値が、抽選対象となりうるノードのリストから 1 つのエントリを選びます。
あるブロックのシードはそのブロックが存在して初めて存在するため、次のブロックの順番を前もって知る者はいません。順番は通常、1 ブロック先までしか分かりません(多数の席を持つ攻撃者は、ときにそれより先を見られることがあります。ブロックシード(VRF) を参照)。また、すべてのノードが同じ直前のブロックと同じレジストリを持っているため、すべてのノードが同じリストを計算します。解くべきパズルも、公開された当番表も、調整役もありません。
抽選の対象となるリスト
抽選は抽選集合から選びます。
- 直前のブロック時点のアクティブなレジストリ、つまり加入が認められた(登録済みの)ノードです。キューで待機中のノードは含まれません。
- ノード 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 の生成者を指名し、以下同様です(ラウンド、タイミング、時間枠 を参照)。各抽選は独立しているため、同じノードが 1 つのリストの中で複数回指名されることもあります。
タグ zbc-blocksmith は、この抽選をブロックシードから取られる他のランダムな選択と区別します。他の選択はそれぞれ独自のタグを使います。コインベース抽選 には zbc-coinbase、レシートとネットワークトポロジー には zbc-receipt と zbc-receipt-datum、ピアのトポロジーには zbc-topology-v2、ZooBC のアプリ には zbc-apps です。
すべての席が同じ確率を持つ
各抽選は、抽選集合のすべてのエントリを同じ確率で選びます。それ以外の要素は一切入りません。ノードのハードウェアも、オーナーの残高も、ステークも、参加スコアも関係ありません。30 のアクティブな席のうち 3 つを持つ運用者は、およそ 10 ブロックに 1 つを生成します。
これが Proof of Participation の第一の設計目標、すなわちブロック生成力の均一化です。より大きな力を得る唯一の方法は席を増やすことであり、席はキューを通じて、プロトコルが定めるペースで、一度に 1 つずつしか加入が認められません(加入ペース を参照)。スコアを抽選から切り離しているのは意図的です。スコアの高いノードはより多く稼ぎますが、より多くのブロックを作ることも、より多くのシードを選ぶことも、トランザクションを除外する機会を増やすこともありません。
2 つの補足ルール
- 直前の生成者。 直前のブロックを作ったノードは抽選集合に残りますが、その抽選はラウンド 10 より早いものとしては数えられないため、次のブロックを作るのは遅い段階のフォールバックとしてだけです。優先ラウンド、空のブロック、直前の生成者 を参照してください。
- 遅いラウンド。 ラウンド 11 以降の生成者は、トランザクションを含まないブロックしか作れません。こちらも 優先ラウンド、空のブロック、直前の生成者 を参照してください。