Branch data 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