mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-10 03:47:29 -03:00
chainparams: add allowed assumeutxo values
Values for mainnet and testnet will be specified in a follow-up PR that can be scrutinized accordingly. This structure is required for use in snapshot activation logic.
This commit is contained in:
parent
e9c037ba64
commit
7a6c46b37e
6 changed files with 110 additions and 1 deletions
|
@ -8,7 +8,6 @@
|
|||
#include <chainparamsseeds.h>
|
||||
#include <consensus/merkle.h>
|
||||
#include <hash.h> // for signet block challenge hash
|
||||
#include <tinyformat.h>
|
||||
#include <util/system.h>
|
||||
#include <util/strencodings.h>
|
||||
#include <versionbitsinfo.h>
|
||||
|
@ -161,6 +160,10 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
m_assumeutxo_data = MapAssumeutxo{
|
||||
// TODO to be specified in a future patch.
|
||||
};
|
||||
|
||||
chainTxData = ChainTxData{
|
||||
// Data from RPC: getchaintxstats 4096 0000000000000000000b9d2ec5a352ecba0592946514a92f14319dc2b367fc72
|
||||
/* nTime */ 1603995752,
|
||||
|
@ -250,6 +253,10 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
m_assumeutxo_data = MapAssumeutxo{
|
||||
// TODO to be specified in a future patch.
|
||||
};
|
||||
|
||||
chainTxData = ChainTxData{
|
||||
// Data from RPC: getchaintxstats 4096 000000000000006433d1efec504c53ca332b64963c425395515b01977bd7b3b0
|
||||
/* nTime */ 1603359686,
|
||||
|
@ -431,6 +438,17 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
m_assumeutxo_data = MapAssumeutxo{
|
||||
{
|
||||
110,
|
||||
{uint256S("0x76fd7334ac7c1baf57ddc0c626f073a655a35d98a4258cd1382c8cc2b8392e10"), 110},
|
||||
},
|
||||
{
|
||||
210,
|
||||
{uint256S("0x9c5ed99ef98544b34f8920b6d1802f72ac28ae6e2bd2bd4c316ff10c230df3f2"), 210},
|
||||
},
|
||||
};
|
||||
|
||||
chainTxData = ChainTxData{
|
||||
0,
|
||||
0,
|
||||
|
@ -526,3 +544,9 @@ void SelectParams(const std::string& network)
|
|||
SelectBaseParams(network);
|
||||
globalChainParams = CreateChainParams(gArgs, network);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& o, const AssumeutxoData& aud)
|
||||
{
|
||||
o << strprintf("AssumeutxoData(%s, %s)", aud.hash_serialized.ToString(), aud.nChainTx);
|
||||
return o;
|
||||
}
|
||||
|
|
|
@ -30,6 +30,26 @@ struct CCheckpointData {
|
|||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Holds configuration for use during UTXO snapshot load and validation. The contents
|
||||
* here are security critical, since they dictate which UTXO snapshots are recognized
|
||||
* as valid.
|
||||
*/
|
||||
struct AssumeutxoData {
|
||||
//! The expected hash of the deserialized UTXO set.
|
||||
const uint256 hash_serialized;
|
||||
|
||||
//! Used to populate the nChainTx value, which is used during BlockManager::LoadBlockIndex().
|
||||
//!
|
||||
//! We need to hardcode the value here because this is computed cumulatively using block data,
|
||||
//! which we do not necessarily have at the time of snapshot load.
|
||||
const unsigned int nChainTx;
|
||||
};
|
||||
|
||||
std::ostream& operator<<(std::ostream& o, const AssumeutxoData& aud);
|
||||
|
||||
using MapAssumeutxo = std::map<int, const AssumeutxoData>;
|
||||
|
||||
/**
|
||||
* Holds various statistics on transactions within a chain. Used to estimate
|
||||
* verification progress during chain sync.
|
||||
|
@ -90,6 +110,11 @@ public:
|
|||
const std::string& Bech32HRP() const { return bech32_hrp; }
|
||||
const std::vector<SeedSpec6>& FixedSeeds() const { return vFixedSeeds; }
|
||||
const CCheckpointData& Checkpoints() const { return checkpointData; }
|
||||
|
||||
//! Get allowed assumeutxo configuration.
|
||||
//! @see ChainstateManager
|
||||
const MapAssumeutxo& Assumeutxo() const { return m_assumeutxo_data; }
|
||||
|
||||
const ChainTxData& TxData() const { return chainTxData; }
|
||||
protected:
|
||||
CChainParams() {}
|
||||
|
@ -111,6 +136,7 @@ protected:
|
|||
bool m_is_test_chain;
|
||||
bool m_is_mockable_chain;
|
||||
CCheckpointData checkpointData;
|
||||
MapAssumeutxo m_assumeutxo_data;
|
||||
ChainTxData chainTxData;
|
||||
};
|
||||
|
||||
|
|
|
@ -55,6 +55,18 @@ static void ApplyHash(CCoinsStats& stats, MuHash3072& muhash, const uint256& has
|
|||
muhash.Insert(MakeUCharSpan(ss));
|
||||
}
|
||||
|
||||
//! Warning: be very careful when changing this! assumeutxo and UTXO snapshot
|
||||
//! validation commitments are reliant on the hash constructed by this
|
||||
//! function.
|
||||
//!
|
||||
//! If the construction of this hash is changed, it will invalidate
|
||||
//! existing UTXO snapshots. This will not result in any kind of consensus
|
||||
//! failure, but it will force clients that were expecting to make use of
|
||||
//! assumeutxo to do traditional IBD instead.
|
||||
//!
|
||||
//! It is also possible, though very unlikely, that a change in this
|
||||
//! construction could cause a previously invalid (and potentially malicious)
|
||||
//! UTXO snapshot to be considered valid.
|
||||
template <typename T>
|
||||
static void ApplyStats(CCoinsStats& stats, T& hash_obj, const uint256& hash, const std::map<uint32_t, Coin>& outputs)
|
||||
{
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include <chainparams.h>
|
||||
#include <net.h>
|
||||
#include <signet.h>
|
||||
#include <uint256.h>
|
||||
#include <validation.h>
|
||||
|
||||
#include <test/util/setup_common.h>
|
||||
|
@ -119,4 +120,27 @@ BOOST_AUTO_TEST_CASE(signet_parse_tests)
|
|||
BOOST_CHECK(!CheckSignetBlockSolution(block, signet_params->GetConsensus()));
|
||||
}
|
||||
|
||||
//! Test retrieval of valid assumeutxo values.
|
||||
BOOST_AUTO_TEST_CASE(test_assumeutxo)
|
||||
{
|
||||
const auto params = CreateChainParams(*m_node.args, CBaseChainParams::REGTEST);
|
||||
|
||||
// These heights don't have assumeutxo configurations associated, per the contents
|
||||
// of chainparams.cpp.
|
||||
std::vector<int> bad_heights{0, 100, 111, 115, 209, 211};
|
||||
|
||||
for (auto empty : bad_heights) {
|
||||
const auto out = ExpectedAssumeutxo(empty, *params);
|
||||
BOOST_CHECK(!out);
|
||||
}
|
||||
|
||||
const auto out110 = *ExpectedAssumeutxo(110, *params);
|
||||
BOOST_CHECK_EQUAL(out110.hash_serialized, uint256S("76fd7334ac7c1baf57ddc0c626f073a655a35d98a4258cd1382c8cc2b8392e10"));
|
||||
BOOST_CHECK_EQUAL(out110.nChainTx, (unsigned int)110);
|
||||
|
||||
const auto out210 = *ExpectedAssumeutxo(210, *params);
|
||||
BOOST_CHECK_EQUAL(out210.hash_serialized, uint256S("9c5ed99ef98544b34f8920b6d1802f72ac28ae6e2bd2bd4c316ff10c230df3f2"));
|
||||
BOOST_CHECK_EQUAL(out210.nChainTx, (unsigned int)210);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <logging/timer.h>
|
||||
#include <node/ui_interface.h>
|
||||
#include <optional.h>
|
||||
#include <node/coinstats.h>
|
||||
#include <policy/policy.h>
|
||||
#include <policy/settings.h>
|
||||
#include <pow.h>
|
||||
|
@ -5192,6 +5193,18 @@ CChainState& ChainstateManager::InitializeChainstate(CTxMemPool& mempool, const
|
|||
return *to_modify;
|
||||
}
|
||||
|
||||
const AssumeutxoData* ExpectedAssumeutxo(
|
||||
const int height, const CChainParams& chainparams)
|
||||
{
|
||||
const MapAssumeutxo& valid_assumeutxos_map = chainparams.Assumeutxo();
|
||||
const auto assumeutxo_found = valid_assumeutxos_map.find(height);
|
||||
|
||||
if (assumeutxo_found != valid_assumeutxos_map.end()) {
|
||||
return &assumeutxo_found->second;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
CChainState& ChainstateManager::ActiveChainstate() const
|
||||
{
|
||||
LOCK(::cs_main);
|
||||
|
|
|
@ -53,6 +53,7 @@ struct ChainTxData;
|
|||
struct DisconnectedBlockTransactions;
|
||||
struct PrecomputedTransactionData;
|
||||
struct LockPoints;
|
||||
struct AssumeutxoData;
|
||||
|
||||
/** Default for -minrelaytxfee, minimum relay fee for transactions */
|
||||
static const unsigned int DEFAULT_MIN_RELAY_TX_FEE = 1000;
|
||||
|
@ -1013,4 +1014,13 @@ inline bool IsBlockPruned(const CBlockIndex* pblockindex)
|
|||
return (fHavePruned && !(pblockindex->nStatus & BLOCK_HAVE_DATA) && pblockindex->nTx > 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the expected assumeutxo value for a given height, if one exists.
|
||||
*
|
||||
* @param height[in] Get the assumeutxo value for this height.
|
||||
*
|
||||
* @returns empty if no assumeutxo configuration exists for the given height.
|
||||
*/
|
||||
const AssumeutxoData* ExpectedAssumeutxo(const int height, const CChainParams& params);
|
||||
|
||||
#endif // BITCOIN_VALIDATION_H
|
||||
|
|
Loading…
Reference in a new issue