aboutsummaryrefslogtreecommitdiff
path: root/test/functional
diff options
context:
space:
mode:
authorAndrew Chow <github@achow101.com>2023-10-11 14:19:22 -0400
committerAndrew Chow <github@achow101.com>2023-10-11 14:25:23 -0400
commite3eb3aae30269b0c9478afe946e7a0871cab5b69 (patch)
tree2b0e9f32d7a6d27f2f99c6785d6318d7dcfb1956 /test/functional
parentd98d88c779bc28794e5936d5ad08fd2df3d992a4 (diff)
parent2e31250027ac580a7a72221fe2ff505b30836175 (diff)
downloadbitcoin-e3eb3aae30269b0c9478afe946e7a0871cab5b69.tar.xz
Merge bitcoin/bitcoin#28625: test: check that loading snapshot not matching AssumeUTXO parameters fails
2e31250027ac580a7a72221fe2ff505b30836175 test: check that loading snapshot not matching AssumeUTXO parameters fails (Sebastian Falbesoner) Pull request description: This PR adds test coverage for the failed loading of an AssumeUTXO snapshot in case the referenced block hash doesn't match the parameters in the chainparams. Right now, I expect this would be the most common error-case for `loadtxoutset` out in the wild, as for mainnet the `m_assumeutxo_data` map is empty and this error condition would obviously always be triggered for any (otherwise valid, correctly encoded) snapshot. Note that this test-case is the simplest scenario and doesn't cover any of the TODO ideas mentioned at the top of the functional test yet. ACKs for top commit: jamesob: ACK https://github.com/bitcoin/bitcoin/pull/28625/commits/2e31250027ac580a7a72221fe2ff505b30836175 Sjors: utACK 2e31250027ac580a7a72221fe2ff505b30836175 achow101: ACK 2e31250027ac580a7a72221fe2ff505b30836175 Tree-SHA512: 8bcb2d525c95fbc95f87d3e978ad717d95bddb1ff67cbe7d3b06e4783f0f1ffba32b17ef451468c39c23bc1b3ef1150baa71148c145275c386f2d4822d790d39
Diffstat (limited to 'test/functional')
-rwxr-xr-xtest/functional/feature_assumeutxo.py27
1 files changed, 26 insertions, 1 deletions
diff --git a/test/functional/feature_assumeutxo.py b/test/functional/feature_assumeutxo.py
index 6c09a6f5e7..ea93b7ab88 100755
--- a/test/functional/feature_assumeutxo.py
+++ b/test/functional/feature_assumeutxo.py
@@ -36,7 +36,11 @@ Interesting starting states could be loading a snapshot when the current chain t
"""
from test_framework.test_framework import BitcoinTestFramework
-from test_framework.util import assert_equal
+from test_framework.util import (
+ assert_equal,
+ assert_raises_rpc_error,
+)
+
START_HEIGHT = 199
SNAPSHOT_BASE_HEIGHT = 299
@@ -62,6 +66,25 @@ class AssumeutxoTest(BitcoinTestFramework):
self.add_nodes(3)
self.start_nodes(extra_args=self.extra_args)
+ def test_invalid_snapshot_scenarios(self, valid_snapshot_path):
+ self.log.info("Test different scenarios of loading invalid snapshot files")
+ self.log.info(" - snapshot file refering to a block that is not in the assumeutxo parameters")
+ with open(valid_snapshot_path, 'rb') as f:
+ valid_snapshot_contents = f.read()
+
+ # we can only test this with a block that is already known, as otherwise the `loadtxoutset` RPC
+ # would time out (waiting to see the hash in the headers chain), rather than error immediately
+ bad_snapshot_height = SNAPSHOT_BASE_HEIGHT - 1
+ bad_snapshot_path = valid_snapshot_path + '.mod'
+ with open(bad_snapshot_path, 'wb') as f:
+ bad_snapshot_block_hash = self.nodes[0].getblockhash(bad_snapshot_height)
+ # block hash of the snapshot base is stored right at the start (first 32 bytes)
+ f.write(bytes.fromhex(bad_snapshot_block_hash)[::-1] + valid_snapshot_contents[32:])
+
+ expected_log = f"assumeutxo height in snapshot metadata not recognized ({bad_snapshot_height}) - refusing to load snapshot"
+ with self.nodes[1].assert_debug_log(expected_log):
+ assert_raises_rpc_error(-32603, "Unable to load UTXO snapshot", self.nodes[1].loadtxoutset, bad_snapshot_path)
+
def run_test(self):
"""
Bring up two (disconnected) nodes, mine some new blocks on the first,
@@ -120,6 +143,8 @@ class AssumeutxoTest(BitcoinTestFramework):
assert_equal(n0.getblockchaininfo()["blocks"], FINAL_HEIGHT)
+ self.test_invalid_snapshot_scenarios(dump_output['path'])
+
self.log.info(f"Loading snapshot into second node from {dump_output['path']}")
loaded = n1.loadtxoutset(dump_output['path'])
assert_equal(loaded['coins_loaded'], SNAPSHOT_BASE_HEIGHT)