mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 12:02:48 +01:00
merge bitcoin#14719: Check specific reject reasons in feature_block
This commit is contained in:
parent
d9f8518d1a
commit
73ce859de2
@ -304,7 +304,7 @@ class FullBlockTest(BitcoinTestFramework):
|
||||
self.send_blocks([b24], success=False, reject_reason='bad-blk-length', reconnect=True)
|
||||
|
||||
b25 = self.next_block(25, spend=out[7])
|
||||
self.send_blocks([b25], False, request_block=False, reconnect=True)
|
||||
self.send_blocks([b25], False, force_send=True, reconnect=True)
|
||||
|
||||
# Create blocks with a coinbase input script size out of range
|
||||
# genesis -> b1 (0) -> b2 (1) -> b5 (2) -> b6 (3)
|
||||
@ -594,14 +594,14 @@ class FullBlockTest(BitcoinTestFramework):
|
||||
while b47.sha256 <= target:
|
||||
b47.nNonce += 1
|
||||
b47.rehash()
|
||||
self.send_blocks([b47], False, request_block=False)
|
||||
self.send_blocks([b47], False, force_send=True, reject_reason='high-hash')
|
||||
|
||||
self.log.info("Reject a block with a timestamp >2 hours in the future")
|
||||
self.move_tip(44)
|
||||
b48 = self.next_block(48, solve=False)
|
||||
b48.nTime = int(self.mocktime) + 60 * 60 * 3
|
||||
b48.solve()
|
||||
self.send_blocks([b48], False, request_block=False)
|
||||
self.send_blocks([b48], False, force_send=True, reject_reason='time-too-new')
|
||||
|
||||
self.log.info("Reject a block with invalid merkle hash")
|
||||
self.move_tip(44)
|
||||
@ -615,7 +615,7 @@ class FullBlockTest(BitcoinTestFramework):
|
||||
b50 = self.next_block(50)
|
||||
b50.nBits = b50.nBits - 1
|
||||
b50.solve()
|
||||
self.send_blocks([b50], False, request_block=False, reconnect=True)
|
||||
self.send_blocks([b50], False, force_send=True, reject_reason='bad-diffbits', reconnect=True)
|
||||
|
||||
self.log.info("Reject a block with two coinbase transactions")
|
||||
self.move_tip(44)
|
||||
@ -645,7 +645,7 @@ class FullBlockTest(BitcoinTestFramework):
|
||||
b54 = self.next_block(54, spend=out[15])
|
||||
b54.nTime = b35.nTime - 1
|
||||
b54.solve()
|
||||
self.send_blocks([b54], False, request_block=False)
|
||||
self.send_blocks([b54], False, force_send=True, reject_reason='time-too-old')
|
||||
|
||||
# valid timestamp
|
||||
self.move_tip(53)
|
||||
@ -1117,11 +1117,11 @@ class FullBlockTest(BitcoinTestFramework):
|
||||
|
||||
self.move_tip(77)
|
||||
b80 = self.next_block(80, spend=out[25])
|
||||
self.send_blocks([b80], False, request_block=False)
|
||||
self.send_blocks([b80], False, force_send=True)
|
||||
self.save_spendable_output()
|
||||
|
||||
b81 = self.next_block(81, spend=out[26])
|
||||
self.send_blocks([b81], False, request_block=False) # other chain is same length
|
||||
self.send_blocks([b81], False, force_send=True) # other chain is same length
|
||||
self.save_spendable_output()
|
||||
|
||||
b82 = self.next_block(82, spend=out[27])
|
||||
@ -1228,7 +1228,7 @@ class FullBlockTest(BitcoinTestFramework):
|
||||
blocks2 = []
|
||||
for i in range(89, LARGE_REORG_SIZE + 89):
|
||||
blocks2.append(self.next_block("alt" + str(i)))
|
||||
self.send_blocks(blocks2, False, request_block=False)
|
||||
self.send_blocks(blocks2, False, force_send=True)
|
||||
|
||||
# extend alt chain to trigger re-org
|
||||
block = self.next_block("alt" + str(chain1_tip + 1))
|
||||
@ -1237,7 +1237,7 @@ class FullBlockTest(BitcoinTestFramework):
|
||||
# ... and re-org back to the first chain
|
||||
self.move_tip(chain1_tip)
|
||||
block = self.next_block(chain1_tip + 1)
|
||||
self.send_blocks([block], False, request_block=False)
|
||||
self.send_blocks([block], False, force_send=True)
|
||||
block = self.next_block(chain1_tip + 2)
|
||||
self.send_blocks([block], True, timeout=960)
|
||||
|
||||
@ -1350,14 +1350,15 @@ class FullBlockTest(BitcoinTestFramework):
|
||||
self.nodes[0].disconnect_p2ps()
|
||||
self.bootstrap_p2p()
|
||||
|
||||
def send_blocks(self, blocks, success=True, reject_reason=None, request_block=True, reconnect=False, timeout=60):
|
||||
def send_blocks(self, blocks, success=True, reject_reason=None, force_send=False, reconnect=False, timeout=60):
|
||||
"""Sends blocks to test node. Syncs and verifies that tip has advanced to most recent block.
|
||||
|
||||
Call with success = False if the tip shouldn't advance to the most recent block."""
|
||||
self.nodes[0].p2p.send_blocks_and_test(blocks, self.nodes[0], success=success, reject_reason=reject_reason, request_block=request_block, timeout=timeout, expect_disconnect=reconnect)
|
||||
self.nodes[0].p2p.send_blocks_and_test(blocks, self.nodes[0], success=success, reject_reason=reject_reason, force_send=force_send, timeout=timeout, expect_disconnect=reconnect)
|
||||
|
||||
if reconnect:
|
||||
self.reconnect_p2p()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
FullBlockTest().main()
|
||||
|
@ -614,14 +614,14 @@ class P2PDataStore(P2PInterface):
|
||||
if response is not None:
|
||||
self.send_message(response)
|
||||
|
||||
def send_blocks_and_test(self, blocks, node, *, success=True, request_block=True, reject_reason=None, expect_disconnect=False, timeout=60):
|
||||
def send_blocks_and_test(self, blocks, node, *, success=True, force_send=False, reject_reason=None, expect_disconnect=False, timeout=60):
|
||||
"""Send blocks to test node and test whether the tip advances.
|
||||
|
||||
- add all blocks to our block_store
|
||||
- send a headers message for the final block
|
||||
- the on_getheaders handler will ensure that any getheaders are responded to
|
||||
- if request_block is True: wait for getdata for each of the blocks. The on_getdata handler will
|
||||
ensure that any getdata messages are responded to
|
||||
- if force_send is False: wait for getdata for each of the blocks. The on_getdata handler will
|
||||
ensure that any getdata messages are responded to. Otherwise send the full block unsolicited.
|
||||
- if success is True: assert that the node's tip advances to the most recent block
|
||||
- if success is False: assert that the node's tip doesn't advance
|
||||
- if reject_reason is set: assert that the correct reject message is logged"""
|
||||
@ -633,9 +633,11 @@ class P2PDataStore(P2PInterface):
|
||||
|
||||
reject_reason = [reject_reason] if reject_reason else []
|
||||
with node.assert_debug_log(expected_msgs=reject_reason):
|
||||
self.send_message(msg_headers([CBlockHeader(block) for block in blocks]))
|
||||
|
||||
if request_block:
|
||||
if force_send:
|
||||
for b in blocks:
|
||||
self.send_message(msg_block(block=b))
|
||||
else:
|
||||
self.send_message(msg_headers([CBlockHeader(block) for block in blocks]))
|
||||
wait_until(lambda: blocks[-1].sha256 in self.getdata_requests, timeout=timeout, lock=mininode_lock)
|
||||
|
||||
if expect_disconnect:
|
||||
|
Loading…
Reference in New Issue
Block a user