mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-04-17 19:18:00 +02:00
validation: do not wipe utxo cache for stats/scans/snapshots
Since #28280, the cost of a non-wiping sync of the UTXO cache is only proportional to the number of dirty entries, rather than proportional to the size of the entire cache. Because of that, there is no reason to perform a wiping flush in case the contents of the cache is still useful. Split the FlushStateMode::ALWAYS mode into a FORCE_SYNC (non-wiping) and a FORCE_FLUSH (wiping), and then use the former in scantxoutset, gettxoutsetinfo, snapshot creation. Co-authored-by: l0rinc <pap.lorinc@gmail.com> Co-authored-by: cedwies <141683552+cedwies@users.noreply.github.com>
This commit is contained in:
@@ -57,7 +57,7 @@ void sanity_check_snapshot()
|
||||
// Connect the chain to the tmp chainman and sanity check the chainparams snapshot values.
|
||||
LOCK(cs_main);
|
||||
auto& cs{node.chainman->ActiveChainstate()};
|
||||
cs.ForceFlushStateToDisk();
|
||||
cs.ForceFlushStateToDisk(/*wipe_cache=*/false);
|
||||
const auto stats{*Assert(kernel::ComputeUTXOStats(kernel::CoinStatsHashType::HASH_SERIALIZED, &cs.CoinsDB(), node.chainman->m_blockman))};
|
||||
const auto cp_au_data{*Assert(node.chainman->GetParams().AssumeutxoForHeight(2 * COINBASE_MATURITY))};
|
||||
Assert(stats.nHeight == cp_au_data.height);
|
||||
|
||||
@@ -87,9 +87,9 @@ FUZZ_TARGET(utxo_total_supply)
|
||||
tx.vin.emplace_back(txo.first);
|
||||
tx.vout.emplace_back(txo.second.nValue, txo.second.scriptPubKey); // "Forward" coin with no fee
|
||||
};
|
||||
const auto UpdateUtxoStats = [&]() {
|
||||
const auto UpdateUtxoStats = [&](bool wipe_cache) {
|
||||
LOCK(chainman.GetMutex());
|
||||
chainman.ActiveChainstate().ForceFlushStateToDisk();
|
||||
chainman.ActiveChainstate().ForceFlushStateToDisk(wipe_cache);
|
||||
utxo_stats = std::move(
|
||||
*Assert(kernel::ComputeUTXOStats(kernel::CoinStatsHashType::NONE, &chainman.ActiveChainstate().CoinsDB(), chainman.m_blockman, {})));
|
||||
// Check that miner can't print more money than they are allowed to
|
||||
@@ -99,7 +99,7 @@ FUZZ_TARGET(utxo_total_supply)
|
||||
|
||||
// Update internal state to chain tip
|
||||
StoreLastTxo();
|
||||
UpdateUtxoStats();
|
||||
UpdateUtxoStats(/*wipe_cache=*/fuzzed_data_provider.ConsumeBool());
|
||||
assert(ActiveHeight() == 0);
|
||||
// Get at which height we duplicate the coinbase
|
||||
// Assuming that the fuzzer will mine relatively short chains (less than 200 blocks), we want the duplicate coinbase to be not too high.
|
||||
@@ -124,7 +124,7 @@ FUZZ_TARGET(utxo_total_supply)
|
||||
circulation += GetBlockSubsidy(ActiveHeight(), Params().GetConsensus());
|
||||
|
||||
assert(ActiveHeight() == 1);
|
||||
UpdateUtxoStats();
|
||||
UpdateUtxoStats(/*wipe_cache=*/fuzzed_data_provider.ConsumeBool());
|
||||
current_block = PrepareNextBlock();
|
||||
StoreLastTxo();
|
||||
|
||||
@@ -163,7 +163,7 @@ FUZZ_TARGET(utxo_total_supply)
|
||||
circulation += GetBlockSubsidy(ActiveHeight(), Params().GetConsensus());
|
||||
}
|
||||
|
||||
UpdateUtxoStats();
|
||||
UpdateUtxoStats(/*wipe_cache=*/fuzzed_data_provider.ConsumeBool());
|
||||
|
||||
if (!was_valid) {
|
||||
// utxo stats must not change
|
||||
|
||||
Reference in New Issue
Block a user