Bitcoin ABC 0.32.5
P2P Digital Currency
Classes | Functions | Variables
blockchain.cpp File Reference
#include <rpc/blockchain.h>
#include <avalanche/processor.h>
#include <blockfilter.h>
#include <chain.h>
#include <chainparams.h>
#include <clientversion.h>
#include <coins.h>
#include <common/args.h>
#include <config.h>
#include <consensus/amount.h>
#include <consensus/params.h>
#include <consensus/validation.h>
#include <core_io.h>
#include <hash.h>
#include <index/blockfilterindex.h>
#include <index/coinstatsindex.h>
#include <logging/timer.h>
#include <net.h>
#include <net_processing.h>
#include <node/blockstorage.h>
#include <node/coinstats.h>
#include <node/context.h>
#include <node/utxo_snapshot.h>
#include <primitives/transaction.h>
#include <rpc/server.h>
#include <rpc/server_util.h>
#include <rpc/util.h>
#include <script/descriptor.h>
#include <serialize.h>
#include <streams.h>
#include <txdb.h>
#include <txmempool.h>
#include <undo.h>
#include <util/check.h>
#include <util/fs.h>
#include <util/strencodings.h>
#include <util/string.h>
#include <util/translation.h>
#include <validation.h>
#include <validationinterface.h>
#include <warnings.h>
#include <condition_variable>
#include <cstdint>
#include <memory>
#include <mutex>
#include <optional>
Include dependency graph for blockchain.cpp:

Go to the source code of this file.

Classes

struct  CUpdatedBlock
 
struct  CompareBlocksByHeight
 Comparison function for sorting the getchaintips heads. More...
 
class  CoinsViewScanReserver
 
class  NetworkDisable
 RAII class that disables the network in its constructor and enables it in its destructor. More...
 
class  TemporaryRollback
 RAII class that temporarily rolls back the local chain in it's constructor and rolls it forward again in it's destructor. More...
 

Functions

static CUpdatedBlock latestblock GUARDED_BY (cs_blockchange)
 
std::tuple< std::unique_ptr< CCoinsViewCursor >, CCoinsStats, const CBlockIndex * > PrepareUTXOSnapshot(Chainstate &chainstate, const std::function< void()> &interruption_point={}) EXCLUSIVE_LOCKS_REQUIRED(UniValue WriteUTXOSnapshot (Chainstate &chainstate, CCoinsViewCursor *pcursor, CCoinsStats *maybe_stats, const CBlockIndex *tip, AutoFile &afile, const fs::path &path, const fs::path &temppath, const std::function< void()> &interruption_point={})
 
double GetDifficulty (const CBlockIndex &blockindex)
 Calculate the difficulty for a given block index. More...
 
static int ComputeNextBlockAndDepth (const CBlockIndex &tip, const CBlockIndex &blockindex, const CBlockIndex *&next)
 
static const CBlockIndexParseHashOrHeight (const UniValue &param, ChainstateManager &chainman)
 
UniValue blockheaderToJSON (const CBlockIndex &tip, const CBlockIndex &blockindex)
 Block header to JSON. More...
 
UniValue blockToJSON (BlockManager &blockman, const CBlock &block, const CBlockIndex &tip, const CBlockIndex &blockindex, TxVerbosity verbosity)
 Block description to JSON. More...
 
static RPCHelpMan getblockcount ()
 
static RPCHelpMan getbestblockhash ()
 
void RPCNotifyBlockChange (const CBlockIndex *pindex)
 Callback for when block tip changed. More...
 
static RPCHelpMan waitfornewblock ()
 
static RPCHelpMan waitforblock ()
 
static RPCHelpMan waitforblockheight ()
 
static RPCHelpMan syncwithvalidationinterfacequeue ()
 
static RPCHelpMan getdifficulty ()
 
static RPCHelpMan getblockfrompeer ()
 
static RPCHelpMan getblockhash ()
 
static RPCHelpMan getblockheader ()
 
static CBlock GetBlockChecked (BlockManager &blockman, const CBlockIndex &blockindex)
 
static CBlockUndo GetUndoChecked (BlockManager &blockman, const CBlockIndex &blockindex)
 
static RPCHelpMan getblock ()
 
std::optional< int > GetPruneHeight (const BlockManager &blockman, const CChain &chain)
 
static RPCHelpMan pruneblockchain ()
 
static CoinStatsHashType ParseHashType (const std::string &hash_type_input)
 
static RPCHelpMan gettxoutsetinfo ()
 
RPCHelpMan gettxout ()
 
static RPCHelpMan verifychain ()
 
RPCHelpMan getblockchaininfo ()
 
static RPCHelpMan getchaintips ()
 
static RPCHelpMan preciousblock ()
 
static void InvalidateBlock (ChainstateManager &chainman, avalanche::Processor *const avalanche, const BlockHash &block_hash)
 
static RPCHelpMan invalidateblock ()
 
RPCHelpMan parkblock ()
 
static void ReconsiderBlock (ChainstateManager &chainman, avalanche::Processor *const avalanche, const BlockHash &block_hash)
 
static RPCHelpMan reconsiderblock ()
 
RPCHelpMan unparkblock ()
 
static RPCHelpMan getchaintxstats ()
 
template<typename T >
static T CalculateTruncatedMedian (std::vector< T > &scores)
 
template<typename T >
static bool SetHasKeys (const std::set< T > &set)
 
template<typename T , typename Tk , typename... Args>
static bool SetHasKeys (const std::set< T > &set, const Tk &key, const Args &...args)
 
static RPCHelpMan getblockstats ()
 
static RPCHelpMan scantxoutset ()
 
static RPCHelpMan getblockfilter ()
 
static RPCHelpMan dumptxoutset ()
 Serialize the UTXO set to a file for loading elsewhere. More...
 
std::tuple< std::unique_ptr< CCoinsViewCursor >, CCoinsStats, const CBlockIndex * > PrepareUTXOSnapshot (Chainstate &chainstate, const std::function< void()> &interruption_point)
 
UniValue CreateUTXOSnapshot (node::NodeContext &node, Chainstate &chainstate, AutoFile &afile, const fs::path &path, const fs::path &tmppath)
 Test-only helper to create UTXO snapshots given a chainstate and a file handle. More...
 
static RPCHelpMan loadtxoutset ()
 
static RPCHelpMan getchainstates ()
 
void RegisterBlockchainRPCCommands (CRPCTable &t)
 

Variables

static GlobalMutex cs_blockchange
 
static std::condition_variable cond_blockchange
 
static constexpr size_t PER_UTXO_OVERHEAD
 
static std::atomic< int > g_scan_progress
 RAII object to prevent concurrency issue when scanning the txout set. More...
 
static std::atomic< bool > g_scan_in_progress
 
static std::atomic< bool > g_should_abort_scan
 
const std::vector< RPCResultRPCHelpForChainstate
 

Function Documentation

◆ blockheaderToJSON()

UniValue blockheaderToJSON ( const CBlockIndex tip,
const CBlockIndex blockindex 
)

Block header to JSON.

Definition at line 146 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ blockToJSON()

UniValue blockToJSON ( BlockManager blockman,
const CBlock block,
const CBlockIndex tip,
const CBlockIndex blockindex,
TxVerbosity  verbosity 
)

Block description to JSON.

Definition at line 180 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CalculateTruncatedMedian()

template<typename T >
static T CalculateTruncatedMedian ( std::vector< T > &  scores)
static

Definition at line 2001 of file blockchain.cpp.

Here is the caller graph for this function:

◆ ComputeNextBlockAndDepth()

static int ComputeNextBlockAndDepth ( const CBlockIndex tip,
const CBlockIndex blockindex,
const CBlockIndex *&  next 
)
static

Definition at line 103 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CreateUTXOSnapshot()

UniValue CreateUTXOSnapshot ( node::NodeContext node,
Chainstate chainstate,
AutoFile afile,
const fs::path path,
const fs::path tmppath 
)

Test-only helper to create UTXO snapshots given a chainstate and a file handle.

Returns
a UniValue map containing metadata about the snapshot.

Definition at line 3066 of file blockchain.cpp.

Here is the call graph for this function:

◆ dumptxoutset()

static RPCHelpMan dumptxoutset ( )
static

Serialize the UTXO set to a file for loading elsewhere.

See also
SnapshotMetadata

Definition at line 2727 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getbestblockhash()

static RPCHelpMan getbestblockhash ( )
static

Definition at line 237 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getblock()

static RPCHelpMan getblock ( )
static

Definition at line 700 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getblockchaininfo()

RPCHelpMan getblockchaininfo ( )

Definition at line 1356 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetBlockChecked()

static CBlock GetBlockChecked ( BlockManager blockman,
const CBlockIndex blockindex 
)
static

Definition at line 659 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getblockcount()

static RPCHelpMan getblockcount ( )
static

Definition at line 219 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getblockfilter()

static RPCHelpMan getblockfilter ( )
static

Definition at line 2584 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getblockfrompeer()

static RPCHelpMan getblockfrompeer ( )
static

Definition at line 480 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getblockhash()

static RPCHelpMan getblockhash ( )
static

Definition at line 534 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getblockheader()

static RPCHelpMan getblockheader ( )
static

Definition at line 563 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getblockstats()

static RPCHelpMan getblockstats ( )
static

Definition at line 2028 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getchainstates()

static RPCHelpMan getchainstates ( )
static

Definition at line 3197 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getchaintips()

static RPCHelpMan getchaintips ( )
static

Idea: The set of chain tips is the active chain tip, plus orphan blocks which do not have another orphan building off of them. Algorithm:

  • Make one pass through BlockIndex(), picking out the orphan blocks, and also storing a set of the orphan block's pprev pointers.
  • Iterate through the orphan blocks. If the block isn't pointed to by another orphan, it is a chain tip.
  • Add the active chain tip

Definition at line 1481 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getchaintxstats()

static RPCHelpMan getchaintxstats ( )
static

Definition at line 1879 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getdifficulty()

static RPCHelpMan getdifficulty ( )
static

Definition at line 460 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetDifficulty()

double GetDifficulty ( const CBlockIndex blockindex)

Calculate the difficulty for a given block index.

Get the required difficulty of the next block w/r/t the given block index.

Definition at line 87 of file blockchain.cpp.

Here is the caller graph for this function:

◆ GetPruneHeight()

std::optional< int > GetPruneHeight ( const BlockManager blockman,
const CChain chain 
)

Definition at line 851 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ gettxout()

RPCHelpMan gettxout ( )

Definition at line 1212 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ gettxoutsetinfo()

static RPCHelpMan gettxoutsetinfo ( )
static

Definition at line 977 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetUndoChecked()

static CBlockUndo GetUndoChecked ( BlockManager blockman,
const CBlockIndex blockindex 
)
static

Definition at line 681 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GUARDED_BY()

static CUpdatedBlock latestblock GUARDED_BY ( cs_blockchange  )
static

◆ invalidateblock()

static RPCHelpMan invalidateblock ( )
static

Definition at line 1677 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ InvalidateBlock()

static void InvalidateBlock ( ChainstateManager chainman,
avalanche::Processor *const  avalanche,
const BlockHash block_hash 
)
static

Definition at line 1653 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ loadtxoutset()

static RPCHelpMan loadtxoutset ( )
static

Definition at line 3076 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parkblock()

RPCHelpMan parkblock ( )

Definition at line 1704 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ParseHashOrHeight()

static const CBlockIndex * ParseHashOrHeight ( const UniValue param,
ChainstateManager chainman 
)
static

Definition at line 114 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ParseHashType()

static CoinStatsHashType ParseHashType ( const std::string &  hash_type_input)
static

Definition at line 963 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ preciousblock()

static RPCHelpMan preciousblock ( )
static

Definition at line 1606 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ PrepareUTXOSnapshot()

std::tuple< std::unique_ptr< CCoinsViewCursor >, CCoinsStats, const CBlockIndex * > PrepareUTXOSnapshot ( Chainstate chainstate,
const std::function< void()> &  interruption_point 
)

Definition at line 2948 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ pruneblockchain()

static RPCHelpMan pruneblockchain ( )
static

Definition at line 889 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ reconsiderblock()

static RPCHelpMan reconsiderblock ( )
static

Definition at line 1783 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ReconsiderBlock()

static void ReconsiderBlock ( ChainstateManager chainman,
avalanche::Processor *const  avalanche,
const BlockHash block_hash 
)
static

Definition at line 1759 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ RegisterBlockchainRPCCommands()

void RegisterBlockchainRPCCommands ( CRPCTable t)

Definition at line 3271 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ RPCNotifyBlockChange()

void RPCNotifyBlockChange ( const CBlockIndex pindex)

Callback for when block tip changed.

Definition at line 255 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ scantxoutset()

static RPCHelpMan scantxoutset ( )
static

Definition at line 2357 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetHasKeys() [1/2]

template<typename T >
static bool SetHasKeys ( const std::set< T > &  set)
inlinestatic

Definition at line 2015 of file blockchain.cpp.

Here is the caller graph for this function:

◆ SetHasKeys() [2/2]

template<typename T , typename Tk , typename... Args>
static bool SetHasKeys ( const std::set< T > &  set,
const Tk &  key,
const Args &...  args 
)
inlinestatic

Definition at line 2019 of file blockchain.cpp.

Here is the call graph for this function:

◆ syncwithvalidationinterfacequeue()

static RPCHelpMan syncwithvalidationinterfacequeue ( )
static

Definition at line 443 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ unparkblock()

RPCHelpMan unparkblock ( )

Definition at line 1812 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ verifychain()

static RPCHelpMan verifychain ( )
static

Definition at line 1316 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ waitforblock()

static RPCHelpMan waitforblock ( )
static

Definition at line 321 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ waitforblockheight()

static RPCHelpMan waitforblockheight ( )
static

Definition at line 383 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ waitfornewblock()

static RPCHelpMan waitfornewblock ( )
static

Definition at line 264 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ WriteUTXOSnapshot()

UniValue WriteUTXOSnapshot ( Chainstate chainstate,
CCoinsViewCursor pcursor,
CCoinsStats maybe_stats,
const CBlockIndex tip,
AutoFile afile,
const fs::path path,
const fs::path temppath,
const std::function< void()> &  interruption_point = {} 
)

Definition at line 2988 of file blockchain.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ cond_blockchange

std::condition_variable cond_blockchange
static

Definition at line 69 of file blockchain.cpp.

◆ cs_blockchange

GlobalMutex cs_blockchange
static

Definition at line 68 of file blockchain.cpp.

◆ g_scan_in_progress

std::atomic<bool> g_scan_in_progress
static

Definition at line 2332 of file blockchain.cpp.

◆ g_scan_progress

std::atomic<int> g_scan_progress
static

RAII object to prevent concurrency issue when scanning the txout set.

Definition at line 2331 of file blockchain.cpp.

◆ g_should_abort_scan

std::atomic<bool> g_should_abort_scan
static

Definition at line 2333 of file blockchain.cpp.

◆ PER_UTXO_OVERHEAD

constexpr size_t PER_UTXO_OVERHEAD
staticconstexpr
Initial value:
=
sizeof(COutPoint) + sizeof(uint32_t) + sizeof(bool)

Definition at line 2025 of file blockchain.cpp.

◆ RPCHelpForChainstate

const std::vector<RPCResult> RPCHelpForChainstate
Initial value:
{
{RPCResult::Type::NUM, "blocks", "number of blocks in this chainstate"},
{RPCResult::Type::STR_HEX, "bestblockhash", "blockhash of the tip"},
{RPCResult::Type::NUM, "difficulty", "difficulty of the tip"},
{RPCResult::Type::NUM, "verificationprogress",
"progress towards the network tip"},
{RPCResult::Type::STR_HEX, "snapshot_blockhash", true,
"the base block of the snapshot this chainstate is based on, if any"},
{RPCResult::Type::NUM, "coins_db_cache_bytes", "size of the coinsdb cache"},
{RPCResult::Type::NUM, "coins_tip_cache_bytes",
"size of the coinstip cache"},
{RPCResult::Type::BOOL, "validated",
"whether the chainstate is fully validated. True if all blocks in the "
"chainstate were validated, false if the chain is based on a snapshot and "
"the snapshot has not yet been validated."},
}
@ STR_HEX
Special string with only hex chars.

Definition at line 3179 of file blockchain.cpp.