coinstatsindex.h raw

   1  // Copyright (c) 2020-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_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      bool AllowPrune() const override { return true; }
  53  
  54  protected:
  55      bool CustomInit(const std::optional<interfaces::BlockRef>& block) override;
  56  
  57      bool CustomCommit(CDBBatch& batch) override;
  58  
  59      bool CustomAppend(const interfaces::BlockInfo& block) override;
  60  
  61      bool CustomRemove(const interfaces::BlockInfo& block) override;
  62  
  63      BaseIndex::DB& GetDB() const override { return *m_db; }
  64  
  65  public:
  66      // Constructs the index, which becomes available to be queried.
  67      explicit CoinStatsIndex(std::unique_ptr<interfaces::Chain> chain, size_t n_cache_size, bool f_memory = false, bool f_wipe = false);
  68  
  69      interfaces::Chain::NotifyOptions CustomOptions() override;
  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
  79