
ビットコインの二重トランザクション:リスクが極めて小さい興味深いバグ
TechFlow厳選深潮セレクト

ビットコインの二重トランザクション:リスクが極めて小さい興味深いバグ
重複取引は混乱を引き起こす可能性があるため、ビットコインの開発者は長年にわたりさまざまな方法でこれと戦ってきました。

概要
通常のビットコイントランザクションは、過去のトランザクションID(TXID)を参照して、少なくとも1つの未使用出力(UTXO)を使用します。これらの未使用出力は一度しか使用できず、二度使われればダブルスペンディングが可能となり、ビットコイン自体の価値が失われてしまいます。しかし実際には、ビットコインのブロックチェーンには完全に同一のトランザクションが2組だけ存在しています。これは、コインベース・トランザクションが入力を一切持たず、新しく生成されたコインのみを持つためです。そのため、異なるマイナーが同じ数量を同じアドレスに送信し、まったく同じ方法で構築した場合、コインベース・トランザクションが完全に一致する可能性があります。こうしたトランザクションは同一であるため、そのTXIDも一致します。なぜならTXIDはトランザクションデータのハッシュ値だからです。TXIDが重複するもう一つの可能性はハッシュ衝突ですが、SHA256のような暗号学的に安全なハッシュ関数では、これは理論上ほぼ不可能とされ、実際にビットコインや他のシステムでハッシュ衝突が発生したことはありません。
この2組の重複トランザクションは、いずれも2010年11月14日08:37 UTCから2010年11月15日00:38 UTCまでの約16時間の間に発生しています。最初の重複ペアは、2番目のペアの間に挟まれる形で登場しています。我々はd5d2….8599を「最初の」重複トランザクションとして分類します。なぜなら、奇妙なことに、ブロックチェーン上では別の重複トランザクションe3bf….b468より後に初めて出現しているにもかかわらず、再現としては先に成立しているからです。
重複トランザクションの詳細
以下の画像は、mempool.spaceのブロックエクスプローラからのスクリーンショットで、1つの重複トランザクションが2つの異なるブロックに含まれている様子を示しています。


興味深いことに、関連するURLをWebブラウザに入力すると、mempool.spaceのブロックエクスプローラは、d5d2….8599については初期のブロックをデフォルトで表示し、一方e3bf….b468については後期のブロックをデフォルトで表示します。Blockstream.infoおよびBtcscan.orgもmempool.spaceと同じ挙動を示します。一方、Blockchain.comおよびBlockchair.comは基本的なテストによると異なる挙動をし、URLを入力した際に常に重複トランザクションの最新版を表示します。
関連する4つのブロックのうち、ただ1つ(ブロック91,812)だけが他のトランザクションを含んでいます。このトランザクションは、1 BTCと19 BTCの出力を統合し、20 BTCの出力を生成しています。
これらの出力は使用可能か?
同じTXIDを持つトランザクションが2つあるため、その後のトランザクションにおける参照に問題が生じます。各重複トランザクションの額は50 BTCです。したがって、これら4つの出力により合計4 × 50 BTC = 200 BTCが関与しており、あるいは見方によっては2 × 50 BTC = 100 BTCが関与していることになります。ある意味で、100 BTCは実質的に存在しません。今日まで、すべての200 BTCは未使用のままです。私たちの知る限り(ここでの理解が誤っている可能性もあります)、もし誰かがこれらの出力に関連する秘密鍵を所有しているならば、それらのビットコインを使用できるでしょう。しかし、一度使用されるとUTXOはデータベースから削除されるため、重複していた50 BTCは使用できなくなり失われるため、回収可能なのは最大100 BTCとなります。また、それらのコインが使用された場合、それがどちらのブロック(早い方か遅い方か)から引き出されるのかは、定義されていないか、または確定できない可能性があります。
誰かが重複トランザクションを作成する前にすべてのビットコインを支出し、その後に重複する出力を生成することで、UTXOデータベースに新しいエントリを作成することも理論上可能です。これにより、重複トランザクションだけでなく、既に支出済みの出力についても重複が生じる可能性があります。もしこれが起きた場合、それらの出力が使用される際にさらに多くの重複トランザクションが生成され、一種の「重複チェーン」が形成されるかもしれません。このような場合には、常に「支出→重複作成」という順序を守る必要があります。そうでなければ、ビットコインが永久に失われる危険があります。こうした新たな重複トランザクションはコインベースではなく、「通常の」トランザクションとなるでしょう。幸運にも、このような事態はこれまで一度も発生していません。
重複トランザクションの問題点
重複トランザクションは明らかに好ましくありません。ウォレットやブロックエクスプローラにとって混乱を招き、ビットコインの出所も不明瞭になります。また、さまざまな攻撃や脆弱性の原因にもなり得ます。例えば、あなたは同じ金額を2回支払い、相手に2回分のトランザクションを受け取らせることができます。その後、取引相手がその資金を使おうとしたとき、使えるのは半分だけかもしれないのです。これは取引所を破産させようとする攻撃に利用でき、攻撃者は入金後にすぐに出金することで何の損失もなく利益を得られる可能性があります。
重複TXIDを持つトランザクションの禁止
重複トランザクションの問題を緩和するため、2012年2月にビットコイン開発者のピーター・ウィーレがBIP30を提案しました。これはソフトフォークによる仕様変更で、以前のTXIDがすでに使用されている場合を除き、重複するTXIDを持つトランザクションを禁止するものです。このルールは2012年3月15日以降のすべてのブロックに適用されます。
2012年9月、ビットコイン開発者のグレッグ・マクスウェルがこのルールを修正し、BIP30のチェックを2012年3月15日以降だけでなくすべてのブロックに適用するようにしました。ただし、前述の2つの重複トランザクションは例外とされています。これによりいくつかのDoS脆弱性が修復されました。技術的にはこれもソフトフォークですが、変更内容が6ヶ月以上前のブロックにのみ影響するため、通常のプロトコル変更に伴うリスクはありませんでした。
BIP30のチェックは計算コストが高くなります。ノードは新区塊内のすべてのトランザクション出力を確認し、それらが出力端末(UTXOセット)にすでに存在しないかを調べる必要があります。おそらくこれが、Wuille氏が未使用出力のみにチェックを限定した理由です。すべての出力に対して行えば、コストはさらに高くなり、UTXOの刈り込み(pruning)もできなくなってしまいます。
BIP34
2012年7月、ビットコイン開発者ガビン・アンドリーセンはBIP34を提案し、2013年3月にアクティベートされました。このプロトコル変更により、コインベース・トランザクションにブロック高(block height)を含めることが義務付けられました。これにより、ブロックのバージョン管理も可能になります。ブロック高は、コインベースのscriptSigの最初の項目として追加されます。scriptSigの最初のバイトは、ブロック高を表現するために使用するバイト数を示し、続くバイトがブロック高そのものです。最初のc160年(223 /(1日144ブロック × 365日))の間、最初のバイトは0x03になります。そのため、現在のコインベース scriptSig(HEX)は常に03で始まっています。このソフトフォークにより、重複トランザクションの問題は事実上完全に解決され、すべてのトランザクションが一意になるようになりました。
BIP34が採用された後、2015年11月にビットコイン開発者アレックス・モロコスがBitcoin Coreリポジトリにプルリクエストを提出しました。この変更により、ノードはBIP30のチェックを停止するようになります。BIP34が問題を解決したため、高コストなチェックは不要になったからです。当時は知られていませんでしたが、技術的にはこれは非常に稀な将来のブロックに対するハードフォークでした。しかし、潜在的なハードフォークは実質的に重要ではありません。なぜなら、2015年11月以前のノードソフトウェアを実行している人はほとんどいないためです。forkmonitor.infoでは、2015年10月にリリースされたBitcoin Core 0.10.3を実行しています。つまり、これはハードフォーク前のルールであり、クライアントは依然として高コストなBIP30チェックを行っていたということです。
ブロック983,702の問題
実際、BIP34がアクティベートされる前のブロックの中には、偶然にもscriptSigの最初のバイトが将来有効なブロック高と一致してしまうものがありました。そのため、BIP34はほぼすべての場合で問題を解決しましたが、完全に100%の対策とはなっていませんでした。2018年、ビットコイン開発者のジョン・ニューベリーは、こうした潜在的な重複の完全なリストを公開しました。以下がその表です。


*注:これらのブロックは2012年および2017年にコインベース・トランザクションを生成しましたが、実際には重複していません。209,921番目のブロック(初の半減期まであと79ブロック)は重複しえません。なぜなら、その期間中BIP30が有効だったためです。
出典:https://gist.github.com/jnewbery/df0a98f3d2fea52e487001bf2b9ef1fd
年別:潜在的重複コインベース・トランザクションの数

出典:https://gist.github.com/jnewbery/df0a98f3d2fea52e487001bf2b9ef1fd
したがって、次に重複トランザクションが発生する可能性があるブロックは1,983,702で、約2046年1月に生成される予定です。2012年1月に生成されたブロック164,384のコインベース・トランザクションは、7つの異なる出力アドレスに合計170 BTCを送信しています。したがって、2046年のマイナーがこの攻撃を試みるには、まずそのブロックを幸運にも発見する必要があり、さらに170 BTC未満の手数料を燃やす必要があります。総コストは170 BTCをわずかに超え、0.09765625 BTCのブロック報酬の機会費用を含みます。現在のビットコイン価格88,500ドルで換算すると、1,500万ドル以上かかります。2012年のコインベース出力の7アドレスが誰に属するかは不明で、秘密鍵はおそらく失われています。現在、このコインベースの7つの出力アドレスはすべて使用済みです。うち3つは同一のトランザクションで使用されています。我々はこれらの資金がPirate40のポンジーシェームに関係している可能性があると考えますが、これはあくまで推測です。したがって、この攻撃は非常に高価であり、攻撃者にとってほとんど無意味なものだと考えられます。31年前の2015年11月のノードをネットワークからハードフォークで排除するには、莫大なコストがかかります。
次に重複の脆弱性があるブロックは、2012年3月の169,985番目です。このコインベースはわずかに50 BTC以上を支出しており、170 BTCよりはるかに少ない額です。もちろん、50 BTCは当時の報酬ですが、このコインベースが2078年に再現可能になる頃には、報酬ははるかに低くなっています。したがって、これを悪用するには、マイナーは約50 BTC相当の手数料を燃やす必要があります。そしてこれらの手数料は2012年の古い出力に送金しなければならないため、取り戻すことはできません。2078年のビットコイン価格がいくらになるか誰にもわかりませんが、この攻撃のコストも非常に高くなる可能性があります。したがって、この問題はビットコインの主要なリスクとは言えませんが、依然として懸念材料ではあります。
2017年のSegWitアップグレード以降、コインベース・トランザクションにはブロック内のすべてのトランザクションをコミットする機能も含まれるようになりました。しかし、BIP34以前のこれらのブロックにはwitness commitmentが含まれていません。したがって、重複するコインベース・トランザクションを生成するには、マイナーはブロックからすべてのSegWit出力のredeemトランザクションを除外しなければならず、これは攻撃の機会費用をさらに増大させます。なぜなら、ブロックが多くの手数料を支払う他のトランザクションを含められなくなるためです。
結論
重複トランザクションの再現には高い難易度とコストがかかり、利用可能な機会も非常に限られていることを考えると、このバグはビットコインの主要なセキュリティ問題とは言えません。とはいえ、関係する時間スケールや重複トランザクションの独自性を考えると、興味深いテーマではあります。それでも、長年にわたり開発者たちはこの問題に多くの時間を費やしてきました。2046年という日付は、一部の開発者にとってはこの問題を最終的に修正する期限となっているかもしれません。このバグを修正する方法はいくつかあり、ソフトフォークが必要となるでしょう。一つの可能性は、SegWitコミットメントの強制適用です。
TechFlow公式コミュニティへようこそ
Telegram購読グループ:https://t.me/TechFlowDaily
Twitter公式アカウント:https://x.com/TechFlowPost
Twitter英語アカウント:https://x.com/BlockFlow_News














