diff --git a/src/node/coinstats.h b/src/node/coinstats.h --- a/src/node/coinstats.h +++ b/src/node/coinstats.h @@ -23,6 +23,7 @@ }; struct CCoinsStats { + CoinStatsHashType m_hash_type; int nHeight{0}; BlockHash hashBlock{}; uint64_t nTransactions{0}; @@ -34,11 +35,12 @@ //! The number of coins contained. uint64_t coins_count{0}; + + CCoinsStats(CoinStatsHashType hash_type) : m_hash_type(hash_type) {} }; //! Calculate statistics about the unspent transaction output set bool GetUTXOStats(CCoinsView *view, BlockManager &blockman, CCoinsStats &stats, - const CoinStatsHashType hash_type, const std::function &interruption_point = {}); #endif // BITCOIN_NODE_COINSTATS_H diff --git a/src/node/coinstats.cpp b/src/node/coinstats.cpp --- a/src/node/coinstats.cpp +++ b/src/node/coinstats.cpp @@ -88,7 +88,6 @@ static bool GetUTXOStats(CCoinsView *view, BlockManager &blockman, CCoinsStats &stats, T hash_obj, const std::function &interruption_point) { - stats = CCoinsStats(); std::unique_ptr pcursor(view->Cursor()); assert(pcursor); @@ -134,9 +133,8 @@ } bool GetUTXOStats(CCoinsView *view, BlockManager &blockman, CCoinsStats &stats, - CoinStatsHashType hash_type, const std::function &interruption_point) { - switch (hash_type) { + switch (stats.m_hash_type) { case (CoinStatsHashType::HASH_SERIALIZED): { CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); return GetUTXOStats(view, blockman, stats, ss, interruption_point); diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -1285,16 +1285,16 @@ const JSONRPCRequest &request) -> UniValue { UniValue ret(UniValue::VOBJ); - CCoinsStats stats; - NodeContext &node = EnsureAnyNodeContext(request.context); - ChainstateManager &chainman = EnsureChainman(node); - CChainState &active_chainstate = chainman.ActiveChainstate(); - active_chainstate.ForceFlushStateToDisk(); - const CoinStatsHashType hash_type{ request.params[0].isNull() ? CoinStatsHashType::HASH_SERIALIZED : ParseHashType(request.params[0].get_str())}; + CCoinsStats stats{hash_type}; + + NodeContext &node = EnsureAnyNodeContext(request.context); + ChainstateManager &chainman = EnsureChainman(node); + CChainState &active_chainstate = chainman.ActiveChainstate(); + active_chainstate.ForceFlushStateToDisk(); CCoinsView *coins_view; BlockManager *blockman; @@ -1303,7 +1303,8 @@ coins_view = &active_chainstate.CoinsDB(); blockman = &active_chainstate.m_blockman; } - if (GetUTXOStats(coins_view, *blockman, stats, hash_type, + + if (GetUTXOStats(coins_view, *blockman, stats, node.rpc_interruption_point)) { ret.pushKV("height", int64_t(stats.nHeight)); ret.pushKV("bestblock", stats.hashBlock.GetHex()); @@ -3078,7 +3079,7 @@ UniValue CreateUTXOSnapshot(NodeContext &node, CChainState &chainstate, CAutoFile &afile) { std::unique_ptr pcursor; - CCoinsStats stats; + CCoinsStats stats{CoinStatsHashType::NONE}; CBlockIndex *tip; { @@ -3100,7 +3101,6 @@ chainstate.ForceFlushStateToDisk(); if (!GetUTXOStats(&chainstate.CoinsDB(), chainstate.m_blockman, stats, - CoinStatsHashType::NONE, node.rpc_interruption_point)) { throw JSONRPCError(RPC_INTERNAL_ERROR, "Unable to read UTXO set"); } diff --git a/src/test/fuzz/coins_view.cpp b/src/test/fuzz/coins_view.cpp --- a/src/test/fuzz/coins_view.cpp +++ b/src/test/fuzz/coins_view.cpp @@ -299,14 +299,14 @@ break; } case 3: { - CCoinsStats stats; + CCoinsStats stats{CoinStatsHashType::HASH_SERIALIZED}; bool expected_code_path = false; try { (void)GetUTXOStats( &coins_view_cache, WITH_LOCK(::cs_main, return std::ref(g_chainman.m_blockman)), - stats, CoinStatsHashType::HASH_SERIALIZED); + stats); } catch (const std::logic_error &) { expected_code_path = true; } diff --git a/src/validation.cpp b/src/validation.cpp --- a/src/validation.cpp +++ b/src/validation.cpp @@ -6287,7 +6287,7 @@ assert(coins_cache.GetBestBlock() == base_blockhash); - CCoinsStats stats; + CCoinsStats stats{CoinStatsHashType::HASH_SERIALIZED}; auto breakpoint_fnc = [] { /* TODO insert breakpoint here? */ }; // As above, okay to immediately release cs_main here since no other context @@ -6297,7 +6297,7 @@ if (!GetUTXOStats(snapshot_coinsdb, WITH_LOCK(::cs_main, return std::ref(m_blockman)), stats, - CoinStatsHashType::HASH_SERIALIZED, breakpoint_fnc)) { + breakpoint_fnc)) { LogPrintf("[snapshot] failed to generate coins stats\n"); return false; }