ZooBC ウィキ
Proof of Participation

ブロックシード(VRF)

ZooBC のすべてのブロックは、チェーンのランダム性の源である 64 バイトのシードを持っています。シードは、次のブロックを作ってよいのは誰か、コインベース抽選に当たるのは誰か、生成者がどのレシートを提示するか、そしてピア同士がどのように割り当てられるかを決めます。バージョン 0.5.8 以降、シードは検証可能ランダム関数(VRF)の出力です。ある生成者とある直前のシードに対して有効な値はちょうど 1 つだけ存在し、ブロックヘッダー内の短い証明によってすべてのノードがそれを確認できます。

シードを選べてはならない理由

生成者が複数の候補から自分のブロックのシードを選べるなら、次の生成者の抽選を自分や仲間に有利な方向へ誘導したり、コインベース抽選を傾けたり、アプリの賭けの結果を決めたりできてしまいます。通常のデジタル署名ではシードとして不十分です。同じメッセージに対して有効な署名が複数存在しうるため、生成者はいくつも試して気に入ったものを残せるからです。

VRF はその扉を閉ざします。VRF は有効な結果が 1 つしかない署名のように働きます。鍵を持つ者は出力と証明を計算でき、公開鍵を持つ者は誰でも証明を検証でき、同じ鍵と入力に対する有効な証明はすべて同じ出力を与えます。

左:署名によるシードには有効な出力が多数あり、生成者がその 1 つを選びます。右:VRF によるシードには値がちょうど 1 つと 80 バイトの証明があり、すべてのバリデーターがそれを確認します。
左:署名によるシードには有効な出力が多数あり、生成者がその 1 つを選びます。右:VRF によるシードには値がちょうど 1 つと 80 バイトの証明があり、すべてのバリデーターがそれを確認します。

シードの作り方

  1. アルファと呼ばれる入力は、直前のブロックの 64 バイトのシードの SHA3-256 ハッシュ(32 バイト)です。
  2. 生成者は、ZooBC 版の Ed25519 上の ECVRF を自分のノード鍵で実行します(ノードの鍵 を参照)。
  3. 出力が新しい 64 バイトのシードです。証明は 80 バイトで、32 バイトの曲線上の点、16 バイトのチャレンジ、32 バイトのスカラーから成ります。
  4. 証明はブロックヘッダーに入り、ブロック署名の対象になります。署名されるヘッダーは 284 バイト(他のフィールドの 204 バイトと 80 バイトの証明)で、ハッシュされるのは 348 バイトです。

バリデーターは証明を必須とし、アルファに対して生成者の鍵で検証し、シードが証明の出力と一致しないブロックを拒否します。

新しいブロックからは何も入力に入りません。トランザクションもタイムスタンプも入りません。したがって生成者はブロックの中身を並べ替えてシードを操作することはできず、シードの連鎖はどのブロックからでも、シードがすべてゼロであるジェネシスブロックまで遡って確認できます。生成者自身のコンピューターが出す乱数は誰にも検証できないため、そうしたものは使われません。

直前のシードがハッシュされてアルファになり、アルファと生成者のノード鍵が ECVRF に入り、64 バイトのシードと 80 バイトの証明が出力され、どちらもヘッダーに含まれます。トランザクションとタイムスタンプは入力ではありません。
直前のシードがハッシュされてアルファになり、アルファと生成者のノード鍵が ECVRF に入り、64 バイトのシードと 80 バイトの証明が出力され、どちらもヘッダーに含まれます。トランザクションとタイムスタンプは入力ではありません。

ZooBC 版

ZooBC の ECVRF は ECVRF-EDWARDS25519-SHA512-TAI の変種です。曲線へのハッシュ化では素数位数の候補点だけを受け入れ、コファクターを掛けずにそのまま使います。また検証では、チャレンジまたはスカラーがゼロの証明も拒否します。そのため標準の RFC 9381 ライブラリでは異なる出力になります。ノードや検証ツールを書く人は、この変種を実装しなければなりません。

鍵と入力の組のおよそ 1,500 万に 1 つ(確率 (15/16)^256、約 6.7 × 10^-8)では、有効な証明が存在しません。その場合、抽選された生成者はそのブロックを作ることができず、順番は次のラウンドの生成者に移ります。

残された唯一の手段:棄権

抽選された生成者が、自分のブロックが持つことになるシードを気に入らない場合、取れる手段は 1 つだけです。ブロックを出さないことです。すると順番は 15 秒後に次に抽選されたノードへ移り、そのノードが自分自身のシードで、同じく予測不能なブロックを作ります。ブロックを出さないことはサイコロを一度振り直すだけで、結果を選ぶことは決してできません。

しかもそれには代償があります。飛ばされた生成者には逃した番が 1 回数えられ、次に自分のブロックを作るまで「欠席」となり、何も稼げず参加スコアを失います(逃した番、一時停止、除名 を参照)。後から出されたブロックは フォーク選択と累積難易度 でも重みが小さくなります。Proof of Participation の設計分析では、席の割合 a を持つ攻撃者が n ブロック先のシードを予測できる確率をおよそ a の n 乗としています。席の 3 分の 1 を持つ場合、3 ブロック先ではおよそ 27 分の 1 です。

さらに 2 つのルールが抜け道を塞ぎます。

  • ノード鍵の変更は、それを含むブロックの 120 ブロック(30 分)後にはじめて有効になります。そのため生成者は、前もって署名しておいた鍵のローテーションで仲間の次のシードを操作することはできません。
  • 直前のブロックの生成者は次の抽選で降格されるため、別のノードが応答できる間は、1 つのノードがブロックの中身とそれを確定させるシードの両方を握ることはありません(優先ラウンド、空のブロック、直前の生成者 を参照)。

シードが決めるもの

シードは公開されています。誰でもチェーンからシードを読み取り、これらの抽選をすべて再現できます。

関連項目