feature_maxtipage.py
1 #!/usr/bin/env python3 2 # Copyright (c) 2022 The Bitcoin Core developers 3 # Distributed under the MIT software license, see the accompanying 4 # file COPYING or http://www.opensource.org/licenses/mit-license.php. 5 """Test logic for setting -maxtipage on command line. 6 7 Nodes don't consider themselves out of "initial block download" as long as 8 their best known block header time is more than -maxtipage in the past. 9 """ 10 11 import time 12 13 from test_framework.test_framework import BitcoinTestFramework 14 from test_framework.util import assert_equal 15 16 17 DEFAULT_MAX_TIP_AGE = 24 * 60 * 60 18 19 20 class MaxTipAgeTest(BitcoinTestFramework): 21 def set_test_params(self): 22 self.setup_clean_chain = True 23 self.num_nodes = 2 24 25 def test_maxtipage(self, maxtipage, set_parameter=True, test_deltas=True): 26 node_miner = self.nodes[0] 27 node_ibd = self.nodes[1] 28 29 self.restart_node(1, [f'-maxtipage={maxtipage}'] if set_parameter else None) 30 self.connect_nodes(0, 1) 31 cur_time = int(time.time()) 32 33 if test_deltas: 34 # tips older than maximum age -> stay in IBD 35 node_ibd.setmocktime(cur_time) 36 for delta in [5, 4, 3, 2, 1]: 37 node_miner.setmocktime(cur_time - maxtipage - delta) 38 self.generate(node_miner, 1) 39 assert_equal(node_ibd.getblockchaininfo()['initialblockdownload'], True) 40 41 # tip within maximum age -> leave IBD 42 node_miner.setmocktime(max(cur_time - maxtipage, 0)) 43 self.generate(node_miner, 1) 44 assert_equal(node_ibd.getblockchaininfo()['initialblockdownload'], False) 45 46 def run_test(self): 47 self.log.info("Test IBD with maximum tip age of 24 hours (default).") 48 self.test_maxtipage(DEFAULT_MAX_TIP_AGE, set_parameter=False) 49 50 for hours in [20, 10, 5, 2, 1]: 51 maxtipage = hours * 60 * 60 52 self.log.info(f"Test IBD with maximum tip age of {hours} hours (-maxtipage={maxtipage}).") 53 self.test_maxtipage(maxtipage) 54 55 max_long_val = 9223372036854775807 56 self.log.info(f"Test IBD with highest allowable maximum tip age ({max_long_val}).") 57 self.test_maxtipage(max_long_val, test_deltas=False) 58 59 60 if __name__ == '__main__': 61 MaxTipAgeTest().main()