message: [test] Allow rebroadcast for same-txid-different-wtxid transactions
diff: @@ -16,6 +16,7 @@ from test_framework.messages import (
  CTxOut,
  sha256,
  )
  +from test_framework.p2p import P2PTxInvStore
  from test_framework.script import (
  CScript,
  OP_0,
  @@ -62,6 +63,8 @@ class MempoolWtxidTest(BitcoinTestFramework):
  parent_txid = node.sendrawtransaction(hexstring=raw_parent, maxfeerate=0)
  node.generate(1)
  + peer_wtxid_relay = node.add_p2p_connection(P2PTxInvStore())
  +
  # Create a new transaction with witness solving first branch
  child_witness_script = CScript([OP_TRUE])
  child_witness_program = sha256(child_witness_script)
  @@ -87,10 +90,13 @@ class MempoolWtxidTest(BitcoinTestFramework):
  assert_equal(child_one_txid, child_two_txid)
  assert child_one_wtxid != child_two_wtxid
  - self.log.info("Submit one child to the mempool")
  + self.log.info("Submit child_one to the mempool")
  txid_submitted = node.sendrawtransaction(child_one.serialize().hex())
  assert_equal(node.getrawmempool(True)[txid_submitted]['wtxid'], child_one_wtxid)
  + peer_wtxid_relay.wait_for_broadcast([child_one_wtxid])
  + assert_equal(node.getmempoolinfo()["unbroadcastcount"], 0)
  +
  # testmempoolaccept reports the "already in mempool" error
  assert_equal(node.testmempoolaccept([child_one.serialize().hex()]), [{
  "txid": child_one_txid,
  @@ -108,9 +114,18 @@ class MempoolWtxidTest(BitcoinTestFramework):
  # sendrawtransaction will not throw but quits early when the exact same transaction is already in mempool
  node.sendrawtransaction(child_one.serialize().hex())
  +
  + self.log.info("Connect another peer that hasn't seen child_one before")
  + peer_wtxid_relay_2 = node.add_p2p_connection(P2PTxInvStore())
  +
  + self.log.info("Submit child_two to the mempool")
  # sendrawtransaction will not throw but quits early when a transaction with the same non-witness data is already in mempool
  node.sendrawtransaction(child_two.serialize().hex())
  + # The node should rebroadcast the transaction using the wtxid of the correct transaction
  + # (child_one, which is in its mempool).
  + peer_wtxid_relay_2.wait_for_broadcast([child_one_wtxid])
  + assert_equal(node.getmempoolinfo()["unbroadcastcount"], 0)
  if __name__ == '__main__':
  MempoolWtxidTest().main()
  