メインコンテンツまでスキップ

イーサリアム 2.0:PoS の新しいブロック生成流れを整理してみた

· 約7分

The merge が実施できてから、 Ethereum のブロック生成アルゴリズムが PoW から PoS に切り替えました。バリデーター・委員会・ブロック提案者など新しい言葉もあり、PoS の場合新しいブロックはどう生成されるかを整理してみました

情報元は下記 Vitalik's Annotated Ethereum 2.0 Spec です。リンク先は Phase 0 になっており、今現在は既にその後の Mergeフェーズになっていますが、概ねの流れが変わってない(と思う)ので、ご参考になれば幸いです。

Vitalik's Annotated Ethereum 2.0 Spec

前提知識

Ethereum 2.0 は2つのチェーン

Ethereum 2.0 は、協業しながら実行する2つのチェーンによって構成されています。

  • ビーコンチェーン は、コンセンサスレイヤーとしてコンセンサスロジックとブロックゴシッププロトコル を導入しています
    • ビーコンチェーンにはエポック(epoch)とスロット(slot)という概念があります。
      • Ethereum 1.0 のブロック生成は競争ゲームであるため、ブロック生成の時間は固定できなかったが、PoS の場合、競争でなくなったため、固定できるようになりました。この固定のブロック生成単位は、スロット(slot)とよばれ、12 秒になっています
      • 32 個のスロットを1つの区切りとして、エポック(epoch)と呼ばれています。エポック単位で、バリデーター周りの処理を実行しています
  • シャードチェーン は、今までの Ethereum 1.0 のチェーンからコンセンサス処理を除いて、トランザクションを実行(スマートコントラクトの実行)しています
    • 現時点のシャードチェーンは Ethereum 1.0 のチェーンしかないですが、シャーディングの実装ができたら、他のシャードチェーンがどんどん増えて行きます

バリデーターとは

Ethereum 2.0 PoS のコンセンサスへの参加者は、バリデーター (validator) と呼ばれています

  • バリデーターになるには、32 ETH を保証金として預かっておく(入金)必要があります
  • それからしばらくしてアクティブなバリデーターになり、新しいブロックを提案したり、投票したり、コンセンサスの処理を実行する必要があります

ブロック生成の流れ

大まかの流れは下記になります

  • アクティブなバリデーターからランダムでスロットごとの委員会を編成する
  • 委員会が自分が担当するスロットになったら、ランダムでブロック提案者を選出する
    • ブロック提案者は、新しいブロックを提案してネットワークに公開する
    • 委員会の他のバリデーターは、新しいブロックが正しいかどうかを検証し投票する
    • 正しい投票が 2/3 を超えたら、そのブロックが確定される(厳密的には2回の投票が必要だが、別記事にする)

ランダム値について

ブロックチェーン上のランダム処理は、ランダム性がありつつ、同じ入力値に対して何回実行してもどこで実行しても同じランダム値を返すような特性を期待しています。

Ethereum 2.0 のランダム値を取得する処理は、RANDAOという部品(?)に任せています。この辺の詳細もそれなりにボリュームあるので、また別記事にします。

詳細流れ

エポック 104 のスロットのブロック生成する流れを例として説明します。

  • エポック 100 (ターゲットエポックの4 個前のエポック)の最後のスロットで
    • 4 エポック先(エポック 104)用のバリデーターセットを計算する
      • バリデーターのライフサイクルは、加入・退出周りのルールがあるため、4 エポック先のバリデーターは、この時点で確定できるため、計算できます。
  • エポック 103 (ターゲットエポックの 1 個前のエポック)の最初のスロットで
    • このタイミングで、次のエポックで使うランダム処理の seed が確定されたので、ランダム処理の必要なデータが備えた
    • バリデーターセットから、次のエポック 104 の 32 個のスロットごとの、委員会とブロック提案者をランダムで編成する
      • 委員会を構成するバリデーターの数は、最小 128 で、最大 2048 と定義されています
      • つまり、バリデーターセットから、最大 65536 個(= 32 スロット * 2048 スロットごとの最大メンバー数) のバリデーターを選出して、32 グループに分けます
      • 現時点(2022年12月)では、アクティブなバリデーターが 48 万前後 になっています
      • エポックごとにブロック生成に参加できるのは、最大 65536 個しかないようですが、選出ロジックと、4 個前のエポック 100 のタイミングで既に抽出したのかどうかについては、まだ把握できていません
  • エポック 104 のスロットで
    • ブロック提案者は、新しいブロックを提案しネットワークに公開する
    • 委員会のメンバーは、公開された新しいブロックを検証し、それを次のブロックにすることに賛成かどうかを投票しその投票もネットワークに公開する
    • 投票が委員会の 2/3 を超えたら、新しいブロックが確定されるとみなす
      • ブロック提案者が新しいブロック提案しなかったり、投票が 2/3 に至ってなかったりする場合もあるので、その場合、そのスロットが空になります
    • 次のスロットになると、そのスロットの委員会とブロック提案者は同じ処理を行う

まとめ

図で整理してみたかったんですが、結局リンク先の資料画像と似ているので、そのまま使いました。 PoW の処理と比べて、PoS の処理はだいぶ複雑になった印象がありますね。