分散合意アルゴリズム入門:Paxos・Raft・PBFT・PoW/PoSの原理と実装ポイントを徹底解説

はじめに

分散合意アルゴリズム(distributed consensus algorithm)は、ネットワーク上に分散した複数のノードが、障害や通信遅延、不正動作があっても「ひとつの値」や「共通の状態」を合意するための仕組みです。分散システムにおける状態同期や障害耐性を実現する基盤技術であり、データベースのレプリケーション、分散ファイルシステム、クラスタ管理、さらにはブロックチェーンまで幅広く使われます。本稿では基礎概念、代表的アルゴリズム、理論的制約、実装上の注意点、セキュリティ問題までを深掘りします。

合意問題の基本概念と性質

合意問題における主要な性質は主に次の2つに集約されます。

  • 安全性(Safety):決定された値は矛盾してはならない(異なる正直ノードが異なる決定をしてはいけない)。
  • ライブネス/進行性(Liveness / Progress):合意は最終的に達成されるべきである(停滞し続けてはいけない)。

また、障害モデルとしては大きく分けて「クラッシュフォルト(ノードが停止する)」と「ビザンチンフォルト(任意の不正動作をする)」があり、前者は比較的単純だが後者はより強力な敵対を想定します。耐障害性は通常「f個の障害に耐える」などと表現され、必要ノード数はモデルによって変わります(クラッシュ耐性で多数決なら N ≥ 2f+1、ビザンチン耐性なら N ≥ 3f+1 が一般的)。

理論的制約:ビザンチン将軍問題とFLP不可能性

合意の難しさを端的に示す2つの古典的結果があります。

  • ビザンチン将軍問題(Lamport, Shostak, Pease, 1982):一部が裏切る可能性がある状況で全員が一致するには、全体の3分の1を超える正直ノードが必要であることを示します。
  • FLP不可能性(Fischer, Lynch, Paterson, 1985):完全に非同期でかつクライアントがクラッシュする可能性があるモデルでは、通信遅延が任意に長くなる可能性の下で「安全性とライブネスを同時に常に保証する」決定的アルゴリズムは存在しない、という理論的制約です。実際のアルゴリズムは部分同期モデル(ある時点以降遅延は有界になる)やタイムアウトに基づく工夫で実用的なライブネスを確保します。

代表的なアルゴリズムと設計思想

ここでは主要な合意手法を分類して解説します。

Paxos(Lamport)

Paxosはクラッシュフォルト(正直ノードが停止する)が対象の分散合意の古典です。提案/受諾(proposer/acceptor)という役割で多数派(過半数)を用いたクォラムを形成し、安全性を保ちます。Paxosは理論的に堅牢ですが、実装と理解が難しいため、運用上の簡便性で改良された実装(Multi-Paxosなど)が使われます。ライブネスは部分同期とタイムアウトに依存します。

Raft

RaftはOngaroとOusterhoutによる、Paxosより設計と実装を単純化した合意プロトコルです。リーダー選出→ログ複製→安全なコミットという明確な手順で実装が容易な点が特徴です。クラッシュフォルト耐性で多数派クォラムを使用し、多くの実運用システム(etcd, Consulなど)で採用されています。

PBFT(Practical Byzantine Fault Tolerance)

PBFTはビザンチン耐性を持つ実用的なプロトコルで、フェーズを複数回(pre-prepare, prepare, commit)行い、2f+1(総数3f+1)以上の同意を得ることでビザンチン振る舞いを排除します。遅延が低い小規模〜中規模(数十ノード程度)で強い一貫性と即時性(確定)を実現しますが、ノード数が増えると通信オーバーヘッドがO(n^2)となる点が課題です。

Tendermint 等のBFTベースのブロックチェーン合意

TendermintはPBFT系の考えをブロックチェーンに適用し、リードノードがブロックを提案し、投票で2/3以上の賛成が得られれば即時ファイナリティ(最終確定)を提供します。パーミッションド型や一部パーミッションレス設計で使われます。

ナカモトコンセンサス(Proof-of-Work)

ビットコインが提示した方法で、計算力競争(PoW)により「最長・最重のチェーン」を正統とみなす確率的合意を実現します。資源の過半(ハッシュレート)が正直な参加者に属することが前提で、最終性は確率的(ブロックが深くなるほど確率的に確定)です。スケーラビリティやエネルギー消費が問題点として挙げられます。

Proof-of-Stake とその変種

PoSは資源(コインの保有量)を担保に合意を取る手法で、様々な設計(スラッシング、バリデータ選出、チェーン最終化アルゴリズム)があります。PoS系プロトコルは即時確定を目指すものや、長期的な攻撃(long-range attack)を考慮した設計が必要になります。

合意アルゴリズムの性能とスケーラビリティ

合意プロトコルの設計では次のようなトレードオフが常に存在します。

  • レイテンシ(遅延):合意達成に要するラウンド数。リーダー主導型は1〜数ラウンドで済むことが多い。
  • スループット:単位時間あたりに処理できるトランザクション数。リーダーがボトルネックになることがあるため、バッチングやパイプライニングで改善する。
  • 通信オーバーヘッド:全ノード間の通信量。BFT系はO(n^2)になりやすく、大規模化が難しい。
  • 参加者数とセキュリティ強度:多数のノードで耐攻撃性は高まるが管理が難しくなる。

セキュリティ上の脅威と防御

分散合意が直面する主な攻撃や課題:

  • Sybil攻撃:多数の偽ノードを用いて過半数を獲得しようとする攻撃。PoW/PoSはこれをリソースやステークで困難にする。
  • 分断(ネットワークパーティション):CAP的な観点で、分断時に可用性を取るか一貫性を守るかの判断が必要。
  • 検閲・遅延攻撃:リーダー制ではリーダーが一部トランザクションを検閲できる。
  • 二重署名・二重投票(Equivocation):同じステップで異なるメッセージを送る悪意あるノード対策として署名とレピュテーション、スラッシングが使われる。

実運用時の注意点

理論から実装へ移す際は多くの実務的課題があります。

  • タイムアウトとリトライの調整:FLPを避けるためタイムアウトは重要だが過度だと頻繁なリーダー交代で性能が落ちる。
  • ノード再構成(メンバ変更):オンラインでのノード追加・除去は安全に行う必要がある(構成変更のための合意手順が必要)。
  • モニタリングと検証:ログ整合性、レイテンシ、投票の欠如などを監視し、問題発生時はトレースできるようにしておく。
  • テスト:ネットワーク分断、遅延、ノードクラッシュ、ビザンチン振る舞いを模したフォールトインジェクションテストが必須。

合意の評価基準と選択の指針

どのアルゴリズムを選ぶかはユースケース次第です。データベースのレプリケーションやクラスタ管理ではクラッシュ耐性で低遅延のRaftやMulti-Paxosが一般的です。一方、銀行間決済や許可制ブロックチェーンではビザンチン耐性が求められるのでPBFT系やTendermintが適します。公開型(パーミッションレス)ブロックチェーンではPoW/PoSのような経済インセンティブ設計も重要になります。

まとめ

分散合意は分散システムの中核であり、理論的な限界(FLP)、攻撃モデル(ビザンチン)、実装複雑性、運用上のトレードオフを理解した上で適切なアルゴリズムを選ぶことが重要です。単に「合意を取る」だけでなく、性能、拡張性、セキュリティ、運用性を総合的に評価する必要があります。最新のブロックチェーン研究や産業実装の進化も速いため、継続的な学習と検証が求められます。

参考文献