ビットコインの繰り返し取引:リスクが非常に小さい興味深いバグ
原文标题:《Bitcoinの重複トランザクション》
原文来源:BitMEX Research
编译:BlockBeats
ビットコインのブロックチェーンには、完全に同じ2つのトランザクションのセットが存在し、一方のトランザクションがもう一方のトランザクションを「挟んで」います。これらは2010年11月中旬に発生しました。重複トランザクションは混乱を引き起こす可能性があり、ビットコインの開発者たちは長年にわたりさまざまな方法でこれに対処してきました。この問題はまだ100%解決されておらず、次の潜在的な重複トランザクションは2046年に発生する可能性があります。重複トランザクションに関連するリスクは現在非常に小さいですが、考える価値のある興味深いバグです。
概要
通常のビットコイントランザクションは、前のトランザクションのトランザクションID(TXID)を参照することで、少なくとも1つの前のトランザクションの出力を使用します。これらの未使用の出力は一度だけ使用でき、もし二度使用できるなら、ビットコインは二重支払いを可能にし、価値がなくなります。しかし、ビットコインには実際に完全に同じ2つのトランザクションのセットが存在します。この状況が発生する理由は、コインベーストランザクションにはトランザクション入力がなく、新しく生成されたコインがあるためです。したがって、異なる2つのコインベーストランザクションが同じ金額を同じアドレスに送信し、完全に同じ方法で構築される可能性があります。これらのトランザクションが同じであるため、TXIDも一致します。TXIDがコピーされる唯一の他の方法はハッシュ衝突であり、暗号的に安全なハッシュ関数にとっては、これは非常に起こりにくく、実現不可能と見なされています。SHA256のようなハッシュ衝突は、ビットコインや他のどこでも発生したことはありません。
この2つの重複トランザクションは、2010年11月14日08:37 UTCから2010年11月15日00:38 UTCの間に、約16時間の間に発生しました。最初の重複トランザクションは、2番目のトランザクションの間に挟まれています。d5d2….8599を最初の重複トランザクションとして分類しますが、これは最初にコピー品となったためです。奇妙なことに、これは別の重複トランザクションe3bf….b468の後にブロックチェーン上に初めて現れました。
重複トランザクションの詳細
以下の画像には、mempool.spaceブロックエクスプローラーからの2つのスクリーンショットが表示されており、最初の重複トランザクションが2つの異なるブロックで繰り返し現れる様子が示されています。
興味深いことに、関連するURLをウェブブラウザに入力すると、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 x 50 BTC = 200 BTC、または異なる理解の仕方によっては2 x 50 BTC = 100 BTCに関与している可能性があります。ある意味で、100 BTCは実際には存在しません。
今日現在、200 BTCはすべて未使用です。私たちの知る限り(ここで間違っている可能性がありますが)、もし誰かがこれらの出力に関連付けられた秘密鍵を持っていれば、彼らはこれらのビットコインを使用することができます。しかし、一度使用されると、UTXOはデータベースから削除され、重複した50 BTCは使用できなくなり失われるため、回収できるのは100 BTCだけです。これらのコインが使用された場合、それらはどのブロックから来るのか、早いものか最近のものかは未定義または不明確である可能性があります。
この人は重複トランザクションを作成する前にすべてのビットコインを使用し、その後重複出力を作成し、未使用出力のデータベースに新しいエントリを作成することができたかもしれません。これは、重複トランザクションだけでなく、重複した使用済み出力の重複トランザクションが存在する可能性を意味します。この場合、これらの出力が使用されると、さらに多くの重複トランザクションが作成され、重複の連鎖が形成される可能性があります。人々はイベントの順序に注意を払う必要があり、常に重複を作成する前に使用しなければなりません。さもなければ、ビットコインは永遠に失われる可能性があります。これらの新しい重複トランザクションはコインベーストランザクションではなく、「通常の」トランザクションになります。幸いなことに、このような状況はこれまでに発生したことはありません。
重複トランザクションの問題
重複トランザクションは明らかに良くありません。これらはウォレットやブロックエクスプローラーに混乱をもたらし、ビットコインの出所を不明瞭にします。また、多くの攻撃や脆弱性を引き起こす可能性があります。例えば、あなたは2つの重複したトランザクションで誰かに2回支払うことができます。そして、取引相手がこの資金を使用しようと決定した場合、彼らは回収できる資金が半分しかないことに気づくかもしれません。例えば、これは取引プラットフォームへの攻撃であり、攻撃者は損失を被ることなく、入金後すぐに資金を引き出すことができます。
重複TXIDを使用したトランザクションの禁止
重複トランザクションの問題を軽減するために、2012年2月、ビットコイン開発者のPieter WuilleはBIP30ソフトフォーク提案を行い、前のTXIDが使用されていない限り、重複TXIDを使用したトランザクションを禁止しました。このソフトフォークは2012年3月15日以降のすべてのブロックに適用されます。
2012年9月、ビットコイン開発者のGreg Maxwellはこのルールを修正し、BIP30チェックをすべてのブロックに適用することにしました。これは2012年3月15日以降のブロックだけでなく、前述の2つの重複トランザクションを除きます。これにより、いくつかのDOS脆弱性が修正されました。技術的には、これは再びソフトフォークですが、ルールの変更は過去6か月以上のブロックにのみ適用されるため、通常のプロトコルルールの変更に関連するリスクは存在しません。
このBIP30チェックの計算コストは非常に高いです。ノードは新しいブロック内のすべてのトランザクション出力をチェックし、これらの出力エンドポイントがUTXOに存在するかどうかを確認する必要があります。これがWuilleが未使用の出力のみをチェックする理由かもしれません。すべての出力をチェックすると計算コストが高くなり、プルーニングができなくなります。
BIP34
2012年7月、ビットコイン開発者のGavin AndresenはBIP34ソフトフォーク提案を行い、2013年3月に有効化されました。このプロトコル変更により、コインベーストランザクションにはブロック高が含まれる必要があり、ブロックバージョン管理も可能になりました。ブロック高はコインベーストランザクションスクリプトSigの最初の項目として追加されました。コインベースscriptSigの最初のバイトはブロック高の数字に使用されるバイト数であり、次のバイトがブロック高の数字そのものです。最初のc160年(223 /(1日144ブロック×1年365日))では、最初のバイトは0x03である必要があります。これが今日のコインベースScriptSig(HEX)が常に03で始まる理由です。このソフトフォークは重複トランザクションの問題を根本的に解決したようで、現在すべてのトランザクションは一意であるべきです。
BIP34が採用されたため、2015年11月、ビットコイン開発者のAlex Morcosはビットコインコアソフトウェアリポジトリにプルリクエストを追加しました。この変更により、ノードはBIP30チェックを停止します。結局のところ、BIP34がこの問題を修正したので、この高価なチェックはもはや必要ありませんでした。当時はまだ知られていませんでしたが、技術的には将来の非常にまれなブロックのためのハードフォークでした。現在では、潜在的なハードフォークは重要ではないように見えます。なぜなら、2015年11月以前のノードソフトウェアを実行している人はほとんどいないからです。forkmonitor.infoでは、2015年10月にリリースされたBitcoin Core 0.10.3を実行しています。したがって、これはハードフォーク前のルールであり、クライアントは依然として高価なBIP30チェックを行っています。
ブロック983,702の問題
実際、BIP34が有効化される前のブロックにはいくつかのコインベーストランザクションがあり、そのときに使用されたscriptSigsの最初のバイトが将来有効なブロック高と一致していました。したがって、BIP34はほぼすべてのケースでこの問題を修正しましたが、完全に100%修正されたわけではありません。2018年、ビットコイン開発者のJohn Newberyは、これらの潜在的な重複の完全なリストを印刷しました。以下の表に示します。
*注:これらのブロックは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ドルで計算すると、1500万ドル以上の費用がかかります。2012年のコインベーストランザクションの7つのアドレスが誰のものであるかは現在不明であり、鍵は失われている可能性が高いです。現在、このコインベーストランザクションの7つの出力アドレスはすべて使用されており、そのうち3つは同じトランザクションで使用されています。私たちはこれらの資金がPirate40のポンジスキームに関連している可能性があると考えていますが、これはあくまで推測です。したがって、この攻撃は非常に高価であり、攻撃者にとってほとんど無意味に見えます。31年前の2015年11月のノードをネットワークから削除するためのハードフォークは、かなりの出費となるでしょう。
次に複製される可能性のある脆弱なブロックは2012年3月の169985です。このコインベースはわずかに50 BTCを超える金額を使用しており、170 BTCを大きく下回っています。もちろん、50 BTCは当時の補助金であり、このコインベーストランザクションが2078年に重複しやすくなるとき、補助金ははるかに低くなります。したがって、これを利用するには、マイナーは約50 BTCの費用を焼き払う必要がありますが、これらの費用は回収できません。なぜなら、これらの費用は2012年の古い出力に送信されなければならないからです。2078年のビットコインの価格がどうなるかは誰にもわかりませんが、この攻撃のコストも非常に高くなる可能性があります。したがって、この問題はビットコインの主要なリスクではないかもしれませんが、依然として懸念材料です。
2017年のSegWitアップグレード以降、コインベーストランザクションには、1つのブロック内のすべてのトランザクションに対するコミットメントを含めることもできます。これらのBIP34以前のブロックには、証人コミットメントが含まれていません。したがって、重複したコインベーストランザクションを生成するには、マイナーはブロックから任意のSegWit出力のリデンプショントランザクションを除外する必要があり、これにより攻撃の機会コストがさらに増加します。なぜなら、ブロックには他の多くの支払い手数料のトランザクションを含めることができない可能性があるからです。
結論
重複トランザクションの難易度とコスト、およびそれを利用する機会が非常にまれであることを考慮すると、この重複トランザクションの脆弱性はビットコインの主要なセキュリティ問題ではないようです。しかし、関与する時間スケールと重複トランザクションの新規性を考えると、考える価値はあります。それにもかかわらず、開発者たちはこの問題に多くの時間を費やしてきました。2046年という日付は、一部の開発者にとってこの問題を修正するための最終期限かもしれません。このバグを修正する方法はいくつかあり、ソフトフォークが必要になる可能性があります。修正方法の1つは、SegWitコミットメントを強制することです。