イスタンブールBFTコンセンサスアルゴリズム詳細なドキュメント
イスタンブールBFTクラスBFTアルゴリズムとしては、エーテル広場で行われてきました。イスタンブールがまだそこにいくつかの潜在的な問題ですが、アルゴリズムのアイデアと実装はまだ価値がある学習とリファレンスです。
用語
- バリ:ブロック検証。
- 提案者:ブロックの意志。
- ラウンド:コンセンサスのいくつかのラウンド。ラウンド数を(ラウンド数が原因でエラーまたはブロック更新変更してもよい)をブロックまたは変更する提出を終了ブロックによってラウンドブロックから開始する提案を行いました。
- 提案:提案されたプロセスで新しいブロック。
- シーケンス:提案の高さ。そして、シーケンスが高いブロックに対応します。
- Blocklog:将来的にはバックログに記録された情報の内部。
core.backlogs
- ラウンド状態:
Round
とSequence
、一緒に結合しview
、 - コンセンサス証明:ブロック署名提出。それぞれを
validator
検証した後、それをブロックします署名されています。 - スナップショット:国家の投票バリ。
コンセンサスアルゴリズムの説明
PBFTアルゴリズムから変更イスタンブールBFTは、次の3つのフェーズで構成されていますPRE-PREPARE
、PREPARE
とCOMMIT
。でN
ネットワークノード、アルゴリズムは、最大許容することができるF
、請求項つのエラー・ノードN=3F+1
。各ラウンドの開始前に、validator
としてそれらのいずれかを選択しますproposer
(スティッキーな方法に加えて、検索デフォルトのラウンドロビン方式のstickyProposer
方法は、詳細を確認します)。その後、提案者は前方に置く提案をブロックし、ブロードキャストするPRE-PREPARE
情報を。バリデータの受信時にPRE-PREPARE
フラグを記載する旨されPRE-PREPARED
、次いでブロードキャストPREPARE
情報。このステップは、バリデータのすべてに同じseqnenceコンセンサス及びラウンド(ビューのコード)で検証することを保証することです。受信するとメッセージ、バリデータは入力と放送のステータス情報。このステップは、ピア・ノードは、提案されたブロックを受信した通知することであり、ブロックが鎖に挿入されます。最後に、Validatorは待つこと数ヶ月に行き、その後、ブロックは、チェーンに挿入された状態。イスタンブールBFTアルゴリズムブロックが決定され、法的分岐は、鎖は、必ずしも鎖にブロックしないことを意味します。悪意のあるノードが別の鎖を生成しないようにするために、ブロックは鎖内に挿入される前に、バリの各々は、必要とするヘッダの領域に署名をフィールド。したがって、ブロックは、(なぜなら、署名の)自己検証することができ、光のクライアントもサポートされています。ただし、動的2F+ 1
PREPARE
PREPARED
COMMIT
2F + 1
COMMIT
COMMITTED
2F + 1
COMMIT
extraData
extraData
また、ブロックのハッシュ計算を引き起こす可能性があります。ブロックは異なるバリデータを検証することができるので、異なるシグネチャが存在することになるので、異なるハッシュ同一のブロックが存在することになるからです。ソリューションは、ときブロックのハッシュを計算することでCOMMIT
署名を除きます。したがって、我々は一貫性を検証すると同時にブロックハッシュコンセンサスで行わ任意のコースを保証することができます。
コンセンサス状態
New Round
:提案者は、新しいブロックの提案が送信されます。待っているバリPRE-PREPARE
の情報。PRE-PREPARED
:バリデータは受信したPRE-PREPARE
情報及び放送PREPARE
情報を。次に待つ2F + 1
2PREPARE
かCOMMIT
情報を。PREPARED
:バリデータは、受信されたメッセージおよびブロードキャスト情報を。次に待つのメッセージ2F + 1
PREPARE
COMMIT
2F + 1
COMMIT
COMMITTED
:バリデータは、受信したメッセージをこの時点で提案されたブロック鎖に挿入することができます。2F + 1
COMMIT
FINAL COMMITTED
:バリデータが正常にブロック鎖に挿入され、次のラウンドのために待機されています。ROUND CHANGE
:同じの次のラウンドで待機しているバリデータ2F + 1
数のROUND CHANGE
情報。
状態遷移
- NEW ROUND - > PRE-PREPARED:
- 中txpoolで提案コレクター取引。
- 提案者は、バリへの提案とブロックの放送を楽しみに置きます。そして、入力
PRE-PREPARED
状態を。 - それぞれのバリデータ
PRE-PREPARED
を受信すると状態、PRE-PREPARED
以下を伴う情報:- ブロックの提案は、提案者から効果的です。
- 有効なヘッダ領域。
- シーケンスおよび状態バリラウンドとブロックマッチングの提案。
- Validatorは、ブロードキャスト
PREPARE
、他のバリデータに情報を。
- PRE-PREPARED - > PREPARED:
- Validatorは受信
2F + 1
有効なPREPARE
情報を、および入力PREPARED
状態を。効果的な情報は、以下の基準を満たす必要があります:- シーケンスおよび回戦。
- 取引ハッシュが一致。
- バリデータからの情報が知られています。
- 一度に
PREPARED
状態、Validatorは報知情報をCOMMIT。
- Validatorは受信
- PREPARED - > COMMITTED:
- Validatorは受信
2F + 1
・有効なCOMMIT
入力するために情報をCOMMITTED
状態。効果的な情報は、以下の基準を満たす必要があります:- シーケンスおよび回戦。
- ブロックハッシュが一致
- バリデータからの情報が知られています。
- Validatorは受信
- COMMITTED - > FINAL COMMITTED:
- バリ
2F + 1
ヘッダ領域への署名のコミットメントextraData
とブロック鎖にブロックを挿入しようとします。 - あなたはにブロック成功、バリデータを挿入する
FINAL COMMITTED
状態。
- バリ
- COMMITTED FINAL - > NEW ROUND:
バリデータは、新しい提案が新ラウンドの開始]を選択します。
潜在的な問題
- フェイルストップ障害
- この記事ではiBFTのを解析し、
- ませんインセンティブ