【Bullshark】アンカーリーダーのリンクづけとコミット
commit_leader() in bullshark.rs
関数の返り値
OutcomeとCommittedSubDagのベクターを返す
code:.rs
if stake < self.committee.validity_threshold() {
debug!("Leader {:?} does not have enough support", leader);
return Ok((Outcome::NotEnoughSupportForLeader, vec![]));
}
リーダーブロックをコミットするということは、その依存関係をすべてコミットすることを意味します。
リーダーのサポートが閾値未満の場合、NotEnoughSupportForLeaderを返して関数を終了します
committee.validity_threshold()について
ステーク量をベースにf + 1を超えていることを確認する
TODO: バリデータはどの関数でアンカーリーダーに投票しているのか?ローカルビューも
ここのどこかにありそう
code:.rs
let mut committed_sub_dags = Vec::new();
let mut leaders_to_commit = self.order_leaders(leader, state);
コミットされたサブDAGを格納するベクターを初期化します。
コミットすべきリーダーのリストを取得します。
ということは,アンカーリーダー間のパスはすでに繋がっている
order_leaders()のto_commit変数も使っているmut leaders_to_commitとして
order_leaders()について
bullshark.rs内の関数
引数
Certificate構造体とConsensusState構造体を可変で引数として受け取る
ConsensusState構造体
クラッシュ復旧用のコンセンサスに関する状態
最後にコミットされたラウンドや最新のコミットされた証明書など
返り値
to_commit変数
両端キュー(デック)の証明書を配列する
関数
まだコミットされていない過去のリーダーを古い順(ラウンド番号の小さい順)に並べる
to_commit変数にコミット予定のリーダーを格納
code:.rs
let mut to_commit = VecDeque::new();
to_commit.push_front(leader.clone());
最後にコミットされたラウンドの次のリーダーラウンドから現在のリーダーの前のラウンドまでループ処理
現在のリーダと前のリーダーがリンクしているかを確認
リンクしているなら前のリーダーをto_commitリストの先頭に追加
bullshark.rs内の関数のlinked()関数を使う
TODO: 詳細の処理を確認する
linked()関数
bullshark.rs内の関数
返り値
bool
trueはパスがある
code:.rs
let mut min_round = leader.round();
let mut sequence = Vec::new();
// DAGをシーケンスしていく
for x in utils::order_dag(&leader, state) {
state.update(&x);
min_round = min_round.min(x.round());
sequence.push(x);
}
リーダーから参照されるサブDAGをフラット化し、証明書のシーケンスを作成します。
内部状態を更新し、最小ラウンドを追跡します。
これら以降は,CommittedSubDag::new()で新しくコミットされたサブDAGの構造体を作って,store(Bullshark内のフィールド)に.write_consensus_state(&state.last_committed, &sub_dagで永続化している