再編成時にTRUCの「兄弟エビクション」ルールが発動することによるmempoolの不整合の詳細を開示します。 修正は2025年10月10日にBitcoin Core v30.0でリリースされました。影響を受けるバージョンは28.0から28.2 および29.0から29.1です。

この問題の重大度は 高 と見なされています。

詳細

トランザクションリレーポリシーは、バージョン3(「TRUC」)トランザクションに追加のトポロジー制限を適用します (BIP 431参照)。具体的には、TRUCトランザクションは、 未承認の祖先を最大1つ、未承認の子孫を最大1つまでしか持つことができません。これらはmempoolのポリシールールであり、 コンセンサスルールではないため、有効なブロックでは、TRUC形式の親が複数の子を持つようなトポロジーも許容されます。 mempoolに送信されたトランザクションがTRUCの親に2つ目の未承認の子を追加することになる場合、 Bitcoin Coreの「兄弟エビクション」ロジック(v28.0で導入)は、既存の子を置換候補として扱い、 新しいトランザクションが十分な手数料を支払っていれば、RBF(replace-by-fee)のルールに基づいて既存の子をmempoolから排除します。

チェーンの再編成が発生すると、再編成により切り離されたブロックに含まれていたトランザクションは bypass_limits=trueという設定でmempoolに再追加されます。 これは、mempoolに対するDoS攻撃対策やトポロジーのポリシーを適用することなく、 以前承認されていたトランザクションを忠実に復元するための仕組みです。 今回のバグは、兄弟エビクションの処理がbypass_limitsで制御されておらず、 トランザクションの再追加中にもTRUC制限の適用が実行されてしまうことでした。

再編成によって、TRUCの子孫制限に違反するトランザクションのトポロジー、つまりブロック内では有効だが mempool内では形成不可能なトポロジーが復元される場合があります。 兄弟エビクションが有効なままこのようなトランザクションを再追加すると、 復元されたトランザクションが排除されてしまう一方で、mempool内のその子孫は残されたままになるという事態が生じます。 その結果、mempool内に、もはや存在しないアウトプットを使用しようとするトランザクションが残ることになります。

この不整合な状態が生じると、マイナーがブロックテンプレートを作成できなくなります。 組み立てられたテンプレートは有効性チェックに失敗するため、このような再編成を行ったノードは、 mempoolを整合性のある状態で再読み込みする再起動を行うまで、ブロックを生成できなくなります。 この問題はPR #33504で、TRUCのチェックをbypass_limitsで制御することにより修正され、 再編成時の再追加中に兄弟エビクションが実行されることはなくなりました。

貢献

この問題はNiklas Goeggeによって発見され、責任ある開示が行われました。

タイムライン

  • 2025-09-26 - Niklas GoeggeがBitcoin Coreのセキュリティメーリングリストにこの問題を報告
  • 2025-09-29 - Greg Sandersが修正を含むPR #33504をオープン
  • 2025-10-02 - PR #33504がmasterにマージされる
  • 2025-10-03 - 修正がPR #33474で29.xブランチにバックポートされる
  • 2025-10-06 - 修正がPR #33473で30.xブランチにバックポートされる
  • 2025-10-07 - 修正がPR #33535で28.xブランチにバックポートされる
  • 2025-10-10 - Bitcoin Core 30.0が修正と共にリリースされる
  • 2025-10-14 - Bitcoin Core 29.2が修正と共にリリースされる
  • 2025-10-17 - Bitcoin Core 28.3が修正と共にリリースされる
  • 2026-10-27 - 最後の脆弱なBitcoin Coreバージョン(29.x)がEoLを迎える
  • 2026-11-10 - 開示