Line data Source code
1 : // Copyright (c) 2022-present 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_KERNEL_COINSTATS_H
6 : #define BITCOIN_KERNEL_COINSTATS_H
7 :
8 : #include <arith_uint256.h>
9 : #include <consensus/amount.h>
10 : #include <uint256.h>
11 :
12 : #include <cstdint>
13 : #include <functional>
14 : #include <optional>
15 :
16 : class CCoinsViewDB;
17 : class Coin;
18 : class COutPoint;
19 : class CScript;
20 : class MuHash3072;
21 : namespace node {
22 : class BlockManager;
23 : } // namespace node
24 :
25 : namespace kernel {
26 : enum class CoinStatsHashType {
27 : HASH_SERIALIZED,
28 : MUHASH,
29 : NONE,
30 : };
31 :
32 : struct CCoinsStats {
33 : int nHeight{0};
34 : uint256 hashBlock{};
35 : uint64_t nTransactions{0};
36 : uint64_t nTransactionOutputs{0};
37 : uint64_t nBogoSize{0};
38 : uint256 hashSerialized{};
39 : uint64_t nDiskSize{0};
40 : //! The total amount, or nullopt if an overflow occurred calculating it
41 : std::optional<CAmount> total_amount{0};
42 :
43 : //! The number of coins contained.
44 : uint64_t coins_count{0};
45 :
46 : //! Signals if the coinstatsindex was used to retrieve the statistics.
47 : bool index_used{false};
48 :
49 : // Following values are only available from coinstats index
50 :
51 : //! Total cumulative amount of block subsidies up to and including this block
52 : CAmount total_subsidy{0};
53 : //! The unspendable coinbase amount from the genesis block
54 : CAmount total_unspendables_genesis_block{0};
55 : //! The two unspendable coinbase outputs total amount caused by BIP30
56 : CAmount total_unspendables_bip30{0};
57 : //! Total cumulative amount of outputs sent to unspendable scripts (OP_RETURN for example) up to and including this block
58 : CAmount total_unspendables_scripts{0};
59 : //! Total cumulative amount of coins lost due to unclaimed miner rewards up to and including this block
60 : CAmount total_unspendables_unclaimed_rewards{0};
61 :
62 : // Despite containing amounts the following values use a uint256 type to prevent overflowing
63 :
64 : //! Total cumulative amount of prevouts spent up to and including this block
65 : arith_uint256 total_prevout_spent_amount{0};
66 : //! Total cumulative amount of outputs created up to and including this block
67 : arith_uint256 total_new_outputs_ex_coinbase_amount{0};
68 : //! Total cumulative amount of coinbase outputs up to and including this block
69 : arith_uint256 total_coinbase_amount{0};
70 :
71 0 : CCoinsStats() = default;
72 : CCoinsStats(int block_height, const uint256& block_hash);
73 : };
74 :
75 : uint64_t GetBogoSize(const CScript& script_pub_key);
76 :
77 : void ApplyCoinHash(MuHash3072& muhash, const COutPoint& outpoint, const Coin& coin);
78 : void RemoveCoinHash(MuHash3072& muhash, const COutPoint& outpoint, const Coin& coin);
79 :
80 : std::optional<CCoinsStats> ComputeUTXOStats(CoinStatsHashType hash_type, const CCoinsViewDB& view, node::BlockManager& blockman, const std::function<void()>& interruption_point = {});
81 : } // namespace kernel
82 :
83 : #endif // BITCOIN_KERNEL_COINSTATS_H
|