8 #include <blockfilter.h>
10 #include <chainparams.h>
38 #include <txmempool.h>
52 #include <condition_variable>
79 int nShift = (blockindex->
nBits >> 24) & 0xff;
81 (double)0x0000ffff / (
double)(blockindex->
nBits & 0x00ffffff);
100 if (next && next->
pprev == blockindex) {
104 return blockindex == tip ? 1 : -1;
113 const int height{param.
getInt<
int>()};
117 const int current_tip{active_chain.
Height()};
118 if (height > current_tip) {
122 return active_chain[height];
144 result.
pushKV(
"confirmations", confirmations);
155 result.
pushKV(
"nTx", (uint64_t)blockindex->
nTx);
157 if (blockindex->
pprev)
183 const bool is_not_pruned{
WITH_LOCK(::
cs_main,
return !blockman.IsBlockPruned(blockindex))};
184 const bool have_undo{is_not_pruned && blockman.
UndoReadFromDisk(blockUndo, *blockindex)};
186 for (
size_t i = 0; i < block.
vtx.size(); ++i) {
189 const CTxUndo* txundo = (have_undo && i > 0) ? &blockUndo.
vtxundo.at(i - 1) :
nullptr;
205 "\nReturns the height of the most-work fully-validated chain.\n"
206 "The genesis block has height 0.\n",
226 "\nReturns the hash of the best (tip) block in the most-work fully-validated chain.\n",
248 latestblock.height = pindex->
nHeight;
256 "\nWaits for a specific new block and returns useful info about it.\n"
257 "\nReturns the current block on timeout or exit.\n",
274 if (!request.params[0].isNull())
275 timeout = request.params[0].
getInt<
int>();
298 "\nWaits for a specific new block and returns useful info about it.\n"
299 "\nReturns the current block on timeout or exit.\n",
311 HelpExampleCli(
"waitforblock",
"\"0000000000079f8ef3d2c688c244eb7a4570b24c9ed7b4a8c619eb02596f8862\" 1000")
312 +
HelpExampleRpc(
"waitforblock",
"\"0000000000079f8ef3d2c688c244eb7a4570b24c9ed7b4a8c619eb02596f8862\", 1000")
320 if (!request.params[1].isNull())
321 timeout = request.params[1].getInt<
int>();
334 ret.pushKV(
"hash", block.hash.GetHex());
335 ret.pushKV(
"height", block.height);
344 "\nWaits for (at least) block height and returns the height and hash\n"
345 "of the current tip.\n"
346 "\nReturns the current block on timeout or exit.\n",
365 int height = request.params[0].
getInt<
int>();
367 if (!request.params[1].isNull())
368 timeout = request.params[1].getInt<
int>();
389 return RPCHelpMan{
"syncwithvalidationinterfacequeue",
390 "\nWaits for the validation interface queue to catch up on everything that was there when we entered this function.\n",
408 "\nReturns the proof-of-work difficulty as a multiple of the minimum difficulty.\n",
411 RPCResult::Type::NUM,
"",
"the proof-of-work difficulty as a multiple of the minimum difficulty."},
429 "Attempt to fetch block from a given peer.\n\n"
430 "We must have the header for this block, e.g. using submitheader.\n"
431 "Subsequent calls for the same block may cause the response from the previous peer to be ignored.\n"
432 "Peers generally ignore requests for a stale block that they never fully verified, or one that is more than a month old.\n"
433 "When a peer does not respond with a block, we will disconnect.\n"
434 "Note: The block could be re-pruned as soon as it is received.\n\n"
435 "Returns an empty JSON object if the request was successfully scheduled.",
442 HelpExampleCli(
"getblockfrompeer",
"\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\" 0")
443 +
HelpExampleRpc(
"getblockfrompeer",
"\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\" 0")
452 const NodeId peer_id{request.params[1].getInt<int64_t>()};
463 throw JSONRPCError(
RPC_MISC_ERROR,
"In prune mode, only blocks that the node has already synced previously can be fetched from a peer");
467 if (block_has_data) {
471 if (
const auto err{peerman.
FetchBlock(peer_id, *index)}) {
482 "\nReturns hash of block in best-block-chain at height provided.\n",
498 int nHeight = request.params[0].getInt<
int>();
499 if (nHeight < 0 || nHeight > active_chain.
Height())
511 "\nIf verbose is false, returns a string that is serialized, hex-encoded data for blockheader 'hash'.\n"
512 "If verbose is true, returns an Object with information about blockheader <hash>.\n",
522 {
RPCResult::Type::NUM,
"confirmations",
"The number of confirmations, or -1 if the block is not on the main chain"},
541 HelpExampleCli(
"getblockheader",
"\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\"")
542 +
HelpExampleRpc(
"getblockheader",
"\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\"")
548 bool fVerbose =
true;
549 if (!request.params[1].isNull())
550 fVerbose = request.params[1].get_bool();
569 std::string strHex =
HexStr(ssBlock);
583 if (blockman.IsBlockPruned(pblockindex)) {
603 if (pblockindex->
nHeight == 0)
return blockUndo;
607 if (blockman.IsBlockPruned(pblockindex)) {
635 {
RPCResult::Type::STR,
"address",
true,
"The Bitcoin address (only if a well-defined address exists)"},
646 "\nIf verbosity is 0, returns a string that is serialized, hex-encoded data for block 'hash'.\n"
647 "If verbosity is 1, returns an Object with information about block <hash>.\n"
648 "If verbosity is 2, returns an Object with information about block <hash> and information about each transaction.\n"
649 "If verbosity is 3, returns an Object with information about block <hash> and information about each transaction, including prevout information for inputs (only for unpruned blocks in the current best chain).\n",
652 {
"verbosity|verbose",
RPCArg::Type::NUM,
RPCArg::Default{1},
"0 for hex-encoded data, 1 for a JSON object, 2 for JSON object with transaction data, and 3 for JSON object with transaction data including prevout information for inputs",
662 {
RPCResult::Type::NUM,
"confirmations",
"The number of confirmations, or -1 if the block is not on the main chain"},
677 {
RPCResult::Type::STR_HEX,
"chainwork",
"Expected number of hashes required to produce the chain up to this block (in hex)"},
690 {
RPCResult::Type::ELISION,
"",
"The transactions in the format of the getrawtransaction RPC. Different from verbosity = 1 \"tx\" result"},
709 HelpExampleCli(
"getblock",
"\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\"")
710 +
HelpExampleRpc(
"getblock",
"\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\"")
717 if (!request.params[1].isNull()) {
718 if (request.params[1].isBool()) {
719 verbosity = request.params[1].get_bool() ? 1 : 0;
721 verbosity = request.params[1].getInt<
int>();
744 std::string strHex =
HexStr(ssBlock);
749 if (verbosity == 1) {
751 }
else if (verbosity == 2) {
767 " to prune blocks whose block time is at least 2 hours older than the provided timestamp."},
783 Chainstate& active_chainstate = chainman.ActiveChainstate();
786 int heightParam = request.params[0].getInt<
int>();
787 if (heightParam < 0) {
793 if (heightParam > 1000000000) {
802 unsigned int height = (
unsigned int) heightParam;
803 unsigned int chainHeight = (
unsigned int) active_chain.
Height();
806 }
else if (height > chainHeight) {
809 LogPrint(
BCLog::RPC,
"Attempt to prune blocks close to the tip. Retaining the minimum number of blocks.\n");
817 return static_cast<int64_t
>(last_block->nHeight - 1);
824 if (hash_type_input ==
"hash_serialized_2") {
825 return CoinStatsHashType::HASH_SERIALIZED;
826 }
else if (hash_type_input ==
"muhash") {
827 return CoinStatsHashType::MUHASH;
828 }
else if (hash_type_input ==
"none") {
842 const std::function<
void()>& interruption_point = {},
844 bool index_requested =
true)
868 "\nReturns statistics about the unspent transaction output set.\n"
869 "Note this call may take some time if you are not using coinstatsindex.\n",
871 {
"hash_type",
RPCArg::Type::STR,
RPCArg::Default{
"hash_serialized_2"},
"Which UTXO set hash should be calculated. Options: 'hash_serialized_2' (the legacy algorithm), 'muhash', 'none'."},
875 .type_str = {
"",
"string or numeric"},
885 {
RPCResult::Type::NUM,
"bogosize",
"Database-independent, meaningless metric indicating the UTXO set size"},
886 {
RPCResult::Type::STR_HEX,
"hash_serialized_2",
true,
"The serialized hash (only present if 'hash_serialized_2' hash_type is chosen)"},
888 {
RPCResult::Type::NUM,
"transactions",
true,
"The number of transactions with unspent outputs (not available when coinstatsindex is used)"},
889 {
RPCResult::Type::NUM,
"disk_size",
true,
"The estimated size of the chainstate on disk (not available when coinstatsindex is used)"},
891 {
RPCResult::Type::STR_AMOUNT,
"total_unspendable_amount",
true,
"The total amount of coins permanently excluded from the UTXO set (only available if coinstatsindex is used)"},
892 {
RPCResult::Type::OBJ,
"block_info",
true,
"Info on amounts in the block at this block height (only available if coinstatsindex is used)",
911 HelpExampleCli("gettxoutsetinfo", R
"("none" '"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09"')") +
912 HelpExampleCli("-named gettxoutsetinfo", R
"(hash_type='muhash' use_index='false')") +
916 HelpExampleRpc("gettxoutsetinfo", R
"("none", "00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09")")
924 bool index_requested = request.params[2].isNull() || request.params[2].get_bool();
928 Chainstate& active_chainstate = chainman.ActiveChainstate();
935 coins_view = &active_chainstate.
CoinsDB();
940 if (!request.params[1].isNull()) {
945 if (hash_type == CoinStatsHashType::HASH_SERIALIZED) {
949 if (!index_requested) {
961 if (pindex->
nHeight > summary.best_block_height) {
967 const std::optional<CCoinsStats> maybe_stats =
GetUTXOStats(coins_view, *blockman, hash_type,
node.rpc_interruption_point, pindex, index_requested);
968 if (maybe_stats.has_value()) {
974 if (hash_type == CoinStatsHashType::HASH_SERIALIZED) {
977 if (hash_type == CoinStatsHashType::MUHASH) {
990 const std::optional<CCoinsStats> maybe_prev_stats =
GetUTXOStats(coins_view, *blockman, hash_type,
node.rpc_interruption_point, pindex->
pprev, index_requested);
991 if (!maybe_prev_stats) {
994 prev_stats = maybe_prev_stats.value();
1008 block_info.
pushKV(
"unspendables", unspendables);
1010 ret.pushKV(
"block_info", block_info);
1023 "\nReturns details about an unspent transaction output.\n",
1027 {
"include_mempool",
RPCArg::Type::BOOL,
RPCArg::Default{
true},
"Whether to include the mempool. Note that an unspent output that is spent in the mempool won't appear."},
1040 {
RPCResult::Type::STR,
"address",
true,
"The Bitcoin address (only if a well-defined address exists)"},
1046 "\nGet unspent transactions\n"
1048 "\nView the details\n"
1050 "\nAs a JSON-RPC call\n"
1062 COutPoint out{hash, request.params[1].getInt<uint32_t>()};
1063 bool fMempool =
true;
1064 if (!request.params[2].isNull())
1065 fMempool = request.params[2].get_bool();
1068 Chainstate& active_chainstate = chainman.ActiveChainstate();
1087 ret.pushKV(
"confirmations", 0);
1094 ret.pushKV(
"scriptPubKey", o);
1105 "\nVerifies blockchain database.\n",
1112 RPCResult::Type::BOOL,
"",
"Verification finished successfully. If false, check debug.log for reason."},
1120 const int check_depth{request.params[1].isNull() ?
DEFAULT_CHECKBLOCKS : request.params[1].getInt<
int>()};
1125 Chainstate& active_chainstate = chainman.ActiveChainstate();
1139 rv.
pushKV(
"type",
"buried");
1152 if (blockindex ==
nullptr)
return;
1154 auto get_state_name = [](
const ThresholdState state) -> std::string {
1181 bip9.
pushKV(
"status", get_state_name(current_state));
1183 bip9.
pushKV(
"status_next", get_state_name(next_state));
1188 std::vector<bool> signals;
1197 bip9.
pushKV(
"statistics", statsUV);
1200 sig.reserve(signals.size());
1201 for (
const bool s : signals) {
1202 sig.push_back(s ?
'#' :
'-');
1204 bip9.
pushKV(
"signalling", sig);
1208 rv.
pushKV(
"type",
"bip9");
1222 "Returns an object containing various state info regarding blockchain processing.\n",
1228 {
RPCResult::Type::NUM,
"blocks",
"the height of the most-work fully-validated chain. The genesis block has height 0"},
1235 {
RPCResult::Type::BOOL,
"initialblockdownload",
"(debug information) estimate of whether this node is in Initial Block Download mode"},
1237 {
RPCResult::Type::NUM,
"size_on_disk",
"the estimated size of the block and undo files on disk"},
1239 {
RPCResult::Type::NUM,
"pruneheight",
true,
"height of the last block pruned, plus one (only present if pruning is enabled)"},
1240 {
RPCResult::Type::BOOL,
"automatic_pruning",
true,
"whether automatic pruning is enabled (only present if pruning is enabled)"},
1241 {
RPCResult::Type::NUM,
"prune_target_size",
true,
"the target size used by pruning (only present if automatic pruning is enabled)"},
1252 Chainstate& active_chainstate = chainman.ActiveChainstate();
1255 const int height{tip.nHeight};
1258 obj.
pushKV(
"blocks", height);
1259 obj.
pushKV(
"headers", chainman.m_best_header ? chainman.m_best_header->nHeight : -1);
1260 obj.
pushKV(
"bestblockhash", tip.GetBlockHash().GetHex());
1262 obj.
pushKV(
"time", tip.GetBlockTime());
1263 obj.
pushKV(
"mediantime", tip.GetMedianTimePast());
1265 obj.
pushKV(
"initialblockdownload", active_chainstate.IsInitialBlockDownload());
1266 obj.
pushKV(
"chainwork", tip.nChainWork.GetHex());
1270 obj.
pushKV(
"pruneheight", chainman.
m_blockman.GetFirstStoredBlock(tip)->nHeight);
1273 obj.
pushKV(
"automatic_pruning", automatic_pruning);
1274 if (automatic_pruning) {
1286 const std::vector<RPCResult> RPCHelpForDeployment{
1288 {
RPCResult::Type::NUM,
"height",
true,
"height of the first block which the rules are or will be enforced (only for \"buried\" type, or \"bip9\" type with \"active\" status)"},
1289 {
RPCResult::Type::BOOL,
"active",
"true if the rules are enforced for the mempool and the next block"},
1292 {
RPCResult::Type::NUM,
"bit",
true,
"the bit (0-28) in the block version field used to signal this softfork (only for \"started\" and \"locked_in\" status)"},
1293 {
RPCResult::Type::NUM_TIME,
"start_time",
"the minimum median time past of a block at which the bit gains its meaning"},
1294 {
RPCResult::Type::NUM_TIME,
"timeout",
"the median time past of a block at which the deployment is considered failed if not yet locked in"},
1295 {
RPCResult::Type::NUM,
"min_activation_height",
"minimum height of blocks for which the rules may be enforced"},
1296 {
RPCResult::Type::STR,
"status",
"status of deployment at specified block (one of \"defined\", \"started\", \"locked_in\", \"active\", \"failed\")"},
1299 {
RPCResult::Type::OBJ,
"statistics",
true,
"numeric statistics about signalling for a softfork (only for \"started\" and \"locked_in\" status)",
1302 {
RPCResult::Type::NUM,
"threshold",
true,
"the number of blocks with the version bit set required to activate the feature (only for \"started\" status)"},
1303 {
RPCResult::Type::NUM,
"elapsed",
"the number of blocks elapsed since the beginning of the current period"},
1304 {
RPCResult::Type::NUM,
"count",
"the number of blocks with the version bit set in the current period"},
1305 {
RPCResult::Type::BOOL,
"possible",
true,
"returns false if there are not enough blocks left in this period to pass activation threshold (only for \"started\" status)"},
1307 {
RPCResult::Type::STR,
"signalling",
true,
"indicates blocks that signalled with a # and blocks that did not with a -"},
1328 "Returns an object containing various state info regarding deployments of consensus changes.",
1346 const Chainstate& active_chainstate = chainman.ActiveChainstate();
1349 if (request.params[0].isNull()) {
1362 deploymentinfo.
pushKV(
"deployments", DeploymentInfo(blockindex, chainman));
1363 return deploymentinfo;
1386 "Return information about all known tips in the block tree,"
1387 " including the main chain as well as orphaned branches.\n",
1395 {
RPCResult::Type::NUM,
"branchlen",
"zero for main chain, otherwise length of branch connecting the tip to the main chain"},
1397 "Possible values for status:\n"
1398 "1. \"invalid\" This branch contains at least one invalid block\n"
1399 "2. \"headers-only\" Not all blocks for this branch are available, but the headers are valid\n"
1400 "3. \"valid-headers\" All blocks are available for this branch, but they were never fully validated\n"
1401 "4. \"valid-fork\" This branch is not part of the active chain, but is fully validated\n"
1402 "5. \"active\" This is the tip of the active main chain, which is certainly valid"},
1421 std::set<const CBlockIndex*, CompareBlocksByHeight> setTips;
1422 std::set<const CBlockIndex*> setOrphans;
1423 std::set<const CBlockIndex*> setPrevs;
1425 for (
const auto& [
_, block_index] : chainman.
BlockIndex()) {
1426 if (!active_chain.
Contains(&block_index)) {
1427 setOrphans.insert(&block_index);
1428 setPrevs.insert(block_index.pprev);
1432 for (std::set<const CBlockIndex*>::iterator it = setOrphans.begin(); it != setOrphans.end(); ++it) {
1433 if (setPrevs.erase(*it) == 0) {
1434 setTips.insert(*it);
1439 setTips.insert(active_chain.
Tip());
1445 obj.
pushKV(
"height", block->nHeight);
1446 obj.
pushKV(
"hash", block->phashBlock->GetHex());
1448 const int branchLen = block->nHeight - active_chain.
FindFork(block)->
nHeight;
1449 obj.
pushKV(
"branchlen", branchLen);
1452 if (active_chain.
Contains(block)) {
1458 }
else if (!block->HaveTxsDownloaded()) {
1460 status =
"headers-only";
1463 status =
"valid-fork";
1466 status =
"valid-headers";
1471 obj.
pushKV(
"status", status);
1484 "\nTreats a block as if it were received before others with the same work.\n"
1485 "\nA later preciousblock call can override the effect of an earlier one.\n"
1486 "\nThe effects of preciousblock are not retained across restarts.\n",
1510 chainman.ActiveChainstate().PreciousBlock(state, pblockindex);
1524 "\nPermanently marks a block as invalid, as if it violated a consensus rule.\n",
1547 chainman.ActiveChainstate().InvalidateBlock(state, pblockindex);
1550 chainman.ActiveChainstate().ActivateBestChain(state);
1565 "\nRemoves invalidity status of a block, its ancestors and its descendants, reconsider them for activation.\n"
1566 "This can be used to undo the effects of invalidateblock.\n",
1587 chainman.ActiveChainstate().ResetBlockFailureFlags(pblockindex);
1591 chainman.ActiveChainstate().ActivateBestChain(state);
1605 "\nCompute statistics about the total number and rate of transactions in the chain.\n",
1614 {
RPCResult::Type::NUM,
"txcount",
"The total number of transactions in the chain up to that point"},
1616 {
RPCResult::Type::NUM,
"window_final_block_height",
"The height of the final block in the window."},
1618 {
RPCResult::Type::NUM,
"window_tx_count",
true,
"The number of transactions in the window. Only returned if \"window_block_count\" is > 0"},
1619 {
RPCResult::Type::NUM,
"window_interval",
true,
"The elapsed time in the window in seconds. Only returned if \"window_block_count\" is > 0"},
1620 {
RPCResult::Type::NUM,
"txrate",
true,
"The average rate of transactions per second in the window. Only returned if \"window_interval\" is > 0"},
1632 if (request.params[1].isNull()) {
1649 if (request.params[0].isNull()) {
1650 blockcount = std::max(0, std::min(blockcount, pindex->
nHeight - 1));
1652 blockcount = request.params[0].getInt<
int>();
1654 if (blockcount < 0 || (blockcount > 0 && blockcount >= pindex->
nHeight)) {
1660 const int64_t nTimeDiff{pindex->
GetMedianTimePast() - past_block.GetMedianTimePast()};
1661 const int nTxDiff = pindex->
nChainTx - past_block.nChainTx;
1664 ret.pushKV(
"time", (int64_t)pindex->
nTime);
1667 ret.pushKV(
"window_final_block_height", pindex->
nHeight);
1668 ret.pushKV(
"window_block_count", blockcount);
1669 if (blockcount > 0) {
1670 ret.pushKV(
"window_tx_count", nTxDiff);
1671 ret.pushKV(
"window_interval", nTimeDiff);
1672 if (nTimeDiff > 0) {
1673 ret.pushKV(
"txrate", ((
double)nTxDiff) / nTimeDiff);
1682 template<
typename T>
1685 size_t size = scores.size();
1690 std::sort(scores.begin(), scores.end());
1691 if (size % 2 == 0) {
1692 return (scores[size / 2 - 1] + scores[size / 2]) / 2;
1694 return scores[size / 2];
1700 if (scores.empty()) {
1704 std::sort(scores.begin(), scores.end());
1708 total_weight / 10.0, total_weight / 4.0, total_weight / 2.0, (total_weight * 3.0) / 4.0, (total_weight * 9.0) / 10.0
1711 int64_t next_percentile_index = 0;
1712 int64_t cumulative_weight = 0;
1713 for (
const auto& element : scores) {
1714 cumulative_weight += element.second;
1715 while (next_percentile_index < NUM_GETBLOCKSTATS_PERCENTILES && cumulative_weight >= weights[next_percentile_index]) {
1716 result[next_percentile_index] = element.first;
1717 ++next_percentile_index;
1723 result[i] = scores.back().first;
1727 template<
typename T>
1728 static inline bool SetHasKeys(
const std::set<T>& set) {
return false;}
1729 template<
typename T,
typename Tk,
typename... Args>
1730 static inline bool SetHasKeys(
const std::set<T>& set,
const Tk& key,
const Args&...
args)
1741 "\nCompute per block statistics for a given window. All amounts are in satoshis.\n"
1742 "It won't work for some heights with pruning.\n",
1747 .type_str = {
"",
"string or numeric"},
1763 {
RPCResult::Type::ARR_FIXED,
"feerate_percentiles",
true,
"Feerates at the 10th, 25th, 50th, 75th, and 90th percentile weight unit (in satoshis per virtual byte)",
1788 {
RPCResult::Type::NUM,
"total_out",
true,
"Total amount in all outputs (excluding coinbase and thus reward [ie subsidy + totalfee])"},
1793 {
RPCResult::Type::NUM,
"utxo_increase",
true,
"The increase/decrease in the number of unspent outputs (not discounting op_return and similar)"},
1794 {
RPCResult::Type::NUM,
"utxo_size_inc",
true,
"The increase/decrease in size for the utxo index (not discounting op_return and similar)"},
1795 {
RPCResult::Type::NUM,
"utxo_increase_actual",
true,
"The increase/decrease in the number of unspent outputs, not counting unspendables"},
1796 {
RPCResult::Type::NUM,
"utxo_size_inc_actual",
true,
"The increase/decrease in size for the utxo index, not counting unspendables"},
1799 HelpExampleCli(
"getblockstats", R
"('"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09"' '["minfeerate","avgfeerate"]')") +
1800 HelpExampleCli("getblockstats", R
"(1000 '["minfeerate","avgfeerate"]')") +
1801 HelpExampleRpc("getblockstats", R
"("00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09", ["minfeerate","avgfeerate"])") +
1802 HelpExampleRpc("getblockstats", R
"(1000, ["minfeerate","avgfeerate"])")
1809 std::set<std::string> stats;
1810 if (!request.params[1].isNull()) {
1812 for (
unsigned int i = 0; i < stats_univalue.
size(); i++) {
1813 const std::string stat = stats_univalue[i].
get_str();
1821 const bool do_all = stats.size() == 0;
1822 const bool do_mediantxsize = do_all || stats.count(
"mediantxsize") != 0;
1823 const bool do_medianfee = do_all || stats.count(
"medianfee") != 0;
1824 const bool do_feerate_percentiles = do_all || stats.count(
"feerate_percentiles") != 0;
1825 const bool loop_inputs = do_all || do_medianfee || do_feerate_percentiles ||
1826 SetHasKeys(stats,
"utxo_increase",
"utxo_increase_actual",
"utxo_size_inc",
"utxo_size_inc_actual",
"totalfee",
"avgfee",
"avgfeerate",
"minfee",
"maxfee",
"minfeerate",
"maxfeerate");
1827 const bool loop_outputs = do_all || loop_inputs || stats.count(
"total_out");
1828 const bool do_calculate_size = do_mediantxsize ||
1829 SetHasKeys(stats,
"total_size",
"avgtxsize",
"mintxsize",
"maxtxsize",
"swtotal_size");
1830 const bool do_calculate_weight = do_all ||
SetHasKeys(stats,
"total_weight",
"avgfeerate",
"swtotal_weight",
"avgfeerate",
"feerate_percentiles",
"minfeerate",
"maxfeerate");
1831 const bool do_calculate_sw = do_all ||
SetHasKeys(stats,
"swtxs",
"swtotal_size",
"swtotal_weight");
1840 int64_t maxtxsize = 0;
1842 int64_t outputs = 0;
1843 int64_t swtotal_size = 0;
1844 int64_t swtotal_weight = 0;
1846 int64_t total_size = 0;
1847 int64_t total_weight = 0;
1849 int64_t utxo_size_inc = 0;
1850 int64_t utxo_size_inc_actual = 0;
1851 std::vector<CAmount> fee_array;
1852 std::vector<std::pair<CAmount, int64_t>> feerate_array;
1853 std::vector<int64_t> txsize_array;
1855 for (
size_t i = 0; i < block.
vtx.size(); ++i) {
1856 const auto& tx = block.
vtx.at(i);
1857 outputs += tx->vout.size();
1862 tx_total_out +=
out.nValue;
1865 utxo_size_inc += out_size;
1871 if (
out.scriptPubKey.IsUnspendable())
continue;
1874 utxo_size_inc_actual += out_size;
1878 if (tx->IsCoinBase()) {
1882 inputs += tx->vin.size();
1883 total_out += tx_total_out;
1885 int64_t tx_size = 0;
1886 if (do_calculate_size) {
1888 tx_size = tx->GetTotalSize();
1889 if (do_mediantxsize) {
1890 txsize_array.push_back(tx_size);
1892 maxtxsize = std::max(maxtxsize, tx_size);
1893 mintxsize = std::min(mintxsize, tx_size);
1894 total_size += tx_size;
1898 if (do_calculate_weight) {
1900 total_weight += weight;
1903 if (do_calculate_sw && tx->HasWitness()) {
1905 swtotal_size += tx_size;
1906 swtotal_weight += weight;
1911 const auto& txundo = blockUndo.
vtxundo.at(i - 1);
1912 for (
const Coin& coin: txundo.vprevout) {
1915 tx_total_in += prevoutput.
nValue;
1917 utxo_size_inc -= prevout_size;
1918 utxo_size_inc_actual -= prevout_size;
1921 CAmount txfee = tx_total_in - tx_total_out;
1924 fee_array.push_back(txfee);
1926 maxfee = std::max(maxfee, txfee);
1927 minfee = std::min(minfee, txfee);
1932 if (do_feerate_percentiles) {
1933 feerate_array.emplace_back(std::make_pair(feerate, weight));
1935 maxfeerate = std::max(maxfeerate, feerate);
1936 minfeerate = std::min(minfeerate, feerate);
1945 feerates_res.
push_back(feerate_percentiles[i]);
1949 ret_all.
pushKV(
"avgfee", (block.
vtx.size() > 1) ? totalfee / (block.
vtx.size() - 1) : 0);
1951 ret_all.
pushKV(
"avgtxsize", (block.
vtx.size() > 1) ? total_size / (block.
vtx.size() - 1) : 0);
1953 ret_all.
pushKV(
"feerate_percentiles", feerates_res);
1955 ret_all.
pushKV(
"ins", inputs);
1956 ret_all.
pushKV(
"maxfee", maxfee);
1957 ret_all.
pushKV(
"maxfeerate", maxfeerate);
1958 ret_all.
pushKV(
"maxtxsize", maxtxsize);
1963 ret_all.
pushKV(
"minfeerate", (minfeerate ==
MAX_MONEY) ? 0 : minfeerate);
1965 ret_all.
pushKV(
"outs", outputs);
1967 ret_all.
pushKV(
"swtotal_size", swtotal_size);
1968 ret_all.
pushKV(
"swtotal_weight", swtotal_weight);
1969 ret_all.
pushKV(
"swtxs", swtxs);
1971 ret_all.
pushKV(
"total_out", total_out);
1972 ret_all.
pushKV(
"total_size", total_size);
1973 ret_all.
pushKV(
"total_weight", total_weight);
1974 ret_all.
pushKV(
"totalfee", totalfee);
1975 ret_all.
pushKV(
"txs", (int64_t)block.
vtx.size());
1976 ret_all.
pushKV(
"utxo_increase", outputs - inputs);
1977 ret_all.
pushKV(
"utxo_size_inc", utxo_size_inc);
1978 ret_all.
pushKV(
"utxo_increase_actual", utxos - inputs);
1979 ret_all.
pushKV(
"utxo_size_inc_actual", utxo_size_inc_actual);
1986 for (
const std::string& stat : stats) {
1987 const UniValue& value = ret_all[stat];
1991 ret.pushKV(stat, value);
2000 bool FindScriptPubKey(std::atomic<int>& scan_progress,
const std::atomic<bool>& should_abort, int64_t&
count,
CCoinsViewCursor* cursor,
const std::set<CScript>& needles, std::map<COutPoint, Coin>& out_results, std::function<
void()>& interruption_point)
2004 while (cursor->
Valid()) {
2007 if (!cursor->
GetKey(key) || !cursor->
GetValue(coin))
return false;
2008 if (++
count % 8192 == 0) {
2009 interruption_point();
2015 if (
count % 256 == 0) {
2018 scan_progress = (int)(high * 100.0 / 65536.0 + 0.5);
2021 out_results.emplace(key, coin);
2025 scan_progress = 100;
2061 "\"start\" for starting a scan\n"
2062 "\"abort\" for aborting the current scan (returns true when abort was successful)\n"
2063 "\"status\" for progress report (in %) of the current scan"
2068 "Every scan object is either a string descriptor or an object:",
2082 "True if scan will be aborted (not necessarily before this RPC returns), or false if there is no scan to abort"
2085 "when action=='status' and no scan is in progress - possibly already completed",
RPCResult::Type::NONE,
"",
""
2096 const std::string EXAMPLE_DESCRIPTOR_RAW =
"raw(76a91411b366edfc0a8b66feebae5c2e25a7b6a5d1cf3188ac)#fm24fxxy";
2099 "\nScans the unspent transaction output set for entries that match certain output descriptors.\n"
2100 "Examples of output descriptors are:\n"
2101 " addr(<address>) Outputs whose scriptPubKey corresponds to the specified address (does not include P2PK)\n"
2102 " raw(<hex script>) Outputs whose scriptPubKey equals the specified hex scripts\n"
2103 " combo(<pubkey>) P2PK, P2PKH, P2WPKH, and P2SH-P2WPKH outputs for the given pubkey\n"
2104 " pkh(<pubkey>) P2PKH outputs for the given pubkey\n"
2105 " sh(multi(<n>,<pubkey>,<pubkey>,...)) P2SH-multisig outputs for the given threshold and pubkeys\n"
2106 " tr(<pubkey>) P2TR\n"
2107 " tr(<pubkey>,{pk(<pubkey>)}) P2TR with single fallback pubkey in tapscript\n"
2108 " rawtr(<pubkey>) P2TR with the specified key as output key rather than inner\n"
2109 " wsh(and_v(v:pk(<pubkey>),after(2))) P2WSH miniscript with mandatory pubkey and a timelock\n"
2110 "\nIn the above, <pubkey> either refers to a fixed public key in hexadecimal notation, or to an xpub/xprv optionally followed by one\n"
2111 "or more path elements separated by \"/\", and optionally ending in \"/*\" (unhardened), or \"/*'\" or \"/*h\" (hardened) to specify all\n"
2112 "unhardened or hardened child keys.\n"
2113 "In the latter case, a range needs to be specified by below if different from 1000.\n"
2114 "For more information on output descriptors, see the documentation in the doc/descriptors.md file.\n",
2145 HelpExampleCli(
"scantxoutset",
"start \'[\"" + EXAMPLE_DESCRIPTOR_RAW +
"\"]\'") +
2148 HelpExampleRpc(
"scantxoutset",
"\"start\", [\"" + EXAMPLE_DESCRIPTOR_RAW +
"\"]") +
2155 if (request.params[0].get_str() ==
"status") {
2163 }
else if (request.params[0].get_str() ==
"abort") {
2172 }
else if (request.params[0].get_str() ==
"start") {
2178 if (request.params.size() < 2) {
2182 std::set<CScript> needles;
2183 std::map<CScript, std::string> descriptors;
2190 for (
CScript& script : scripts) {
2192 needles.emplace(script);
2193 descriptors.emplace(std::move(script), std::move(inferred));
2199 std::vector<CTxOut> input_txos;
2200 std::map<COutPoint, Coin> coins;
2203 std::unique_ptr<CCoinsViewCursor> pcursor;
2209 Chainstate& active_chainstate = chainman.ActiveChainstate();
2215 result.
pushKV(
"success", res);
2220 for (
const auto& it : coins) {
2222 const Coin& coin = it.second;
2224 input_txos.push_back(txo);
2229 unspent.
pushKV(
"vout", (int32_t)outpoint.
n);
2238 result.
pushKV(
"unspents", unspents);
2282 for (
const auto& tx : block.vtx) {
2283 if (std::any_of(tx->vout.cbegin(), tx->vout.cend(), [&](
const auto& txout) {
2284 return needles.count(std::vector<unsigned char>(txout.scriptPubKey.begin(), txout.scriptPubKey.end())) != 0;
2290 for (
const auto& txundo : block_undo.vtxundo) {
2291 if (std::any_of(txundo.vprevout.cbegin(), txundo.vprevout.cend(), [&](
const auto& coin) {
2292 return needles.count(std::vector<unsigned char>(coin.out.scriptPubKey.begin(), coin.out.scriptPubKey.end())) != 0;
2304 "\nReturn relevant blockhashes for given descriptors (requires blockfilterindex).\n"
2305 "This call may take several minutes. Make sure to use no RPC timeout (bitcoin-cli -rpcclienttimeout=0)",
2314 {
"filter_false_positives",
RPCArg::Type::BOOL,
RPCArg::Default{
false},
"Filter false positives (slower and may fail on pruned nodes). Otherwise they may occur at a rate of 1/M"},
2336 HelpExampleCli(
"scanblocks",
"start '[\"addr(bcrt1q4u4nsgk6ug0sqz7r3rj9tykjxrsl0yy4d0wwte)\"]' 300000") +
2337 HelpExampleCli(
"scanblocks",
"start '[\"addr(bcrt1q4u4nsgk6ug0sqz7r3rj9tykjxrsl0yy4d0wwte)\"]' 100 150 basic") +
2339 HelpExampleRpc(
"scanblocks",
"\"start\", [\"addr(bcrt1q4u4nsgk6ug0sqz7r3rj9tykjxrsl0yy4d0wwte)\"], 300000") +
2340 HelpExampleRpc(
"scanblocks",
"\"start\", [\"addr(bcrt1q4u4nsgk6ug0sqz7r3rj9tykjxrsl0yy4d0wwte)\"], 100, 150, \"basic\"") +
2346 if (request.params[0].get_str() ==
"status") {
2355 }
else if (request.params[0].get_str() ==
"abort") {
2364 }
else if (request.params[0].get_str() ==
"start") {
2369 const std::string filtertype_name{request.params[4].isNull() ?
"basic" : request.params[4].get_str()};
2377 bool filter_false_positives{options.exists(
"filter_false_positives") ? options[
"filter_false_positives"].get_bool() :
false};
2393 start_index = active_chain.
Genesis();
2394 stop_block = active_chain.
Tip();
2395 if (!request.params[2].isNull()) {
2396 start_index = active_chain[request.params[2].getInt<
int>()];
2401 if (!request.params[3].isNull()) {
2402 stop_block = active_chain[request.params[3].getInt<
int>()];
2416 for (
const CScript& script : scripts) {
2417 needle_set.emplace(script.begin(), script.end());
2421 const int amount_per_chunk = 10000;
2422 std::vector<BlockFilter> filters;
2423 int start_block_height = start_index->
nHeight;
2424 const int total_blocks_to_process = stop_block->
nHeight - start_block_height;
2429 bool completed =
true;
2433 node.rpc_interruption_point();
2440 int start_block = !end_range ? start_index->
nHeight : start_index->
nHeight + 1;
2441 end_range = (start_block + amount_per_chunk < stop_block->
nHeight) ?
2448 if (filter.GetFilter().MatchAny(needle_set)) {
2449 if (filter_false_positives) {
2458 blocks.
push_back(filter.GetBlockHash().GetHex());
2462 start_index = end_range;
2465 int blocks_processed = end_range->
nHeight - start_block_height;
2466 if (total_blocks_to_process > 0) {
2474 }
while (start_index != stop_block);
2476 ret.pushKV(
"from_height", start_block_height);
2477 ret.pushKV(
"to_height", start_index->
nHeight);
2478 ret.pushKV(
"relevant_blocks", blocks);
2479 ret.pushKV(
"completed", completed);
2492 "\nRetrieve a BIP 157 content filter for a particular block.\n",
2504 HelpExampleCli(
"getblockfilter",
"\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\" \"basic\"") +
2505 HelpExampleRpc(
"getblockfilter",
"\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\", \"basic\"")
2511 if (!request.params[1].isNull()) {
2512 filtertype_name = request.params[1].get_str();
2526 bool block_was_connected;
2537 bool index_ready = index->BlockUntilSyncedToCurrentChain();
2544 std::string errmsg =
"Filter not found.";
2546 if (!block_was_connected) {
2548 errmsg +=
" Block was not connected to active chain.";
2549 }
else if (!index_ready) {
2551 errmsg +=
" Block filters are still in the process of being indexed.";
2554 errmsg +=
" This error is unexpected and indicates index corruption.";
2562 ret.pushKV(
"header", filter_header.
GetHex());
2577 "Write the serialized UTXO set to disk.",
2589 {
RPCResult::Type::NUM,
"nchaintx",
"the number of transactions in the chain up to and including the base block"},
2606 path.
u8string() +
" already exists. If you are sure this is what you want, "
2607 "move it out of the way first");
2612 if (afile.IsNull()) {
2615 "Couldn't open file " + temppath.
u8string() +
" for writing.");
2620 node,
node.chainman->ActiveChainstate(), afile, path, temppath);
2621 fs::rename(temppath, path);
2636 std::unique_ptr<CCoinsViewCursor> pcursor;
2637 std::optional<CCoinsStats> maybe_stats;
2676 unsigned int iter{0};
2678 while (pcursor->Valid()) {
2679 if (iter % 5000 == 0)
node.rpc_interruption_point();
2681 if (pcursor->GetKey(key) && pcursor->GetValue(coin)) {
2692 result.
pushKV(
"coins_written", maybe_stats->coins_count);
2696 result.
pushKV(
"txoutset_hash", maybe_stats->hashSerialized.ToString());
2734 for (
const auto& c : commands) {
2735 t.appendCommand(c.name, &c);
static constexpr CAmount MAX_MONEY
No amount larger than this (in satoshi) is valid.
bool MoneyRange(const CAmount &nValue)
int64_t CAmount
Amount in satoshis (Can be negative)
static RPCHelpMan getblock()
static int ComputeNextBlockAndDepth(const CBlockIndex *tip, const CBlockIndex *blockindex, const CBlockIndex *&next)
static RPCHelpMan getdifficulty()
static const auto scan_result_abort
static std::atomic< bool > g_scan_in_progress
static bool SetHasKeys(const std::set< T > &set)
static RPCHelpMan reconsiderblock()
static T CalculateTruncatedMedian(std::vector< T > &scores)
static RPCHelpMan invalidateblock()
const RPCResult getblock_vin
static RPCHelpMan syncwithvalidationinterfacequeue()
static RPCHelpMan getchaintips()
static RPCHelpMan gettxoutsetinfo()
static std::optional< kernel::CCoinsStats > GetUTXOStats(CCoinsView *view, node::BlockManager &blockman, kernel::CoinStatsHashType hash_type, const std::function< void()> &interruption_point={}, const CBlockIndex *pindex=nullptr, bool index_requested=true)
Calculate statistics about the unspent transaction output set.
static std::atomic< int > g_scanfilter_progress_height
static RPCHelpMan getblockstats()
static std::atomic< bool > g_scanfilter_should_abort_scan
static std::atomic< int > g_scanfilter_progress
RAII object to prevent concurrency issue when scanning blockfilters.
static void SoftForkDescPushBack(const CBlockIndex *blockindex, UniValue &softforks, const ChainstateManager &chainman, Consensus::BuriedDeployment dep)
static RPCHelpMan preciousblock()
static constexpr size_t PER_UTXO_OVERHEAD
double GetDifficulty(const CBlockIndex *blockindex)
Get the difficulty of the net wrt to the given block index.
static const auto scan_objects_arg_desc
static RPCHelpMan scantxoutset()
CoinStatsHashType ParseHashType(const std::string &hash_type_input)
static bool CheckBlockFilterMatches(BlockManager &blockman, const CBlockIndex &blockindex, const GCSFilter::ElementSet &needles)
static std::condition_variable cond_blockchange
void CalculatePercentilesByWeight(CAmount result[NUM_GETBLOCKSTATS_PERCENTILES], std::vector< std::pair< CAmount, int64_t >> &scores, int64_t total_weight)
Used by getblockstats to get feerates at different percentiles by weight
static std::atomic< int > g_scan_progress
RAII object to prevent concurrency issue when scanning the txout set.
static CBlockUndo GetUndoChecked(BlockManager &blockman, const CBlockIndex *pblockindex)
RPCHelpMan getdeploymentinfo()
static RPCHelpMan getblockfilter()
static RPCHelpMan getbestblockhash()
static CBlock GetBlockChecked(BlockManager &blockman, const CBlockIndex *pblockindex)
RPCHelpMan getblockchaininfo()
static RPCHelpMan getchaintxstats()
static RPCHelpMan waitforblock()
static RPCHelpMan getblockfrompeer()
static const auto scan_result_status_some
UniValue blockToJSON(BlockManager &blockman, const CBlock &block, const CBlockIndex *tip, const CBlockIndex *blockindex, TxVerbosity verbosity)
Block description to JSON.
static const CBlockIndex * ParseHashOrHeight(const UniValue ¶m, ChainstateManager &chainman)
static RPCHelpMan getblockhash()
void RegisterBlockchainRPCCommands(CRPCTable &t)
static RPCHelpMan gettxout()
static RPCHelpMan verifychain()
static std::atomic< bool > g_should_abort_scan
static const auto scan_action_arg_desc
UniValue blockheaderToJSON(const CBlockIndex *tip, const CBlockIndex *blockindex)
Block header to JSON.
static RPCHelpMan waitforblockheight()
static RPCHelpMan pruneblockchain()
static CUpdatedBlock latestblock GUARDED_BY(cs_blockchange)
static RPCHelpMan getblockheader()
static RPCHelpMan scanblocks()
static std::atomic< bool > g_scanfilter_in_progress
UniValue CreateUTXOSnapshot(NodeContext &node, Chainstate &chainstate, AutoFile &afile, const fs::path &path, const fs::path &temppath)
Helper to create UTXO snapshots given a chainstate and a file handle.
static GlobalMutex cs_blockchange
static RPCHelpMan dumptxoutset()
Serialize the UTXO set to a file for loading elsewhere.
static RPCHelpMan getblockcount()
static RPCHelpMan waitfornewblock()
static const auto scan_result_status_none
void RPCNotifyBlockChange(const CBlockIndex *pindex)
Callback for when block tip changed.
static constexpr int NUM_GETBLOCKSTATS_PERCENTILES
const std::string & BlockFilterTypeName(BlockFilterType filter_type)
Get the human-readable name for a filter type.
bool BlockFilterTypeByName(const std::string &name, BlockFilterType &filter_type)
Find a filter type by its human-readable name.
BlockFilterIndex * GetBlockFilterIndex(BlockFilterType filter_type)
Get a block filter index by type.
@ BLOCK_VALID_SCRIPTS
Scripts & signatures ok. Implies all parents are also at least SCRIPTS.
@ BLOCK_VALID_TREE
All parent headers found, difficulty matches, timestamp >= median previous, checkpoint.
@ BLOCK_HAVE_DATA
full block available in blk*.dat
static constexpr int64_t TIMESTAMP_WINDOW
Timestamp window used as a grace period by code that compares external timestamps (such as timestamps...
#define CHECK_NONFATAL(condition)
Identity function.
const fs::path & GetDataDirNet() const
Get data directory path with appended network identifier.
Non-refcounted RAII wrapper for FILE*.
Complete block filter struct as defined in BIP 157.
const std::vector< unsigned char > & GetEncodedFilter() const LIFETIMEBOUND
BlockFilterIndex is used to store and retrieve block filters, hashes, and headers for a range of bloc...
bool LookupFilterRange(int start_height, const CBlockIndex *stop_index, std::vector< BlockFilter > &filters_out) const
Get a range of filters between two heights on a chain.
bool LookupFilter(const CBlockIndex *block_index, BlockFilter &filter_out) const
Get a single filter by block.
bool LookupFilterHeader(const CBlockIndex *block_index, uint256 &header_out) EXCLUSIVE_LOCKS_REQUIRED(!m_cs_headers_cache)
Get a single filter header by block.
BlockFiltersScanReserver()=default
~BlockFiltersScanReserver()
std::vector< CTransactionRef > vtx
The block chain is a tree shaped structure starting with the genesis block at the root,...
CBlockIndex * pprev
pointer to the index of the predecessor of this block
CBlockHeader GetBlockHeader() const
arith_uint256 nChainWork
(memory only) Total amount of work (expected number of hashes) in the chain up to and including this ...
uint256 GetBlockHash() const
int64_t GetBlockTime() const
int64_t GetMedianTimePast() const
unsigned int nTx
Number of transactions in this block.
bool IsValid(enum BlockStatus nUpTo=BLOCK_VALID_TRANSACTIONS) const EXCLUSIVE_LOCKS_REQUIRED(
Check whether this block index entry is valid up to the passed validity level.
int32_t nVersion
block header
CBlockIndex * GetAncestor(int height)
Efficiently find an ancestor of this block.
int nHeight
height of the entry in the chain. The genesis block has height 0
unsigned int nChainTx
(memory only) Number of transactions in the chain up to and including this block.
Undo information for a CBlock.
std::vector< CTxUndo > vtxundo
An in-memory indexed chain of blocks.
CBlockIndex * Genesis() const
Returns the index entry for the genesis block of this chain, or nullptr if none.
CBlockIndex * Tip() const
Returns the index entry for the tip of this chain, or nullptr if none.
CBlockIndex * FindEarliestAtLeast(int64_t nTime, int height) const
Find the earliest block with timestamp equal or greater than the given time and height equal or great...
int Height() const
Return the maximal height in the chain.
const CBlockIndex * FindFork(const CBlockIndex *pindex) const
Find the last common block between this chain and a block index entry.
bool Contains(const CBlockIndex *pindex) const
Efficiently check whether a block is present in this chain.
std::string GetChainTypeString() const
Return the chain type string.
const ChainTxData & TxData() const
const Consensus::Params & GetConsensus() const
uint64_t PruneAfterHeight() const
CCoinsView that adds a memory cache for transactions to another CCoinsView.
uint256 GetBestBlock() const override
Retrieve the block hash whose state this CCoinsView currently represents.
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
Cursor for iterating over CoinsView state.
virtual bool Valid() const =0
virtual bool GetKey(COutPoint &key) const =0
virtual bool GetValue(Coin &coin) const =0
std::unique_ptr< CCoinsViewCursor > Cursor() const override
Get a cursor to iterate over the whole state.
Abstract view on the open txout dataset.
virtual uint256 GetBestBlock() const
Retrieve the block hash whose state this CCoinsView currently represents.
CCoinsView that brings transactions from a mempool into view.
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
An outpoint - a combination of a transaction hash and an index n into its vout.
Serialized script, used inside transaction inputs and outputs.
CTxMemPool stores valid-according-to-the-current-best-chain transactions that may be included in the ...
RecursiveMutex cs
This mutex needs to be locked when accessing mapTx or other members that are guarded by it.
bool isSpent(const COutPoint &outpoint) const
An output of a transaction.
Undo information for a CTransaction.
RAII wrapper for VerifyDB: Verify consistency of the block and coin databases.
VerifyDBResult VerifyDB(Chainstate &chainstate, const Consensus::Params &consensus_params, CCoinsView &coinsview, int nCheckLevel, int nCheckDepth) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Chainstate stores and provides an API to update our local knowledge of the current best chain.
CChain m_chain
The current chain of blockheaders we consult and build on.
CCoinsViewDB & CoinsDB() EXCLUSIVE_LOCKS_REQUIRED(
void ForceFlushStateToDisk()
Unconditionally flush all changes to disk.
CCoinsViewCache & CoinsTip() EXCLUSIVE_LOCKS_REQUIRED(
node::BlockManager & m_blockman
Reference to a BlockManager instance which itself is shared across all Chainstate instances.
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
CChain & ActiveChain() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
const CChainParams & GetParams() const
node::BlockMap & BlockIndex() EXCLUSIVE_LOCKS_REQUIRED(
RecursiveMutex & GetMutex() const LOCK_RETURNED(
Alias for cs_main.
VersionBitsCache m_versionbitscache
Track versionbit status.
CBlockIndex * ActiveTip() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
kernel::Notifications & GetNotifications() const
const Consensus::Params & GetConsensus() const
node::BlockManager m_blockman
A single BlockManager instance is shared across each constructed chainstate to avoid duplicating bloc...
CTxOut out
unspent transaction output
uint32_t nHeight
at which height this containing transaction was included in the active block chain
unsigned int fCoinBase
whether containing transaction was a coinbase
CoinsViewScanReserver()=default
Double ended buffer combining vector and stream-like interfaces.
std::unordered_set< Element, ByteVectorHash > ElementSet
Different type to mark Mutex at global scope.
virtual std::optional< std::string > FetchBlock(NodeId peer_id, const CBlockIndex &block_index)=0
Attempt to manually fetch block from a given peer.
void push_back(UniValue val)
const std::string & get_str() const
const std::vector< UniValue > & getValues() const
const UniValue & get_array() const
void pushKV(std::string key, UniValue val)
std::string ToString() const
int StateSinceHeight(const CBlockIndex *pindexPrev, const Consensus::Params ¶ms, Consensus::DeploymentPos pos) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Get the block height at which the BIP9 deployment switched into the state for the block after pindexP...
static BIP9Stats Statistics(const CBlockIndex *pindex, const Consensus::Params ¶ms, Consensus::DeploymentPos pos, std::vector< bool > *signalling_blocks=nullptr)
Get the numerical statistics for a given deployment for the signalling period that includes pindex.
ThresholdState State(const CBlockIndex *pindexPrev, const Consensus::Params ¶ms, Consensus::DeploymentPos pos) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Get the BIP9 state for a given deployment for the block after pindexPrev.
std::string ToString() const
constexpr unsigned char * begin()
std::string GetHex() const
std::string GetHex() const
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
std::string u8string() const
Maintains a tree of blocks (stored in m_block_index) which is consulted to determine where the most-w...
bool ReadBlockFromDisk(CBlock &block, const FlatFilePos &pos) const
Functions for disk access for blocks.
CBlockIndex * LookupBlockIndex(const uint256 &hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
bool UndoReadFromDisk(CBlockUndo &blockundo, const CBlockIndex &index) const
uint64_t GetPruneTarget() const
Attempt to stay below this number of bytes of block files.
uint64_t CalculateCurrentUsage()
Calculate the amount of disk space the block & undo files currently use.
bool IsPruneMode() const
Whether running in -prune mode.
std::unique_ptr< CoinStatsIndex > g_coin_stats_index
The global UTXO set hash object.
static int64_t GetBlockWeight(const CBlock &block)
static int64_t GetTransactionWeight(const CTransaction &tx)
static const unsigned int MAX_BLOCK_SERIALIZED_SIZE
The maximum allowed size for a serialized block, in bytes (only for buffer size limits)
static const int WITNESS_SCALE_FACTOR
TxVerbosity
Verbose level for block's transaction.
@ SHOW_DETAILS_AND_PREVOUT
The same as previous option with information about prevouts if available.
@ SHOW_TXID
Only TXID for each block's transaction.
@ SHOW_DETAILS
Include TXID, inputs, outputs, and other common block's transaction information.
void ScriptToUniv(const CScript &script, UniValue &out, bool include_hex=true, bool include_address=false, const SigningProvider *provider=nullptr)
void TxToUniv(const CTransaction &tx, const uint256 &block_hash, UniValue &entry, bool include_hex=true, int serialize_flags=0, const CTxUndo *txundo=nullptr, TxVerbosity verbosity=TxVerbosity::SHOW_DETAILS)
UniValue ValueFromAmount(const CAmount amount)
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
std::string DeploymentName(Consensus::BuriedDeployment dep)
bool DeploymentActiveAfter(const CBlockIndex *pindexPrev, const Consensus::Params ¶ms, Consensus::BuriedDeployment dep, [[maybe_unused]] VersionBitsCache &versionbitscache)
Determine if a deployment is active for the next block.
bool DeploymentEnabled(const Consensus::Params ¶ms, Consensus::BuriedDeployment dep)
Determine if a deployment is enabled (can ever be active)
std::unique_ptr< Descriptor > InferDescriptor(const CScript &script, const SigningProvider &provider)
Find a descriptor for the specified script, using information from provider where possible.
const std::string CURRENCY_UNIT
#define T(expected, seed, data)
#define LogPrint(category,...)
BuriedDeployment
A buried deployment is one where the height of the activation has been hardcoded into the client impl...
static path u8path(const std::string &utf8_str)
static bool exists(const path &p)
static std::string PathToString(const path &path)
Convert path object to a byte string.
FILE * fopen(const fs::path &p, const char *mode)
fs::path AbsPathJoin(const fs::path &base, const fs::path &path)
Helper function for joining two paths.
static bool ComputeUTXOStats(CCoinsView *view, CCoinsStats &stats, T hash_obj, const std::function< void()> &interruption_point)
Calculate statistics about the unspent transaction output set.
static const int SERIALIZE_TRANSACTION_NO_WITNESS
A flag that is ORed into the protocol version to designate that a transaction should be (un)serialize...
std::shared_ptr< const CTransaction > CTransactionRef
UniValue JSONRPCError(int code, const std::string &message)
@ RPC_MISC_ERROR
General application defined errors.
@ RPC_INVALID_PARAMETER
Invalid, missing or duplicate parameter.
@ RPC_DATABASE_ERROR
Database error.
@ RPC_INVALID_ADDRESS_OR_KEY
Invalid address or key.
std::string HelpExampleCli(const std::string &methodname, const std::string &args)
std::string HelpExampleRpc(const std::string &methodname, const std::string &args)
const std::string UNIX_EPOCH_TIME
String used to describe UNIX epoch time in documentation, factored out to a constant for consistency.
std::string GetAllOutputTypes()
Gets all existing output types formatted for RPC help sections.
std::vector< CScript > EvalDescriptorStringOrObject(const UniValue &scanobject, FlatSigningProvider &provider, const bool expand_priv)
Evaluate a descriptor given as a string, or as a {"desc":...,"range":...} object, with default range ...
uint256 ParseHashV(const UniValue &v, std::string strName)
Utilities: convert hex-encoded Values (throws error if not hex).
size_t GetSerializeSize(const T &t, int nVersion=0)
bool IsRPCRunning()
Query whether RPC is running.
int RPCSerializationFlags()
ArgsManager & EnsureAnyArgsman(const std::any &context)
ChainstateManager & EnsureAnyChainman(const std::any &context)
NodeContext & EnsureAnyNodeContext(const std::any &context)
PeerManager & EnsurePeerman(const NodeContext &node)
CTxMemPool & EnsureMemPool(const NodeContext &node)
ChainstateManager & EnsureChainman(const NodeContext &node)
std::string MakeUnorderedList(const std::vector< std::string > &items)
Create an unordered multi-line list of items.
Display status of an in-progress BIP9 softfork.
int count
Number of blocks with the version bit set since the beginning of the current period.
int elapsed
Number of blocks elapsed since the beginning of the current period.
int threshold
Number of blocks with the version bit set required to activate the softfork.
bool possible
False if there are not enough blocks left in this period to pass activation threshold.
int period
Length of blocks of the BIP9 signalling period.
Comparison function for sorting the getchaintips heads.
bool operator()(const CBlockIndex *a, const CBlockIndex *b) const
int min_activation_height
If lock in occurs, delay activation until at least this block height.
int bit
Bit position to select the particular bit in nVersion.
int64_t nTimeout
Timeout/expiry MedianTime for the deployment attempt.
int64_t nStartTime
Start MedianTime for version bits miner confirmation.
BIP9Deployment vDeployments[MAX_VERSION_BITS_DEPLOYMENTS]
int DeploymentHeight(BuriedDeployment dep) const
int64_t nPowTargetSpacing
@ RANGE
Special type that is a NUM or [NUM,NUM].
@ STR_HEX
Special type that is a STR with only hex chars.
std::string DefaultHint
Hint for default value.
@ OMITTED
Optional argument for which the default value is omitted from help text for one of two reasons:
std::string oneline_description
Should be empty unless it is supposed to override the auto-generated summary line.
@ ELISION
Special type to denote elision (...)
@ NUM_TIME
Special numeric to denote unix epoch time.
@ ARR_FIXED
Special array that has a fixed number of entries.
@ OBJ_DYN
Special dictionary with keys that are not literals.
@ STR_HEX
Special string with only hex chars.
@ STR_AMOUNT
Special string to represent a floating point amount.
std::optional< CAmount > total_amount
The total amount, or nullopt if an overflow occurred calculating it.
CAmount total_unspendable_amount
Total cumulative amount of unspendable coins up to and including this block.
CAmount total_unspendables_scripts
Total cumulative amount of outputs sent to unspendable scripts (OP_RETURN for example) up to and incl...
CAmount total_new_outputs_ex_coinbase_amount
Total cumulative amount of outputs created up to and including this block.
uint64_t nTransactionOutputs
CAmount total_coinbase_amount
Total cumulative amount of coinbase outputs up to and including this block.
bool index_used
Signals if the coinstatsindex was used to retrieve the statistics.
CAmount total_unspendables_bip30
The two unspendable coinbase outputs total amount caused by BIP30.
CAmount total_unspendables_genesis_block
The unspendable coinbase amount from the genesis block.
CAmount total_prevout_spent_amount
Total cumulative amount of prevouts spent up to and including this block.
CAmount total_unspendables_unclaimed_rewards
Total cumulative amount of coins lost due to unclaimed miner rewards up to and including this block.
NodeContext struct containing references to chain state and connection state.
#define WAIT_LOCK(cs, name)
#define AssertLockNotHeld(cs)
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
#define EXCLUSIVE_LOCKS_REQUIRED(...)
#define LOG_TIME_SECONDS(end_msg)
bilingual_str _(const char *psz)
Translation function.
static const uint32_t MEMPOOL_HEIGHT
Fake height value used in Coin to signify they are only in the memory pool (since 0....
const UniValue NullUniValue
std::string HexStr(const Span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
double GuessVerificationProgress(const ChainTxData &data, const CBlockIndex *pindex)
Guess how far we are in the verification process at the given block index require cs_main if pindex h...
CAmount GetBlockSubsidy(int nHeight, const Consensus::Params &consensusParams)
const std::vector< std::string > CHECKLEVEL_DOC
Documentation for argument 'checklevel'.
void PruneBlockFilesManual(Chainstate &active_chainstate, int nManualPruneHeight)
Prune block files up to a given height.
bool IsBIP30Repeat(const CBlockIndex &block_index)
Identifies blocks that overwrote an existing coinbase output in the UTXO set (see BIP30)
static constexpr int DEFAULT_CHECKLEVEL
static const unsigned int MIN_BLOCKS_TO_KEEP
Block files containing a block-height within MIN_BLOCKS_TO_KEEP of ActiveChain().Tip() will not be pr...
static const signed int DEFAULT_CHECKBLOCKS
void SyncWithValidationInterfaceQueue()
This is a synonym for the following, which asserts certain locks are not held: std::promise<void> pro...
static const int PROTOCOL_VERSION
network protocol versioning
ThresholdState
BIP 9 defines a finite-state-machine to deploy a softfork in multiple stages.
bilingual_str GetWarnings(bool verbose)
Format a string that describes several potential problems detected by the core.