Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

コンセンサスアルゴリズム

コンセンサスアルゴリズム 1枚まとめ

分散システムにおける合意

ブロックチェーンのノードは世界中に散らばっており、通信遅延があり、一部のノードは故障したり悪意を持っていたりする。その状況で、全ノードが同じ取引履歴(=操作の順序)に合意するための仕組みが コンセンサスアルゴリズム(consensus algorithm) である。

ビザンチン将軍問題(Byzantine Generals Problem)

複数の将軍(ノード)が伝令(メッセージ)だけで連絡を取り合い、攻撃か撤退かを決める。一部の将軍は裏切り者で、矛盾したメッセージを送るかもしれない。このとき、忠実な将軍たちが全員同じ決定に到達できるか、という問題(Lamport, Shostak & Pease, 1982)。

裏切り者がいても正しく合意できる性質を ビザンチン耐性(Byzantine Fault Tolerance, BFT) という。

合意アルゴリズムに求められる性質は、大きく2つに分けられる。

性質意味ブロックチェーンでの例
安全性(Safety)悪いことが起きない確定した取引が覆らない、二重支払いが起きない
活性(Liveness)良いことがいつかは起きる正当な取引はいつか必ずブロックに取り込まれる

ネットワークが分断されうる状況では、安全性と活性を同時に完全には満たせない(FLP不可能性、CAP定理)。どちらを優先するかでアルゴリズムの性格が分かれる。

Proof of Work(PoW)

仕組み

Proof of Work(作業証明) は、ブロックを作る権利を計算競争で決める方式。

マイナーは、ブロックヘッダーのハッシュ値が 難易度ターゲット(difficulty target) 未満になるような nonce を探す。

SHA256(SHA256(header(nonce)))<target\text{SHA256}(\text{SHA256}(\text{header}(\text{nonce}))) < \text{target}

ハッシュ関数の出力は予測できないので、nonceを1つずつ変えて試すしかない。計算問題を解くというより、当たりが出るまでくじを引き続けるイメージで、計算資源を多く投入するほど1秒あたりに多くのくじを引ける。

一方、見つかったnonceが条件を満たすかの検証はハッシュを1回計算するだけで済む。この「作るのは大変だが検証は簡単」という非対称性がPoWの本質。

 8 bit: nonce=     106 試行回数の期待値=      256 時間=0.000s  00d58402d26479ed...
12 bit: nonce=   3,340 試行回数の期待値=    4,096 時間=0.002s  000db62a0eea814d...
16 bit: nonce= 332,301 試行回数の期待値=   65,536 時間=0.164s  00005bdecba48528...
20 bit: nonce=1,180,691 試行回数の期待値=1,048,576 時間=0.589s  000009954e9a656e...

難易度が1ビット上がるごとに、必要な試行回数の期待値は2倍になる。

なぜ計算コストを課すのか

  • シビル攻撃対策:IDを大量に作るのはタダなので、「1ノード1票」では偽アカウントを量産した者が勝ってしまう。PoWは「1CPU 1票」、つまり現実の物理資源(電力・計算機)に比例した発言力にする

  • スパム対策:無効なブロックを大量に流すことを抑止する

  • 価値の裏付け:報酬として発行される通貨に、生産コストという意味での価値を与える

難易度調整

Bitcoinでは2,016ブロック(約2週間)ごとに難易度ターゲットを調整し、ブロック生成間隔が平均10分になるようにしている。

new target=old target×直近2016ブロックの所要時間20160分\text{new target} = \text{old target} \times \frac{\text{直近2016ブロックの所要時間}}{20160\text{分}}
  • マイナーが急増してブロック生成が速くなりすぎると、チェーンの分岐が頻発する → 難易度を上げる

  • マイナーが急減すると、ブロックがいつまでもできずに取引が処理されない → 難易度を下げる

急激な変化を避けるため、1回の調整幅は1/4倍〜4倍に制限されている。

Nakamoto Consensus

最長チェーンルール

マイナーが偶然ほぼ同時にブロックを見つけたり、伝播に遅延があったりすると、チェーンが一時的に分岐(fork)する。Bitcoinでは 最も多くの累積作業量を持つチェーン(俗に最長チェーン)を正統とする ルールで分岐を解消する。分岐のどちらかに次のブロックが先に繋がった時点で、多くのノードがそちらに乗り換え、もう片方のブロックは捨てられる(stale block / orphan block)。

マイナーにとっても、正統なチェーンの先端にブロックを繋がないと報酬が無効になるため、最長チェーンに乗ることが合理的になる。

確率的ファイナリティ

Nakamoto Consensusでは、ブロックがいつ「確定」したと言えるかが明確でない。後からより長いチェーンが現れれば、既存のブロックが覆る可能性が常に残る。ただし、上に積まれたブロック数(承認数、confirmations)が増えるほど、覆る確率は指数的に小さくなる。これを 確率的ファイナリティ(probabilistic finality) と呼ぶ。

Nakamotoの論文では、全ハッシュレートの割合 qq を持つ攻撃者が、zz ブロック遅れから正直なチェーンに追いつく確率を次のように計算している。正直なマイナーの割合を p=1−qp = 1-q とすると、ギャンブラーの破産問題より、zz ブロックの差を逆転できる確率は

qz={1(p≤q)(q/p)z(p>q)q_z = \begin{cases} 1 & (p \le q) \\ (q/p)^z & (p > q) \end{cases}

正直なチェーンが zz ブロック進む間に攻撃者が進むブロック数を、期待値 λ=zqp\lambda = z\frac{q}{p} のポアソン分布で近似すると、攻撃の成功確率は

P=1−∑k=0zλke−λk!(1−(q/p)z−k)P = 1 - \sum_{k=0}^{z} \frac{\lambda^k e^{-\lambda}}{k!}\left(1 - (q/p)^{z-k}\right)

となる。

<Figure size 600x400 with 1 Axes>

攻撃者のハッシュレートが10%なら、6承認で成功確率は約0.02%まで下がる。Bitcoinで「6承認(約1時間)待てば安全」と言われる根拠はここにある。一方で攻撃者が過半数(q≥0.5q \ge 0.5)を持てば、いくら待っても確率は1になる。

Proof of Stake(PoS)

仕組み

Proof of Stake(保有証明) では、計算資源の代わりに 暗号資産を預け入れる(ステークする) ことで、ブロック生成や検証に参加する権利を得る。ステークした参加者(バリデータ)の中から、ブロック提案者や投票者がランダムに選ばれる。

  • 正しく振る舞えば報酬が得られる

  • 二重投票などの不正をすると、預けた資産が没収される(スラッシング, slashing)

という経済的インセンティブで正直な行動を促す。

PoWとの比較

項目PoWPoS
参加に必要な資源計算資源(電力・専用ハードウェア)ステークする暗号資産
セキュリティの源泉全体のハッシュレートステーク総量
攻撃コストハッシュレートの過半数を確保する費用ステーク総量の1/3〜2/3を確保する費用。不正すればスラッシングで失う
コストの性質外部資源(電力)を消費し続けるシステム内部の資産をロックする機会費用
環境負荷大きい小さい
ファイナリティ確率的決定論的なファイナリティを組み込める
主な課題電力消費、マイニングの寡占富の集中、Nothing at Stake問題、ロングレンジ攻撃
Nothing at Stake 問題

PoWでは、分岐したチェーンの両方でマイニングすると計算資源が分散して損をする。PoSでは署名するだけなのでコストがかからず、分岐した両方のチェーンに投票しておくのが合理的になってしまう。

Ethereumなどでは、矛盾する署名を行ったバリデータのステークを没収する(スラッシング)ことでこの問題に対処している。

Ethereumの具体的なPoSの仕組みは Proof of Stake(Ethereum) を参照。

BFT系アルゴリズム

PBFT

PBFT(Practical Byzantine Fault Tolerance, Castro & Liskov 1999) は、参加者が固定・既知の環境で、投票によって合意する古典的なアルゴリズム。

  1. Pre-prepare:リーダーが提案を全ノードに送る

  2. Prepare:各ノードが提案を受け取ったことを全ノードに送る

  3. Commit:十分な数のPrepareを受け取ったノードが確定を全ノードに送る

全員が全員にメッセージを送るため通信量は O(N2)O(N^2) で、ノード数を増やしにくい。一方で、一度Commitされたブロックは覆らない 決定論的ファイナリティ(deterministic finality) が得られる。

なぜ2/3なのか

全ノード数を N=3f+1N = 3f + 1、そのうち最大 ff 台が悪意を持つ(ビザンチン)とする。

  • 活性のため、ff 台が応答しなくても進める必要がある → 待てるのは最大 N−f=2f+1N - f = 2f + 1 票まで

  • 安全性のため、矛盾する2つの決定が両方とも 2f+12f+1 票を集めることがあってはならない

2つの 2f+12f+1 票の集合の重なりは少なくとも 2(2f+1)−(3f+1)=f+12(2f+1) - (3f+1) = f+1 台で、そのうち少なくとも1台は正直なノードになる。正直なノードは矛盾する2つに投票しないので、矛盾した決定は起こらない。したがって、合意には 全体の2/3超の票(2f+12f+1) が必要になる。

PoS系のチェーン(Ethereum, Cosmos(Tendermint/CometBFT), Polkadotなど)の多くは、ファイナリティの部分にこの考え方を取り入れている。

ブロック時間とファイナリティ時間

用語意味
ブロック時間(block time)ブロックが生成される間隔。ブロックがチェーンに取り込まれても、分岐によって後で外れる可能性がある
ファイナリティ時間(time to finality)ブロックが最終確定し、覆らなくなるまでの時間
チェーンブロック時間ファイナリティ
Bitcoin約10分確率的(慣習的に6承認≒約60分)
Ethereum12秒約2〜3エポック(約13〜19分)で決定論的に確定
Tendermint系(Cosmos等)数秒ブロック時間 = ファイナリティ時間(即時確定)

ファイナリティには全バリデータ間の投票と伝播が必要なため、ノード数や通信遅延という物理的な制約を受ける。ノード数を増やすほど分散性は高まるが、確定には時間がかかる。

コンセンサスへの攻撃

攻撃対象概要
51%攻撃コンセンサスハッシュレート(PoSならステーク)の過半数を握り、過去の取引を覆したり特定の取引を排除したりする
セルフィッシュマイニングコンセンサス見つけたブロックを隠して掘り進め、都合のよいタイミングで一気に公開して他のマイナーの作業を無駄にする。過半数未満でも取り分を増やせる(Eyal & Sirer, 2014)
エクリプス攻撃ネットワーク標的ノードの接続先をすべて攻撃者のノードで占め、偽の情報を見せる
ロングレンジ攻撃PoS過去にステークしていた(現在は引き出し済みの)鍵を入手し、過去の時点から別のチェーンを作り直す
Goldfinger攻撃プロトコル外空売りなどで価格下落から利益を得る立場を取ったうえでチェーンを攻撃する。「マイナーは報酬の価値を損なう攻撃をしない」という前提への反例