aboutsummaryrefslogtreecommitdiff
path: root/test/functional/p2p_dos_header_tree.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/functional/p2p_dos_header_tree.py')
-rwxr-xr-xtest/functional/p2p_dos_header_tree.py88
1 files changed, 0 insertions, 88 deletions
diff --git a/test/functional/p2p_dos_header_tree.py b/test/functional/p2p_dos_header_tree.py
deleted file mode 100755
index fbb5d716f5..0000000000
--- a/test/functional/p2p_dos_header_tree.py
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/usr/bin/env python3
-# Copyright (c) 2019-2022 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-"""Test that we reject low difficulty headers to prevent our block tree from filling up with useless bloat"""
-
-from test_framework.messages import (
- CBlockHeader,
- from_hex,
-)
-from test_framework.p2p import (
- P2PInterface,
- msg_headers,
-)
-from test_framework.test_framework import BitcoinTestFramework
-
-import os
-
-
-class RejectLowDifficultyHeadersTest(BitcoinTestFramework):
- def set_test_params(self):
- self.setup_clean_chain = True
- self.chain = 'testnet3' # Use testnet chain because it has an early checkpoint
- self.num_nodes = 2
- self.extra_args = [["-minimumchainwork=0x0", '-prune=550']] * self.num_nodes
-
- def add_options(self, parser):
- parser.add_argument(
- '--datafile',
- default='data/blockheader_testnet3.hex',
- help='Test data file (default: %(default)s)',
- )
-
- def run_test(self):
- self.log.info("Read headers data")
- self.headers_file_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), self.options.datafile)
- with open(self.headers_file_path, encoding='utf-8') as headers_data:
- h_lines = [l.strip() for l in headers_data.readlines()]
-
- # The headers data is taken from testnet3 for early blocks from genesis until the first checkpoint. There are
- # two headers with valid POW at height 1 and 2, forking off from genesis. They are indicated by the FORK_PREFIX.
- FORK_PREFIX = 'fork:'
- self.headers = [l for l in h_lines if not l.startswith(FORK_PREFIX)]
- self.headers_fork = [l[len(FORK_PREFIX):] for l in h_lines if l.startswith(FORK_PREFIX)]
-
- self.headers = [from_hex(CBlockHeader(), h) for h in self.headers]
- self.headers_fork = [from_hex(CBlockHeader(), h) for h in self.headers_fork]
-
- self.log.info("Feed all non-fork headers, including and up to the first checkpoint")
- peer_checkpoint = self.nodes[0].add_p2p_connection(P2PInterface())
- peer_checkpoint.send_and_ping(msg_headers(self.headers))
- assert {
- 'height': 546,
- 'hash': '000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70',
- 'branchlen': 546,
- 'status': 'headers-only',
- } in self.nodes[0].getchaintips()
-
- self.log.info("Feed all fork headers (fails due to checkpoint)")
- with self.nodes[0].assert_debug_log(['bad-fork-prior-to-checkpoint']):
- peer_checkpoint.send_message(msg_headers(self.headers_fork))
- peer_checkpoint.wait_for_disconnect()
-
- self.log.info("Feed all fork headers (succeeds without checkpoint)")
- # On node 0 it succeeds because checkpoints are disabled
- self.restart_node(0, extra_args=['-nocheckpoints', "-minimumchainwork=0x0", '-prune=550'])
- peer_no_checkpoint = self.nodes[0].add_p2p_connection(P2PInterface())
- peer_no_checkpoint.send_and_ping(msg_headers(self.headers_fork))
- assert {
- "height": 2,
- "hash": "00000000b0494bd6c3d5ff79c497cfce40831871cbf39b1bc28bd1dac817dc39",
- "branchlen": 2,
- "status": "headers-only",
- } in self.nodes[0].getchaintips()
-
- # On node 1 it succeeds because no checkpoint has been reached yet by a chain tip
- peer_before_checkpoint = self.nodes[1].add_p2p_connection(P2PInterface())
- peer_before_checkpoint.send_and_ping(msg_headers(self.headers_fork))
- assert {
- "height": 2,
- "hash": "00000000b0494bd6c3d5ff79c497cfce40831871cbf39b1bc28bd1dac817dc39",
- "branchlen": 2,
- "status": "headers-only",
- } in self.nodes[1].getchaintips()
-
-
-if __name__ == '__main__':
- RejectLowDifficultyHeadersTest(__file__).main()