mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-04-17 02:57:33 +02:00
refactor: Move early loadtxoutset checks into ActiveSnapshot
Also changes the return type of ActiveSnapshot to allow returning the error message to the user of the loadtxoutset RPC.
This commit is contained in:
@@ -62,9 +62,7 @@ using kernel::CoinStatsHashType;
|
||||
using node::BlockManager;
|
||||
using node::NodeContext;
|
||||
using node::SnapshotMetadata;
|
||||
using util::Join;
|
||||
using util::MakeUnorderedList;
|
||||
using util::ToString;
|
||||
|
||||
struct CUpdatedBlock
|
||||
{
|
||||
@@ -2821,34 +2819,15 @@ static RPCHelpMan loadtxoutset()
|
||||
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("Unable to parse metadata: %s", e.what()));
|
||||
}
|
||||
|
||||
uint256 base_blockhash = metadata.m_base_blockhash;
|
||||
int base_blockheight = metadata.m_base_blockheight;
|
||||
if (!chainman.GetParams().AssumeutxoForBlockhash(base_blockhash).has_value()) {
|
||||
auto available_heights = chainman.GetParams().GetAvailableSnapshotHeights();
|
||||
std::string heights_formatted = Join(available_heights, ", ", [&](const auto& i) { return ToString(i); });
|
||||
throw JSONRPCError(RPC_INTERNAL_ERROR, strprintf("Unable to load UTXO snapshot, "
|
||||
"assumeutxo block hash in snapshot metadata not recognized (hash: %s, height: %s). The following snapshot heights are available: %s.",
|
||||
base_blockhash.ToString(),
|
||||
base_blockheight,
|
||||
heights_formatted));
|
||||
}
|
||||
CBlockIndex* snapshot_start_block = WITH_LOCK(::cs_main,
|
||||
return chainman.m_blockman.LookupBlockIndex(base_blockhash));
|
||||
|
||||
if (!snapshot_start_block) {
|
||||
throw JSONRPCError(
|
||||
RPC_INTERNAL_ERROR,
|
||||
strprintf("The base block header (%s) must appear in the headers chain. Make sure all headers are syncing, and call this RPC again.",
|
||||
base_blockhash.ToString()));
|
||||
}
|
||||
if (!chainman.ActivateSnapshot(afile, metadata, false)) {
|
||||
throw JSONRPCError(RPC_INTERNAL_ERROR, "Unable to load UTXO snapshot " + fs::PathToString(path));
|
||||
auto activation_result{chainman.ActivateSnapshot(afile, metadata, false)};
|
||||
if (!activation_result) {
|
||||
throw JSONRPCError(RPC_INTERNAL_ERROR, strprintf(_("Unable to load UTXO snapshot: %s\n"), util::ErrorString(activation_result)).original);
|
||||
}
|
||||
|
||||
UniValue result(UniValue::VOBJ);
|
||||
result.pushKV("coins_loaded", metadata.m_coins_count);
|
||||
result.pushKV("tip_hash", snapshot_start_block->GetBlockHash().ToString());
|
||||
result.pushKV("base_height", snapshot_start_block->nHeight);
|
||||
result.pushKV("tip_hash", metadata.m_base_blockhash.ToString());
|
||||
result.pushKV("base_height", metadata.m_base_blockheight);
|
||||
result.pushKV("path", fs::PathToString(path));
|
||||
return result;
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user