Changeset View
Changeset View
Standalone View
Standalone View
test/functional/p2p_dos_header_tree.py
Show First 20 Lines • Show All 42 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
for line in h_lines if line.startswith(FORK_PREFIX)] | for line in h_lines if line.startswith(FORK_PREFIX)] | ||||
self.headers = [FromHex(CBlockHeader(), h) for h in self.headers] | self.headers = [FromHex(CBlockHeader(), h) for h in self.headers] | ||||
self.headers_fork = [FromHex(CBlockHeader(), h) | self.headers_fork = [FromHex(CBlockHeader(), h) | ||||
for h in self.headers_fork] | for h in self.headers_fork] | ||||
self.log.info( | self.log.info( | ||||
"Feed all non-fork headers, including and up to the first checkpoint") | "Feed all non-fork headers, including and up to the first checkpoint") | ||||
self.nodes[0].add_p2p_connection(P2PInterface()) | peer_checkpoint = self.nodes[0].add_p2p_connection(P2PInterface()) | ||||
self.nodes[0].p2p.send_and_ping(msg_headers(self.headers)) | peer_checkpoint.send_and_ping(msg_headers(self.headers)) | ||||
assert { | assert { | ||||
'height': 546, | 'height': 546, | ||||
'hash': '000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70', | 'hash': '000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70', | ||||
'branchlen': 546, | 'branchlen': 546, | ||||
'status': 'headers-only', | 'status': 'headers-only', | ||||
} in self.nodes[0].getchaintips() | } in self.nodes[0].getchaintips() | ||||
self.log.info("Feed all fork headers (fails due to checkpoint)") | self.log.info("Feed all fork headers (fails due to checkpoint)") | ||||
with self.nodes[0].assert_debug_log(['bad-fork-prior-to-checkpoint']): | with self.nodes[0].assert_debug_log(['bad-fork-prior-to-checkpoint']): | ||||
self.nodes[0].p2p.send_message(msg_headers(self.headers_fork)) | peer_checkpoint.send_message(msg_headers(self.headers_fork)) | ||||
self.nodes[0].p2p.wait_for_disconnect() | peer_checkpoint.wait_for_disconnect() | ||||
self.log.info("Feed all fork headers (succeeds without checkpoint)") | self.log.info("Feed all fork headers (succeeds without checkpoint)") | ||||
# On node 0 it succeeds because checkpoints are disabled | # On node 0 it succeeds because checkpoints are disabled | ||||
self.restart_node(0, extra_args=['-nocheckpoints']) | self.restart_node(0, extra_args=['-nocheckpoints']) | ||||
self.nodes[0].add_p2p_connection(P2PInterface()) | peer_no_checkpoint = self.nodes[0].add_p2p_connection(P2PInterface()) | ||||
self.nodes[0].p2p.send_and_ping(msg_headers(self.headers_fork)) | peer_no_checkpoint.send_and_ping(msg_headers(self.headers_fork)) | ||||
assert { | assert { | ||||
"height": 2, | "height": 2, | ||||
"hash": "00000000b0494bd6c3d5ff79c497cfce40831871cbf39b1bc28bd1dac817dc39", | "hash": "00000000b0494bd6c3d5ff79c497cfce40831871cbf39b1bc28bd1dac817dc39", | ||||
"branchlen": 2, | "branchlen": 2, | ||||
"status": "headers-only", | "status": "headers-only", | ||||
} in self.nodes[0].getchaintips() | } in self.nodes[0].getchaintips() | ||||
# On node 1 it succeeds because no checkpoint has been reached yet by a | # On node 1 it succeeds because no checkpoint has been reached yet by a | ||||
# chain tip | # chain tip | ||||
self.nodes[1].add_p2p_connection(P2PInterface()) | peer_before_checkpoint = self.nodes[1].add_p2p_connection( | ||||
self.nodes[1].p2p.send_and_ping(msg_headers(self.headers_fork)) | P2PInterface()) | ||||
peer_before_checkpoint.send_and_ping( | |||||
msg_headers(self.headers_fork)) | |||||
assert { | assert { | ||||
"height": 2, | "height": 2, | ||||
"hash": "00000000b0494bd6c3d5ff79c497cfce40831871cbf39b1bc28bd1dac817dc39", | "hash": "00000000b0494bd6c3d5ff79c497cfce40831871cbf39b1bc28bd1dac817dc39", | ||||
"branchlen": 2, | "branchlen": 2, | ||||
"status": "headers-only", | "status": "headers-only", | ||||
} in self.nodes[1].getchaintips() | } in self.nodes[1].getchaintips() | ||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
RejectLowDifficultyHeadersTest().main() | RejectLowDifficultyHeadersTest().main() |