CometBFT: データ構造
概要
Table of Contents
ブロック
CometBFT は Tendermint やその他のブロックチェーンと同様に合意の単位となるデータとしてブロックを用いる。この Block 構造体は Fig 1 に示すように 1) ヘッダ、2) 0 個以上のトランザクション、3) 0 個以上のエビデンス、4) 1 個以上の署名を伴うコミットによって構成される。
ヘッダ
Header 構造体は CometBFT のブロックヘッダを定義する。これにはブロックとコンセンサスのメタ情報、検証のための様々なハッシュ値が含まれている。各フィールドの詳細は CometBFT 仕様の Header を参照。
ブロックは提案ブロック作成時に MakeBlock() で作成される。
Version: バージョンフィールドは Block と App のフィールドで構成されている。Block バージョンは BlockProtocol 定数値であり、CometBFT ノードの実行中に変化しない静的なブロックの仕様バージョンを示している。App バージョンは ABCI の EndBlock レスポンスでアプリケーションから更新可能な値で、このブロックの高さでのアプリケーションのバージョンを示している。これらはヘッダの検証時と Block と State の検証時に CometBFT ノードが認識しているバージョンと比較される。
ChainID: このブロックが属するチェーンの ID を示す文字列。ノードが認識しているチェーン ID と一致しているかの検証で使用する。50 文字以下である必要がある。
LastBlockID: ヘッダの最終ブロック ID フィールド LastBlockID はノードが認識している最終ブロックと一致しているかを検証するために使用する。
Time: ヘッダの時刻フィールド Time は MedianTime() で取得する。この関数は Commit に含まれている有効な署名 (投票) から各 Validator の VotingPower を考慮した重み付き中央値のタイムスタンプを選択する。このアルゴリズムは、有効な Commit 署名をタイムスタンプ順にソートし、VotingPower の総和の 1/2 の位置の署名のタイムスタンプを採用する単純な重み付きサンプリングである。
ProposerAddress:
その他のフィールド
Block の mtx フィールドは 1) ブロックの検証、2) ブロックのハッシュ算出、3) ブロックのシリアライズのための部分化で排他制御を行うために用いられている。これらの処理は 2) で算出済みハッシュ値のメモ化を行っているものの、それ以外での更新処理での排他は行われていない。
Hash は何のハッシュで誰がいつ算出したものか。PartSetHeader とは何か。何で BlockID を修飾しているのか。提案ブロックとは何か。
参照
- CometBFT Specification: Data Structures