mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-06-14 10:51:27 +02:00
rpc: read raw block in getblock and deserialize for verbosity > 0
Note that for speed this commit also removes the proof of work and signet signature checks before returning the block in getblock. It is assumed if a block is stored it will be valid.
This commit is contained in:
parent
0865ab8712
commit
95ce0783a6
@ -17,6 +17,7 @@
|
|||||||
#include <core_io.h>
|
#include <core_io.h>
|
||||||
#include <deploymentinfo.h>
|
#include <deploymentinfo.h>
|
||||||
#include <deploymentstatus.h>
|
#include <deploymentstatus.h>
|
||||||
|
#include <flatfile.h>
|
||||||
#include <hash.h>
|
#include <hash.h>
|
||||||
#include <index/blockfilterindex.h>
|
#include <index/blockfilterindex.h>
|
||||||
#include <index/coinstatsindex.h>
|
#include <index/coinstatsindex.h>
|
||||||
@ -595,6 +596,28 @@ static CBlock GetBlockChecked(BlockManager& blockman, const CBlockIndex& blockin
|
|||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::vector<uint8_t> GetRawBlockChecked(BlockManager& blockman, const CBlockIndex& blockindex)
|
||||||
|
{
|
||||||
|
std::vector<uint8_t> data{};
|
||||||
|
FlatFilePos pos{};
|
||||||
|
{
|
||||||
|
LOCK(cs_main);
|
||||||
|
if (blockman.IsBlockPruned(blockindex)) {
|
||||||
|
throw JSONRPCError(RPC_MISC_ERROR, "Block not available (pruned data)");
|
||||||
|
}
|
||||||
|
pos = blockindex.GetBlockPos();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!blockman.ReadRawBlockFromDisk(data, pos)) {
|
||||||
|
// 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
|
||||||
|
// block. Or if the block was pruned right after we released the lock above.
|
||||||
|
throw JSONRPCError(RPC_MISC_ERROR, "Block not found on disk");
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
static CBlockUndo GetUndoChecked(BlockManager& blockman, const CBlockIndex& blockindex)
|
static CBlockUndo GetUndoChecked(BlockManager& blockman, const CBlockIndex& blockindex)
|
||||||
{
|
{
|
||||||
CBlockUndo blockUndo;
|
CBlockUndo blockUndo;
|
||||||
@ -735,15 +758,16 @@ static RPCHelpMan getblock()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const CBlock block{GetBlockChecked(chainman.m_blockman, *pblockindex)};
|
const std::vector<uint8_t> block_data{GetRawBlockChecked(chainman.m_blockman, *pblockindex)};
|
||||||
|
|
||||||
if (verbosity <= 0) {
|
if (verbosity <= 0) {
|
||||||
DataStream ssBlock;
|
return HexStr(block_data);
|
||||||
ssBlock << TX_WITH_WITNESS(block);
|
|
||||||
std::string strHex = HexStr(ssBlock);
|
|
||||||
return strHex;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DataStream block_stream{block_data};
|
||||||
|
CBlock block{};
|
||||||
|
block_stream >> TX_WITH_WITNESS(block);
|
||||||
|
|
||||||
TxVerbosity tx_verbosity;
|
TxVerbosity tx_verbosity;
|
||||||
if (verbosity == 1) {
|
if (verbosity == 1) {
|
||||||
tx_verbosity = TxVerbosity::SHOW_TXID;
|
tx_verbosity = TxVerbosity::SHOW_TXID;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user