8 #include <blockfilter.h> 10 #include <chainparams.h> 43 #include <txmempool.h> 56 #include <condition_variable> 82 int nShift = (blockindex.
nBits >> 24) & 0xff;
84 (double)0x0000ffff / (
double)(blockindex.
nBits & 0x00ffffff);
103 if (next && next->
pprev == &blockindex) {
107 return &blockindex == &tip ? 1 : -1;
116 const int height{param.
getInt<
int>()};
120 const int current_tip{active_chain.
Height()};
121 if (height > current_tip) {
125 return active_chain[height];
147 result.
pushKV(
"confirmations", confirmations);
160 if (blockindex.
pprev)
186 const bool is_not_pruned{
WITH_LOCK(::
cs_main,
return !blockman.IsBlockPruned(blockindex))};
187 const bool have_undo{is_not_pruned && blockman.
UndoReadFromDisk(blockUndo, blockindex)};
189 for (
size_t i = 0; i < block.
vtx.size(); ++i) {
192 const CTxUndo* txundo = (have_undo && i > 0) ? &blockUndo.
vtxundo.at(i - 1) :
nullptr;
200 result.
pushKV(
"tx", std::move(txs));
208 "\nReturns the height of the most-work fully-validated chain.\n" 209 "The genesis block has height 0.\n",
229 "\nReturns the hash of the best (tip) block in the most-work fully-validated chain.\n",
251 latestblock.height = pindex->
nHeight;
259 "\nWaits for a specific new block and returns useful info about it.\n" 260 "\nReturns the current block on timeout or exit.\n",
277 if (!request.params[0].isNull())
278 timeout = request.params[0].
getInt<
int>();
301 "\nWaits for a specific new block and returns useful info about it.\n" 302 "\nReturns the current block on timeout or exit.\n",
314 HelpExampleCli(
"waitforblock",
"\"0000000000079f8ef3d2c688c244eb7a4570b24c9ed7b4a8c619eb02596f8862\" 1000")
315 +
HelpExampleRpc(
"waitforblock",
"\"0000000000079f8ef3d2c688c244eb7a4570b24c9ed7b4a8c619eb02596f8862\", 1000")
323 if (!request.params[1].isNull())
324 timeout = request.params[1].getInt<
int>();
347 "\nWaits for (at least) block height and returns the height and hash\n" 348 "of the current tip.\n" 349 "\nReturns the current block on timeout or exit.\n",
368 int height = request.params[0].
getInt<
int>();
370 if (!request.params[1].isNull())
371 timeout = request.params[1].getInt<
int>();
392 return RPCHelpMan{
"syncwithvalidationinterfacequeue",
393 "\nWaits for the validation interface queue to catch up on everything that was there when we entered this function.\n",
412 "\nReturns the proof-of-work difficulty as a multiple of the minimum difficulty.\n",
415 RPCResult::Type::NUM,
"",
"the proof-of-work difficulty as a multiple of the minimum difficulty."},
433 "Attempt to fetch block from a given peer.\n\n" 434 "We must have the header for this block, e.g. using submitheader.\n" 435 "The block will not have any undo data which can limit the usage of the block data in a context where the undo data is needed.\n" 436 "Subsequent calls for the same block may cause the response from the previous peer to be ignored.\n" 437 "Peers generally ignore requests for a stale block that they never fully verified, or one that is more than a month old.\n" 438 "When a peer does not respond with a block, we will disconnect.\n" 439 "Note: The block could be re-pruned as soon as it is received.\n\n" 440 "Returns an empty JSON object if the request was successfully scheduled.",
447 HelpExampleCli(
"getblockfrompeer",
"\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\" 0")
448 +
HelpExampleRpc(
"getblockfrompeer",
"\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\" 0")
457 const NodeId peer_id{request.params[1].getInt<int64_t>()};
468 throw JSONRPCError(
RPC_MISC_ERROR,
"In prune mode, only blocks that the node has already synced previously can be fetched from a peer");
472 if (block_has_data) {
476 if (
const auto err{peerman.
FetchBlock(peer_id, *index)}) {
487 "\nReturns hash of block in best-block-chain at height provided.\n",
503 int nHeight = request.params[0].getInt<
int>();
504 if (nHeight < 0 || nHeight > active_chain.
Height())
516 "\nIf verbose is false, returns a string that is serialized, hex-encoded data for blockheader 'hash'.\n" 517 "If verbose is true, returns an Object with information about blockheader <hash>.\n",
527 {
RPCResult::Type::NUM,
"confirmations",
"The number of confirmations, or -1 if the block is not on the main chain"},
546 HelpExampleCli(
"getblockheader",
"\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\"")
547 +
HelpExampleRpc(
"getblockheader",
"\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\"")
553 bool fVerbose =
true;
554 if (!request.params[1].isNull())
555 fVerbose = request.params[1].get_bool();
574 std::string strHex =
HexStr(ssBlock);
588 if (blockman.IsBlockPruned(blockindex)) {
605 std::vector<uint8_t> data{};
609 if (blockman.IsBlockPruned(blockindex)) {
630 if (blockindex.
nHeight == 0)
return blockUndo;
634 if (blockman.IsBlockPruned(blockindex)) {
662 {
RPCResult::Type::STR,
"address",
true,
"The Bitcoin address (only if a well-defined address exists)"},
673 "\nIf verbosity is 0, returns a string that is serialized, hex-encoded data for block 'hash'.\n" 674 "If verbosity is 1, returns an Object with information about block <hash>.\n" 675 "If verbosity is 2, returns an Object with information about block <hash> and information about each transaction.\n" 676 "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",
679 {
"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",
689 {
RPCResult::Type::NUM,
"confirmations",
"The number of confirmations, or -1 if the block is not on the main chain"},
704 {
RPCResult::Type::STR_HEX,
"chainwork",
"Expected number of hashes required to produce the chain up to this block (in hex)"},
717 {
RPCResult::Type::ELISION,
"",
"The transactions in the format of the getrawtransaction RPC. Different from verbosity = 1 \"tx\" result"},
736 HelpExampleCli(
"getblock",
"\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\"")
737 +
HelpExampleRpc(
"getblock",
"\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\"")
744 if (!request.params[1].isNull()) {
745 if (request.params[1].isBool()) {
746 verbosity = request.params[1].get_bool() ? 1 : 0;
748 verbosity = request.params[1].getInt<
int>();
767 if (verbosity <= 0) {
768 return HexStr(block_data);
776 if (verbosity == 1) {
778 }
else if (verbosity == 2) {
800 if (!first_block || !chain_tip)
return std::nullopt;
806 if (&first_unpruned == first_block) {
820 " to prune blocks whose block time is at least 2 hours older than the provided timestamp."},
839 int heightParam = request.params[0].getInt<
int>();
840 if (heightParam < 0) {
846 if (heightParam > 1000000000) {
855 unsigned int height = (
unsigned int) heightParam;
856 unsigned int chainHeight = (
unsigned int) active_chain.
Height();
859 }
else if (height > chainHeight) {
862 LogPrint(
BCLog::RPC,
"Attempt to prune blocks close to the tip. Retaining the minimum number of blocks.\n");
874 if (hash_type_input ==
"hash_serialized_3") {
875 return CoinStatsHashType::HASH_SERIALIZED;
876 }
else if (hash_type_input ==
"muhash") {
877 return CoinStatsHashType::MUHASH;
878 }
else if (hash_type_input ==
"none") {
892 const std::function<
void()>& interruption_point = {},
894 bool index_requested =
true)
918 "\nReturns statistics about the unspent transaction output set.\n" 919 "Note this call may take some time if you are not using coinstatsindex.\n",
921 {
"hash_type",
RPCArg::Type::STR,
RPCArg::Default{
"hash_serialized_3"},
"Which UTXO set hash should be calculated. Options: 'hash_serialized_3' (the legacy algorithm), 'muhash', 'none'."},
925 .type_str = {
"",
"string or numeric"},
935 {
RPCResult::Type::NUM,
"bogosize",
"Database-independent, meaningless metric indicating the UTXO set size"},
936 {
RPCResult::Type::STR_HEX,
"hash_serialized_3",
true,
"The serialized hash (only present if 'hash_serialized_3' hash_type is chosen)"},
938 {
RPCResult::Type::NUM,
"transactions",
true,
"The number of transactions with unspent outputs (not available when coinstatsindex is used)"},
939 {
RPCResult::Type::NUM,
"disk_size",
true,
"The estimated size of the chainstate on disk (not available when coinstatsindex is used)"},
941 {
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)"},
942 {
RPCResult::Type::OBJ,
"block_info",
true,
"Info on amounts in the block at this block height (only available if coinstatsindex is used)",
961 HelpExampleCli("gettxoutsetinfo", R
"("none" '"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09"')") + 962 HelpExampleCli("-named gettxoutsetinfo", R
"(hash_type='muhash' use_index='false')") + 966 HelpExampleRpc("gettxoutsetinfo", R
"("none", "00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09")") 974 bool index_requested = request.params[2].isNull() || request.params[2].get_bool();
985 coins_view = &active_chainstate.
CoinsDB();
990 if (!request.params[1].isNull()) {
995 if (hash_type == CoinStatsHashType::HASH_SERIALIZED) {
999 if (!index_requested) {
1011 if (pindex->
nHeight > summary.best_block_height) {
1017 const std::optional<CCoinsStats> maybe_stats =
GetUTXOStats(coins_view, *blockman, hash_type,
node.rpc_interruption_point, pindex, index_requested);
1018 if (maybe_stats.has_value()) {
1020 ret.pushKV(
"height", (int64_t)stats.
nHeight);
1024 if (hash_type == CoinStatsHashType::HASH_SERIALIZED) {
1027 if (hash_type == CoinStatsHashType::MUHASH) {
1040 const std::optional<CCoinsStats> maybe_prev_stats =
GetUTXOStats(coins_view, *blockman, hash_type,
node.rpc_interruption_point, pindex->
pprev, index_requested);
1041 if (!maybe_prev_stats) {
1044 prev_stats = maybe_prev_stats.value();
1058 block_info.
pushKV(
"unspendables", std::move(unspendables));
1060 ret.pushKV(
"block_info", std::move(block_info));
1073 "\nReturns details about an unspent transaction output.\n",
1077 {
"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."},
1090 {
RPCResult::Type::STR,
"address",
true,
"The Bitcoin address (only if a well-defined address exists)"},
1096 "\nGet unspent transactions\n" 1098 "\nView the details\n" 1100 "\nAs a JSON-RPC call\n" 1112 COutPoint out{hash, request.params[1].getInt<uint32_t>()};
1113 bool fMempool =
true;
1114 if (!request.params[2].isNull())
1115 fMempool = request.params[2].get_bool();
1137 ret.pushKV(
"confirmations", 0);
1144 ret.pushKV(
"scriptPubKey", std::move(o));
1155 "\nVerifies blockchain database.\n",
1162 RPCResult::Type::BOOL,
"",
"Verification finished successfully. If false, check debug.log for reason."},
1170 const int check_depth{request.params[1].isNull() ?
DEFAULT_CHECKBLOCKS : request.params[1].getInt<
int>()};
1189 rv.
pushKV(
"type",
"buried");
1202 if (blockindex ==
nullptr)
return;
1204 auto get_state_name = [](
const ThresholdState state) -> std::string {
1231 bip9.
pushKV(
"status", get_state_name(current_state));
1233 bip9.
pushKV(
"status_next", get_state_name(next_state));
1238 std::vector<bool> signals;
1247 bip9.
pushKV(
"statistics", std::move(statsUV));
1250 sig.reserve(signals.size());
1251 for (
const bool s : signals) {
1252 sig.push_back(s ?
'#' :
'-');
1254 bip9.
pushKV(
"signalling", sig);
1258 rv.
pushKV(
"type",
"bip9");
1263 rv.
pushKV(
"bip9", std::move(bip9));
1272 "Returns an object containing various state info regarding blockchain processing.\n",
1278 {
RPCResult::Type::NUM,
"blocks",
"the height of the most-work fully-validated chain. The genesis block has height 0"},
1285 {
RPCResult::Type::BOOL,
"initialblockdownload",
"(debug information) estimate of whether this node is in Initial Block Download mode"},
1287 {
RPCResult::Type::NUM,
"size_on_disk",
"the estimated size of the block and undo files on disk"},
1289 {
RPCResult::Type::NUM,
"pruneheight",
true,
"height of the last block pruned, plus one (only present if pruning is enabled)"},
1290 {
RPCResult::Type::BOOL,
"automatic_pruning",
true,
"whether automatic pruning is enabled (only present if pruning is enabled)"},
1291 {
RPCResult::Type::NUM,
"prune_target_size",
true,
"the target size used by pruning (only present if automatic pruning is enabled)"},
1294 RPCResult{
RPCResult::Type::ARR,
"warnings",
"any network and blockchain warnings (run with `-deprecatedrpc=warnings` to return the latest warning as a single string)",
1312 const int height{tip.nHeight};
1315 obj.
pushKV(
"blocks", height);
1316 obj.
pushKV(
"headers", chainman.m_best_header ? chainman.m_best_header->nHeight : -1);
1317 obj.
pushKV(
"bestblockhash", tip.GetBlockHash().GetHex());
1319 obj.
pushKV(
"time", tip.GetBlockTime());
1320 obj.
pushKV(
"mediantime", tip.GetMedianTimePast());
1323 obj.
pushKV(
"chainwork", tip.nChainWork.GetHex());
1328 obj.
pushKV(
"pruneheight", prune_height ? prune_height.value() + 1 : 0);
1331 obj.
pushKV(
"automatic_pruning", automatic_pruning);
1332 if (automatic_pruning) {
1345 const std::vector<RPCResult> RPCHelpForDeployment{
1347 {
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)"},
1348 {
RPCResult::Type::BOOL,
"active",
"true if the rules are enforced for the mempool and the next block"},
1351 {
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)"},
1352 {
RPCResult::Type::NUM_TIME,
"start_time",
"the minimum median time past of a block at which the bit gains its meaning"},
1353 {
RPCResult::Type::NUM_TIME,
"timeout",
"the median time past of a block at which the deployment is considered failed if not yet locked in"},
1354 {
RPCResult::Type::NUM,
"min_activation_height",
"minimum height of blocks for which the rules may be enforced"},
1355 {
RPCResult::Type::STR,
"status",
"status of deployment at specified block (one of \"defined\", \"started\", \"locked_in\", \"active\", \"failed\")"},
1358 {
RPCResult::Type::OBJ,
"statistics",
true,
"numeric statistics about signalling for a softfork (only for \"started\" and \"locked_in\" status)",
1361 {
RPCResult::Type::NUM,
"threshold",
true,
"the number of blocks with the version bit set required to activate the feature (only for \"started\" status)"},
1362 {
RPCResult::Type::NUM,
"elapsed",
"the number of blocks elapsed since the beginning of the current period"},
1363 {
RPCResult::Type::NUM,
"count",
"the number of blocks with the version bit set in the current period"},
1364 {
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)"},
1366 {
RPCResult::Type::STR,
"signalling",
true,
"indicates blocks that signalled with a # and blocks that did not with a -"},
1387 "Returns an object containing various state info regarding deployments of consensus changes.",
1408 if (request.params[0].isNull()) {
1421 deploymentinfo.
pushKV(
"deployments", DeploymentInfo(blockindex, chainman));
1422 return deploymentinfo;
1445 "Return information about all known tips in the block tree," 1446 " including the main chain as well as orphaned branches.\n",
1454 {
RPCResult::Type::NUM,
"branchlen",
"zero for main chain, otherwise length of branch connecting the tip to the main chain"},
1456 "Possible values for status:\n" 1457 "1. \"invalid\" This branch contains at least one invalid block\n" 1458 "2. \"headers-only\" Not all blocks for this branch are available, but the headers are valid\n" 1459 "3. \"valid-headers\" All blocks are available for this branch, but they were never fully validated\n" 1460 "4. \"valid-fork\" This branch is not part of the active chain, but is fully validated\n" 1461 "5. \"active\" This is the tip of the active main chain, which is certainly valid"},
1480 std::set<const CBlockIndex*, CompareBlocksByHeight> setTips;
1481 std::set<const CBlockIndex*> setOrphans;
1482 std::set<const CBlockIndex*> setPrevs;
1484 for (
const auto& [
_, block_index] : chainman.
BlockIndex()) {
1485 if (!active_chain.
Contains(&block_index)) {
1486 setOrphans.insert(&block_index);
1487 setPrevs.insert(block_index.
pprev);
1491 for (std::set<const CBlockIndex*>::iterator it = setOrphans.begin(); it != setOrphans.end(); ++it) {
1492 if (setPrevs.erase(*it) == 0) {
1493 setTips.insert(*it);
1498 setTips.insert(active_chain.
Tip());
1504 obj.
pushKV(
"height", block->nHeight);
1505 obj.
pushKV(
"hash", block->phashBlock->GetHex());
1507 const int branchLen = block->nHeight - active_chain.
FindFork(block)->
nHeight;
1508 obj.
pushKV(
"branchlen", branchLen);
1511 if (active_chain.
Contains(block)) {
1517 }
else if (!block->HaveNumChainTxs()) {
1519 status =
"headers-only";
1522 status =
"valid-fork";
1525 status =
"valid-headers";
1530 obj.
pushKV(
"status", status);
1543 "\nTreats a block as if it were received before others with the same work.\n" 1544 "\nA later preciousblock call can override the effect of an earlier one.\n" 1545 "\nThe effects of preciousblock are not retained across restarts.\n",
1583 "\nPermanently marks a block as invalid, as if it violated a consensus rule.\n",
1624 "\nRemoves invalidity status of a block, its ancestors and its descendants, reconsider them for activation.\n" 1625 "This can be used to undo the effects of invalidateblock.\n",
1664 "\nCompute statistics about the total number and rate of transactions in the chain.\n",
1674 "The total number of transactions in the chain up to that point, if known. " 1675 "It may be unknown when using assumeutxo."},
1677 {
RPCResult::Type::NUM,
"window_final_block_height",
"The height of the final block in the window."},
1679 {
RPCResult::Type::NUM,
"window_interval",
true,
"The elapsed time in the window in seconds. Only returned if \"window_block_count\" is > 0"},
1681 "The number of transactions in the window. " 1682 "Only returned if \"window_block_count\" is > 0 and if txcount exists for the start and end of the window."},
1684 "The average rate of transactions per second in the window. " 1685 "Only returned if \"window_interval\" is > 0 and if window_tx_count exists."},
1697 if (request.params[1].isNull()) {
1714 if (request.params[0].isNull()) {
1715 blockcount = std::max(0, std::min(blockcount, pindex->
nHeight - 1));
1717 blockcount = request.params[0].getInt<
int>();
1719 if (blockcount < 0 || (blockcount > 0 && blockcount >= pindex->
nHeight)) {
1725 const int64_t nTimeDiff{pindex->
GetMedianTimePast() - past_block.GetMedianTimePast()};
1728 ret.pushKV(
"time", (int64_t)pindex->
nTime);
1733 ret.pushKV(
"window_final_block_height", pindex->
nHeight);
1734 ret.pushKV(
"window_block_count", blockcount);
1735 if (blockcount > 0) {
1736 ret.pushKV(
"window_interval", nTimeDiff);
1738 const auto window_tx_count = pindex->
m_chain_tx_count - past_block.m_chain_tx_count;
1739 ret.pushKV(
"window_tx_count", window_tx_count);
1740 if (nTimeDiff > 0) {
1741 ret.pushKV(
"txrate",
double(window_tx_count) / nTimeDiff);
1751 template<
typename T>
1754 size_t size = scores.size();
1759 std::sort(scores.begin(), scores.end());
1760 if (size % 2 == 0) {
1761 return (scores[size / 2 - 1] + scores[size / 2]) / 2;
1763 return scores[size / 2];
1769 if (scores.empty()) {
1773 std::sort(scores.begin(), scores.end());
1777 total_weight / 10.0, total_weight / 4.0, total_weight / 2.0, (total_weight * 3.0) / 4.0, (total_weight * 9.0) / 10.0
1780 int64_t next_percentile_index = 0;
1781 int64_t cumulative_weight = 0;
1782 for (
const auto& element : scores) {
1783 cumulative_weight += element.second;
1784 while (next_percentile_index < NUM_GETBLOCKSTATS_PERCENTILES && cumulative_weight >= weights[next_percentile_index]) {
1785 result[next_percentile_index] = element.first;
1786 ++next_percentile_index;
1792 result[i] = scores.back().first;
1796 template<
typename T>
1797 static inline bool SetHasKeys(
const std::set<T>&
set) {
return false;}
1798 template<
typename T,
typename Tk,
typename... Args>
1799 static inline bool SetHasKeys(
const std::set<T>&
set,
const Tk& key,
const Args&...
args)
1810 "\nCompute per block statistics for a given window. All amounts are in satoshis.\n" 1811 "It won't work for some heights with pruning.\n",
1816 .type_str = {
"",
"string or numeric"},
1832 {
RPCResult::Type::ARR_FIXED,
"feerate_percentiles",
true,
"Feerates at the 10th, 25th, 50th, 75th, and 90th percentile weight unit (in satoshis per virtual byte)",
1857 {
RPCResult::Type::NUM,
"total_out",
true,
"Total amount in all outputs (excluding coinbase and thus reward [ie subsidy + totalfee])"},
1862 {
RPCResult::Type::NUM,
"utxo_increase",
true,
"The increase/decrease in the number of unspent outputs (not discounting op_return and similar)"},
1863 {
RPCResult::Type::NUM,
"utxo_size_inc",
true,
"The increase/decrease in size for the utxo index (not discounting op_return and similar)"},
1864 {
RPCResult::Type::NUM,
"utxo_increase_actual",
true,
"The increase/decrease in the number of unspent outputs, not counting unspendables"},
1865 {
RPCResult::Type::NUM,
"utxo_size_inc_actual",
true,
"The increase/decrease in size for the utxo index, not counting unspendables"},
1868 HelpExampleCli(
"getblockstats", R
"('"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09"' '["minfeerate","avgfeerate"]')") + 1869 HelpExampleCli("getblockstats", R
"(1000 '["minfeerate","avgfeerate"]')") + 1870 HelpExampleRpc("getblockstats", R
"("00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09", ["minfeerate","avgfeerate"])") + 1871 HelpExampleRpc("getblockstats", R
"(1000, ["minfeerate","avgfeerate"])") 1878 std::set<std::string> stats;
1879 if (!request.params[1].isNull()) {
1881 for (
unsigned int i = 0; i < stats_univalue.
size(); i++) {
1882 const std::string stat = stats_univalue[i].
get_str();
1890 const bool do_all = stats.size() == 0;
1891 const bool do_mediantxsize = do_all || stats.count(
"mediantxsize") != 0;
1892 const bool do_medianfee = do_all || stats.count(
"medianfee") != 0;
1893 const bool do_feerate_percentiles = do_all || stats.count(
"feerate_percentiles") != 0;
1894 const bool loop_inputs = do_all || do_medianfee || do_feerate_percentiles ||
1895 SetHasKeys(stats,
"utxo_increase",
"utxo_increase_actual",
"utxo_size_inc",
"utxo_size_inc_actual",
"totalfee",
"avgfee",
"avgfeerate",
"minfee",
"maxfee",
"minfeerate",
"maxfeerate");
1896 const bool loop_outputs = do_all || loop_inputs || stats.count(
"total_out");
1897 const bool do_calculate_size = do_mediantxsize ||
1898 SetHasKeys(stats,
"total_size",
"avgtxsize",
"mintxsize",
"maxtxsize",
"swtotal_size");
1899 const bool do_calculate_weight = do_all ||
SetHasKeys(stats,
"total_weight",
"avgfeerate",
"swtotal_weight",
"avgfeerate",
"feerate_percentiles",
"minfeerate",
"maxfeerate");
1900 const bool do_calculate_sw = do_all ||
SetHasKeys(stats,
"swtxs",
"swtotal_size",
"swtotal_weight");
1909 int64_t maxtxsize = 0;
1911 int64_t outputs = 0;
1912 int64_t swtotal_size = 0;
1913 int64_t swtotal_weight = 0;
1915 int64_t total_size = 0;
1916 int64_t total_weight = 0;
1918 int64_t utxo_size_inc = 0;
1919 int64_t utxo_size_inc_actual = 0;
1920 std::vector<CAmount> fee_array;
1921 std::vector<std::pair<CAmount, int64_t>> feerate_array;
1922 std::vector<int64_t> txsize_array;
1924 for (
size_t i = 0; i < block.
vtx.size(); ++i) {
1925 const auto& tx = block.
vtx.at(i);
1926 outputs += tx->vout.size();
1931 tx_total_out +=
out.nValue;
1934 utxo_size_inc += out_size;
1940 if (
out.scriptPubKey.IsUnspendable())
continue;
1943 utxo_size_inc_actual += out_size;
1947 if (tx->IsCoinBase()) {
1951 inputs += tx->vin.size();
1952 total_out += tx_total_out;
1954 int64_t tx_size = 0;
1955 if (do_calculate_size) {
1957 tx_size = tx->GetTotalSize();
1958 if (do_mediantxsize) {
1959 txsize_array.push_back(tx_size);
1961 maxtxsize = std::max(maxtxsize, tx_size);
1962 mintxsize = std::min(mintxsize, tx_size);
1963 total_size += tx_size;
1967 if (do_calculate_weight) {
1969 total_weight += weight;
1972 if (do_calculate_sw && tx->HasWitness()) {
1974 swtotal_size += tx_size;
1975 swtotal_weight += weight;
1980 const auto& txundo = blockUndo.
vtxundo.at(i - 1);
1981 for (
const Coin& coin: txundo.vprevout) {
1984 tx_total_in += prevoutput.
nValue;
1986 utxo_size_inc -= prevout_size;
1987 utxo_size_inc_actual -= prevout_size;
1990 CAmount txfee = tx_total_in - tx_total_out;
1993 fee_array.push_back(txfee);
1995 maxfee = std::max(maxfee, txfee);
1996 minfee = std::min(minfee, txfee);
2001 if (do_feerate_percentiles) {
2002 feerate_array.emplace_back(feerate, weight);
2004 maxfeerate = std::max(maxfeerate, feerate);
2005 minfeerate = std::min(minfeerate, feerate);
2014 feerates_res.
push_back(feerate_percentiles[i]);
2018 ret_all.
pushKV(
"avgfee", (block.
vtx.size() > 1) ? totalfee / (block.
vtx.size() - 1) : 0);
2020 ret_all.
pushKV(
"avgtxsize", (block.
vtx.size() > 1) ? total_size / (block.
vtx.size() - 1) : 0);
2022 ret_all.
pushKV(
"feerate_percentiles", std::move(feerates_res));
2024 ret_all.
pushKV(
"ins", inputs);
2025 ret_all.
pushKV(
"maxfee", maxfee);
2026 ret_all.
pushKV(
"maxfeerate", maxfeerate);
2027 ret_all.
pushKV(
"maxtxsize", maxtxsize);
2032 ret_all.
pushKV(
"minfeerate", (minfeerate ==
MAX_MONEY) ? 0 : minfeerate);
2034 ret_all.
pushKV(
"outs", outputs);
2036 ret_all.
pushKV(
"swtotal_size", swtotal_size);
2037 ret_all.
pushKV(
"swtotal_weight", swtotal_weight);
2038 ret_all.
pushKV(
"swtxs", swtxs);
2040 ret_all.
pushKV(
"total_out", total_out);
2041 ret_all.
pushKV(
"total_size", total_size);
2042 ret_all.
pushKV(
"total_weight", total_weight);
2043 ret_all.
pushKV(
"totalfee", totalfee);
2044 ret_all.
pushKV(
"txs", (int64_t)block.
vtx.size());
2045 ret_all.
pushKV(
"utxo_increase", outputs - inputs);
2046 ret_all.
pushKV(
"utxo_size_inc", utxo_size_inc);
2047 ret_all.
pushKV(
"utxo_increase_actual", utxos - inputs);
2048 ret_all.
pushKV(
"utxo_size_inc_actual", utxo_size_inc_actual);
2055 for (
const std::string& stat : stats) {
2056 const UniValue& value = ret_all[stat];
2060 ret.pushKV(stat, value);
2069 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)
2073 while (cursor->
Valid()) {
2076 if (!cursor->
GetKey(key) || !cursor->
GetValue(coin))
return false;
2077 if (++
count % 8192 == 0) {
2078 interruption_point();
2084 if (
count % 256 == 0) {
2087 scan_progress = (int)(high * 100.0 / 65536.0 + 0.5);
2090 out_results.emplace(key, coin);
2094 scan_progress = 100;
2130 "\"start\" for starting a scan\n" 2131 "\"abort\" for aborting the current scan (returns true when abort was successful)\n" 2132 "\"status\" for progress report (in %) of the current scan" 2137 "Every scan object is either a string descriptor or an object:",
2151 "True if scan will be aborted (not necessarily before this RPC returns), or false if there is no scan to abort" 2154 "when action=='status' and no scan is in progress - possibly already completed",
RPCResult::Type::NONE,
"",
"" 2165 const std::string EXAMPLE_DESCRIPTOR_RAW =
"raw(76a91411b366edfc0a8b66feebae5c2e25a7b6a5d1cf3188ac)#fm24fxxy";
2168 "\nScans the unspent transaction output set for entries that match certain output descriptors.\n" 2169 "Examples of output descriptors are:\n" 2170 " addr(<address>) Outputs whose output script corresponds to the specified address (does not include P2PK)\n" 2171 " raw(<hex script>) Outputs whose output script equals the specified hex-encoded bytes\n" 2172 " combo(<pubkey>) P2PK, P2PKH, P2WPKH, and P2SH-P2WPKH outputs for the given pubkey\n" 2173 " pkh(<pubkey>) P2PKH outputs for the given pubkey\n" 2174 " sh(multi(<n>,<pubkey>,<pubkey>,...)) P2SH-multisig outputs for the given threshold and pubkeys\n" 2175 " tr(<pubkey>) P2TR\n" 2176 " tr(<pubkey>,{pk(<pubkey>)}) P2TR with single fallback pubkey in tapscript\n" 2177 " rawtr(<pubkey>) P2TR with the specified key as output key rather than inner\n" 2178 " wsh(and_v(v:pk(<pubkey>),after(2))) P2WSH miniscript with mandatory pubkey and a timelock\n" 2179 "\nIn the above, <pubkey> either refers to a fixed public key in hexadecimal notation, or to an xpub/xprv optionally followed by one\n" 2180 "or more path elements separated by \"/\", and optionally ending in \"/*\" (unhardened), or \"/*'\" or \"/*h\" (hardened) to specify all\n" 2181 "unhardened or hardened child keys.\n" 2182 "In the latter case, a range needs to be specified by below if different from 1000.\n" 2183 "For more information on output descriptors, see the documentation in the doc/descriptors.md file.\n",
2206 {
RPCResult::Type::NUM,
"confirmations",
"Number of confirmations of the unspent transaction output when the scan was done"},
2216 HelpExampleCli(
"scantxoutset",
"start \'[\"" + EXAMPLE_DESCRIPTOR_RAW +
"\"]\'") +
2219 HelpExampleRpc(
"scantxoutset",
"\"start\", [\"" + EXAMPLE_DESCRIPTOR_RAW +
"\"]") +
2226 const auto action{
self.Arg<std::string>(
"action")};
2227 if (action ==
"status") {
2235 }
else if (action ==
"abort") {
2244 }
else if (action ==
"start") {
2250 if (request.params.size() < 2) {
2254 std::set<CScript> needles;
2255 std::map<CScript, std::string> descriptors;
2265 descriptors.emplace(std::move(
script), std::move(inferred));
2271 std::vector<CTxOut> input_txos;
2272 std::map<COutPoint, Coin> coins;
2275 std::unique_ptr<CCoinsViewCursor> pcursor;
2287 result.
pushKV(
"success", res);
2292 for (
const auto& it : coins) {
2294 const Coin& coin = it.second;
2297 input_txos.push_back(txo);
2302 unspent.
pushKV(
"vout", outpoint.
n);
2308 unspent.
pushKV(
"blockhash", coinb_block.GetBlockHash().GetHex());
2313 result.
pushKV(
"unspents", std::move(unspents));
2357 for (
const auto& tx : block.vtx) {
2358 if (std::any_of(tx->vout.cbegin(), tx->vout.cend(), [&](
const auto& txout) {
2359 return needles.count(std::vector<unsigned char>(txout.scriptPubKey.begin(), txout.scriptPubKey.end())) != 0;
2365 for (
const auto& txundo : block_undo.vtxundo) {
2366 if (std::any_of(txundo.vprevout.cbegin(), txundo.vprevout.cend(), [&](
const auto& coin) {
2379 "\nReturn relevant blockhashes for given descriptors (requires blockfilterindex).\n" 2380 "This call may take several minutes. Make sure to use no RPC timeout (bitcoin-cli -rpcclienttimeout=0)",
2389 {
"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"},
2411 HelpExampleCli(
"scanblocks",
"start '[\"addr(bcrt1q4u4nsgk6ug0sqz7r3rj9tykjxrsl0yy4d0wwte)\"]' 300000") +
2412 HelpExampleCli(
"scanblocks",
"start '[\"addr(bcrt1q4u4nsgk6ug0sqz7r3rj9tykjxrsl0yy4d0wwte)\"]' 100 150 basic") +
2414 HelpExampleRpc(
"scanblocks",
"\"start\", [\"addr(bcrt1q4u4nsgk6ug0sqz7r3rj9tykjxrsl0yy4d0wwte)\"], 300000") +
2415 HelpExampleRpc(
"scanblocks",
"\"start\", [\"addr(bcrt1q4u4nsgk6ug0sqz7r3rj9tykjxrsl0yy4d0wwte)\"], 100, 150, \"basic\"") +
2421 if (request.params[0].get_str() ==
"status") {
2430 }
else if (request.params[0].get_str() ==
"abort") {
2439 }
else if (request.params[0].get_str() ==
"start") {
2444 const std::string filtertype_name{request.params[4].isNull() ?
"basic" : request.params[4].get_str()};
2452 bool filter_false_positives{options.exists(
"filter_false_positives") ? options[
"filter_false_positives"].get_bool() :
false};
2468 start_index = active_chain.
Genesis();
2469 stop_block = active_chain.
Tip();
2470 if (!request.params[2].isNull()) {
2471 start_index = active_chain[request.params[2].getInt<
int>()];
2476 if (!request.params[3].isNull()) {
2477 stop_block = active_chain[request.params[3].getInt<
int>()];
2496 const int amount_per_chunk = 10000;
2497 std::vector<BlockFilter> filters;
2498 int start_block_height = start_index->
nHeight;
2499 const int total_blocks_to_process = stop_block->
nHeight - start_block_height;
2504 bool completed =
true;
2508 node.rpc_interruption_point();
2515 int start_block = !end_range ? start_index->
nHeight : start_index->
nHeight + 1;
2516 end_range = (start_block + amount_per_chunk < stop_block->
nHeight) ?
2523 if (filter.GetFilter().MatchAny(needle_set)) {
2524 if (filter_false_positives) {
2533 blocks.
push_back(filter.GetBlockHash().GetHex());
2537 start_index = end_range;
2540 int blocks_processed = end_range->
nHeight - start_block_height;
2541 if (total_blocks_to_process > 0) {
2549 }
while (start_index != stop_block);
2551 ret.pushKV(
"from_height", start_block_height);
2552 ret.pushKV(
"to_height", start_index->
nHeight);
2553 ret.pushKV(
"relevant_blocks", std::move(blocks));
2554 ret.pushKV(
"completed", completed);
2567 "\nRetrieve a BIP 157 content filter for a particular block.\n",
2579 HelpExampleCli(
"getblockfilter",
"\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\" \"basic\"") +
2580 HelpExampleRpc(
"getblockfilter",
"\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\", \"basic\"")
2586 if (!request.params[1].isNull()) {
2587 filtertype_name = request.params[1].get_str();
2601 bool block_was_connected;
2612 bool index_ready = index->BlockUntilSyncedToCurrentChain();
2619 std::string errmsg =
"Filter not found.";
2621 if (!block_was_connected) {
2623 errmsg +=
" Block was not connected to active chain.";
2624 }
else if (!index_ready) {
2626 errmsg +=
" Block filters are still in the process of being indexed.";
2629 errmsg +=
" This error is unexpected and indicates index corruption.";
2637 ret.pushKV(
"header", filter_header.
GetHex());
2652 "Write the serialized UTXO set to a file.",
2664 {
RPCResult::Type::NUM,
"nchaintx",
"the number of transactions in the chain up to and including the base block"},
2681 path.
utf8string() +
" already exists. If you are sure this is what you want, " 2682 "move it out of the way first");
2687 if (afile.IsNull()) {
2690 "Couldn't open file " + temppath.
utf8string() +
" for writing.");
2695 node,
node.chainman->ActiveChainstate(), afile, path, temppath);
2696 fs::rename(temppath, path);
2698 result.
pushKV(
"path", path.utf8string());
2711 std::unique_ptr<CCoinsViewCursor> pcursor;
2712 std::optional<CCoinsStats> maybe_stats;
2752 unsigned int iter{0};
2753 size_t written_coins_count{0};
2754 std::vector<std::pair<uint32_t, Coin>> coins;
2763 auto write_coins_to_file = [&](
AutoFile& afile,
const Txid& last_hash,
const std::vector<std::pair<uint32_t, Coin>>& coins,
size_t& written_coins_count) {
2766 for (
const auto& [n, coin] : coins) {
2769 ++written_coins_count;
2773 pcursor->GetKey(key);
2774 last_hash = key.
hash;
2775 while (pcursor->Valid()) {
2776 if (iter % 5000 == 0)
node.rpc_interruption_point();
2778 if (pcursor->GetKey(key) && pcursor->GetValue(coin)) {
2779 if (key.
hash != last_hash) {
2780 write_coins_to_file(afile, last_hash, coins, written_coins_count);
2781 last_hash = key.
hash;
2784 coins.emplace_back(key.
n, coin);
2789 if (!coins.empty()) {
2790 write_coins_to_file(afile, last_hash, coins, written_coins_count);
2798 result.
pushKV(
"coins_written", written_coins_count);
2802 result.
pushKV(
"txoutset_hash", maybe_stats->hashSerialized.ToString());
2811 "Load the serialized UTXO set from a file.\n" 2812 "Once this snapshot is loaded, its contents will be " 2813 "deserialized into a second chainstate data structure, which is then used to sync to " 2814 "the network's tip. " 2815 "Meanwhile, the original chainstate will complete the initial block download process in " 2816 "the background, eventually validating up to the block that the snapshot is based upon.\n\n" 2818 "The result is a usable bitcoind instance that is current with the network tip in a " 2819 "matter of minutes rather than hours. UTXO snapshot are typically obtained from " 2820 "third-party sources (HTTP, torrent, etc.) which is reasonable since their " 2821 "contents are always checked by hash.\n\n" 2823 "You can find more information on this process in the `assumeutxo` design " 2824 "document (<https://github.com/bitcoin/bitcoin/blob/master/doc/design/assumeutxo.md>).",
2829 "path to the snapshot file. If relative, will be prefixed by datadir."},
2851 if (afile.IsNull()) {
2854 "Couldn't open file " + path.utf8string() +
" for reading.");
2860 }
catch (
const std::ios_base::failure& e) {
2865 if (!activation_result) {
2879 result.
pushKV(
"coins_loaded", metadata.m_coins_count);
2880 result.
pushKV(
"tip_hash", snapshot_index.GetBlockHash().ToString());
2881 result.
pushKV(
"base_height", snapshot_index.nHeight);
2893 {
RPCResult::Type::STR_HEX,
"snapshot_blockhash",
true,
"the base block of the snapshot this chainstate is based on, if any"},
2896 {
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."},
2903 "\nReturn information about chainstates.\n",
2925 if (!
cs.m_chain.Tip()) {
2935 data.
pushKV(
"coins_db_cache_bytes",
cs.m_coinsdb_cache_size_bytes);
2936 data.
pushKV(
"coins_tip_cache_bytes",
cs.m_coinstip_cache_size_bytes);
2937 if (
cs.m_from_snapshot_blockhash) {
2938 data.
pushKV(
"snapshot_blockhash",
cs.m_from_snapshot_blockhash->ToString());
2940 data.
pushKV(
"validated", validated);
2944 obj.
pushKV(
"headers", chainman.m_best_header ? chainman.m_best_header->nHeight : -1);
2946 const auto& chainstates = chainman.
GetAll();
2949 obj_chainstates.push_back(make_chain_data(*
cs, !
cs->m_from_snapshot_blockhash || chainstates.size() == 1));
2951 obj.
pushKV(
"chainstates", std::move(obj_chainstates));
2991 for (
const auto& c : commands) {
2992 t.appendCommand(c.name, &c);
std::shared_ptr< const CTransaction > CTransactionRef
CCoinsViewCache & CoinsTip() EXCLUSIVE_LOCKS_REQUIRED(
arith_uint256 nChainWork
(memory only) Total amount of work (expected number of hashes) in the chain up to and including this ...
const std::vector< RPCResult > RPCHelpForChainstate
int min_activation_height
If lock in occurs, delay activation until at least this block height.
std::string GetHex() const
void PruneBlockFilesManual(Chainstate &active_chainstate, int nManualPruneHeight)
Prune block files up to a given height.
fs::path AbsPathForConfigVal(const ArgsManager &args, const fs::path &path, bool net_specific=true)
Most paths passed as configuration arguments are treated as relative to the datadir if they are not a...
node::BlockManager m_blockman
A single BlockManager instance is shared across each constructed chainstate to avoid duplicating bloc...
bool LookupFilter(const CBlockIndex *block_index, BlockFilter &filter_out) const
Get a single filter by block.
static RPCHelpMan syncwithvalidationinterfacequeue()
Display status of an in-progress BIP9 softfork.
static const auto scan_result_abort
BlockFilterIndex is used to store and retrieve block filters, hashes, and headers for a range of bloc...
void push_back(UniValue val)
const std::vector< std::string > CHECKLEVEL_DOC
Documentation for argument 'checklevel'.
static constexpr int NUM_GETBLOCKSTATS_PERCENTILES
static RPCHelpMan getblock()
static std::atomic< int > g_scanfilter_progress_height
fs::path AbsPathJoin(const fs::path &base, const fs::path &path)
Helper function for joining two paths.
The same as previous option with information about prevouts if available.
CAmount GetBlockSubsidy(int nHeight, const Consensus::Params &consensusParams)
const std::vector< UniValue > & getValues() const
std::unique_ptr< CCoinsViewCursor > Cursor() const override
Get a cursor to iterate over the whole state.
static const int WITNESS_SCALE_FACTOR
bool IsPruneMode() const
Whether running in -prune mode.
#define LogPrint(category,...)
int64_t GetBlockTime() const
FILE * fopen(const fs::path &p, const char *mode)
CBlockIndex * pprev
pointer to the index of the predecessor of this block
uint64_t CalculateCurrentUsage()
Calculate the amount of disk space the block & undo files currently use.
bool IsRPCRunning()
Query whether RPC is running.
static RPCHelpMan getblockfrompeer()
std::string GetChainTypeString() const
Return the chain type string.
node::BlockManager & m_blockman
Reference to a BlockManager instance which itself is shared across all Chainstate instances...
CTxMemPool & EnsureMemPool(const NodeContext &node)
bool BlockFilterTypeByName(const std::string &name, BlockFilterType &filter_type)
Find a filter type by its human-readable name.
TxVerbosity
Verbose level for block's transaction.
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
An in-memory indexed chain of blocks.
static std::atomic< bool > g_scanfilter_should_abort_scan
BlockFiltersScanReserver()=default
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override
GetCoin, returning whether it exists and is not spent.
BlockFilterIndex * GetBlockFilterIndex(BlockFilterType filter_type)
Get a block filter index by type.
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.
size_t GetSerializeSize(const T &t)
CAmount total_new_outputs_ex_coinbase_amount
Total cumulative amount of outputs created up to and including this block.
bool index_used
Signals if the coinstatsindex was used to retrieve the statistics.
Comparison function for sorting the getchaintips heads.
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...
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...
CChain & ActiveChain() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
static GlobalMutex cs_blockchange
static std::vector< uint8_t > GetRawBlockChecked(BlockManager &blockman, const CBlockIndex &blockindex)
All parent headers found, difficulty matches, timestamp >= median previous, checkpoint.
static constexpr int DEFAULT_CHECKLEVEL
bool MoneyRange(const CAmount &nValue)
CBlockHeader GetBlockHeader() const
#define CHECK_NONFATAL(condition)
Identity function.
int Height() const
Return the maximal height in the chain.
Special type that behaves almost exactly like OBJ, defining an options object with a list of pre-defi...
CTxOut out
unspent transaction output
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.
std::optional< CAmount > total_amount
The total amount, or nullopt if an overflow occurred calculating it.
constexpr const std::byte * begin() const
unsigned int fCoinBase
whether containing transaction was a coinbase
#define LOG_TIME_SECONDS(end_msg)
static const auto scan_result_status_some
const std::string & get_str() const
CBlockIndex * Genesis() const
Returns the index entry for the genesis block of this chain, or nullptr if none.
const UniValue & get_array() const
#define LIST_CHAIN_NAMES
List of possible chain / network names.
static RPCHelpMan scantxoutset()
ThresholdState
BIP 9 defines a finite-state-machine to deploy a softfork in multiple stages.
bool ReadBlockFromDisk(CBlock &block, const FlatFilePos &pos) const
Functions for disk access for blocks.
CChain m_chain
The current chain of blockheaders we consult and build on.
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...
static int ComputeNextBlockAndDepth(const CBlockIndex &tip, const CBlockIndex &blockindex, const CBlockIndex *&next)
util::Result< CBlockIndex * > ActivateSnapshot(AutoFile &coins_file, const node::SnapshotMetadata &metadata, bool in_memory)
Construct and activate a Chainstate on the basis of UTXO snapshot data.
static std::atomic< int > g_scan_progress
RAII object to prevent concurrency issue when scanning the txout set.
Non-refcounted RAII wrapper for FILE*.
static int32_t GetTransactionWeight(const CTransaction &tx)
static constexpr int64_t TIMESTAMP_WINDOW
Timestamp window used as a grace period by code that compares external timestamps (such as timestamps...
static RPCHelpMan loadtxoutset()
int threshold
Number of blocks with the version bit set required to activate the softfork.
CAmount total_unspendables_scripts
Total cumulative amount of outputs sent to unspendable scripts (OP_RETURN for example) up to and incl...
void RPCNotifyBlockChange(const CBlockIndex *pindex)
Callback for when block tip changed.
std::unique_ptr< Descriptor > InferDescriptor(const CScript &script, const SigningProvider &provider)
Find a descriptor for the specified script, using information from provider where possible...
bool isSpent(const COutPoint &outpoint) const
Invalid, missing or duplicate parameter.
CAmount total_coinbase_amount
Total cumulative amount of coinbase outputs up to and including this block.
RPCHelpMan getblockchaininfo()
VersionBitsCache m_versionbitscache
Track versionbit status.
~BlockFiltersScanReserver()
bool DeploymentEnabled(const Consensus::Params ¶ms, Consensus::BuriedDeployment dep)
Determine if a deployment is enabled (can ever be active)
CoinStatsHashType ParseHashType(const std::string &hash_type_input)
CoinsViewScanReserver()=default
static RPCHelpMan getchaintxstats()
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.
const RPCResult getblock_vin
int64_t CAmount
Amount in satoshis (Can be negative)
CAmount total_unspendables_unclaimed_rewards
Total cumulative amount of coins lost due to unclaimed miner rewards up to and including this block...
CAmount total_unspendables_bip30
The two unspendable coinbase outputs total amount caused by BIP30.
static T CalculateTruncatedMedian(std::vector< T > &scores)
std::string GetAllOutputTypes()
Gets all existing output types formatted for RPC help sections.
virtual bool GetValue(Coin &coin) const =0
uint256 GetBlockHash() const
std::string oneline_description
Should be empty unless it is supposed to override the auto-generated summary line.
uint32_t nHeight
at which height this containing transaction was included in the active block chain ...
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...
static const uint32_t MEMPOOL_HEIGHT
Fake height value used in Coin to signify they are only in the memory pool (since 0...
static RPCHelpMan getblockfilter()
uint64_t PruneAfterHeight() const
std::string MakeUnorderedList(const std::vector< std::string > &items)
Create an unordered multi-line list of items.
Special type that is a STR with only hex chars.
NodeContext struct containing references to chain state and connection state.
bool IsBIP30Repeat(const CBlockIndex &block_index)
Identifies blocks that overwrote an existing coinbase output in the UTXO set (see BIP30) ...
std::string HelpExampleRpc(const std::string &methodname, const std::string &args)
ChainstateManager & m_chainman
The chainstate manager that owns this chainstate.
static std::atomic< bool > g_scan_in_progress
UniValue JSONRPCError(int code, const std::string &message)
fs::path GetDataDirNet() const
Get data directory path with appended network identifier.
bool operator()(const CBlockIndex *a, const CBlockIndex *b) const
Special string with only hex chars.
static std::string PathToString(const path &path)
Convert path object to a byte string.
virtual bool Valid() const =0
Chainstate stores and provides an API to update our local knowledge of the current best chain...
static RPCHelpMan waitfornewblock()
Include TXID, inputs, outputs, and other common block's transaction information.
static void SoftForkDescPushBack(const CBlockIndex *blockindex, UniValue &softforks, const ChainstateManager &chainman, Consensus::BuriedDeployment dep)
UniValue blockheaderToJSON(const CBlockIndex &tip, const CBlockIndex &blockindex)
Block header to JSON.
static const CBlockIndex * ParseHashOrHeight(const UniValue ¶m, ChainstateManager &chainman)
void RegisterBlockchainRPCCommands(CRPCTable &t)
void ScriptToUniv(const CScript &script, UniValue &out, bool include_hex=true, bool include_address=false, const SigningProvider *provider=nullptr)
Abstract view on the open txout dataset.
uint64_t m_chain_tx_count
(memory only) Number of transactions in the chain up to and including this block. ...
int period
Length of blocks of the BIP9 signalling period.
Double ended buffer combining vector and stream-like interfaces.
int DeploymentHeight(BuriedDeployment dep) const
std::string ToString() const
static RPCHelpMan dumptxoutset()
Serialize the UTXO set to a file for loading elsewhere.
void WriteCompactSize(SizeComputer &os, uint64_t nSize)
bool LookupFilterHeader(const CBlockIndex *block_index, uint256 &header_out) EXCLUSIVE_LOCKS_REQUIRED(!m_cs_headers_cache)
Get a single filter header by block.
static RPCHelpMan getblockheader()
static std::condition_variable cond_blockchange
Complete block filter struct as defined in BIP 157.
CAmount total_prevout_spent_amount
Total cumulative amount of prevouts spent up to and including this block.
Special array that has a fixed number of entries.
static RPCHelpMan getchainstates()
bool Contains(const CBlockIndex *pindex) const
Efficiently check whether a block is present in this chain.
kernel::Notifications & GetNotifications() const
int64_t nStartTime
Start MedianTime for version bits miner confirmation.
int64_t nPowTargetSpacing
RAII wrapper for VerifyDB: Verify consistency of the block and coin databases.
static RPCHelpMan getblockstats()
bool UndoReadFromDisk(CBlockUndo &blockundo, const CBlockIndex &index) const
const Consensus::Params & GetConsensus() const
const std::string CURRENCY_UNIT
CBlockIndex * ActiveTip() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Maintains a tree of blocks (stored in m_block_index) which is consulted to determine where the most-w...
CCoinsViewDB & CoinsDB() EXCLUSIVE_LOCKS_REQUIRED(
std::optional< int > GetPruneHeight(const BlockManager &blockman, const CChain &chain)
Return height of highest block that has been pruned, or std::nullopt if no blocks have been pruned...
General application defined errors.
std::string DefaultHint
Hint for default value.
void ForceFlushStateToDisk()
Unconditionally flush all changes to disk.
int count
Number of blocks with the version bit set since the beginning of the current period.
#define WAIT_LOCK(cs, name)
An output of a transaction.
CAmount total_unspendable_amount
Total cumulative amount of unspendable coins up to and including this block.
std::string ToString() const
RecursiveMutex & GetMutex() const LOCK_RETURNED(
Alias for cs_main.
virtual std::optional< std::string > FetchBlock(NodeId peer_id, const CBlockIndex &block_index)=0
Attempt to manually fetch block from a given peer.
static std::atomic< bool > g_scanfilter_in_progress
static const auto scan_result_status_none
An outpoint - a combination of a transaction hash and an index n into its vout.
CBlockIndex * LookupBlockIndex(const uint256 &hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
std::string HelpExampleCli(const std::string &methodname, const std::string &args)
bool IsDeprecatedRPCEnabled(const std::string &method)
Chainstate &InitializeChainstate(CTxMemPool *mempool) EXCLUSIVE_LOCKS_REQUIRED(std::vector< Chainstate * GetAll)()
Instantiate a new chainstate.
Special numeric to denote unix epoch time.
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
int64_t GetMedianTimePast() const
static RPCHelpMan getdifficulty()
static RPCHelpMan invalidateblock()
std::unordered_set< Element, ByteVectorHash > ElementSet
virtual bool GetKey(COutPoint &key) const =0
UniValue GetWarningsForRpc(const Warnings &warnings, bool use_deprecated)
RPC helper function that wraps warnings.GetMessages().
node::BlockMap & BlockIndex() EXCLUSIVE_LOCKS_REQUIRED(
static RPCHelpMan getblockcount()
uint256 GetBestBlock() const override
Retrieve the block hash whose state this CCoinsView currently represents.
Special type that is a NUM or [NUM,NUM].
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
static bool ComputeUTXOStats(CCoinsView *view, CCoinsStats &stats, T hash_obj, const std::function< void()> &interruption_point)
Calculate statistics about the unspent transaction output set.
const CChainParams & GetParams() const
int64_t nTimeout
Timeout/expiry MedianTime for the deployment attempt.
Optional argument for which the default value is omitted from help text for one of two reasons: ...
static const auto scan_action_arg_desc
static std::atomic< bool > g_should_abort_scan
#define EXCLUSIVE_LOCKS_REQUIRED(...)
static RPCHelpMan waitforblock()
std::vector< CTransactionRef > vtx
std::string utf8string() const
Return a UTF-8 representation of the path as a std::string, for compatibility with code using std::st...
static const auto scan_objects_arg_desc
const ChainTxData & TxData() const
static CBlock GetBlockChecked(BlockManager &blockman, const CBlockIndex &blockindex)
CTxMemPool stores valid-according-to-the-current-best-chain transactions that may be included in the ...
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
static bool SetHasKeys(const std::set< T > &set)
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.
Only TXID for each block's transaction.
Special string to represent a floating point amount.
static RPCHelpMan gettxout()
static RPCHelpMan verifychain()
The block chain is a tree shaped structure starting with the genesis block at the root...
const CChainParams & Params()
Return the currently selected parameters.
void pushKV(std::string key, UniValue val)
Undo information for a CBlock.
Serialized script, used inside transaction inputs and outputs.
static transaction_identifier FromUint256(const uint256 &id)
uint256 ParseHashV(const UniValue &v, std::string_view name)
Utilities: convert hex-encoded Values (throws error if not hex).
static const signed int DEFAULT_CHECKBLOCKS
Undo information for a CTransaction.
ChainstateManager & EnsureChainman(const NodeContext &node)
bool ReadRawBlockFromDisk(std::vector< uint8_t > &block, const FlatFilePos &pos) const
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...
const MessageStartChars & MessageStart() const
virtual uint256 GetBestBlock() const
Retrieve the block hash whose state this CCoinsView currently represents.
bool IsInitialBlockDownload() const
Check whether we are doing an initial block download (synchronizing from disk or network) ...
CBlockIndex * Tip() const
Returns the index entry for the tip of this chain, or nullptr if none.
static RPCHelpMan preciousblock()
std::string GetHex() const
static constexpr size_t PER_UTXO_OVERHEAD
std::string HexStr(const Span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
static RPCHelpMan waitforblockheight()
UniValue ValueFromAmount(const CAmount amount)
static RPCHelpMan gettxoutsetinfo()
ArgsManager & EnsureAnyArgsman(const std::any &context)
const UniValue NullUniValue
static constexpr CAmount MAX_MONEY
No amount larger than this (in satoshi) is valid.
static RPCHelpMan pruneblockchain()
#define AssertLockNotHeld(cs)
int elapsed
Number of blocks elapsed since the beginning of the current period.
bilingual_str ErrorString(const Result< T > &result)
static CBlockUndo GetUndoChecked(BlockManager &blockman, const CBlockIndex &blockindex)
RPCHelpMan getdeploymentinfo()
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 ...
static RPCHelpMan reconsiderblock()
bool possible
False if there are not enough blocks left in this period to pass activation threshold.
PeerManager & EnsurePeerman(const NodeContext &node)
unsigned char * UCharCast(char *c)
static RPCHelpMan getchaintips()
std::unique_ptr< CoinStatsIndex > g_coin_stats_index
The global UTXO set hash object.
double GetDifficulty(const CBlockIndex &blockindex)
Get the difficulty of the net wrt to the given block index.
static const unsigned int MAX_BLOCK_SERIALIZED_SIZE
The maximum allowed size for a serialized block, in bytes (only for buffer size limits) ...
std::string GetHex() const
Hex encoding of the number (with the most significant digits first).
static bool CheckBlockFilterMatches(BlockManager &blockman, const CBlockIndex &blockindex, const GCSFilter::ElementSet &needles)
CAmount total_unspendables_genesis_block
The unspendable coinbase amount from the genesis block.
Different type to mark Mutex at global scope.
static std::atomic< int > g_scanfilter_progress
RAII object to prevent concurrency issue when scanning blockfilters.
int nHeight
height of the entry in the chain. The genesis block has height 0
FlatFilePos GetBlockPos() const EXCLUSIVE_LOCKS_REQUIRED(
const std::vector< unsigned char > & GetEncodedFilter() const LIFETIMEBOUND
const Consensus::Params & GetConsensus() const
int bit
Bit position to select the particular bit in nVersion.
Special dictionary with keys that are not literals.
CCoinsView that adds a memory cache for transactions to another CCoinsView.
static CUpdatedBlock latestblock GUARDED_BY(cs_blockchange)
CBlockIndex * GetAncestor(int height)
Efficiently find an ancestor of this block.
full block available in blk*.dat
static bool exists(const path &p)
ChainstateManager & EnsureAnyChainman(const std::any &context)
static path u8path(const std::string &utf8_str)
std::vector< CTxUndo > vtxundo
static int64_t GetBlockWeight(const CBlock &block)
static RPCHelpMan scanblocks()
uint64_t nTransactionOutputs
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
uint64_t GetPruneTarget() const
Attempt to stay below this number of bytes of block files.
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate...
const CBlockIndex * FindFork(const CBlockIndex *pindex) const
Find the last common block between this chain and a block index entry.
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.
CCoinsView that brings transactions from a mempool into view.
bilingual_str _(ConstevalStringLiteral str)
Translation function.
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.
#define T(expected, seed, data)
BuriedDeployment
A buried deployment is one where the height of the activation has been hardcoded into the client impl...
unsigned int nTx
Number of transactions in this block.
SnapshotCompletionResult MaybeCompleteSnapshotValidation() EXCLUSIVE_LOCKS_REQUIRED(const CBlockIndex *GetSnapshotBaseBlock() const EXCLUSIVE_LOCKS_REQUIRED(Chainstate ActiveChainstate)() const
Once the background validation chainstate has reached the height which is the base of the UTXO snapsh...
UniValue blockToJSON(BlockManager &blockman, const CBlock &block, const CBlockIndex &tip, const CBlockIndex &blockindex, TxVerbosity verbosity)
Block description to JSON.
NodeContext & EnsureAnyNodeContext(const std::any &context)
static RPCHelpMan getblockhash()
BIP9Deployment vDeployments[MAX_VERSION_BITS_DEPLOYMENTS]
RecursiveMutex cs
This mutex needs to be locked when accessing mapTx or other members that are guarded by it...
ArgsManager & EnsureArgsman(const NodeContext &node)
Error parsing or validating structure in raw format.
const std::string UNIX_EPOCH_TIME
String used to describe UNIX epoch time in documentation, factored out to a constant for consistency...
static constexpr TransactionSerParams TX_WITH_WITNESS
static constexpr TransactionSerParams TX_NO_WITNESS
Special type to denote elision (...)
const std::string & BlockFilterTypeName(BlockFilterType filter_type)
Get the human-readable name for a filter type.
void TxToUniv(const CTransaction &tx, const uint256 &block_hash, UniValue &entry, bool include_hex=true, const CTxUndo *txundo=nullptr, TxVerbosity verbosity=TxVerbosity::SHOW_DETAILS)
std::string DeploymentName(Consensus::BuriedDeployment dep)
Cursor for iterating over CoinsView state.
static RPCHelpMan getbestblockhash()