/root/bitcoin/src/index/coinstatsindex.h
Line | Count | Source (jump to first uncovered line) |
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::BlockRef>& block) override; |
47 | | |
48 | | bool CustomCommit(CDBBatch& batch) override; |
49 | | |
50 | | bool CustomAppend(const interfaces::BlockInfo& block) override; |
51 | | |
52 | | bool CustomRewind(const interfaces::BlockRef& current_tip, const interfaces::BlockRef& 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 |