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 <arith_uint256.h>
9 : #include <consensus/amount.h>
10 : #include <crypto/muhash.h>
11 : #include <index/base.h>
12 : #include <interfaces/chain.h>
13 : #include <uint256.h>
14 :
15 : #include <cstddef>
16 : #include <cstdint>
17 : #include <memory>
18 : #include <optional>
19 :
20 : class CBlockIndex;
21 : namespace kernel {
22 : struct CCoinsStats;
23 : }
24 :
25 : static constexpr bool DEFAULT_COINSTATSINDEX{false};
26 :
27 : /**
28 : * CoinStatsIndex maintains statistics on the UTXO set.
29 : */
30 : class CoinStatsIndex final : public BaseIndex
31 : {
32 : private:
33 : std::unique_ptr<BaseIndex::DB> m_db;
34 :
35 : MuHash3072 m_muhash;
36 : uint64_t m_transaction_output_count{0};
37 : uint64_t m_bogo_size{0};
38 : CAmount m_total_amount{0};
39 : CAmount m_total_subsidy{0};
40 : arith_uint256 m_total_prevout_spent_amount{0};
41 : arith_uint256 m_total_new_outputs_ex_coinbase_amount{0};
42 : arith_uint256 m_total_coinbase_amount{0};
43 : CAmount m_total_unspendables_genesis_block{0};
44 : CAmount m_total_unspendables_bip30{0};
45 : CAmount m_total_unspendables_scripts{0};
46 : CAmount m_total_unspendables_unclaimed_rewards{0};
47 :
48 : uint256 m_current_block_hash{};
49 :
50 : [[nodiscard]] bool RevertBlock(const interfaces::BlockInfo& block);
51 :
52 7 : bool AllowPrune() const override { return true; }
53 :
54 : protected:
55 : interfaces::Chain::NotifyOptions CustomOptions() override;
56 :
57 : bool CustomInit(const std::optional<interfaces::BlockRef>& block) override;
58 :
59 : bool CustomCommit(CDBBatch& batch) override;
60 :
61 : bool CustomAppend(const interfaces::BlockInfo& block) override;
62 :
63 : bool CustomRemove(const interfaces::BlockInfo& block) override;
64 :
65 9 : BaseIndex::DB& GetDB() const override { return *m_db; }
66 :
67 : public:
68 : // Constructs the index, which becomes available to be queried.
69 : explicit CoinStatsIndex(std::unique_ptr<interfaces::Chain> chain, size_t n_cache_size, bool f_memory = false, bool f_wipe = false);
70 :
71 : // Look up stats for a specific block using CBlockIndex
72 : std::optional<kernel::CCoinsStats> LookUpStats(const CBlockIndex& block_index) const;
73 : };
74 :
75 : /// The global UTXO set hash object.
76 : extern std::unique_ptr<CoinStatsIndex> g_coin_stats_index;
77 :
78 : #endif // BITCOIN_INDEX_COINSTATSINDEX_H
|