| 253 | } |
| 254 | |
| 255 | UniValue blockToJSON(const CBlock& block, const CBlockIndex* tip, const CBlockIndex* blockindex, TxVerbosity verbosity) |
| 256 | { |
| 257 | UniValue result = blockheaderToJSON(tip, blockindex); |
| 258 | |
| 259 | result.pushKV("strippedsize", (int)::GetSerializeSize(block, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS)); |
| 260 | result.pushKV("size", (int)::GetSerializeSize(block, PROTOCOL_VERSION)); |
| 261 | result.pushKV("weight", (int)::GetBlockWeight(block)); |
| 262 | UniValue txs(UniValue::VARR); |
| 263 | |
| 264 | switch (verbosity) { |
| 265 | case TxVerbosity::SHOW_TXID: |
| 266 | for (const CTransactionRef& tx : block.vtx) { |
| 267 | txs.push_back(tx->GetHash().GetHex()); |
| 268 | } |
| 269 | break; |
| 270 | |
| 271 | case TxVerbosity::SHOW_DETAILS: |
| 272 | case TxVerbosity::SHOW_DETAILS_AND_PREVOUT: |
| 273 | CBlockUndo blockUndo; |
| 274 | const bool have_undo{WITH_LOCK(::cs_main, return !IsBlockPruned(blockindex) && UndoReadFromDisk(blockUndo, blockindex))}; |
| 275 | |
| 276 | for (size_t i = 0; i < block.vtx.size(); ++i) { |
| 277 | const CTransactionRef& tx = block.vtx.at(i); |
| 278 | // coinbase transaction (i.e. i == 0) doesn't have undo data |
| 279 | const CTxUndo* txundo = (have_undo && i > 0) ? &blockUndo.vtxundo.at(i - 1) : nullptr; |
| 280 | UniValue objTx(UniValue::VOBJ); |
| 281 | TxToUniv(*tx, uint256(), objTx, true, RPCSerializationFlags(), txundo, verbosity); |
| 282 | txs.push_back(std::move(objTx)); |
| 283 | } |
| 284 | break; |
| 285 | } |
| 286 | |
| 287 | result.pushKV("tx", std::move(txs)); |
| 288 | |
| 289 | return result; |
| 290 | } |
| 291 | |
| 292 | static RPCHelpMan getblockcount() |
| 293 | { |
no test coverage detected