Tendermint

Takami Torao Tendermint 0.32 #Blockchain #Tendermint
  • このエントリーをはてなブックマークに追加

概要

アルゴリズム

Tendermint-BFT

Tendermint には BFT に基づいた合意アルゴリズムが実装されている。

  1. Proposer から開始し各ノードが Pre-vote をブロードキャストする。
  2. 各ノードは他の 以上のノードから同じブロックの pre-vote メッセージを受信すると pre-commit をブロードキャストする。
  3. 受信できない場合、ノードは待機時間を延長し、

Proposer Election

Tendermint は Validator 集合からラウンドごとに Proposer を選択する。このアルゴリズムは、それぞの Validator が持つ票数 (voting power) で重み付けられた Round Robin アルゴリズムであり Proof of Stake の一種と言える。具体的な実装アルゴリズムは Priority Queue で要素を選択する方法と同じである。

Voting Power
Priority
Proposer
Frequency
Round 0 , Total Voting Power 0

となる時にそれぞれの Validator の選出頻度が概ね Voting Power と一致することが分かるだろう。

選出アルゴリズム

※この記述は Tendermint 0.32 のソースコードより読み解いたものであり、Whitepaper で説明している内容とは異なる可能性がある点に注意。

基本的な選出方針は、ラウンドごとに各 Validator の Proposer Priority に Stake を加算してゆき、最も大きい Priority を持つ Validator を次のラウンドの Proposer とする。Proposer に選出されると Priority は最下位程度まで減算される。ラウンドロビン設計だが、ラウンドごとに Stake を累積してゆくことで Stake 保有量が多く長期間保有している Validator が高い頻度で選出される構造になっている。また実際には加算によってオーバーフローしないように正規化 (再スケーリング) を行っている。

ある Validator 集合 , に含まれる Validator が持つ票数 (voting power Stake)、ラウンド における の Priority を とすると Priority の初期状態は以下のように表される。ここで 全体の総評数 は定数である。式 () より初回は Validator の持つ票数の多さで Proposer が選択されることが分かる。また途中から合意に参加する Validator もこの初期値から始まる。

ラウンド の各 は概ね 0 を中心に となるように正規化される。より正確には となるように線形返還され、さらにそれぞれから平均値を減算する。正規化後、Validator ごとに を求め、最も大きい を持つ Validator が ラウンドでの Proposer となる。 Proposer に選出された Validator の からは が減算されて次のラウンドの Proposer Priority となる。

となるような Validator , が存在する場合、そのアドレスのバイナリ表現が小さい方が優先される。票を持たない の Validator は初期状態で最下位であり累積も行われないため ( ならば) Proposer として選出されることはない。

参照

  1. Tendermint 公式ドキュメント
  2. Yackolley Amoussou-Guenou, Antonella Del Pozzo, Maria Potop-Butucaru, and Sara Tucci-Piergiovanni, Dissecting Tendermint (2019)