Develop with pleasure!

福岡でCloudとかBlockchainとか。

Bitcoinのブロック1,983,702 問題

Bitcoin Optechのニュースレター#296で、コンセンサスクリーンアップの提案が再検討されているという話の一部に、ブロック1,983,702問題が取り上げられていたので、その内容について。

BitcoinのUTXOは、そのアウトプットが含まれるトランザクションのTXIDとトランザクション内のそのアウトプットのインデックスで識別される。そのためチェーン上でUTXOを一意に識別できるようになっている必要があるけど、TXIDが同じ値になるような重トランザクションが作成されるとUTXOの一意な識別ができなくなってしまう。

TXIDの重複

TXIDはトランザクションデータから生成されるハッシュ値であるため、通常の支払いに使用するトランザクションのTXIDが重複するようなことは確率的にほぼないけど、コインベーストランザクションについては(インプットが参照する)親トランザクションが存在しないため、同じTXIDを持つトランザクションを作るのは簡単になる。

過去、実際にTXIDが重複するコインベーストランザクションが作成されている↓

TXIDが重複したUTXOはどうなる?

これは重複するトランザクションが作成されたタイミングによって挙動が変わる。

  • 重複するトランザクションを作成する前に、先に作成したUTXOを使用していた場合、重複トランザクションのUTXOも使用可能。
  • 重複トランザクションが作成された段階で、先に作成したUTXOも未使用であった場合、既存のコインベースのUTXOが上書きされ1つがUTXOとして認識されなくなる。

↑の実際の重複では、いずれも後者のケースなので2つのコインベースのマイニング報酬(100 BTC)がGoxしたことになる。

そして前者のケースはまた別の問題が発生する。同じTXIDのUTXOのコインを使用するトランザクションは、まったく同じものが後者のトランザクションでも使用できるので、両者の子トランザクションにおいてTXIDの重複を再度発生させることができる。さらにそのトランザクションに複数のアウトプットがある場合、大量の重複トランザクションの再生産が可能になってしまう。

重複に対する対応

↑が発生したことから

BIP-30

まず、TXIDの重複を禁止するBIP-30が導入された。タイムスタンプが2012 年 3 月 15 日 00:00 UTC以降のブロックに対して、チェーン内の未使用なUTXOと同じTXIDを持つトランザクションをブロックに含めることはできないというコンセンサスルールを追加した。*1

BIP-34

その後、BIP-34の導入により、コインベーストランザクションのscriptSigの先頭にそのブロック高をセットするというコンセンサスルールが追加され、ブロック227836から適用されるようになった。

ブロック1,983,702問題

BIP-34のルールの導入により、同一のTXIDを持つコインベーストランザクションを作成することが困難になったため、BIP-30のチェックで発生するDBアクセスを考慮し、Bitcoin Core 0.12.0からBIP-30のチェックがスキップされるようになった↓

github.com

しかし、その後BIP-34の欠陥が見つかる。BIP-34適用前のブロックにおいて、将来のブロックのブロック高がscriptSig内にエンコードされているブロックが複数存在することが発覚した。その最初のブロックがブロック高1,983,702のブロック(20年以上先のブロック)。

問題のコインベースは、ブロック164,384に存在する↓

https://blockstream.info/tx/3aa03753fc238b38f4db9e5889362f3a6f0900d602baa8c9a7e789cb13ca1462?expand

scriptSigの先頭にd6441eとある。このリトルエンディアンの値が1,983,702。

そのため、ブロック高1,983,702でTXIDが重複するコインベーストランザクションが作成される可能性がある。ただ、ブロック164,384のコインベーストランザクションと同じトランザクションを作成するには、

  • コインベーストランザクションで、170BTC近くを手数料として収集する必要がある。
  • マイナーはブロック164,384のコインベースと全く同じ金額を同じ宛先に送付する必要がある
  • Segwitトランザクションはマイニングしてはならない。

といったかなり高いハードルがあり、現実的には無理だろう。

適用済みの対策

しかし、実際に作れてしまうとBIP-30に違反するブロックを作成してしまうことになるため、Bitcoin Core 0.17.0でブロック高1,983,702以降では再度BIP-30のチェックを実行する変更が入っている↓

github.com

今後の対応

ブロック高1,983,702以降では再度BIP-30チェックが実行されるようになっているものの、BIP-30チェックによるオーバーヘッドは減らしたい。ということで、BIP-34を改良してコインベーストランザクションに追加のデータを含めるようなコンセンサスを追加しようというのが、冒頭のコンセンサスクリーンアップの提案の中の1つ。

参考

*1:その後、このタイムスタンプからだいぶ経過したところで、↑の違反ケースを除くすべてのブロックにこのルールが適用された