Bitcoinの供給上限を越えた取引と、その履歴を拒んだノード
ブロック74,638には各92,233,720,368.54275808 BTCの二つの出力が入った。復旧にはコード修正だけでなく、修正版を動かすマイナーとノード、翌日に誤った履歴を追い越した別のチェーンが必要だった。

3点クイック要約
- 発端 / 逆説2010年8月15日17:05:57 UTC、ブロック74,638は各92,233,720,368.54275808 BTCの二つの出力、合計184,467,440,737.08551616 BTCを記録した。
- 決定的瞬間Jeff Garzikが異常を報告し、参加者は個別には正の出力を足した合計が負数へあふれる不具合を突き止めた。Gavin Andresenが応急案を投稿し、Satoshiが合意規則の修正を公開した。
- 歴史的結末0.3.10は問題の取引を無効にしたが、復旧にはマイナーとノード運用者の採用が必要だった。Satoshiは8月16日、修正チェーンが高さ約74,689で誤ったチェーンを追い越したと報告した。
出来事のタイムライン
正数である二つの出力の合計184,467,440,737.08551616 BTCが、旧検証経路では負数へあふれた。
Garzikはブロックデータを示し、巨大な出力と整数上限との関係を問いかけた。
短い試験の後、通貨範囲を越える出力を拒否するコードを投稿した。
21:40、Satoshiは各出力と累計を通貨範囲内か検査するリビジョン132を登録した。23:48にはオーバーフロー取引を拒否する0.3.10の実行ファイルを発表し、更新を求めた。
Satoshiは正常な履歴が高さ約74,689で先行し、旧版ノードもそこへ再編成したと報告した。
1. ブロック表示に現れたあり得ない金額
8月15日17:05:57 UTC、ブロック74,638は0.5 BTCの入力一つと、正確に92,233,720,368.54275808 BTCである出力二つを記録した。[1]
合計は184,467,440,737.08551616 BTC。「1,844億BTC」は規模を丸めた表現であり、正確な合計ではない。[1]
二つの出力はそれぞれ64ビット符号付き整数の上限直下だった。旧クライアントが足すと累計は-0.01 BTCへあふれた。その結果、入力をはるかに越す取引が通常額向けの検査を通り、ブロックのマイナーは通常の50 BTCに見かけ上の手数料0.51 BTCを加えた50.51 BTCを受け取った。[1]
2. 公開スレッドが驚きを原因究明へ変えた
Jeff Garzikは18:08にブロックデータを公開した。[1][2]
参加者は取引表示を再現し、負数になった合計を指摘した。採掘を止めた運用者もおり、解決まで取引を作成・受領しないよう警告が出た。残る記録から取引作成者や動機は分からず、ハッカーやマイナーによる意図的攻撃と断定する根拠はない。[1][2]
Gavin Andresenは20:39に短時間試験した修正案を投稿した。20分後、Satoshiは2,100万BTCを越える各出力と累計を拒否する広い案を示した。Gavinは妥当だと応じ、全員がチェーンを再取得せず問題ブロックを孤立させる方法も尋ねた。[2]
3. コードが先に変わり、認められる履歴は後で変わった
21:40、Satoshiはソースリポジトリのリビジョン132を登録したと告知した。[2][4]
現存するコミットは各出力とその合計に通貨範囲検査を加えている。旧版が受け入れた取引を修正版は拒否するため、検証規則を厳しくする変更だった。[2][4]
続いてSatoshiは0.3.10をビルドし、23:48に発表した。運用者は停止、更新、最後の正常履歴からの再開を相談し、古いチェーン写しと更新済みノードを共有した。修正版マイナーはブロック74,637の次から別の枝を伸ばした。リリースが規則を提示し、その規則に作業証明を与えたのは独立した運用者の選択だった。[2][3]
4. 復旧は夜を越えて続いた
8月16日02:16、Satoshiは修正枝に14ブロックができ、自分につながるノードの半数超が0.3.10だと報告した。ただし、その時点では正常枝の計算力が上回っただろうという見立てだった。[2]
12:59になって、正常枝が高さ約74,689で誤った枝を追い越し、旧版も現在高を返していると確認した。[2]
この順序は、しばしば一つにされる二つの節目を分ける。ブロック時刻の約4時間半後にソース修正が登録され、実行ファイルはさらに後だった。修正された作業証明履歴の追い越し確認は翌日である。放棄枝の通常取引は再収録され確認を積み直せたが、74,638以後の未成熟な採掘報酬は消えた。Satoshiが修正を公開し、複数のマイナーとノード運用者がその規則を採って復旧を完成させた。[2][3]
この事件から学ぶ重要教訓(Key Takeaways)
上限は個々の値と合計の両方で守る
旧経路は個別出力を通した一方、加算時のあふれを防げなかった。修正は累計にも通貨範囲検査を入れた。
修正公開だけでは台帳は変わらない
マイナーとノード運用者が新規則を実行し、修正枝に十分な作業証明を積んで初めて、その履歴が選ばれた。
素早い復旧でも確認数と報酬は動いた
通常取引は確認を積み直せた一方、放棄された枝で生じた未成熟の採掘報酬は消えた。運用上の影響は実在した。
続けて読みたいストーリー
同じテーマを、別の事例や背景から考えてみましょう。
出典・参考文献
- [1]出典 1: Bitcoin Forum:ブロック74,638の異常出力に関する第一報Bitcoin Forumアーカイブ · 2010-08-15
- [2]出典 2: Bitcoin Forum:オーバーフロー不具合の緊急対応スレッドBitcoin Forumアーカイブ · 2010-08-15
- [3]出典 3: Bitcoin Forum:0.3.10オーバーフロー修正版の発表Satoshi Nakamoto / Bitcoin Forumアーカイブ · 2010-08-15
- [4]出典 4: Bitcoinソース:ブロック74,638の出力オーバーフロー修正Bitcoinソースリポジトリ · 2010-08-15
- [5]出典 5: CVE-2010-5139の脆弱性詳細National Vulnerability Database, NIST


