coinstats.h raw

   1  // Copyright (c) 2022 The Limenka 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 LIMENKA_KERNEL_COINSTATS_H
   6  #define LIMENKA_KERNEL_COINSTATS_H
   7  
   8  #include <consensus/amount.h>
   9  #include <crypto/muhash.h>
  10  #include <streams.h>
  11  #include <uint256.h>
  12  
  13  #include <cstdint>
  14  #include <functional>
  15  #include <optional>
  16  
  17  class CCoinsView;
  18  class Coin;
  19  class COutPoint;
  20  class CScript;
  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      //! Total cumulative amount of unspendable coins up to and including this block
  54      CAmount total_unspendable_amount{0};
  55      //! Total cumulative amount of prevouts spent up to and including this block
  56      CAmount total_prevout_spent_amount{0};
  57      //! Total cumulative amount of outputs created up to and including this block
  58      CAmount total_new_outputs_ex_coinbase_amount{0};
  59      //! Total cumulative amount of coinbase outputs up to and including this block
  60      CAmount total_coinbase_amount{0};
  61      //! The unspendable coinbase amount from the genesis block
  62      CAmount total_unspendables_genesis_block{0};
  63      //! The two unspendable coinbase outputs total amount caused by BIP30
  64      CAmount total_unspendables_bip30{0};
  65      //! Total cumulative amount of outputs sent to unspendable scripts (OP_RETURN for example) up to and including this block
  66      CAmount total_unspendables_scripts{0};
  67      //! Total cumulative amount of coins lost due to unclaimed miner rewards up to and including this block
  68      CAmount total_unspendables_unclaimed_rewards{0};
  69  
  70      CCoinsStats() = default;
  71      CCoinsStats(int block_height, const uint256& block_hash);
  72  };
  73  
  74  uint64_t GetBogoSize(const CScript& script_pub_key);
  75  
  76  void ApplyCoinHash(MuHash3072& muhash, const COutPoint& outpoint, const Coin& coin);
  77  void RemoveCoinHash(MuHash3072& muhash, const COutPoint& outpoint, const Coin& coin);
  78  
  79  std::optional<CCoinsStats> ComputeUTXOStats(CoinStatsHashType hash_type, CCoinsView* view, node::BlockManager& blockman, const std::function<void()>& interruption_point = {});
  80  } // namespace kernel
  81  
  82  #endif // LIMENKA_KERNEL_COINSTATS_H
  83