36
36
37
37
"""
38
38
from test_framework .test_framework import BitcoinTestFramework
39
- from test_framework .util import assert_equal
39
+ from test_framework .util import (
40
+ assert_equal ,
41
+ assert_raises_rpc_error ,
42
+ )
43
+
40
44
41
45
START_HEIGHT = 199
42
46
SNAPSHOT_BASE_HEIGHT = 299
@@ -62,6 +66,25 @@ def setup_network(self):
62
66
self .add_nodes (3 )
63
67
self .start_nodes (extra_args = self .extra_args )
64
68
69
+ def test_invalid_snapshot_scenarios (self , valid_snapshot_path ):
70
+ self .log .info ("Test different scenarios of loading invalid snapshot files" )
71
+ self .log .info (" - snapshot file refering to a block that is not in the assumeutxo parameters" )
72
+ with open (valid_snapshot_path , 'rb' ) as f :
73
+ valid_snapshot_contents = f .read ()
74
+
75
+ # we can only test this with a block that is already known, as otherwise the `loadtxoutset` RPC
76
+ # would time out (waiting to see the hash in the headers chain), rather than error immediately
77
+ bad_snapshot_height = SNAPSHOT_BASE_HEIGHT - 1
78
+ bad_snapshot_path = valid_snapshot_path + '.mod'
79
+ with open (bad_snapshot_path , 'wb' ) as f :
80
+ bad_snapshot_block_hash = self .nodes [0 ].getblockhash (bad_snapshot_height )
81
+ # block hash of the snapshot base is stored right at the start (first 32 bytes)
82
+ f .write (bytes .fromhex (bad_snapshot_block_hash )[::- 1 ] + valid_snapshot_contents [32 :])
83
+
84
+ expected_log = f"assumeutxo height in snapshot metadata not recognized ({ bad_snapshot_height } ) - refusing to load snapshot"
85
+ with self .nodes [1 ].assert_debug_log (expected_log ):
86
+ assert_raises_rpc_error (- 32603 , "Unable to load UTXO snapshot" , self .nodes [1 ].loadtxoutset , bad_snapshot_path )
87
+
65
88
def run_test (self ):
66
89
"""
67
90
Bring up two (disconnected) nodes, mine some new blocks on the first,
@@ -120,6 +143,8 @@ def run_test(self):
120
143
121
144
assert_equal (n0 .getblockchaininfo ()["blocks" ], FINAL_HEIGHT )
122
145
146
+ self .test_invalid_snapshot_scenarios (dump_output ['path' ])
147
+
123
148
self .log .info (f"Loading snapshot into second node from { dump_output ['path' ]} " )
124
149
loaded = n1 .loadtxoutset (dump_output ['path' ])
125
150
assert_equal (loaded ['coins_loaded' ], SNAPSHOT_BASE_HEIGHT )
0 commit comments