diff options
author | Carl Dong <contact@carldong.me> | 2022-02-15 18:37:32 -0500 |
---|---|---|
committer | Carl Dong <contact@carldong.me> | 2022-05-23 14:50:35 -0400 |
commit | 524463daf6a10b20a4e20116a68101a684929eda (patch) | |
tree | 257ecace292cba8614f8b1e4592f524561293016 /src/node | |
parent | 46eb9fc56a296a2acea10ec7e5bf7b1827f73c45 (diff) | |
download | bitcoin-524463daf6a10b20a4e20116a68101a684929eda.tar.xz |
coinstats: Return purely out-param CCoinsStats
In previous commits in this patchset, we removed all in-param members of
CCoinsStats. Now that that's done, we can modify GetUTXOStats to return
an optional CCoinsStats instead of a status bool. Callers are modified
accordingly.
In rpc/blockchain.cpp, we discover that GetUTXOStats' status bool when
getting UTXO stats for pprev was not checked for error. We fix this as
well.
Diffstat (limited to 'src/node')
-rw-r--r-- | src/node/coinstats.cpp | 38 | ||||
-rw-r--r-- | src/node/coinstats.h | 10 |
2 files changed, 29 insertions, 19 deletions
diff --git a/src/node/coinstats.cpp b/src/node/coinstats.cpp index 13f1041a51..8fc53fe172 100644 --- a/src/node/coinstats.cpp +++ b/src/node/coinstats.cpp @@ -9,6 +9,7 @@ #include <crypto/muhash.h> #include <hash.h> #include <index/coinstatsindex.h> +#include <optional> #include <serialize.h> #include <uint256.h> #include <util/overflow.h> @@ -144,22 +145,31 @@ static bool GetUTXOStats(CCoinsView* view, BlockManager& blockman, CCoinsStats& return true; } -bool GetUTXOStats(CCoinsView* view, BlockManager& blockman, CCoinsStats& stats, CoinStatsHashType hash_type, const std::function<void()>& interruption_point, const CBlockIndex* pindex, bool index_requested) +std::optional<CCoinsStats> GetUTXOStats(CCoinsView* view, BlockManager& blockman, CoinStatsHashType hash_type, const std::function<void()>& interruption_point, const CBlockIndex* pindex, bool index_requested) { - switch (hash_type) { - case(CoinStatsHashType::HASH_SERIALIZED): { - CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); - return GetUTXOStats(view, blockman, stats, ss, interruption_point, pindex, hash_type, index_requested); - } - case(CoinStatsHashType::MUHASH): { - MuHash3072 muhash; - return GetUTXOStats(view, blockman, stats, muhash, interruption_point, pindex, hash_type, index_requested); - } - case(CoinStatsHashType::NONE): { - return GetUTXOStats(view, blockman, stats, nullptr, interruption_point, pindex, hash_type, index_requested); + CCoinsStats stats{}; + + bool success = [&]() -> bool { + switch (hash_type) { + case(CoinStatsHashType::HASH_SERIALIZED): { + CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); + return GetUTXOStats(view, blockman, stats, ss, interruption_point, pindex, hash_type, index_requested); + } + case(CoinStatsHashType::MUHASH): { + MuHash3072 muhash; + return GetUTXOStats(view, blockman, stats, muhash, interruption_point, pindex, hash_type, index_requested); + } + case(CoinStatsHashType::NONE): { + return GetUTXOStats(view, blockman, stats, nullptr, interruption_point, pindex, hash_type, index_requested); + } + } // no default case, so the compiler can warn about missing cases + assert(false); + }(); + + if (!success) { + return std::nullopt; } - } // no default case, so the compiler can warn about missing cases - assert(false); + return stats; } // The legacy hash serializes the hashBlock diff --git a/src/node/coinstats.h b/src/node/coinstats.h index adc67eb0a6..36cbf19f29 100644 --- a/src/node/coinstats.h +++ b/src/node/coinstats.h @@ -71,11 +71,11 @@ struct CCoinsStats { * * @param[in] index_requested Signals if the coinstatsindex should be used (when available). */ -bool GetUTXOStats(CCoinsView* view, node::BlockManager& blockman, - CCoinsStats& stats, CoinStatsHashType hash_type, - const std::function<void()>& interruption_point = {}, - const CBlockIndex* pindex = nullptr, - bool index_requested = true); +std::optional<CCoinsStats> GetUTXOStats(CCoinsView* view, node::BlockManager& blockman, + CoinStatsHashType hash_type, + const std::function<void()>& interruption_point = {}, + const CBlockIndex* pindex = nullptr, + bool index_requested = true); uint64_t GetBogoSize(const CScript& script_pub_key); |