mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-15 16:38:23 +01:00
test: send duplicate blocktxn message in p2p_compactblocks.py
Add test_multiple_blocktxn_response that checks that the peer is
disconnected.
Github-Pull: #33296
Rebased-From: 8b62647680
This commit is contained in:
@@ -566,6 +566,42 @@ class CompactBlocksTest(BitcoinTestFramework):
|
|||||||
test_node.send_and_ping(msg_block(block))
|
test_node.send_and_ping(msg_block(block))
|
||||||
assert_equal(int(node.getbestblockhash(), 16), block.sha256)
|
assert_equal(int(node.getbestblockhash(), 16), block.sha256)
|
||||||
|
|
||||||
|
# Multiple blocktxn responses will cause a node to get disconnected.
|
||||||
|
def test_multiple_blocktxn_response(self, test_node):
|
||||||
|
node = self.nodes[0]
|
||||||
|
utxo = self.utxos[0]
|
||||||
|
|
||||||
|
block = self.build_block_with_transactions(node, utxo, 2)
|
||||||
|
|
||||||
|
# Send compact block
|
||||||
|
comp_block = HeaderAndShortIDs()
|
||||||
|
comp_block.initialize_from_block(block, prefill_list=[0], use_witness=True)
|
||||||
|
test_node.send_and_ping(msg_cmpctblock(comp_block.to_p2p()))
|
||||||
|
absolute_indexes = []
|
||||||
|
with p2p_lock:
|
||||||
|
assert "getblocktxn" in test_node.last_message
|
||||||
|
absolute_indexes = test_node.last_message["getblocktxn"].block_txn_request.to_absolute()
|
||||||
|
assert_equal(absolute_indexes, [1, 2])
|
||||||
|
|
||||||
|
# Send a blocktxn that does not succeed in reconstruction, triggering
|
||||||
|
# getdata fallback.
|
||||||
|
msg = msg_blocktxn()
|
||||||
|
msg.block_transactions = BlockTransactions(block.sha256, [block.vtx[2]] + [block.vtx[1]])
|
||||||
|
test_node.send_and_ping(msg)
|
||||||
|
|
||||||
|
# Tip should not have updated
|
||||||
|
assert_equal(int(node.getbestblockhash(), 16), block.hashPrevBlock)
|
||||||
|
|
||||||
|
# We should receive a getdata request
|
||||||
|
test_node.wait_for_getdata([block.sha256], timeout=10)
|
||||||
|
assert test_node.last_message["getdata"].inv[0].type == MSG_BLOCK or \
|
||||||
|
test_node.last_message["getdata"].inv[0].type == MSG_BLOCK | MSG_WITNESS_FLAG
|
||||||
|
|
||||||
|
# Send the same blocktxn and assert the sender gets disconnected.
|
||||||
|
with node.assert_debug_log(['previous compact block reconstruction attempt failed']):
|
||||||
|
test_node.send_message(msg)
|
||||||
|
test_node.wait_for_disconnect()
|
||||||
|
|
||||||
def test_getblocktxn_handler(self, test_node):
|
def test_getblocktxn_handler(self, test_node):
|
||||||
node = self.nodes[0]
|
node = self.nodes[0]
|
||||||
# bitcoind will not send blocktxn responses for blocks whose height is
|
# bitcoind will not send blocktxn responses for blocks whose height is
|
||||||
@@ -957,6 +993,12 @@ class CompactBlocksTest(BitcoinTestFramework):
|
|||||||
self.log.info("Testing handling of invalid compact blocks...")
|
self.log.info("Testing handling of invalid compact blocks...")
|
||||||
self.test_invalid_tx_in_compactblock(self.segwit_node)
|
self.test_invalid_tx_in_compactblock(self.segwit_node)
|
||||||
|
|
||||||
|
self.log.info("Testing handling of multiple blocktxn responses...")
|
||||||
|
self.test_multiple_blocktxn_response(self.segwit_node)
|
||||||
|
|
||||||
|
# The previous test will lead to a disconnection. Reconnect before continuing.
|
||||||
|
self.segwit_node = self.nodes[0].add_p2p_connection(TestP2PConn())
|
||||||
|
|
||||||
self.log.info("Testing invalid index in cmpctblock message...")
|
self.log.info("Testing invalid index in cmpctblock message...")
|
||||||
self.test_invalid_cmpctblock_message()
|
self.test_invalid_cmpctblock_message()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user