Line data Source code
1 : // Copyright (c) 2020-2022 The Bitcoin Core developers 2 : // Distributed under the MIT software license, see the accompanying 3 : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 : 5 : #ifndef BITCOIN_INDEX_COINSTATSINDEX_H 6 : #define BITCOIN_INDEX_COINSTATSINDEX_H 7 : 8 : #include <crypto/muhash.h> 9 : #include <index/base.h> 10 : 11 : class CBlockIndex; 12 : class CDBBatch; 13 : namespace kernel { 14 : struct CCoinsStats; 15 : } 16 : 17 : static constexpr bool DEFAULT_COINSTATSINDEX{false}; 18 : 19 : /** 20 : * CoinStatsIndex maintains statistics on the UTXO set. 21 : */ 22 : class CoinStatsIndex final : public BaseIndex 23 : { 24 : private: 25 : std::unique_ptr<BaseIndex::DB> m_db; 26 : 27 : MuHash3072 m_muhash; 28 : uint64_t m_transaction_output_count{0}; 29 : uint64_t m_bogo_size{0}; 30 : CAmount m_total_amount{0}; 31 : CAmount m_total_subsidy{0}; 32 : CAmount m_total_unspendable_amount{0}; 33 : CAmount m_total_prevout_spent_amount{0}; 34 : CAmount m_total_new_outputs_ex_coinbase_amount{0}; 35 : CAmount m_total_coinbase_amount{0}; 36 : CAmount m_total_unspendables_genesis_block{0}; 37 : CAmount m_total_unspendables_bip30{0}; 38 : CAmount m_total_unspendables_scripts{0}; 39 : CAmount m_total_unspendables_unclaimed_rewards{0}; 40 : 41 : [[nodiscard]] bool ReverseBlock(const CBlock& block, const CBlockIndex* pindex); 42 : 43 0 : bool AllowPrune() const override { return true; } 44 : 45 : protected: 46 : bool CustomInit(const std::optional<interfaces::BlockKey>& block) override; 47 : 48 : bool CustomCommit(CDBBatch& batch) override; 49 : 50 : bool CustomAppend(const interfaces::BlockInfo& block) override; 51 : 52 : bool CustomRewind(const interfaces::BlockKey& current_tip, const interfaces::BlockKey& new_tip) override; 53 : 54 0 : BaseIndex::DB& GetDB() const override { return *m_db; } 55 : 56 : public: 57 : // Constructs the index, which becomes available to be queried. 58 : explicit CoinStatsIndex(std::unique_ptr<interfaces::Chain> chain, size_t n_cache_size, bool f_memory = false, bool f_wipe = false); 59 : 60 : // Look up stats for a specific block using CBlockIndex 61 : std::optional<kernel::CCoinsStats> LookUpStats(const CBlockIndex& block_index) const; 62 : }; 63 : 64 : /// The global UTXO set hash object. 65 : extern std::unique_ptr<CoinStatsIndex> g_coin_stats_index; 66 : 67 : #endif // BITCOIN_INDEX_COINSTATSINDEX_H