ビザンチン障害耐性
概要
BFT (Byzantine fault-tolerance) またはビザンチン障害耐性はビザンチン障害プロセスが含まれていても安全な合意を達成することのできる性質である (あるいはその性質を持つ合意アルゴリズムを BFT とも呼ぶ)。またそのような性質を持つ合意をビザンチン合意 (Byzantine agreement) と呼ぶ。BFT の代表的な合意アルゴリズムには pBFT, BFT-SMaRt, Tendermint-BFT, HotStuff-BFT などがある。
BFT に対して Crash-Recovery 障害までを対象としている障害耐性を CFT (crash fault-tolerance) と呼ぶことがある。Raft や Zab などのプロトコルはデータセンターのような信頼できる環境で実行することを想定している分散システムは CFT である。
BFT の性質を持つ分散合意アルゴリズムは最終的にある一つの状態を共有しなければならない。より正確に表現すると:
個のプロセス がそれぞれ状態 を持つとする。1) 故障していないプロセス が初期状態 をとるとき、2) アルゴリズムの終了時に全ての故障していないプロセスが の状態をとる。
Table of Contents
ビザンチン将軍問題
ビザンチン将軍問題 (Byzantine Generals Problem) またはビザンチン合意問題は、分散システムにおけるサブシステム間の合意の困難さを表す例として挙げられる想定問題である。
城壁に囲まれた都市を複数の部隊で攻撃することを想定する。作戦を遂行するためには将軍と城壁を取り囲んでいる各部隊の指揮官たちがその時々の作戦に合意しなければならない。しかし、以下の状況を考慮することによって問題が複雑化する。
- 部隊は互いに遠く離れている。司令官たちがコミュニケーションをとるには伝令員を走らせる必要があり、意思疎通にタイムラグがある。
- 一部の指揮官は攻撃や撤退を望んで命令を改ざんしたり握りつぶすかもしれない。
- 一部の指揮官はうっかり次の部隊に伝え忘れたり別の伝令書を届けてしまうかもしれない。
- 寝返りや作戦妨害をもくろむ指揮官や伝令員が紛れ込んでいて命令書をすり替えるかもしれない。
- 伝令員が敵の弓矢に倒れたり、伝令を放棄して逃げ出してしまうかもしれない。
- 後に出発した伝令員が先に出発した伝令員を追い越すかもしれない。
ビザンチン合意問題では、このような状況でも正しい指揮官が正しい合意を行えるかを議論する。
裏切り者の指揮官は不正のためであればどのような行動も取りうるとする。分散合意アルゴリズムがビザンチン問題耐性を持つかは以下の条件を保証できるかに依存する。
- 正しい指揮官は全員が同じ命令に従う。
- 少数の裏切り指揮官は正しい指揮官に不正な命令を遂行させることができない。
アルゴリズムは裏切り者の行動に関係なく条件 1. を保証する必要がある。また、正しい司令官は単に作戦命令の内容を検証するだけではなくではなく、合意のための過程も検証すべきである。
分散システムにおいては、全てのノードがある一連のルールの元で動作するよう設計し、各ノードはトランザクションを自分のデータベースに追加する前に多数のノードでトランザクション検証が正しく行われたことを検証しなければならない。現実的な実装方法として分散システムのネットワークは伝令員を走らせるより遙かに低コストでメッセージを伝達することができるため富豪的なアプローチを取ることは可能である。
BFT 仮定
ビザンチン故障の存在しない信頼できる非同期ネットワークでの合意は一般に過半数以上のプロセスの承認によって達成される。システムが許容可能な故障プロセス数を
非同期 BFT の考えはこの延長にあり、ネットワークに
BFT に関する表記方法には全プロセス数
同期ネットワークや、すべてのプロセスが認証済みの環境では
定足数
BFT 仮定での定足数 (quorum) とは、合意のために必要な正常なプロセス数、あるいは正常なプロセスの応答数である。したがって、
文献や実装によってはビザンチン応答を含む式 (
例1: 原則的な定足数
Fig 2 は
例2: 照会系での定足数の緩和
同じリクエストに対してすべての正常なプロセスは同じ応答をするという分散合意の特性を利用して、正常なプロセスの状態を変更しないような照会系 (冪等/idempotent) の処理で定足数を緩和することができる。すなはち、同じ応答
Fig 3 はその例を示している。クライアントは
もちろん「ビザンチンプロセスの応答は合意の判断には使わない」という原理原則に従うのであれば
例3: BFT 仮定下で安全な部分集合
BFT 仮定下の
BFT プロトコルは一般に通信複雑性が高く、pBFT のように
例 1 の考えは「集まった応答数が
BFT 仮定が破られた時の挙動
Fig 5 は、ビザンチン故障と非ビザンチン故障が混在する状況において、正しい合意が可能か (Acceptable)、棄却で合意するか (Rejected)、またはビザンチン勢力による合意の乗っ取りが可能か (Collapse) を、定足数の確保に必要な応答数
一般的な
制約
BFT 仮定で
また合意時点の全プロセス数
この記事では以下のように状況を整理する。
ビザンチン故障の最大数を完全に制御できる状況
システム設計で
-
個のノードをプライベートネットワークに設置し、残りの 個のノードを DMZ に設定することで、DMZ 側のすべてのノードが侵入され乗っ取られたとしても全体の合意を乗っ取られることはない。REST API などを用いて外部ネットワークからのアクセスを可能にするために一部のノードを DMZ に設置したい場合など。 -
個のノードを自社で用意し、残りの 個のノードは他社やオープンなネットワークから公募すれば、外部のノードすべてが結託しても自社の合意を乗っ取られることがない。合意結果を遅延ゼロで即時配信する目的で外部のノードを合意に参加させたい場合など。 - 分散合意に関わるソフトウェアをアップデート、構成変更、または別のソフトウェアに置き換えようとしている。新バージョンのソフトウェアがどのような挙動をとっても、
個の非ビザンチン故障を許容しながら間違った合意に達せずサービスを継続することを保証するために、 個のノードを現バージョンのままとし、 個のノードを新バージョンで置き換えて様子を見る。 - 外部監査や実行統計を計測する目的で、ソフトウェアや構成の異なるノードを合意に常設することを考えたとき、そのノード数が
個までであれば、それらがどのような動作をしたとしても全体の合意に影響することはない。
このような状況であればビザンチン故障プロセスが
ビザンチン故障の最大数を完全には制御できない状況
システム設計で
- 協定を結んでいるいくつかの組織で合意を行う。一組織あたりで提供するノード数が
を超えないようにすることで、一つの組織が不正な判断をしても全体の合意には影響がないようにする。 - P2P ネットワークから無作為に選ばれたノードで合意を行う。このネットワークを構成するノードの 2/3 以上は自社が管理していることから、選択に含まれるビザンチン故障ノード数の期待値は
程度である。
ビザンチン故障プロセスが
合意に参加するプロセス数が確定できない状況
合意に参加するノード数
- Pure P2P ネットワークのように、ある時点での参加ノード数が不確定な状況では BFT 仮定に基づく合意は不可能である。
- 自律走行型の自動車が周囲の自動車と合意して (赤信号や濃霧、落下物の検知などで) 全体の流れを停止したり発車しようとしたとき、"周囲" に含まれる範囲が車によって異なるため合意に参加する自動車を確定することはできない。
このような状況では、何か確定性のある定量値に基づいてネットワークから委員会や動的クォーラムといった集合を選出する必要がある。
例
いくつかの例を考えてみよう。正常なプロセスが 🍎 を提案しビザンチン故障プロセスが 🍇 を提案すると仮定する (二価; bivalent)。このとき、全体のコンセンサスは 🍎 で合意するか、または合意に到達できず却下するか (却下に合意するか) のどちらかの状態となる必要がある。
-
, 構成においてビザンチン障害が 2 プロセスあり、正常な 5 プロセスのうち 2 プロセスが応答できなかった。このとき提案は (🍎×3, 🍇×2) となり 個集まった 🍎 で合意する。 -
, 構成においてビザンチン障害が 2 プロセスあり、正常な 5 プロセスのうち 3 プロセスが応答できなかった。このとき提案は (🍎×2, 🍇×2) となり、どちらも 個を満たさないため却下で合意する。 -
, 構成において実際のビザンチン障害が 3 プロセスあり、正常な 4 プロセスのうち 2 プロセスが応答できなかった。このとき提案は (🍎×2, 🍇×3) となり 個集まった 🍇 で合意する。 -
, 構成において実際のビザンチン障害が 3 プロセスあり、正常な 4 プロセス全てが正しく応答した。このとき、提案は最終的に (🍎×4, 🍇×3) となるが、通常はパフォーマンスを考慮して先に を満たした方で合意する。つまり提案の到達タイミングによってプロセスごとに合意値が異なる可能性がある。
2. のケースでは、正常だが応答できないプロセス数が
このように、ビザンチン耐性合意は BFT 仮定が崩れている状況では深刻な状態不整合を引き起こす可能性を潜在的に抱えている。いくつのビザンチンプロセスが入り込むかわからないネットワークでは、電子署名のような暗号技術を使用して合意内容が不正であることを第三者が検出できること (Safety の確保)、また大きなノード集合から合意ごとにランダムにメンバーを入れ替えるといった方法でビザンチン勢力が乗っ取りを継続的に維持できないこと (Liveness の確保) の追加の対策を必要とする。
証明
以下では説明を簡単にするために
定理1 : 故障プロセス数を とすると、 , の場合にビザンチン合意問題を解くアルゴリズムは存在しない。
提案者
上記は
さらに、
以上の説明を使用して
定理2 : の場合にビザンチン合意問題を解くアルゴリズムは存在しない。
それぞれのプロセス集合は、自分以外のプロセス集合が合意した値に対して内包する
それぞれのプロセス集合を
pBFT: Practical Byzantine Fault Tolerance
シミュレーション
BFT の代表的なプロトコルである pBFT のシミュレーション。Proposer プロセスの提案で全ての正常なプロセスが合意できるかを表している。
| # | pre-prepare | prepare | commit |
|---|
参考リンク
- Leslie Lamport, Robert Shostak, Marshall Pease (1982) The Byzantine Generals Problem






