ビットコイン技術中級

ソフトフォークとハードフォーク (Soft Fork & Hard Fork) - ルールを変える二つの方法

ビットコインにはアップデートボタンがありません。ルールを狭めるソフトフォークと広げるハードフォークはどう違い、なぜビットコインはソフトフォークにこだわるのか。

·10分

ビットコインには、アップデートボタンを押す会社がありません。それでもセグウィットタップルートは実際に導入されました。持ち主のいないシステムがどうやってルールを変えるのか。その答えがソフトフォークとハードフォークです。

違いは一文で整理できます。ソフトフォークはルールを狭め、ハードフォークはルールを広げます。この方向の違い一つが、チェーンが一つのまま残るか二つに割れるかを決めます。

合意ルールとは何か

すべてのノードは、ブロックを受け取るとルールの一覧に一つずつ照らして有効かどうかを判定します。ブロックの重みが上限を超えていないか、署名は正しいか、発行量は決められたとおりか、すでに使われた出力をまた使っていないか。この一覧が合意ルール(consensus rules)です。

ここで重要なのはルールそのものではなく、ルールが全員にとって同じでなければならないという点です。私のノードが有効と見たブロックをあなたのノードが無効と見るなら、二人はすでに別の通貨を使っています。プロトコル変更が厄介なのはここに理由があります。コードを直すことが難しいのではなく、世界中の数万台のノードが同じ判定を出し続けるようにすることが難しいのです。

ですからルール変更は「何を変えるか」よりも「変えた後も古いノードが新しいブロックを受け入れるか」で分類されます。

graph TB
  A["新ルールで作ったブロック"] --> B{"アップグレードしていない<br/>古いノードの判定"}
  B -->|"ソフトフォーク<br/>旧ルールも通る"| C["受理<br/>チェーンは一つのまま"]
  B -->|"ハードフォーク<br/>旧ルールに違反"| D["拒否<br/>チェーンが二つに分裂"]
  style C fill:#3fb950,stroke:#3fb950,color:#000
  style D fill:#f85149,stroke:#f85149,color:#000

ソフトフォーク: ルールを狭める

ソフトフォークは、以前は有効だったもののうち一部を無効にする変更です。新ルールで有効なブロックの集合が、旧ルールで有効なブロックの部分集合になります。

この方向であれば、アップグレードしていないノードも新しいブロックを問題なく受け入れます。新ルールを守ったブロックは、旧ルールも自動的に守っているからです。ソフトフォークが後方互換(backward compatible)と呼ばれ、全員が同時にアップグレードしなくてもネットワークが割れないのはこのためです。

ここで自然な疑問が生まれます。ルールを狭めるだけなのに、どうして新機能が追加されるのか。ビットコインはこの問題を巧みに迂回します。古いノードには「誰でも使える(anyone-can-spend)」と見える余地を確保し、新しいノードにだけ厳格な意味を与えるやり方です。

セグウィットとタップルートは、まさにこの方式で導入されました。古いノードはセグウィット出力を見て「条件なしに使える出力だ」と判断して通し、アップグレードしたノードは同じ出力に対して「署名が正しくなければ使えない」というより厳しい条件を強制します。古いノードの立場では何も破られていないので、拒否する理由がありません。

ただし、ただではありません。古いノードは新しいルールを検証できないので、その部分についてはマイナーを信頼する状態になります。ソフトフォークは検証の主権を少し猶予する代わりに、無停止のアップグレードを得る取引です。だからこそソフトフォークであっても、結局は各自がノードを上げるのが正しいのです。

もう一つ。ソフトフォークが安全であるためには、ハッシュレートの過半が新ルールを強制する必要があります。少数だけが強制すると、そのブロックはより長いチェーンに押されて孤児になります。活性化の過程でマイナーのシグナリングを待つのはこのためです。

ハードフォーク: ルールを広げる

ハードフォークは、以前は無効だったものを有効にする変更です。ブロックサイズの上限を1MBから8MBに上げたり、2,100万枚の発行上限を変えたり、新しい命令をスクリプトに追加したりすることがここに当たります。

この方向では、古いノードが新しいブロックを必ず拒否します。4MBのブロックは、1MBの上限を知っているノードにとっては単なるルール違反です。説得や交渉の余地はありません。ソフトウェアがそう判定するように書かれている、それだけです。

graph TB
  B0["ブロック N-1"] --> B1["ブロック N<br/>(最後の共通ブロック)"]
  B1 --> C1["ブロック N+1<br/>新ルールのチェーン"]
  B1 --> D1["ブロック N+1<br/>旧ルールのチェーン"]
  C1 --> C2["新ルールのチェーンが続く"]
  D1 --> D2["旧ルールのチェーンが続く"]
  style B1 fill:#f7931a,stroke:#f7931a,color:#000
  style C2 fill:#58a6ff,stroke:#58a6ff,color:#000
  style D2 fill:#8b949e,stroke:#8b949e,color:#000

結果はチェーンの分裂です。どちらか一方が静かに消えない限り、二つの台帳がそれぞれ育ち、分岐時点までの取引履歴を共有する二つのコインが生まれます。2017年にビットコインキャッシュが分かれたとき、既存の保有者に同じ数量の新しいコインが生じたのも魔法ではなくこれです。分岐以前の出力は、両方の台帳に同じように記されています。

ですからハードフォークは、事実上全員が同時にアップグレードして初めて成立します。調整コストが圧倒的に大きく、調整に失敗すれば通貨そのものが割れます。

なぜビットコインはソフトフォークにこだわるのか

技術的にはハードフォークのほうが綺麗な場合が多いです。セグウィットの証人割引のような複雑な迂回設計なしに、望むルールをそのまま書けばよいからです。それでもビットコインは2017年以降、すべてのプロトコル変更をソフトフォークで処理してきました。理由は技術ではなく、権力の問題です。

ハードフォークはユーザーに選択肢を与えません。アップグレードしなければネットワークから離脱させられるので、実質的には従うか去るかです。この性質が繰り返されると、ルールを提案する側が残りを引っ張っていけるようになります。強制アップグレードが慣行になったシステムでは、発行上限のような約束は「変わらないもの」ではなく「まだ変えていないもの」になります。

一方ソフトフォークでは、同意しない人も古いソフトウェアのまま残ることができます。拒否権がそれぞれの手に残り、変更を推し進める側が反対を説得しなければなりません。ビットコインの変化が遅いのは欠陥ではなく、この構造が意図した結果です。

活性化はどう行われるのか

ルールを決めたからといって、すぐに有効になるわけではありません。いつから強制するかも決めなければなりません。

BIP9バージョンビットは、マイナーがブロックヘッダのバージョン欄で賛成の合図を送り、2016ブロックの区間で95%を超えるとロックインされる方式です。セグウィットがこの方式を試みました。

UASF(ユーザー活性化ソフトフォーク)は、マイナーの合図を待たず、特定の日付から新ルールを守らないブロックを拒否するとノードが先に宣言する方式です。2017年のBIP148がその事例であり、最終的な権限がマイナーではなく経済的なノードにあることを示した出来事として記憶されています。

Speedy Trialはタップルートに使われた折衷案です。約3か月の短い窓を設け、難易度区間で90%のシグナリングを求めつつ、失敗しても静かに期限切れになるようにしました。活性化をめぐる論争が再び戦争になることを避けるための設計であり、実際にタップルートは2021年6月にロックインされ、11月のブロック709,632で活性化しました。

実際の事例

P2SH(2012年、BIP16)は初期の代表的なソフトフォークで、古いノードには条件なしの出力に見える場所を利用してスクリプトハッシュ方式を導入しました。CLTV(2015年、BIP65)とCSV(2016年、BIP112)はタイムロック命令を追加し、ライトニングネットワークの土台を築きました。セグウィット(2017年、BIP141)とタップルート(2021年、BIP341)もすべてソフトフォークです。

意図されたハードフォークの事例は、2017年8月1日のビットコインキャッシュです。ブロックサイズを8MBに上げ、チェーンが恒久的に分離しました。

意図しないハードフォークも一度ありました。2013年3月、バージョン0.8がデータベース層を変更したことで、古いバージョンにのみ存在したロック上限を超えるブロックが作られ、ブロック225,430付近でチェーンが分かれました。この出来事は、合意ルールが仕様書に書かれた文章ではなく、実際に動く実装の挙動であることを露わにしました。文書になかったデータベースの設定値さえ、合意ルールの一部だったのです。

よくある誤解

フォークがすなわち新しいコインの発行だという誤解があります。ソフトフォークはコインを作りません。新しいコインが生まれるのはチェーンが実際に分かれて生き残ったときだけであり、それも発行ではなく既存の台帳の複製です。

マイナーがルールを決めるという誤解もよくあります。マイナーはどのブロックを作るかを選ぶだけで、そのブロックが有効かどうかを判定するのはノードです。ルールを破ったブロックは、どれほど多くのプルーフ・オブ・ワークが入っていても拒否されます。2017年のUASFが証明したのは、まさにこの点です。

最後に、チェーンの分裂と再編成(reorg)は別の現象です。再編成は同じルールの下でより長いチェーンが現れて短いほうが捨てられる一時的な出来事であり、ハードフォークによる分裂はルールそのものが異なり、二つのチェーンが互いを永久に無効と見なす状態です。

関連する概念

  • セグウィット - anyone-can-spendの場所を活用したソフトフォークの代表例
  • タップルート - Speedy Trialで活性化された最も新しいソフトフォーク
  • ノード - ルールを実際に強制し、フォークの帰趨を決める主体
  • マイニングプール - 活性化のシグナリングでマイナーが担う役割
  • 2,100万枚の上限 - ハードフォークなしには変えられない発行上限

関連記事