Changeset View
Changeset View
Standalone View
Standalone View
src/rpc/blockchain.cpp
| Show First 20 Lines • Show All 183 Lines • ▼ Show 20 Lines | UniValue blockToJSON(BlockManager &blockman, const CBlock &block, | ||||
| bool txDetails) { | bool txDetails) { | ||||
| UniValue result = blockheaderToJSON(tip, blockindex); | UniValue result = blockheaderToJSON(tip, blockindex); | ||||
| result.pushKV("size", (int)::GetSerializeSize(block, PROTOCOL_VERSION)); | result.pushKV("size", (int)::GetSerializeSize(block, PROTOCOL_VERSION)); | ||||
| UniValue txs(UniValue::VARR); | UniValue txs(UniValue::VARR); | ||||
| if (txDetails) { | if (txDetails) { | ||||
| CBlockUndo blockUndo; | CBlockUndo blockUndo; | ||||
| const bool is_not_pruned{ | const bool is_not_pruned{ | ||||
| WITH_LOCK(::cs_main, return !blockman.IsBlockPruned(blockindex))}; | WITH_LOCK(::cs_main, return !blockman.IsBlockPruned(*blockindex))}; | ||||
| const bool have_undo{is_not_pruned && | const bool have_undo{is_not_pruned && | ||||
| blockman.UndoReadFromDisk(blockUndo, *blockindex)}; | blockman.UndoReadFromDisk(blockUndo, *blockindex)}; | ||||
| for (size_t i = 0; i < block.vtx.size(); ++i) { | for (size_t i = 0; i < block.vtx.size(); ++i) { | ||||
| const CTransactionRef &tx = block.vtx.at(i); | const CTransactionRef &tx = block.vtx.at(i); | ||||
| // coinbase transaction (i == 0) doesn't have undo data | // coinbase transaction (i == 0) doesn't have undo data | ||||
| const CTxUndo *txundo = | const CTxUndo *txundo = | ||||
| (have_undo && i) ? &blockUndo.vtxundo.at(i - 1) : nullptr; | (have_undo && i) ? &blockUndo.vtxundo.at(i - 1) : nullptr; | ||||
| UniValue objTx(UniValue::VOBJ); | UniValue objTx(UniValue::VOBJ); | ||||
| ▲ Show 20 Lines • Show All 451 Lines • ▼ Show 20 Lines | static RPCHelpMan getblockheader() { | ||||
| }; | }; | ||||
| } | } | ||||
| static CBlock GetBlockChecked(BlockManager &blockman, | static CBlock GetBlockChecked(BlockManager &blockman, | ||||
| const CBlockIndex *pblockindex) { | const CBlockIndex *pblockindex) { | ||||
| CBlock block; | CBlock block; | ||||
| { | { | ||||
| LOCK(cs_main); | LOCK(cs_main); | ||||
| if (blockman.IsBlockPruned(pblockindex)) { | if (blockman.IsBlockPruned(*pblockindex)) { | ||||
| throw JSONRPCError(RPC_MISC_ERROR, | throw JSONRPCError(RPC_MISC_ERROR, | ||||
| "Block not available (pruned data)"); | "Block not available (pruned data)"); | ||||
| } | } | ||||
| } | } | ||||
| if (!blockman.ReadBlockFromDisk(block, *pblockindex)) { | if (!blockman.ReadBlockFromDisk(block, *pblockindex)) { | ||||
| // Block not found on disk. This could be because we have the block | // Block not found on disk. This could be because we have the block | ||||
| // header in our index but not yet have the block or did not accept the | // header in our index but not yet have the block or did not accept the | ||||
| // block. Or if the block was pruned right after we released the lock | // block. Or if the block was pruned right after we released the lock | ||||
| // above. | // above. | ||||
| throw JSONRPCError(RPC_MISC_ERROR, "Block not found on disk"); | throw JSONRPCError(RPC_MISC_ERROR, "Block not found on disk"); | ||||
| } | } | ||||
| return block; | return block; | ||||
| } | } | ||||
| static CBlockUndo GetUndoChecked(BlockManager &blockman, | static CBlockUndo GetUndoChecked(BlockManager &blockman, | ||||
| const CBlockIndex *pblockindex) { | const CBlockIndex *pblockindex) { | ||||
| CBlockUndo blockUndo; | CBlockUndo blockUndo; | ||||
| { | { | ||||
| LOCK(cs_main); | LOCK(cs_main); | ||||
| if (blockman.IsBlockPruned(pblockindex)) { | if (blockman.IsBlockPruned(*pblockindex)) { | ||||
| throw JSONRPCError(RPC_MISC_ERROR, | throw JSONRPCError(RPC_MISC_ERROR, | ||||
| "Undo data not available (pruned data)"); | "Undo data not available (pruned data)"); | ||||
| } | } | ||||
| } | } | ||||
| if (!blockman.UndoReadFromDisk(blockUndo, *pblockindex)) { | if (!blockman.UndoReadFromDisk(blockUndo, *pblockindex)) { | ||||
| throw JSONRPCError(RPC_MISC_ERROR, "Can't read undo data from disk"); | throw JSONRPCError(RPC_MISC_ERROR, "Can't read undo data from disk"); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 2,597 Lines • Show Last 20 Lines | |||||