aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames O'Beirne <james.obeirne@pm.me>2021-04-14 13:29:27 -0400
committerJames O'Beirne <james.obeirne@pm.me>2021-04-14 13:29:27 -0400
commit931684b24a89aba884cb18c13fa67ccca339ee8c (patch)
tree99e37bcf0cab24fed7ee2916e1ca290f151588a0
parent773f8c1a7d568012768e16d2ede65b5d4d62aced (diff)
validation: fix ActivateSnapshot to use hardcoded nChainTx
This fixes an oversight from the move of nChainTx from the user-supplied snapshot metadata into the hardcoded assumeutxo chainparams. Since the nChainTx is now unused in the metadata, it should be removed in a future commit.
-rw-r--r--src/node/utxo_snapshot.h2
-rw-r--r--src/test/validation_chainstatemanager_tests.cpp20
-rw-r--r--src/validation.cpp2
3 files changed, 22 insertions, 2 deletions
diff --git a/src/node/utxo_snapshot.h b/src/node/utxo_snapshot.h
index fe78cb46bd..4767d49889 100644
--- a/src/node/utxo_snapshot.h
+++ b/src/node/utxo_snapshot.h
@@ -24,6 +24,8 @@ public:
//! Necessary to "fake" the base nChainTx so that we can estimate progress during
//! initial block download for the assumeutxo chainstate.
+ //!
+ //! TODO: this is unused and should be removed.
unsigned int m_nchaintx = 0;
SnapshotMetadata() { }
diff --git a/src/test/validation_chainstatemanager_tests.cpp b/src/test/validation_chainstatemanager_tests.cpp
index ab31662f97..15fc9b7cbd 100644
--- a/src/test/validation_chainstatemanager_tests.cpp
+++ b/src/test/validation_chainstatemanager_tests.cpp
@@ -233,6 +233,7 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager_activate_snapshot, TestChain100Setup)
// Mine 10 more blocks, putting at us height 110 where a valid assumeutxo value can
// be found.
+ constexpr int snapshot_height = 110;
mineBlocks(10);
initial_size += 10;
initial_total_coins += 10;
@@ -265,7 +266,16 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager_activate_snapshot, TestChain100Setup)
metadata.m_base_blockhash = uint256::ONE;
}));
- BOOST_REQUIRE(CreateAndActivateUTXOSnapshot(m_node, m_path_root));
+ constexpr int bad_nchaintx = 9999;
+
+ BOOST_REQUIRE(CreateAndActivateUTXOSnapshot(
+ m_node, m_path_root, [](CAutoFile& auto_infile, SnapshotMetadata& metadata) {
+ // Provide an nChainTx that differs from the hardcoded one.
+ //
+ // Ultimately this malleation check should be removed when we remove
+ // the now-unnecessary nChainTx from the user-specified snapshot metadata.
+ metadata.m_nchaintx = bad_nchaintx;
+ }));
// Ensure our active chain is the snapshot chainstate.
BOOST_CHECK(!chainman.ActiveChainstate().m_from_snapshot_blockhash.IsNull());
@@ -273,6 +283,14 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager_activate_snapshot, TestChain100Setup)
chainman.ActiveChainstate().m_from_snapshot_blockhash,
*chainman.SnapshotBlockhash());
+ const AssumeutxoData& au_data = *ExpectedAssumeutxo(snapshot_height, ::Params());
+ const CBlockIndex* tip = chainman.ActiveTip();
+
+ // Ensure that, despite a bad nChainTx value being in the snapshot, activation
+ // uses the hardcoded value from chainparams.
+ BOOST_CHECK_EQUAL(tip->nChainTx, au_data.nChainTx);
+ BOOST_CHECK(tip->nChainTx != bad_nchaintx);
+
// To be checked against later when we try loading a subsequent snapshot.
uint256 loaded_snapshot_blockhash{*chainman.SnapshotBlockhash()};
diff --git a/src/validation.cpp b/src/validation.cpp
index 332cb581b8..a105624510 100644
--- a/src/validation.cpp
+++ b/src/validation.cpp
@@ -5346,7 +5346,7 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
}
assert(index);
- index->nChainTx = metadata.m_nchaintx;
+ index->nChainTx = au_data.nChainTx;
snapshot_chainstate.setBlockIndexCandidates.insert(snapshot_start_block);
LogPrintf("[snapshot] validated snapshot (%.2f MB)\n",