はじめに
QuorumではClique PoA, IBFT, Raftの三種類のコンセンサスアルゴリズムが用意されています。
目的に沿った一番良いアルゴリズムを選びたいところですが、公式ドキュメントでは詳細の仕組みや選び方などが説明されていません。
この記事では、Quorumで選択できるコンセンサスアルゴリズムに関してそれぞれの仕組みや性能差・特徴をまとめて解説しました。
難しいトピックとなるので、結論だけ把握したい方はそれぞれのアルゴリズムのサマリとなるポイントと最後の比較表だけ見てください。
<参考記事>
https://kaleido.io/consensus-algorithms-poa-ibft-or-raft/
https://docs.goquorum.com/en/latest/Consensus/Consensus/
Clique PoA(Proof Of Authority)とは
Clique PoA(クリーク・プルーフ・オブ・オーソリティー)では、Authorityと呼ばれるノードを信頼しコンセンサスを達成します。PoAは単純化されたメッセージングアルゴリズムを利用するため、一般的なPBFTよりもパフォーマンスが高くなります。一般的なPBFTでは3ラウンドのメッセージ交換によりコンセンサスを取るのですが、PoAでは1ラウンドのメッセージのやりとりしかしません。
PoAのネットワークではN/2 - 1
のノードまでビザンチン耐性を持ちます。つまり、過半数であるN/2 + 1
のノードが正しく動作していればネットワークは正しく動作します。
PoAのアルゴリズムはイーサリアムのGHOSTプロトコルを利用しています。GHOSTプロトコルはフォークの発生可能性を許す代わりにブロック生成スピードが早く、PBFTと比べてトランザクションが確定するのが早くなります。
つまり、トランザクションの書き込みデータはすぐにブロックに取り込まれて読みとることができるのです。その代わり、PoAの一貫性のレベルは結果整合性となり、フォークが発生してから収束するまでの間に読み取られるデータは正しいデータでない可能性があります。
PoAでは設定した一定間隔(5s-10s程度)でブロックを生成します。このブロックは含むべきトランザクションがない時でも生成されていくため、データは常に蓄積していきます。
また重要な事として、それぞれのブロックはブロックを提案した単一ノードによってしか署名されません。一方で、PBFTでは過半数の検証ノードによって署名されます。そのため、PoAのデータの改竄耐性はPBFTよりも弱いものとなります。しかし、各ノードはN/2 + 1
ブロックに一度のブロックに対する署名しか許されていないため、依然として十分な改竄耐性を備えています。ブロックチェーンデータの履歴を書き換えるためには、Auhtorityノードの全てに不正な侵入を仕掛ける必要があります。
Clique PoAのポイント
- PBFT(IBFT)に比較して弱いものの十分な改竄体制(BFT)があり、互いに信用できないノード間でネットワーク構築に適している。
- PBFTと比較して高いパフォーマンスが出る。
- フォークが発生しうるため一貫性のレベルは結果整合性となり、金融などの整合性が重視されるケースには向いていない。
IBFT(Istanbul Byzantine Fault Tolerance)とは
2017年にJPMCとAMISが共同でQuorumに初のIBFT(イスタンブール・ビザンチン・フォルト・トラランス)を実装しました。その後IBFTビザンチン耐性の要求される許可制エンタープライズブロックチェーンにおいて非常に一般的なアルゴリズムとなっています。
IBFTはPBFTPractical Byzantine Fault Toleranceに修正を加えて実装したものです。RaftなどのCFT(Crash Fault Tolerance)のアルゴリズムとIBFTが違う点は、Raftではフォロワーノードがリーダーノードを無条件に信頼する一方で、IBFTでは各ブロックでバリデーターによる複数ラウンドの投票によってコンセンサスが達成されます。それぞれの投票結果は各ノードの署名としてブロックに記録されます。バリデーターノードはリーダーやブロックの提案ノードを信頼しません。代わりに、Proof-of-Workなどの信頼できない環境を前提としたアルゴリズムのように、各提案されたブロックを検証することでしてコンセンサスを達成しています。
BFT(ビザンチン耐性)とは、いくつかのノードが悪意を持ったノードでもネットワークが正しく機能し続けることを意味するのですが、PBFTでは`3f + 1`のノードのうち`f`のノードまで悪意であってもネットワークが正しく稼働します。大雑把には約1/3のノードまでが悪意であったり停止したりしてもネットワークが機能すると考えられます。
IBFTは、競合関係にある他社や、セキュリティー環境が不十分で不正アクセスの危険があるノードを含むような信頼のできないネットワークに置いて活用が考えられます。
IBFTではPoAと同様に設定した一定間隔でブロックを生成され、このブロックは含むべきトランザクションがない時でも生成されます。
IBFTで生成されたブロックはブロックの提案ノードとバリデーターノードの複数のノードによって署名されているため、このブロックを改竄するためにはそれらのすべての秘密鍵を知る必要があるため非常に高い改竄耐性を持っています。
IBFTのポイント
- PoAよりも信頼できない関係者を含むネットワークや、より強固なビザンチン耐性が必要な状況に適している。
- PoAとは違いフォークが発生せず、データの一貫性がある。
- PoAと同様にブロックはトランザクションがなくても設定した一定間隔で生成される。
Raftとは
QuorumのRaftコンセンサスアルゴリズムはetcdを利用して動いており、CFT(Crash Fault Tolerant)を実現しています。Raftスタンフォード大学の研究者によって開発されたアルゴリズムで、Kubernetes, Docker Swarm, CloudFoundry,Diego containerなど非常によく使われるサービスで活用されていて、十分に検証された信頼性の高いアルゴリズムです。
RaftのアルゴリズムはCFTのコンセンサスであり、BFT(ビザンチン耐性)と違いリーダーノードは常に正しく動作する想定がなされています。全てのフォロワーノードはリーダーノードにより伝播されたデータを信頼して複製します。リーダーノードが停止すると残りのフォロワーの中から自動的に新たなリーダーノードが選出され、ネットワークは稼働し続けます。停止したノードが復旧すると、フォロワーノードとしてネットワークに参加して複製し損ねたデータを受け取りデータを回復します。
Raftではトランザクションがない限りブロックを生成しません。そのため特にトランザクションの頻度が少ないネットワークにおいてRaftは大幅にストレージを節約することができます。
他のRaftの利点は、IBFTに比較してより早いブロック生成時間です。リーダーノードはトランザクションを受け取ると50ms以内にブロックを生成します。そして、提案されたブロックがRaftのクラスター内で共有されるのは非常に早く行われます。通常の環境において平均ブロック生成時間は安定して1秒未満となります。
Raftのポイント
- BFTではなくCFTで、信頼できないノードのネットワークには適していない。
- 非常に短い時間(50ms)でブロックが生成され、早くデータが確定するため、データの確定が早い必要のあるアプリケーションに向いている。
- トランザクションが無いとブロックが生成されないため、トランザクションの少ないネットワークでは大幅にストレージを節約できる。
- フォークせずデータの一貫性がある。
まとめ:各アルゴリズムの比較
各アルゴリズムの比較を表にすると以下のようになります。
PoA | IBFT | Raft | |
コンセンサス | BFT | PBFT | CFT |
ブロック生成時間 | ~5秒程度 | ~20秒程度 | 50ms |
ブロック生成タイミング | 一定間隔 | 一定間隔 | トランザクション 発生時のみ |
ファイナリティ | × | ○ | ○ |
フォーク | あり | なし | なし |
PoA、IBFT、Raftと比較して解説してみましたが、それぞれ用途に沿った適切な選択をする参考になれば幸いです。
また、当メディア「BaaS info!!」を運営する株式会社digglueでは、ライター・エンジニア・コンサルタントの採用募集を受け付けています。まずは、ランチでもご一緒しませんか?以下のフォームより、お気軽にご連絡くださいませ。
雑記: RaftをKotlinで実装してみようとしたけど途中でやめちゃいました。時間あるときやりたいな。