ビットコインの合意形成設計 — プルーフ・オブ・ワーク、難易度調整、フォーク処理

はじめに

本ページは設計文書シリーズL1 #4 — コンセンサス設計 である。ブロック・チェーン設計ページの直接の後続である。前ページがデータ構造 — ヘッダー、マークルツリー、ハッシュの連鎖 — を記述したのに対し、本ページはどのチェーンが有効でどのチェーン先端が勝つかを決定する規則を記述する。

合意形成は、ビットコインにおいて中央集権的な権威に代わるものである。すべてのフルノードがすべてのブロックを同一の決定論的規則集に対して独立に評価する。信頼に基づいてブロックを受理することはなく、他のノードの判断に委ねることもない。その結果、数千の機械が調整、投票、リーダー選出なしに単一の取引履歴に収束するシステムが実現する。

本ページは 5 つの領域を扱う。ブロック生成を計算上高コストにするプルーフ・オブ・ワークパズル、ブロック頻度を調節する難易度調整、合法なブロックを定義する検証規則、競合するチェーンを解決するフォーク処理ロジック、承認の安全性を定量化するファイナリティモデル。

サトシ時代の実装(v0.1、2009 年 1 月)と現行の Bitcoin Core(v27 以降基準)で挙動が異なる場合は、両方を記す。

1. プルーフ・オブ・ワーク

プルーフ・オブ・ワークはブロック生成を計算上高コストにするメカニズムである。マイナーは 80 バイトのブロックヘッダーの SHA-256d ハッシュがネットワーク全体のターゲット値を下回るようなナンス(およびその他の可変ヘッダーフィールド)を見つけなければならない。SHA-256 は一方向関数であるため、既知の唯一の戦略は総当たり反復である。

マイニングループ

はい

いいえ

ブロックヘッダー組立

(前ハッシュ、

マークルルート、

タイムスタンプ、

難易度ビット)

80 バイトヘッダーの

SHA-256d を計算

hash ≤ target?

有効ブロック発見。

ネットワークに配信。

ナンスをインクリメント

(または extra-ナンス用に

コインベースを変更)

二重 SHA-256 (SHA-256d) 演算は SHA-256 を 2 回連続で適用する: SHA-256(SHA-256(header))。サトシは単一パスの SHA-256 に固有の長さ拡張攻撃を緩和するためにこの構成を選んだ。

プルーフ・オブ・ワークのパラメーター

パラメーター備考
ハッシュ関数SHA-256d (二重 SHA-256)v0.1 から不変
入力80 バイトのブロックヘッダーバージョン、前ハッシュ、マークルルート、タイムスタンプ、ビット、ナンス
ナンスフィールド32 ビット (4 バイト)ヘッダー構成ごとに約 43 億の候補を提供
追加ナンスコインベーストランザクションデータコインベースを変更するとマークルルートが変わり、ナンス探索空間が更新される
ターゲット表現nBits コンパクト形式 (4 バイト)256 ビットターゲットを 3 バイトの仮数と 1 バイトの指数で符号化
難易度 1 ターゲット0x00000000FFFF...(切り詰め)すべての難易度値がこれとの比率で表される基準ターゲット
有効ハッシュ基準ハッシュ ≤ ターゲットターゲットが低い = 難易度が高い = 有効なハッシュを見つけるのが困難

2. 難易度調整

ビットコインはブロック間の平均間隔を 10 分に目標設定する。ネットワーク全体のハッシュレートは変動するため — 新しいマイナーの参入、旧ハードウェアの退役、エネルギーコストの変化 — プロトコルは 2,016 ブロックごと(約 2 週間ごと)にターゲット値を調整する。

再ターゲットサイクル

再ターゲット窓: 2,016 ブロック

ブロック N

ブロック

N+1

···

ブロック

N+2015

経過時間を算出:

timestamp(N+2015) − timestamp(N)

比率 = 実経過 / 想定

想定 = 2,016 × 600 秒

比率を [1/4, 4] に

クランプ

新ターゲット =

旧ターゲット × クランプ比

次の 2,016 ブロックに

適用

調整パラメーター

パラメーター備考
目標ブロック時間600 秒 (10 分)サトシが承認速度と孤児ブロック率のトレードオフとして選択
再ターゲット期間2,016 ブロック目標レートでは正確に 14 日間
期待ウィンドウ時間1,209,600 秒 (14 日間)2,016 × 600
最大上方調整4 倍(ターゲットが 4 倍容易に)ハッシュレートの急激な低下がチェーンを無期限に停滞させることを防止
最大下方調整1/4 倍(ターゲットが 4 倍困難に)ハッシュレートの急増がブロックを危険なほど高速にすることを防止
調整粒度256 ビットターゲットに対する整数算術浮動小数点なし。すべての実装で決定論的

サトシ時代のバグ

元の難易度調整コードには 2 つの既知の問題があり、修正にはハードフォークが必要なため合意規則として残存している:

  • 一つ違い誤差。 再ターゲット計算はブロック N(ウィンドウの最初のブロック)とブロック N+2,015(最後のブロック)のタイムスタンプを使用し、2,016 ではなく 2,015 の間隔を測定する。したがって実際の再ターゲットウィンドウは意図より 1 ブロック短い。10 分の目標では、これは約 0.05% の系統的偏りを生む。

  • 時間歪曲脆弱性。 調整アルゴリズムは 2 つのブロック(ウィンドウの最初と最後)のタイムスタンプのみを検査するため、過半数のハッシュレートを持つマイナーは各ウィンドウの最後のブロックのタイムスタンプを操作してチェーンを実際より遅く見せかけ、目標レートより速くブロックを生成しながら徐々に難易度を下げることができる。この攻撃は正直な多数派に対しては理論的だが、持続的に 50% 超を占める攻撃者には実行可能になる。修正(「時間歪曲攻撃緩和」)は Great Consensus Cleanup で提案されているが、まだ有効化されていない。

3. ブロック検証規則

ノードが新規ブロックを受信すると、ローカルチェーン状態に受理する前に決定論的な一連の検査を適用する。すべての検査に合格しなければならず、1 つでも失敗するとブロック全体が拒否される。

検証判定ツリー

失敗

合格

失敗

合格

失敗

合格

失敗

合格

失敗

合格

失敗

合格

ブロック受信

ヘッダー PoW 有効?

hash ≤ target

ブロック拒否

タイムスタンプが

許容範囲内?

ブロックウェイト

≤ 4 MWU?

マークルルートが

再計算値に一致?

コインベース

トランザクション

有効?(1 件のみ、

報酬 ≤ 新規発行分 + 手数料)

全トランザクション有効?

(署名、UTXO 存在、

ブロック内に

二重支払いなし)

ブロック受理、

チェーン状態を更新

検証項目

検査規則導入時期
ヘッダーのプルーフ・オブ・ワークヘッダーの SHA-256d ハッシュ ≤ nBits に符号化されたターゲットv0.1
タイムスタンプ範囲直前 11 ブロックの中央値 (MTP) より大きく、かつノードのローカル時刻 + 2 時間未満v0.1(MTP 規則は後に正式化)
ブロック重量≤ 4,000,000 重量単位 (4 MWU)BIP 141 (2017 年)。v0.1 時代の 1 MB バイトサイズ上限に置換
マークルルートヘッダーのマークルルートがブロックのトランザクションリストから再計算したルートと一致v0.1
コインベースの有効性コインベースは正確に 1 つ。出力値 ≤ 新規発行分 + トランザクション手数料合計。scriptSig にブロック高を含む (BIP 34)v0.1。BIP 34 は 2013 年追加
トランザクションの有効性すべての入力が既存の未使用出力を参照。すべてのスクリプトが真に評価。ブロック内で入力が二重に使用されていないv0.1
署名操作回数全トランザクション横断の署名操作合計 ≤ 上限(従来型: 20,000、SegWit: 重量加重)v0.1。SegWit で計算方法を改訂
トランザクションの確定性すべてのトランザクションがロックタイムとシーケンスの制約を満たすv0.1。BIP 68/113 で相対的タイムロックを追加

4. フォーク種別と処理

フォークは 2 つ以上のブロックが同じ親を共有するたびに発生する — チェーンが競合する分岐に分裂する。フォークは 3 つの異なる原因から生じ、それぞれ異なる特性と解決メカニズムを持つ。

フォーク比較

ハードフォーク

(規則の緩和または変更)

新規則により従来無効な

ブロックの一部が有効化

更新済みノードが

旧ノードの

拒否するブロックを受理

全ノードが更新しない限り

恒久的にチェーン分裂

ソフトフォーク

(規則の厳格化)

新規則により従来有効な

ブロックの一部が無効化

更新済みノードが

厳格規則を適用

未更新ノードも引き続き

全新ブロックを受理

(後方互換)

ハッシュレート多数派が

更新すれば恒久分裂なし

自然フォーク

(伝播遅延)

2 マイナーが

ほぼ同時にブロックを発見

双方が有効で

同じ親を参照

自動的に解決:

次のブロックが

一方を延長し

最多ワークチェーンとなる

注目すべきフォーク

出来事種別メカニズム結果
値オーバーフロー事件2010緊急ソフトフォークCheckTransaction を修正し 2,100 万 BTC 超の出力を拒否チェーン再編成。無効なブロックは数時間以内に孤立化
BIP 66 (厳密な DER)2015ソフトフォークIsSuperMajority (1,000 ブロック中 950)正規の署名符号化を強制
SegWit (BIP 141)2017ソフトフォークBIP 9 バージョンビット証人ディスカウント導入、改ざん性修正、スクリプトバージョニング有効化
ブロックサイズ → ビットコインキャッシュ2017ハードフォークスケーリング方針の対立ビットコインキャッシュが分裂。非互換の 8 MB ブロックサイズ規則が恒久的チェーン分岐を生む
Taproot (BIP 341)2021ソフトフォークSpeedy Trial(修正 BIP 9)シュノア署名、Tapscript、MAST を追加

チェーン選択規則

ノードが競合するチェーン先端に遭遇した場合、最大作業量チェーン — 累積プルーフ・オブ・ワークが最大のチェーン(内部的に nChainWork として追跡)を選択する。これは一般に不正確にも「最長チェーン」と称される。実際には、難易度の高いブロックを持つ短いチェーンが難易度の低いブロックを持つ長いチェーンよりも多くの総作業量を持ちうる。最大作業量規則は、最大の計算エネルギー支出に裏付けられたチェーンが勝利することを保証する。

5. 合意規則の進化

ビットコインの合意規則は静的ではない。すべての参加者の同時的な調整を必要とせずにネットワークが新規則を採用できるよう、慎重に段階的な有効化メカニズムを通じて進化する。

有効化メカニズムの沿革

2009–2012Flag day固定ブロック高または日付。マイナーシグナリングなし。 初期の変更(例1 MBブロックサイズ上限)に使用。2012–2015IsSuperMajority直近 1,000ブロックのうち 950がシグナル必須。バージョンフィールドの1 ビット。BIP34、66、65 に使用。2015–2017BIP 9 versionbitsバージョンフィールドのビット単位シグナリング。時間境界のある起動窓。並列展開が可能。SegWit に使用。2017–現在BIP 8 / Speedy TrialTaproot 起動をめぐりLOT=true/falseと短期シグナリング案が議論され、 実際のTaproot は Speedy Trialでロックインした。コンセンサス起動機構

有効化パラメーターの比較

メカニズムシグナル方法閾値タイムアウト時の挙動使用例
フラグデーなし(ハードコードされた高さ/時刻)該当なし指定時点で無条件に有効化1 MB 上限、初期パッチ
IsSuperMajorityブロック nVersion ≥ N1,000 ブロック中 950明示的タイムアウトなし。閾値到達まで保留BIP 34、BIP 66、BIP 65
BIP 9 バージョンビットnVersion の個別ビット再ターゲット期間の 95% (2,016 中 1,916)終了日までにロックインされなければ失敗。ビットは再利用可能にCSV (BIP 68/112/113)、SegWit (BIP 141)
BIP 8 (LOT=true)nVersion の個別ビット再ターゲット期間の 95%タイムアウト時に強制ロックイン(マイナーは有効化を阻止できない)Taproot 起動の議論で提案されたが、最終的に採用された機構ではない
BIP 8 (LOT=false)nVersion の個別ビット再ターゲット期間の 95%タイムアウト時に失敗(BIP 9 と同様)提案されたが単独ではデプロイされず
Speedy TrialnVersion の個別ビット再ターゲット期間の 90%短いシグナリング期間。タイムアウト時の強制ロックインなしTaproot (BIP 341)

6. ファイナリティモデル

ビットコインは確率的ファイナリティを提供し、絶対的ファイナリティは提供しない。承認済みトランザクションは後続のブロックごとに覆すのが指数関数的に困難になるが、有限の承認数では数学的に覆しを不可能にすることはない。

承認深度と攻撃成功確率

以下の表はホワイトペーパー第 11 節の分析を再現し、ネットワークハッシュレートの一定割合を持つ攻撃者が、トランザクションが一定の承認深度に達した後に正直なチェーンに追いつき追い越す確率を示す。

承認数q = 10%q = 15%q = 20%q = 25%q = 30%
10.20450.28910.36690.43750.5000
20.05090.09650.15520.23090.3190
30.01310.03340.06820.12670.2138
40.00340.01170.03040.07060.1448
50.00090.00420.01370.03970.0989
60.00020.00150.00620.02250.0680

6 承認(約 1 時間)の時点で、ネットワークハッシュレートの 10% を制御する攻撃者がトランザクションを覆す確率は 0.02% である。30% の攻撃者に対しては、同じ深度でも覆し確率は依然 6.8% であり、高額トランザクションがより多くの承認を待つ理由である。

ビットコインに絶対的ファイナリティがない理由

Tendermint や HotStuff のようなビザンチン障害耐性 (BFT) 合意システムでは、検証者の過半数(通常 2/3)がブロックに署名すると確定とみなされる。その時点以降、プロトコルの安全性保証に違反しなければブロックを覆すことはできない。

ビットコインの設計は根本的に異なるトレードオフを行う:

特性ビットコイン(ナカモト合意)BFT システム
ファイナリティの種別確率的 — 覆し確率が深度とともに指数関数的に減少決定論的 — 過半数投票後に確定
参加者集合開放的 — 許可なくどの機械でもマイニング可能閉鎖的 — 検証者集合が既知で有界
耐障害性敵対的ハッシュレート 50% 未満を許容敵対的検証者 1/3 未満を許容
分断下の活性ブロック生成を継続(一時的にフォークする可能性あり)過半数が再接続するまで停止
覆しコストトランザクションの上に埋まった累積プルーフ・オブ・ワークに比例検証者集合の 1/3 以上の買収が必要

ビットコインが確率的ファイナリティを選んだのは、それが開放的で許可不要の参加者集合 — システムを検閲耐性にする決定的特性 — を可能にするためである。閉鎖的メンバーシップの BFT システムは即時ファイナリティを提供できるが、参加者が誰かを知ることが前提となり、ビットコインが排除するように設計された信頼の前提を、再び持ち込むことになる。

7. 二時代比較

機能サトシ時代 (v0.1、2009 年 1 月)現行 Bitcoin Core、v27 以降基準
ハッシュ関数SHA-256d (二重 SHA-256)同一
チェーン選択最大作業量チェーン (nChainWork)同一規則。永続的 nChainWork 追跡で実装を強化
難易度調整2,016 ブロックごと。一つ違い誤差あり同一アルゴリズム。一つ違い誤差は合意として保存(修正にはハードフォークが必要)
ブロックサイズ上限v0.1 になし。2010 年半ばに 1 MB 追加4 MWU 重量上限 (BIP 141)。実測約 1.5〜2 MB
コインベース成熟100 ブロックの成熟規則同一
ソフトフォーク有効化コード直接変更(フラグデー)BIP 9 バージョンビット / BIP 8 Speedy Trial
スクリプト検証scriptSig + scriptPubKey を結合して実行分離された評価。SegWit 証人プログラム。Taproot スクリプトパス支払い
タイムスタンプ検証前ブロックのタイムスタンプより大きいこと中央値時刻経過 (MTP) 規則: 直前 11 ブロックの中央値より大きいこと
チェックポイントハードコードされたブロックハッシュ(DoS 対策)assumevalid(信頼されたブロックハッシュ以下のスクリプト検証を省略)が大半のチェックポイント機能に置換
ヘッダー先行同期利用不可。ブロックを逐次ダウンロード・検証ヘッダー先行同期(全ヘッダーをダウンロードし、ブロックを並列要求)
暗号ライブラリーSHA-256 と ECDSA に OpenSSL内部 SHA-256(ハードウェアアクセラレーション対応)。ECDSA/シュノアに libsecp256k1

8. 本ページの範囲

本ページは合意形成層を独立して扱う。以下のトピックは本ページの範囲外であり、設計文書シリーズ内のそれぞれのドメインページで扱う: