coinstats.h raw

   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 CCoinsView;
  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      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, CCoinsView* view, node::BlockManager& blockman, const std::function<void()>& interruption_point = {});
  81  } // namespace kernel
  82  
  83  #endif // BITCOIN_KERNEL_COINSTATS_H
  84