From c9bf06a531617fdd70b64e23572931af2b969828 Mon Sep 17 00:00:00 2001 From: Martin Zumsande Date: Fri, 16 Aug 2024 11:38:55 -0400 Subject: [PATCH] test: add test for getchaintips behavior with invalid chains This test would fail to mark the chain tip as "invalid" instead of "headers-only" without the previous commit marking the headers as BLOCK_FAILED_CHILD. --- test/functional/rpc_getchaintips.py | 34 +++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/test/functional/rpc_getchaintips.py b/test/functional/rpc_getchaintips.py index e6d8544d22c75c..9734ec96204618 100755 --- a/test/functional/rpc_getchaintips.py +++ b/test/functional/rpc_getchaintips.py @@ -10,6 +10,10 @@ - verify that getchaintips now returns two chain tips. """ +from test_framework.blocktools import ( + create_block, + create_coinbase, +) from test_framework.test_framework import BitcoinTestFramework from test_framework.util import assert_equal @@ -58,5 +62,35 @@ def run_test(self): tips[1]['status'] = 'active' assert_equal(tips[1], shortTip) + self.log.info("Test getchaintips behavior with invalid blocks") + self.disconnect_nodes(0, 1) + n0 = self.nodes[0] + tip = int(n0.getbestblockhash(), 16) + start_height = self.nodes[0].getblockcount() + # Create invalid block (too high coinbase) + block_time = n0.getblock(n0.getbestblockhash())['time'] + 1 + invalid_block = create_block(tip, create_coinbase(start_height+1, nValue=100), block_time) + invalid_block.solve() + + block_time += 1 + block2 = create_block(invalid_block.sha256, create_coinbase(2), block_time, version=4) + block2.solve() + + self.log.info("Submit headers-only chain") + n0.submitheader(invalid_block.serialize().hex()) + n0.submitheader(block2.serialize().hex()) + tips = n0.getchaintips() + assert_equal(len(tips), 3) + assert_equal(tips[0]['height'], start_height + 2) + assert_equal(tips[0]['status'], 'headers-only') + + self.log.info("Submit invalid block that invalidates the headers-only chain") + n0.submitblock(invalid_block.serialize().hex()) + tips = n0.getchaintips() + assert_equal(len(tips), 3) + assert_equal(tips[0]['height'], start_height + 2) + assert_equal(tips[0]['status'], 'invalid') + + if __name__ == '__main__': GetChainTipsTest(__file__).main()