Add functional test exercising tx downloadman recently confirmed filter

This documents existing behaviour before the change in the following
commit: The bloom filter maintained by the txdownload manager tracks
recently confirmed transasctions even during ibd. If a peer sends an INV
once IBD is over it does not re-request them.

Co-authored-by: sedited <seb.kung@gmail.com>
This commit is contained in:
Lőrincandsedited authored and sedited committed 2026-02-22 13:03:52 +01:00
1 parent 1c2f164d34
commit ce8b692897
1 file changed
+16
+16
View File
@@ -11,6 +11,7 @@
from decimal import Decimal from decimal import Decimal
import time import time
from test_framework.blocktools import create_block, create_coinbase
from test_framework.messages import ( from test_framework.messages import (
CInv, CInv,
COIN, COIN,
@@ -48,6 +49,12 @@ class P2PIBDTxRelayTest(BitcoinTestFramework):
self.wait_until(lambda: all(peer['minfeefilter'] == MAX_FEE_FILTER for peer in node.getpeerinfo())) self.wait_until(lambda: all(peer['minfeefilter'] == MAX_FEE_FILTER for peer in node.getpeerinfo()))
self.nodes[0].setmocktime(int(time.time())) self.nodes[0].setmocktime(int(time.time()))
self.log.info("Mine one old block so we stay in IBD, then remember its coinbase wtxid")
block = create_block(int(self.nodes[0].getbestblockhash(), 16), create_coinbase(1), int(time.time()) - 2 * 24 * 60 * 60)
block.solve()
self.nodes[0].submitblock(block.serialize().hex())
assert self.nodes[0].getblockchaininfo()['initialblockdownload']
ibd_wtxid = int(self.nodes[0].getblock(f"{block.hash_int:064x}", 2)["tx"][0]["hash"], 16)
self.log.info("Check that nodes don't send getdatas for transactions while still in IBD") self.log.info("Check that nodes don't send getdatas for transactions while still in IBD")
peer_inver = self.nodes[0].add_p2p_connection(P2PDataStore()) peer_inver = self.nodes[0].add_p2p_connection(P2PDataStore())
@@ -82,6 +89,15 @@ class P2PIBDTxRelayTest(BitcoinTestFramework):
assert not node.getblockchaininfo()['initialblockdownload'] assert not node.getblockchaininfo()['initialblockdownload']
self.wait_until(lambda: all(peer['minfeefilter'] == NORMAL_FEE_FILTER for peer in node.getpeerinfo())) self.wait_until(lambda: all(peer['minfeefilter'] == NORMAL_FEE_FILTER for peer in node.getpeerinfo()))
self.log.info("Check that txs confirmed during IBD are in the recently-confirmed filter once out of ibd")
peer_inver = self.nodes[0].add_p2p_connection(P2PDataStore())
peer_inver.send_and_ping(msg_inv([CInv(t=MSG_WTX, h=ibd_wtxid)]))
self.nodes[0].bumpmocktime(NONPREF_PEER_TX_DELAY)
peer_inver.sync_with_ping()
with p2p_lock:
assert ibd_wtxid not in peer_inver.getdata_requests
self.nodes[0].disconnect_p2ps()
self.log.info("Check that nodes process the same transaction, even when unsolicited, when no longer in IBD") self.log.info("Check that nodes process the same transaction, even when unsolicited, when no longer in IBD")
peer_txer = self.nodes[0].add_p2p_connection(P2PInterface()) peer_txer = self.nodes[0].add_p2p_connection(P2PInterface())
with self.nodes[0].assert_debug_log(expected_msgs=["was not accepted"]): with self.nodes[0].assert_debug_log(expected_msgs=["was not accepted"]):