
Consensus
コンセンサスコンポーネントはネットワークの他のバリデータとコンセンサスプロトコルに参加し、トランザクションのブロックを順序づけ、実行結果の同意を取り付ける責任があります。
Consensus → Mempool (CO.1)
バリデータVXがleader/poposerのとき、VXのコンセンサスは自分のmempoolから「Mempool::GetBlock()」を使ってトランザクションのブロックを取り出しproposalを作ります。
Consensus → Other Validators (CO.2)
VXがproposer/leaderのとき、そのコンセンサスは提案されたトランザクションのブロックを他のバリデータに複製します。
Consensus → Execution, Consensus → Other Validators (CO.3)
- トランザクションのブロックを実行するため、コンセンサスは実行コンポーネントとインタラクトします。コンセンサスは「Execution:ExecuteBlock()」を通して、トランザクションのブロックを実行します。(Consensus->Executionを参照)
- そのブロック内のトランザクションを実行した後、実行コンポーネントはそれらのトランザクションの実行結果をコンセンサスコンポーネントに返します。
- コンセンサスコンポーネントは実行結果にサインし、コンセンサスに参加している他のバリデータとこの結果の合意を試みます。
Consensus → Execution (CO.4)
もし十分な数のバリデータが同じ実行結果に投票した場合、VXのコンセンサスコンポーネントは「Execution::CommitBlock()」を通して、このブロックがコミット準備完了していることを実行コンポーネントに知らせます。
Consensus README
実装の詳細についてはConsensus READMEを参照。
Execution
実行コンポーネントの仕事は、トランザクションブロックの実行をまとめ、コンセンサスが投票できる様に、過渡的な状態を維持することです。
Consensus → Execution(EX.1)
- コンセンサスは「Execution::ExecuteBlock()」を通して、実行コンポーネントにトランザクションブロックを実行する様に要求する。
- 実行コンポーネントはマークルアキュームレータの関連部分をインメモリーコピーに保つ「スクラッチパッド」を維持します。この情報は、ブロックチェーンの現在の状態のルートハッシュを計算するために使用されます。
- 現在の状態のルートハッシュは、アキュムレータの新しいルートハッシュを決定するため、ブロック内のトランザクションの情報と組み合わされます。これはデータを永続化する前に行われ、バリデータのクオラムが合意に達するまで、状態やトランザクションが保存されないことを保証します。
- 実行コンポーネントは、投機的なルートハッシュを計算します、そしてVxのコンセンサスコンポーネントはこのルートハッシュに署名し、他のバリデータとこのルートハッシュに基づいた合意を試みます。
Execution → VM (EX.2)
コンセンサスが「Execution::ExecuteBlock()」を通してトランザクションのブロックを実行するように実行コンポーネントに要求すると、実行コンポーネントはVMを使ってトランザクションのブロックの実行結果を決定します。
Consensus → Execution (EX.3)
もしバリデータのクオラム(定足数)がブロックの実行結果に合意するなら、各バリデータのコンセンサスコンポーネントはその実行コンポーネントに「Execution::CommitBlock()」を通してブロックのコミット準備が完了したことを知らせます。この実行コンポーネントへのコールには、これらの合意を証明するために、合意したバリデータの署名が含まれます。
Execution → Storage (EX.4)
実行コンポーネントは自分の「スクラッチパッド」から、値を取り出し、それを永続化するために「Storage::SaveTransactions()」を通してそれらをストレージコンポーネントに送ります。その後、実行コンポーネントは「スクラッチパッド」から不要になった古い値を削除します(例えば、コミットができない並列ブロックなど)。
Execution ReadMe
実装についての詳細はExecution READMEを参照してください。
Storage
ストレージコンポーネントは合意されたトランザクションブロックとその実行結果を永続化します。トランザクションのブロックまたはセット(トランザクションTnを含む)は次の場合に保存されます。
- コンセンサスに参加しているバリデータのうち、2f+1以上のバリデータ間で次の全てについて合意がある場合。
ブロック内のトランザクション
トランザクションの順番
** ブロックに含まれているトランザクションの実行結果
トランザクションがブロックチェーンのデータ構造に追加される方法についてはマークルアキュームレータを参照のこと。
VM → Storage (ST.1)
ACまたはmempoolがトランザクションを検証するため「VM::ValidateTransaction()」を呼び出したとき、「VM::ValidateTransaction()」は送信者のアカウントをストレージからロードして、トランザクションのリードオンリー正当性チェックを行います。
Execution → Storage (ST.2)
コンセンサスが「Execution::ExecuteBlock()」をコールしたとき、実行モジュールは実行結果を決定するため、現在の状態をストレージからインメモリの「スクラッチパッド」データと組み合わせて読み込みます。
Execution → Storage (ST.3)
- コンセンサスがあるトランザクションブロックの同意に到ると、実行モジュールはトランザクションのブロックを保存して、それを永続化するため「Storage::SaveTransactions()」を通してストレージをコールします。これはトランザクションのブロックに同意したバリデータノードのサインも含みます。
- このブロックのための「スクラッチパッド」内のインメモリーデータはアップデートされたストレージに渡され、トランザクションは永続化されます。
- ストレージが更新されると、各トランザクションによって変更されたすべてのリソースのシーケンス番号がそれに従って更新されます。
- 注:Libraブロックチェーンのアカウントのシーケンス番号は、そのアカウントのコミットされたトランザクションごとに1づつインクリメントされます。
AC → Storage (ST.4)
ブロックチェーンから情報を読み取るクライアントクエリの場合、ACはストレージと直接インタラクトして要求された情報を読みとります。
Storage README
実装の詳細についてはStorage READMEを参照のこと。