mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-02-05 21:21:17 +00:00
fa996c58e8a31ebe610d186cef408b6dd3b385a8 refactor: Avoid integer overflow in ApplyStats when activating snapshot (MarcoFalke) fac01888d17423d6c23a9ce15d98fc88fb34e3cc Move AdditionOverflow to util, Add CheckedAdd with unit tests (MarcoFalke) fa526d8fb6ab8f2678a30d4536aa9c45218f5269 Add dev doc to CCoinsStats::m_hash_type and make it const (MarcoFalke) faff051560552d4405896e01920a18f698155a56 style: Remove unused whitespace (MarcoFalke) Pull request description: A snapshot contains the utxo set, including the out value. To activate the snapshot, the hash needs to be calculated. As a side-effect, the total amount in the snapshot is calculated (as the sum of all out values), but never used. Instead of running into an integer overflow in an unused result, don't calculate the result in the first place. Other code paths (using the active utxo set) can not run into an integer overflow, since the active utxo set is valid. Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=39716 ACKs for top commit: shaavan: reACK fa996c58e8a31ebe610d186cef408b6dd3b385a8 vasild: ACK fa996c58e8a31ebe610d186cef408b6dd3b385a8 Tree-SHA512: 4f207f634841f6f634fd02ae1e5907e343fd767524fd0e8149aa99fa9a1834fe50167d14874834d45236e9c325d567925f28129bacb7d80be29cf22277a16a14
81 lines
2.9 KiB
C++
81 lines
2.9 KiB
C++
// Copyright (c) 2010 Satoshi Nakamoto
|
|
// Copyright (c) 2009-2021 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#ifndef BITCOIN_NODE_COINSTATS_H
|
|
#define BITCOIN_NODE_COINSTATS_H
|
|
|
|
#include <chain.h>
|
|
#include <coins.h>
|
|
#include <consensus/amount.h>
|
|
#include <streams.h>
|
|
#include <uint256.h>
|
|
|
|
#include <cstdint>
|
|
#include <functional>
|
|
|
|
class BlockManager;
|
|
class CCoinsView;
|
|
|
|
enum class CoinStatsHashType {
|
|
HASH_SERIALIZED,
|
|
MUHASH,
|
|
NONE,
|
|
};
|
|
|
|
struct CCoinsStats {
|
|
//! Which hash type to use
|
|
const CoinStatsHashType m_hash_type;
|
|
|
|
int nHeight{0};
|
|
uint256 hashBlock{};
|
|
uint64_t nTransactions{0};
|
|
uint64_t nTransactionOutputs{0};
|
|
uint64_t nBogoSize{0};
|
|
uint256 hashSerialized{};
|
|
uint64_t nDiskSize{0};
|
|
//! The total amount, or nullopt if an overflow occurred calculating it
|
|
std::optional<CAmount> total_amount{0};
|
|
|
|
//! The number of coins contained.
|
|
uint64_t coins_count{0};
|
|
|
|
//! Signals if the coinstatsindex should be used (when available).
|
|
bool index_requested{true};
|
|
//! Signals if the coinstatsindex was used to retrieve the statistics.
|
|
bool index_used{false};
|
|
|
|
// Following values are only available from coinstats index
|
|
|
|
//! Total cumulative amount of block subsidies up to and including this block
|
|
CAmount total_subsidy{0};
|
|
//! Total cumulative amount of unspendable coins up to and including this block
|
|
CAmount total_unspendable_amount{0};
|
|
//! Total cumulative amount of prevouts spent up to and including this block
|
|
CAmount total_prevout_spent_amount{0};
|
|
//! Total cumulative amount of outputs created up to and including this block
|
|
CAmount total_new_outputs_ex_coinbase_amount{0};
|
|
//! Total cumulative amount of coinbase outputs up to and including this block
|
|
CAmount total_coinbase_amount{0};
|
|
//! The unspendable coinbase amount from the genesis block
|
|
CAmount total_unspendables_genesis_block{0};
|
|
//! The two unspendable coinbase outputs total amount caused by BIP30
|
|
CAmount total_unspendables_bip30{0};
|
|
//! Total cumulative amount of outputs sent to unspendable scripts (OP_RETURN for example) up to and including this block
|
|
CAmount total_unspendables_scripts{0};
|
|
//! Total cumulative amount of coins lost due to unclaimed miner rewards up to and including this block
|
|
CAmount total_unspendables_unclaimed_rewards{0};
|
|
|
|
CCoinsStats(CoinStatsHashType hash_type) : m_hash_type(hash_type) {}
|
|
};
|
|
|
|
//! Calculate statistics about the unspent transaction output set
|
|
bool GetUTXOStats(CCoinsView* view, BlockManager& blockman, CCoinsStats& stats, const std::function<void()>& interruption_point = {}, const CBlockIndex* pindex = nullptr);
|
|
|
|
uint64_t GetBogoSize(const CScript& script_pub_key);
|
|
|
|
CDataStream TxOutSer(const COutPoint& outpoint, const Coin& coin);
|
|
|
|
#endif // BITCOIN_NODE_COINSTATS_H
|