mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-02 09:46:52 -05:00
assumeutxo: Add network magic ctor param to SnapshotMetadata
This prevents SnapshotMetadata from using any globals implicitly.
This commit is contained in:
parent
1f1f998455
commit
6b6084850b
7 changed files with 22 additions and 12 deletions
|
@ -554,7 +554,7 @@ std::vector<int> CChainParams::GetAvailableSnapshotHeights() const
|
||||||
return heights;
|
return heights;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<ChainType> GetNetworkForMagic(MessageStartChars& message)
|
std::optional<ChainType> GetNetworkForMagic(const MessageStartChars& message)
|
||||||
{
|
{
|
||||||
const auto mainnet_msg = CChainParams::Main()->MessageStart();
|
const auto mainnet_msg = CChainParams::Main()->MessageStart();
|
||||||
const auto testnet_msg = CChainParams::TestNet()->MessageStart();
|
const auto testnet_msg = CChainParams::TestNet()->MessageStart();
|
||||||
|
|
|
@ -184,6 +184,6 @@ protected:
|
||||||
ChainTxData chainTxData;
|
ChainTxData chainTxData;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::optional<ChainType> GetNetworkForMagic(MessageStartChars& pchMessageStart);
|
std::optional<ChainType> GetNetworkForMagic(const MessageStartChars& pchMessageStart);
|
||||||
|
|
||||||
#endif // BITCOIN_KERNEL_CHAINPARAMS_H
|
#endif // BITCOIN_KERNEL_CHAINPARAMS_H
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <sync.h>
|
#include <sync.h>
|
||||||
#include <uint256.h>
|
#include <uint256.h>
|
||||||
#include <util/chaintype.h>
|
#include <util/chaintype.h>
|
||||||
|
#include <util/check.h>
|
||||||
#include <util/fs.h>
|
#include <util/fs.h>
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
@ -31,6 +32,7 @@ class SnapshotMetadata
|
||||||
{
|
{
|
||||||
const uint16_t m_version{1};
|
const uint16_t m_version{1};
|
||||||
const std::set<uint16_t> m_supported_versions{1};
|
const std::set<uint16_t> m_supported_versions{1};
|
||||||
|
const MessageStartChars m_network_magic;
|
||||||
public:
|
public:
|
||||||
//! The hash of the block that reflects the tip of the chain for the
|
//! The hash of the block that reflects the tip of the chain for the
|
||||||
//! UTXO set contained in this snapshot.
|
//! UTXO set contained in this snapshot.
|
||||||
|
@ -42,11 +44,15 @@ public:
|
||||||
//! during snapshot load to estimate progress of UTXO set reconstruction.
|
//! during snapshot load to estimate progress of UTXO set reconstruction.
|
||||||
uint64_t m_coins_count = 0;
|
uint64_t m_coins_count = 0;
|
||||||
|
|
||||||
SnapshotMetadata() { }
|
|
||||||
SnapshotMetadata(
|
SnapshotMetadata(
|
||||||
|
const MessageStartChars network_magic) :
|
||||||
|
m_network_magic(network_magic) { }
|
||||||
|
SnapshotMetadata(
|
||||||
|
const MessageStartChars network_magic,
|
||||||
const uint256& base_blockhash,
|
const uint256& base_blockhash,
|
||||||
const int base_blockheight,
|
const int base_blockheight,
|
||||||
uint64_t coins_count) :
|
uint64_t coins_count) :
|
||||||
|
m_network_magic(network_magic),
|
||||||
m_base_blockhash(base_blockhash),
|
m_base_blockhash(base_blockhash),
|
||||||
m_base_blockheight(base_blockheight),
|
m_base_blockheight(base_blockheight),
|
||||||
m_coins_count(coins_count) { }
|
m_coins_count(coins_count) { }
|
||||||
|
@ -55,7 +61,7 @@ public:
|
||||||
inline void Serialize(Stream& s) const {
|
inline void Serialize(Stream& s) const {
|
||||||
s << SNAPSHOT_MAGIC_BYTES;
|
s << SNAPSHOT_MAGIC_BYTES;
|
||||||
s << m_version;
|
s << m_version;
|
||||||
s << Params().MessageStart();
|
s << m_network_magic;
|
||||||
s << m_base_blockheight;
|
s << m_base_blockheight;
|
||||||
s << m_base_blockhash;
|
s << m_base_blockhash;
|
||||||
s << m_coins_count;
|
s << m_coins_count;
|
||||||
|
@ -80,11 +86,13 @@ public:
|
||||||
// Read the network magic (pchMessageStart)
|
// Read the network magic (pchMessageStart)
|
||||||
MessageStartChars message;
|
MessageStartChars message;
|
||||||
s >> message;
|
s >> message;
|
||||||
if (!std::equal(message.begin(), message.end(), Params().MessageStart().data())) {
|
if (!std::equal(message.begin(), message.end(), m_network_magic.data())) {
|
||||||
auto metadata_network = GetNetworkForMagic(message);
|
auto metadata_network{GetNetworkForMagic(message)};
|
||||||
if (metadata_network) {
|
if (metadata_network) {
|
||||||
std::string network_string{ChainTypeToString(metadata_network.value())};
|
std::string network_string{ChainTypeToString(metadata_network.value())};
|
||||||
throw std::ios_base::failure(strprintf("The network of the snapshot (%s) does not match the network of this node (%s).", network_string, Params().GetChainTypeString()));
|
auto node_network{GetNetworkForMagic(m_network_magic)};
|
||||||
|
std::string node_network_string{ChainTypeToString(node_network.value())};
|
||||||
|
throw std::ios_base::failure(strprintf("The network of the snapshot (%s) does not match the network of this node (%s).", network_string, node_network_string));
|
||||||
} else {
|
} else {
|
||||||
throw std::ios_base::failure("This snapshot has been created for an unrecognized network. This could be a custom signet, a new testnet or possibly caused by data corruption.");
|
throw std::ios_base::failure("This snapshot has been created for an unrecognized network. This could be a custom signet, a new testnet or possibly caused by data corruption.");
|
||||||
}
|
}
|
||||||
|
|
|
@ -2697,7 +2697,7 @@ UniValue CreateUTXOSnapshot(
|
||||||
tip->nHeight, tip->GetBlockHash().ToString(),
|
tip->nHeight, tip->GetBlockHash().ToString(),
|
||||||
fs::PathToString(path), fs::PathToString(temppath)));
|
fs::PathToString(path), fs::PathToString(temppath)));
|
||||||
|
|
||||||
SnapshotMetadata metadata{tip->GetBlockHash(), tip->nHeight, maybe_stats->coins_count};
|
SnapshotMetadata metadata{chainstate.m_chainman.GetParams().MessageStart(), tip->GetBlockHash(), tip->nHeight, maybe_stats->coins_count};
|
||||||
|
|
||||||
afile << metadata;
|
afile << metadata;
|
||||||
|
|
||||||
|
@ -2809,7 +2809,7 @@ static RPCHelpMan loadtxoutset()
|
||||||
"Couldn't open file " + path.utf8string() + " for reading.");
|
"Couldn't open file " + path.utf8string() + " for reading.");
|
||||||
}
|
}
|
||||||
|
|
||||||
SnapshotMetadata metadata;
|
SnapshotMetadata metadata{chainman.GetParams().MessageStart()};
|
||||||
try {
|
try {
|
||||||
afile >> metadata;
|
afile >> metadata;
|
||||||
} catch (const std::ios_base::failure& e) {
|
} catch (const std::ios_base::failure& e) {
|
||||||
|
|
|
@ -316,7 +316,8 @@ FUZZ_TARGET_DESERIALIZE(blocktransactionsrequest_deserialize, {
|
||||||
DeserializeFromFuzzingInput(buffer, btr);
|
DeserializeFromFuzzingInput(buffer, btr);
|
||||||
})
|
})
|
||||||
FUZZ_TARGET_DESERIALIZE(snapshotmetadata_deserialize, {
|
FUZZ_TARGET_DESERIALIZE(snapshotmetadata_deserialize, {
|
||||||
SnapshotMetadata snapshot_metadata;
|
auto msg_start = Params().MessageStart();
|
||||||
|
SnapshotMetadata snapshot_metadata{msg_start};
|
||||||
DeserializeFromFuzzingInput(buffer, snapshot_metadata);
|
DeserializeFromFuzzingInput(buffer, snapshot_metadata);
|
||||||
})
|
})
|
||||||
FUZZ_TARGET_DESERIALIZE(uint160_deserialize, {
|
FUZZ_TARGET_DESERIALIZE(uint160_deserialize, {
|
||||||
|
|
|
@ -47,7 +47,8 @@ FUZZ_TARGET(utxo_snapshot, .init = initialize_chain)
|
||||||
|
|
||||||
const auto ActivateFuzzedSnapshot{[&] {
|
const auto ActivateFuzzedSnapshot{[&] {
|
||||||
AutoFile infile{fsbridge::fopen(snapshot_path, "rb")};
|
AutoFile infile{fsbridge::fopen(snapshot_path, "rb")};
|
||||||
SnapshotMetadata metadata;
|
auto msg_start = Params().MessageStart();
|
||||||
|
SnapshotMetadata metadata{msg_start};
|
||||||
try {
|
try {
|
||||||
infile >> metadata;
|
infile >> metadata;
|
||||||
} catch (const std::ios_base::failure&) {
|
} catch (const std::ios_base::failure&) {
|
||||||
|
|
|
@ -56,7 +56,7 @@ CreateAndActivateUTXOSnapshot(
|
||||||
//
|
//
|
||||||
FILE* infile{fsbridge::fopen(snapshot_path, "rb")};
|
FILE* infile{fsbridge::fopen(snapshot_path, "rb")};
|
||||||
AutoFile auto_infile{infile};
|
AutoFile auto_infile{infile};
|
||||||
node::SnapshotMetadata metadata;
|
node::SnapshotMetadata metadata{node.chainman->GetParams().MessageStart()};
|
||||||
auto_infile >> metadata;
|
auto_infile >> metadata;
|
||||||
|
|
||||||
malleation(auto_infile, metadata);
|
malleation(auto_infile, metadata);
|
||||||
|
|
Loading…
Add table
Reference in a new issue