Skip to content

Commit

Permalink
validation: fix ActivateSnapshot to use hardcoded nChainTx
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
jamesob committed Apr 14, 2021
1 parent 773f8c1 commit 931684b
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 2 deletions.
2 changes: 2 additions & 0 deletions src/node/utxo_snapshot.h
Expand Up @@ -24,6 +24,8 @@ class SnapshotMetadata

//! 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() { }
Expand Down
20 changes: 19 additions & 1 deletion src/test/validation_chainstatemanager_tests.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -265,14 +266,31 @@ 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());
BOOST_CHECK_EQUAL(
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()};

Expand Down
2 changes: 1 addition & 1 deletion src/validation.cpp
Expand Up @@ -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",
Expand Down

0 comments on commit 931684b

Please sign in to comment.