mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-25 10:43:19 -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 <chainparamsseeds.h>
|
||||||
#include <consensus/merkle.h>
|
#include <consensus/merkle.h>
|
||||||
#include <hash.h> // for signet block challenge hash
|
#include <hash.h> // for signet block challenge hash
|
||||||
#include <tinyformat.h>
|
|
||||||
#include <util/system.h>
|
#include <util/system.h>
|
||||||
#include <util/strencodings.h>
|
#include <util/strencodings.h>
|
||||||
#include <versionbitsinfo.h>
|
#include <versionbitsinfo.h>
|
||||||
|
@ -161,6 +160,10 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
m_assumeutxo_data = MapAssumeutxo{
|
||||||
|
// TODO to be specified in a future patch.
|
||||||
|
};
|
||||||
|
|
||||||
chainTxData = ChainTxData{
|
chainTxData = ChainTxData{
|
||||||
// Data from RPC: getchaintxstats 4096 0000000000000000000b9d2ec5a352ecba0592946514a92f14319dc2b367fc72
|
// Data from RPC: getchaintxstats 4096 0000000000000000000b9d2ec5a352ecba0592946514a92f14319dc2b367fc72
|
||||||
/* nTime */ 1603995752,
|
/* nTime */ 1603995752,
|
||||||
|
@ -250,6 +253,10 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
m_assumeutxo_data = MapAssumeutxo{
|
||||||
|
// TODO to be specified in a future patch.
|
||||||
|
};
|
||||||
|
|
||||||
chainTxData = ChainTxData{
|
chainTxData = ChainTxData{
|
||||||
// Data from RPC: getchaintxstats 4096 000000000000006433d1efec504c53ca332b64963c425395515b01977bd7b3b0
|
// Data from RPC: getchaintxstats 4096 000000000000006433d1efec504c53ca332b64963c425395515b01977bd7b3b0
|
||||||
/* nTime */ 1603359686,
|
/* nTime */ 1603359686,
|
||||||
|
@ -431,6 +438,17 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
m_assumeutxo_data = MapAssumeutxo{
|
||||||
|
{
|
||||||
|
110,
|
||||||
|
{uint256S("0x76fd7334ac7c1baf57ddc0c626f073a655a35d98a4258cd1382c8cc2b8392e10"), 110},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
210,
|
||||||
|
{uint256S("0x9c5ed99ef98544b34f8920b6d1802f72ac28ae6e2bd2bd4c316ff10c230df3f2"), 210},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
chainTxData = ChainTxData{
|
chainTxData = ChainTxData{
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
@ -526,3 +544,9 @@ void SelectParams(const std::string& network)
|
||||||
SelectBaseParams(network);
|
SelectBaseParams(network);
|
||||||
globalChainParams = CreateChainParams(gArgs, 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
|
* Holds various statistics on transactions within a chain. Used to estimate
|
||||||
* verification progress during chain sync.
|
* verification progress during chain sync.
|
||||||
|
@ -90,6 +110,11 @@ public:
|
||||||
const std::string& Bech32HRP() const { return bech32_hrp; }
|
const std::string& Bech32HRP() const { return bech32_hrp; }
|
||||||
const std::vector<SeedSpec6>& FixedSeeds() const { return vFixedSeeds; }
|
const std::vector<SeedSpec6>& FixedSeeds() const { return vFixedSeeds; }
|
||||||
const CCheckpointData& Checkpoints() const { return checkpointData; }
|
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; }
|
const ChainTxData& TxData() const { return chainTxData; }
|
||||||
protected:
|
protected:
|
||||||
CChainParams() {}
|
CChainParams() {}
|
||||||
|
@ -111,6 +136,7 @@ protected:
|
||||||
bool m_is_test_chain;
|
bool m_is_test_chain;
|
||||||
bool m_is_mockable_chain;
|
bool m_is_mockable_chain;
|
||||||
CCheckpointData checkpointData;
|
CCheckpointData checkpointData;
|
||||||
|
MapAssumeutxo m_assumeutxo_data;
|
||||||
ChainTxData chainTxData;
|
ChainTxData chainTxData;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,18 @@ static void ApplyHash(CCoinsStats& stats, MuHash3072& muhash, const uint256& has
|
||||||
muhash.Insert(MakeUCharSpan(ss));
|
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>
|
template <typename T>
|
||||||
static void ApplyStats(CCoinsStats& stats, T& hash_obj, const uint256& hash, const std::map<uint32_t, Coin>& outputs)
|
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 <chainparams.h>
|
||||||
#include <net.h>
|
#include <net.h>
|
||||||
#include <signet.h>
|
#include <signet.h>
|
||||||
|
#include <uint256.h>
|
||||||
#include <validation.h>
|
#include <validation.h>
|
||||||
|
|
||||||
#include <test/util/setup_common.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()));
|
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()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <logging/timer.h>
|
#include <logging/timer.h>
|
||||||
#include <node/ui_interface.h>
|
#include <node/ui_interface.h>
|
||||||
#include <optional.h>
|
#include <optional.h>
|
||||||
|
#include <node/coinstats.h>
|
||||||
#include <policy/policy.h>
|
#include <policy/policy.h>
|
||||||
#include <policy/settings.h>
|
#include <policy/settings.h>
|
||||||
#include <pow.h>
|
#include <pow.h>
|
||||||
|
@ -5192,6 +5193,18 @@ CChainState& ChainstateManager::InitializeChainstate(CTxMemPool& mempool, const
|
||||||
return *to_modify;
|
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
|
CChainState& ChainstateManager::ActiveChainstate() const
|
||||||
{
|
{
|
||||||
LOCK(::cs_main);
|
LOCK(::cs_main);
|
||||||
|
|
|
@ -53,6 +53,7 @@ struct ChainTxData;
|
||||||
struct DisconnectedBlockTransactions;
|
struct DisconnectedBlockTransactions;
|
||||||
struct PrecomputedTransactionData;
|
struct PrecomputedTransactionData;
|
||||||
struct LockPoints;
|
struct LockPoints;
|
||||||
|
struct AssumeutxoData;
|
||||||
|
|
||||||
/** Default for -minrelaytxfee, minimum relay fee for transactions */
|
/** Default for -minrelaytxfee, minimum relay fee for transactions */
|
||||||
static const unsigned int DEFAULT_MIN_RELAY_TX_FEE = 1000;
|
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 (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
|
#endif // BITCOIN_VALIDATION_H
|
||||||
|
|
Loading…
Add table
Reference in a new issue