mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-06-08 14:10:16 +02:00
Fix assumeutxo crash due to invalid base_blockhash
Can be reviewed with --color-moved=dimmed-zebra --color-moved-ws=ignore-all-space
This commit is contained in:
parent
fa5668bfb3
commit
fae33f98e6
@ -260,6 +260,11 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager_activate_snapshot, TestChain100Setup)
|
|||||||
// Coins count is smaller than coins in file
|
// Coins count is smaller than coins in file
|
||||||
metadata.m_coins_count -= 1;
|
metadata.m_coins_count -= 1;
|
||||||
}));
|
}));
|
||||||
|
BOOST_REQUIRE(!CreateAndActivateUTXOSnapshot(
|
||||||
|
m_node, m_path_root, [](CAutoFile& auto_infile, SnapshotMetadata& metadata) {
|
||||||
|
// Wrong hash
|
||||||
|
metadata.m_base_blockhash = uint256::ZERO;
|
||||||
|
}));
|
||||||
BOOST_REQUIRE(!CreateAndActivateUTXOSnapshot(
|
BOOST_REQUIRE(!CreateAndActivateUTXOSnapshot(
|
||||||
m_node, m_path_root, [](CAutoFile& auto_infile, SnapshotMetadata& metadata) {
|
m_node, m_path_root, [](CAutoFile& auto_infile, SnapshotMetadata& metadata) {
|
||||||
// Wrong hash
|
// Wrong hash
|
||||||
|
@ -4815,6 +4815,26 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
|
|||||||
|
|
||||||
uint256 base_blockhash = metadata.m_base_blockhash;
|
uint256 base_blockhash = metadata.m_base_blockhash;
|
||||||
|
|
||||||
|
CBlockIndex* snapshot_start_block = WITH_LOCK(::cs_main, return m_blockman.LookupBlockIndex(base_blockhash));
|
||||||
|
|
||||||
|
if (!snapshot_start_block) {
|
||||||
|
// Needed for GetUTXOStats and ExpectedAssumeutxo to determine the height and to avoid a crash when base_blockhash.IsNull()
|
||||||
|
LogPrintf("[snapshot] Did not find snapshot start blockheader %s\n",
|
||||||
|
base_blockhash.ToString());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int base_height = snapshot_start_block->nHeight;
|
||||||
|
auto maybe_au_data = ExpectedAssumeutxo(base_height, ::Params());
|
||||||
|
|
||||||
|
if (!maybe_au_data) {
|
||||||
|
LogPrintf("[snapshot] assumeutxo height in snapshot metadata not recognized " /* Continued */
|
||||||
|
"(%d) - refusing to load snapshot\n", base_height);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const AssumeutxoData& au_data = *maybe_au_data;
|
||||||
|
|
||||||
COutPoint outpoint;
|
COutPoint outpoint;
|
||||||
Coin coin;
|
Coin coin;
|
||||||
const uint64_t coins_count = metadata.m_coins_count;
|
const uint64_t coins_count = metadata.m_coins_count;
|
||||||
@ -4905,15 +4925,6 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
|
|||||||
|
|
||||||
assert(coins_cache.GetBestBlock() == base_blockhash);
|
assert(coins_cache.GetBestBlock() == base_blockhash);
|
||||||
|
|
||||||
CBlockIndex* snapshot_start_block = WITH_LOCK(::cs_main, return m_blockman.LookupBlockIndex(base_blockhash));
|
|
||||||
|
|
||||||
if (!snapshot_start_block) {
|
|
||||||
// Needed for GetUTXOStats to determine the height
|
|
||||||
LogPrintf("[snapshot] Did not find snapshot start blockheader %s\n",
|
|
||||||
base_blockhash.ToString());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
CCoinsStats stats{CoinStatsHashType::HASH_SERIALIZED};
|
CCoinsStats stats{CoinStatsHashType::HASH_SERIALIZED};
|
||||||
auto breakpoint_fnc = [] { /* TODO insert breakpoint here? */ };
|
auto breakpoint_fnc = [] { /* TODO insert breakpoint here? */ };
|
||||||
|
|
||||||
@ -4927,18 +4938,6 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Assert that the deserialized chainstate contents match the expected assumeutxo value.
|
// Assert that the deserialized chainstate contents match the expected assumeutxo value.
|
||||||
|
|
||||||
int base_height = snapshot_start_block->nHeight;
|
|
||||||
auto maybe_au_data = ExpectedAssumeutxo(base_height, ::Params());
|
|
||||||
|
|
||||||
if (!maybe_au_data) {
|
|
||||||
LogPrintf("[snapshot] assumeutxo height in snapshot metadata not recognized " /* Continued */
|
|
||||||
"(%d) - refusing to load snapshot\n", base_height);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const AssumeutxoData& au_data = *maybe_au_data;
|
|
||||||
|
|
||||||
if (AssumeutxoHash{stats.hashSerialized} != au_data.hash_serialized) {
|
if (AssumeutxoHash{stats.hashSerialized} != au_data.hash_serialized) {
|
||||||
LogPrintf("[snapshot] bad snapshot content hash: expected %s, got %s\n",
|
LogPrintf("[snapshot] bad snapshot content hash: expected %s, got %s\n",
|
||||||
au_data.hash_serialized.ToString(), stats.hashSerialized.ToString());
|
au_data.hash_serialized.ToString(), stats.hashSerialized.ToString());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user