ビットコイン・インスティテュート

2013年3月の​チェーン分岐 — 0.7が​受け入れられない​ブロックを​0.8が​受け入れ、​二つの​プールが​引き返す

濃紺の背景の図。一列のブロックが225,430の位置で二つに分かれる。上の金色の枝はLevelDBの0.8でハッシュパワー約60%、先のブロックは薄れて孤立する。下の青緑の枝はBerkeley DBの0.7で、伸び続けて一本のチェーンとしてつながる。BTC GuildとSlushが0.8から0.7へ移る札が添えられている。

2013年3月11日、ビットコイン0.8.0で動くマイナーが、高さ225,430のブロックを作った。ギャビン・アンドレセンは、その夜の開発者のIRCのチャンネルで、これを「998,081バイト、1700件超のトランザクションのブロック」と書いた。0.8のノードはこれを受け入れ、その上にブロックを積み続けた。0.7以前のノードはこれを退け、自分たちのチェーンを掘り続けた。誰かが書いたルールのどれにも、このブロックを無効とするものはなく、二つのチェーンはひとりでには一つに戻らなかった。

誰も書いていなかったルール

アンドレセンが9日後に書いた事後検証のBIP 50は、分岐の原因をデータベースの設定にたどった。0.8より前の版はブロックの索引をBerkeley DBに置き、これほど多くのトランザクションの入力を持つブロックを処理するには足りないロックの数しか設定していなかった。ピーター・ウィーユは、チャンネルで、このブロックがトランザクションの索引の項目を5,000件以上動かしたことを突き止めた。0.8は、保存の設計書が書く移行で、そのデータをLevelDBに移しており、LevelDBにはそのような制限がなかった。BIP 50の言葉では、ロックの制限は「ブロックの有効性を決めるネットワークの合意のルールに、暗黙のうちになっていた」。

誰もこの制限に当たらなかったのは、誰もそのようなブロックを作らなかったからだった。最大の大きさのブロックはテストネットで問題なく通っており、0.7より前は、手を加えていないマイニングのノードが自分のブロックを500,000バイトに制限していた。0.7でこの目標が設定できるようになり、分岐の前の週には、マイナーはそれを上げるよう勧められていた。

長いチェーンか、古いチェーンか

0.8のチェーンにはハッシュパワーの約60%があり、長いのはこちらだった。ビットコインでは、ふつうは長いチェーンが勝つ。最初にそう言った。

ギャビン・アンドレセン(#bitcoin-devのIRC、2013年3月11日)

ビットコインの第一のルール。ハッシュパワーの多数派が勝つ

ウィーユは1分後に、今回は違うと答えた。古いソフトウェアで動いているノードは、どれほど作業量を積んでも長いほうのチェーンを退けるからである。

ピーター・ウィーユ(#bitcoin-devのIRC、2013年3月11日)

ハッシュパワーの多数派が勝つ、には反対だ。これはハードフォークだ。多数派というだけでは足りない

ウィーユは続けて、「マイニングの力の90%が0.8にあっても、古いクライアントの加盟店はみな危険にさらされる」、「まともな選択は一つしかない。全員が受け入れると今わかっているチェーンを作ることだ」と書いた。ルーク・ダッシュジュニアは、すでにプールの運営者に連絡を取り、マイナーに版を戻すよう勧めることで一致できないかと開発者に求めていた。グレゴリー・マクスウェルは、その理屈を一行にまとめた。「これはハードフォークだ。いちばん低い共通の水準が受け入れるチェーンで一貫させる必要がある」。

BTC Guildの運営者は、自分の数えでは0.8のチェーンのハッシュパワーの約半分をこのプールが出しており、プールだけで過半数を0.7に戻せる、確認さえもらえればやる、とチャンネルに書いた。ジェフ・ガージックとウィーユがそれに応じ、少し前に後戻りは間違いだと言っていたアンドレセンも加わった。「0.7のチェーンにきれいに戻せるなら、こちらからも了承だ」。

引き返す

BTC Guildは支払いを止め、0.8より前のブロックチェーンをサーバーに写し、0.7に切り替えた。プールで0.8のノードを動かしていたマレク・パラティヌスもチャンネルに現れ、ガージックに「0.7のチェーンに切り替える」と告げられて、何をすればよいかを尋ねた。BIP 50は、二人が「かなりの額の資金を犠牲にすることになったにもかかわらず」ノードをすばやく戻したと記している。二つのプールが0.8のチェーンで見つけたブロックは、どれも孤立ブロックになるからである。

アンドレセンはネットワークにアラートを流した。チャンネルでのガージックの助言は、多くの利用者に必要な形だった。「加盟店は取引の処理を止める。マイナーは0.7で掘る。それ以外の人はただ待つ」。取引所は入金を止め、BitPayは支払いを止めた。0.7のチェーンの作業量が上回ると、0.8のノードはひとりでにそちらへ再編成し、0.8のチェーンのブロックは孤立ブロックとして残った。BTC Guildの運営者は、最初の分岐のブロックからここまでを約6時間半とした。BIP 50によれば、この間に大きな二重支払いが一件あり、それは可能かどうかを試した人によるものだった。

20130.8.0のマイナーがブロック225,430を作る (3月11日)IRCで0.7のチェーンを選びBTC GuildとSlushが版を戻す(3月11日〜12日)0.8.1がこうしたブロックを一時のルールで退ける(3月17日)BIP 50 事後検証(3月20日)ブロック252,451でパッチのない古いノードが分かれる (8月16日)2013年3月のチェーン分岐

その後に変わったこと

3月17日に署名された0.8.1は、「0.7.2以前の版との非互換を避けるための一時的なブロック検証のルール」を入れた。2か月のあいだ、10,000を超えるロックを必要としそうなブロックを退け、自分が作るブロックを500,000バイトに抑え、古い版向けのパッチはロックの上限を引き上げた。同じ事後検証は、アラートの鍵を誰が持つかを見直し、サービスがアラートに応じられるよう-alertnotifyのオプションを加えた。2013年8月16日、ブロック252,451がメインのネットワークに受け入れられ、パッチを当てていない古いソフトウェアのノードは分かれた。

2年半前のバリュー・オーバーフロー事件では、修正はサトシから来て、勝ったのはサトシの直したクライアントが積んだチェーンだった。2013年3月には、修正はIRCのチャンネルにいた数人の開発者と二つのプールの運営者から来て、勝ったのは短いほうのチェーンだった。あの夜、書いてあるかどうかにかかわらず、いちばん古い動いているソフトウェアが退けるものもビットコインのルールに含まれることが、はっきりした。そして、ネットワークを一つに保ったのは、それを守るために資金を払った二人だった。

原典の外部ソース

https://github.com/bitcoin/bips/blob/master/bip-0050.mediawiki

他の外部ソース