Changeset View
Changeset View
Standalone View
Standalone View
test/functional/feature_block.py
Show All 21 Lines | from test_framework.messages import ( | ||||
COIN, | COIN, | ||||
COutPoint, | COutPoint, | ||||
CTransaction, | CTransaction, | ||||
CTxIn, | CTxIn, | ||||
CTxOut, | CTxOut, | ||||
uint256_from_compact, | uint256_from_compact, | ||||
uint256_from_str, | uint256_from_str, | ||||
) | ) | ||||
from test_framework.mininode import P2PDataStore, network_thread_start, network_thread_join | from test_framework.mininode import P2PDataStore | ||||
from test_framework.script import ( | from test_framework.script import ( | ||||
CScript, | CScript, | ||||
hash160, | hash160, | ||||
MAX_SCRIPT_ELEMENT_SIZE, | MAX_SCRIPT_ELEMENT_SIZE, | ||||
OP_2DUP, | OP_2DUP, | ||||
OP_CHECKMULTISIG, | OP_CHECKMULTISIG, | ||||
OP_CHECKMULTISIGVERIFY, | OP_CHECKMULTISIGVERIFY, | ||||
OP_CHECKSIG, | OP_CHECKSIG, | ||||
▲ Show 20 Lines • Show All 1,355 Lines • ▼ Show 20 Lines | def update_block(self, block_number, new_transactions, reorder=True): | ||||
self.blocks[block_number] = block | self.blocks[block_number] = block | ||||
return block | return block | ||||
def bootstrap_p2p(self): | def bootstrap_p2p(self): | ||||
"""Add a P2P connection to the node. | """Add a P2P connection to the node. | ||||
Helper to connect and wait for version handshake.""" | Helper to connect and wait for version handshake.""" | ||||
self.nodes[0].add_p2p_connection(P2PDataStore()) | self.nodes[0].add_p2p_connection(P2PDataStore()) | ||||
network_thread_start() | |||||
# We need to wait for the initial getheaders from the peer before we | # We need to wait for the initial getheaders from the peer before we | ||||
# start populating our blockstore. If we don't, then we may run ahead | # start populating our blockstore. If we don't, then we may run ahead | ||||
# to the next subtest before we receive the getheaders. We'd then send | # to the next subtest before we receive the getheaders. We'd then send | ||||
# an INV for the next block and receive two getheaders - one for the | # an INV for the next block and receive two getheaders - one for the | ||||
# IBD and one for the INV. We'd respond to both and could get | # IBD and one for the INV. We'd respond to both and could get | ||||
# unexpectedly disconnected if the DoS score for that error is 50. | # unexpectedly disconnected if the DoS score for that error is 50. | ||||
self.nodes[0].p2p.wait_for_getheaders(timeout=5) | self.nodes[0].p2p.wait_for_getheaders(timeout=5) | ||||
def reconnect_p2p(self): | def reconnect_p2p(self): | ||||
"""Tear down and bootstrap the P2P connection to the node. | """Tear down and bootstrap the P2P connection to the node. | ||||
The node gets disconnected several times in this test. This helper | The node gets disconnected several times in this test. This helper | ||||
method reconnects the p2p and restarts the network thread.""" | method reconnects the p2p and restarts the network thread.""" | ||||
self.nodes[0].disconnect_p2ps() | self.nodes[0].disconnect_p2ps() | ||||
network_thread_join() | |||||
self.bootstrap_p2p() | self.bootstrap_p2p() | ||||
def sync_blocks(self, blocks, success=True, reject_reason=None, request_block=True, reconnect=False, timeout=60): | def sync_blocks(self, blocks, success=True, reject_reason=None, request_block=True, reconnect=False, timeout=60): | ||||
"""Sends blocks to test node. Syncs and verifies that tip has advanced to most recent block. | """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.""" | 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, | 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) | reject_reason=reject_reason, request_block=request_block, timeout=timeout, expect_disconnect=reconnect) | ||||
if reconnect: | if reconnect: | ||||
self.reconnect_p2p() | self.reconnect_p2p() | ||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
FullBlockTest().main() | FullBlockTest().main() |