Proof of Authority(PoA)について
PoAについて
信頼された署名者のみがブロックを生成できる、コンセンサスアルゴリズムである。各種のアルゴリズム詳細は以下に示す。
Clique
EIP-225参照
生まれた背景
Ethereumのtestnetは2017年当時、PoWによるコンセンサスアルゴリズムを搭載したRopstenが運用されていた。しかし、PoWネットワークの計算能力に依存するセキュリティの問題で、2017年2月にネットワークが麻痺した。
ブロックを巻き戻したり、Gas Limitの制限などを導入したが、完全な解決策にはなり得ないので、長期的な解決策が必要であった。
当時から、PoSの研究はされていたが実用段階ではなかったので、代替手段が必要だった。
Cliqueの目標
既存のEthereumクラインアントに簡単に実装でき、かつカスタムロジックを追加することなく既存の同期技術を使用できるようにすること。
そのため、ブロックヘッダーの構造を変更し、PoWの概念を削除して投票メカニズムに対応する新しいフィールドを導入することはできない。
信頼された署名者の署名と、投票について
Cliqueでは、ブロックヘッダーのextraDataを拡張し、そこにsecp256k1署名を保存する。それにより、検証者は信頼された署名者による署名かどうかを検証することができる。
また、信頼された署名者リストは変化する。以下ではどうやってそれを決定し、保持するか説明する。
PoAにより、ブロックヘッダーのminerとnonceが不要になったので、それらを活用する。通常のブロックでは、それらのフィールドは0で埋められる。
もし署名者が、信頼された署名者リストを変更したい場合、minerにその署名者のアドレスを入れる。そして、nonceに追加であれば0
を、除名であれば0xff...f
を入れる。
ブロック処理中に投票は集計され、動的に変更する信頼された署名者リストを維持することができる。
また、エポック(デフォルトでは30000ブロックごと)の移行時に、投票がリセットされる。エポック以降のブロックでは信頼された署名者リストが保持される。それにより、クライアントはその時点までの投票を集計する必要がなくなる。
具体的なextraDataの中身としては以下で定義される。
- 先頭の32バイトは署名者の任意の値を入れることができる。
- 最後の65バイトは署名が入る。
- エポック以降のブロックでは、上記の間に信頼された署名者リストが入る。(信頼された署名者がN人の場合、N*20バイト)
投票が多数決のコンセンサスに達した場合、即座に署名者リストに反映されます。反映されると、その投票に関する投票は一度リセットされます。
信頼された署名者が署名できる順序について
原則、信頼された署名者が署名する順序は、そのリスト順に権利が回ってくる。ただし、その署名者が何らかの理由で署名ができない場合、その権利を他の誰かが行使する必要がある。そのアルゴリズムは以下の通りである。
- 順番通りの署名者は、親ブロック+BLOCK_PERIOD(デフォルトは15秒)後に署名してブロックをブロードキャストする。
- 順番通りでない署名者は、署名をrand(署名者リストの数 * 500ms)だけ遅れて署名し、ブロックをブロードキャストする。
これにより、順番通りの署名者は有利に署名を行うことができる。また、この方式により、フォークの可能性を減らすことができる。
カスケード効果について
例えば、署名者リストからある署名者が除外されることで、多数決に必要な署名が1つ減ることがある。それにより、多数決に届いていない投票が多数決に達し、さらにその結果で連鎖的に投票が実行されることが考えられる。これを許容すると、評価の順番により最終的な署名者リストが変わる可能性がある。
この問題を避けるために、Cliqueではカスケード効果を明示的に禁止する。具体的な処理としては、現在のminerで定義されたもののみ、署名者リストから追加、もしくは除外することができる。それにより、他の投票が多数決に達した場合、多数決に達したminerに対して投票されたときのみ、実行される。
PoSA (Binance Smart Chain)
BSCのPoSAは、Delegated Proof of Stake (DPoS)とCliqueに似たPoAを組み合わせたコンセンサスアルゴリズムである。
BSCのDPoSでは、ステーキングしたユーザーが投票し、その投票数に応じて、次回のバリデータセットとなる。投票数はステーキングの量に比例する。
バリーデータの選出について
バリデータには以下の3つの役割がある
- Cabinet
- 最も投票された、上位21のバリデータ
- Candidate
- ブロック生成の機会が少しだけある、22位から45位のバリデータ
- Inactive
- ブロック生成の機会が全くないバリデータ
バリデータの役割は、ステーキング情報に基づいて24時間ごとに決定される。UTC 00:00に更新される。
ブロックの生成は、21のバリデータが順番にブロックを生成する。
報酬の分配について
BSCはインフレトークンではないので、ブロック生成の報酬はトランザクション手数料の合計となる。
例えば、ブロック報酬が100BNBで、バリデータが自分でステーキングしている割合が20%、コミッション率を20%としていた場合、
- バリデータの報酬は、100BNB * 0.2 + 80 * 0.2 = 36BNB
- デリゲータの報酬は、100BNB * 80 - 80 * 0.2 = 64BNB
ゲリゲータはステーキングした割合に応じて、報酬が分配される。
Discussion