aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames O'Beirne <james.obeirne@pm.me>2023-05-25 13:05:27 -0400
committerJames O'Beirne <james.obeirne@pm.me>2023-09-30 06:38:47 -0400
commit434495a8c1496ca23fe35b84499f3daf668d76b8 (patch)
tree465c3fe536937e0da024615537412124b5cbab15
parentc711ca186f8d8a28810be0beedcb615ddcf93163 (diff)
chainparams: add blockhash to AssumeutxoData
This allows us to reference assumeutxo configuration by blockhash as well as height; this is helpful in future changes when we want to reference assumeutxo configurations before the block index is loaded.
-rw-r--r--src/kernel/chainparams.cpp18
-rw-r--r--src/kernel/chainparams.h26
-rw-r--r--src/test/validation_chainstatemanager_tests.cpp4
-rw-r--r--src/test/validation_tests.cpp10
-rw-r--r--src/util/vector.h13
-rw-r--r--src/validation.cpp18
-rw-r--r--src/validation.h9
7 files changed, 49 insertions, 49 deletions
diff --git a/src/kernel/chainparams.cpp b/src/kernel/chainparams.cpp
index 7e69c097a6..ca418fc6ab 100644
--- a/src/kernel/chainparams.cpp
+++ b/src/kernel/chainparams.cpp
@@ -172,8 +172,8 @@ public:
}
};
- m_assumeutxo_data = MapAssumeutxo{
- // TODO to be specified in a future patch.
+ m_assumeutxo_data = {
+ // TODO to be specified in a future patch.
};
chainTxData = ChainTxData{
@@ -266,7 +266,7 @@ public:
}
};
- m_assumeutxo_data = MapAssumeutxo{
+ m_assumeutxo_data = {
// TODO to be specified in a future patch.
};
@@ -477,14 +477,12 @@ public:
}
};
- m_assumeutxo_data = MapAssumeutxo{
- {
- 110,
- {AssumeutxoHash{uint256S("0x1ebbf5850204c0bdb15bf030f47c7fe91d45c44c712697e4509ba67adb01c618")}, 110},
- },
+ m_assumeutxo_data = {
{
- 200,
- {AssumeutxoHash{uint256S("0x51c8d11d8b5c1de51543c579736e786aa2736206d1e11e627568029ce092cf62")}, 200},
+ .height = 110,
+ .hash_serialized = AssumeutxoHash{uint256S("0x1ebbf5850204c0bdb15bf030f47c7fe91d45c44c712697e4509ba67adb01c618")},
+ .nChainTx = 110,
+ .blockhash = uint256S("0x696e92821f65549c7ee134edceeeeaaa4105647a3c4fd9f298c0aec0ab50425c")
},
};
diff --git a/src/kernel/chainparams.h b/src/kernel/chainparams.h
index ec1697493c..7a5539bc71 100644
--- a/src/kernel/chainparams.h
+++ b/src/kernel/chainparams.h
@@ -12,6 +12,7 @@
#include <uint256.h>
#include <util/chaintype.h>
#include <util/hash_type.h>
+#include <util/vector.h>
#include <cstdint>
#include <iterator>
@@ -44,17 +45,21 @@ struct AssumeutxoHash : public BaseHash<uint256> {
* as valid.
*/
struct AssumeutxoData {
+ int height;
+
//! The expected hash of the deserialized UTXO set.
- const AssumeutxoHash hash_serialized;
+ AssumeutxoHash 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;
-};
+ unsigned int nChainTx;
-using MapAssumeutxo = std::map<int, const AssumeutxoData>;
+ //! The hash of the base block for this snapshot. Used to refer to assumeutxo data
+ //! prior to having a loaded blockindex.
+ uint256 blockhash;
+};
/**
* Holds various statistics on transactions within a chain. Used to estimate
@@ -114,9 +119,14 @@ public:
const std::vector<uint8_t>& FixedSeeds() const { return vFixedSeeds; }
const CCheckpointData& Checkpoints() const { return checkpointData; }
- //! Get allowed assumeutxo configuration.
- //! @see ChainstateManager
- const MapAssumeutxo& Assumeutxo() const { return m_assumeutxo_data; }
+ std::optional<AssumeutxoData> AssumeutxoForHeight(int height) const
+ {
+ return FindFirst(m_assumeutxo_data, [&](const auto& d) { return d.height == height; });
+ }
+ std::optional<AssumeutxoData> AssumeutxoForBlockhash(const uint256& blockhash) const
+ {
+ return FindFirst(m_assumeutxo_data, [&](const auto& d) { return d.blockhash == blockhash; });
+ }
const ChainTxData& TxData() const { return chainTxData; }
@@ -169,7 +179,7 @@ protected:
bool fDefaultConsistencyChecks;
bool m_is_mockable_chain;
CCheckpointData checkpointData;
- MapAssumeutxo m_assumeutxo_data;
+ std::vector<AssumeutxoData> m_assumeutxo_data;
ChainTxData chainTxData;
};
diff --git a/src/test/validation_chainstatemanager_tests.cpp b/src/test/validation_chainstatemanager_tests.cpp
index 7b7be4be9e..74e577c17c 100644
--- a/src/test/validation_chainstatemanager_tests.cpp
+++ b/src/test/validation_chainstatemanager_tests.cpp
@@ -289,10 +289,10 @@ struct SnapshotTestSetup : TestChain100Setup {
BOOST_CHECK(!chainman.ActiveChain().Genesis()->IsAssumedValid());
}
- const AssumeutxoData& au_data = *ExpectedAssumeutxo(snapshot_height, ::Params());
+ const auto& au_data = ::Params().AssumeutxoForHeight(snapshot_height);
const CBlockIndex* tip = WITH_LOCK(chainman.GetMutex(), return chainman.ActiveTip());
- BOOST_CHECK_EQUAL(tip->nChainTx, au_data.nChainTx);
+ BOOST_CHECK_EQUAL(tip->nChainTx, au_data->nChainTx);
// To be checked against later when we try loading a subsequent snapshot.
uint256 loaded_snapshot_blockhash{*chainman.SnapshotBlockhash()};
diff --git a/src/test/validation_tests.cpp b/src/test/validation_tests.cpp
index d00f2ff4d1..d34d98c219 100644
--- a/src/test/validation_tests.cpp
+++ b/src/test/validation_tests.cpp
@@ -132,17 +132,17 @@ BOOST_AUTO_TEST_CASE(test_assumeutxo)
std::vector<int> bad_heights{0, 100, 111, 115, 209, 211};
for (auto empty : bad_heights) {
- const auto out = ExpectedAssumeutxo(empty, *params);
+ const auto out = params->AssumeutxoForHeight(empty);
BOOST_CHECK(!out);
}
- const auto out110 = *ExpectedAssumeutxo(110, *params);
+ const auto out110 = *params->AssumeutxoForHeight(110);
BOOST_CHECK_EQUAL(out110.hash_serialized.ToString(), "1ebbf5850204c0bdb15bf030f47c7fe91d45c44c712697e4509ba67adb01c618");
BOOST_CHECK_EQUAL(out110.nChainTx, 110U);
- const auto out210 = *ExpectedAssumeutxo(200, *params);
- BOOST_CHECK_EQUAL(out210.hash_serialized.ToString(), "51c8d11d8b5c1de51543c579736e786aa2736206d1e11e627568029ce092cf62");
- BOOST_CHECK_EQUAL(out210.nChainTx, 200U);
+ const auto out110_2 = *params->AssumeutxoForBlockhash(uint256S("0x696e92821f65549c7ee134edceeeeaaa4105647a3c4fd9f298c0aec0ab50425c"));
+ BOOST_CHECK_EQUAL(out110_2.hash_serialized.ToString(), "1ebbf5850204c0bdb15bf030f47c7fe91d45c44c712697e4509ba67adb01c618");
+ BOOST_CHECK_EQUAL(out110_2.nChainTx, 110U);
}
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/util/vector.h b/src/util/vector.h
index 40ff73c293..1513562f1b 100644
--- a/src/util/vector.h
+++ b/src/util/vector.h
@@ -5,7 +5,9 @@
#ifndef BITCOIN_UTIL_VECTOR_H
#define BITCOIN_UTIL_VECTOR_H
+#include <functional>
#include <initializer_list>
+#include <optional>
#include <type_traits>
#include <utility>
#include <vector>
@@ -67,4 +69,15 @@ inline void ClearShrink(V& v) noexcept
V{}.swap(v);
}
+template<typename V, typename L>
+inline std::optional<V> FindFirst(const std::vector<V>& vec, const L fnc)
+{
+ for (const auto& el : vec) {
+ if (fnc(el)) {
+ return el;
+ }
+ }
+ return std::nullopt;
+}
+
#endif // BITCOIN_UTIL_VECTOR_H
diff --git a/src/validation.cpp b/src/validation.cpp
index 240543e6eb..8afd377265 100644
--- a/src/validation.cpp
+++ b/src/validation.cpp
@@ -5099,18 +5099,6 @@ Chainstate& ChainstateManager::InitializeChainstate(CTxMemPool* mempool)
return *m_active_chainstate;
}
-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;
-}
-
[[nodiscard]] static bool DeleteCoinsDBFromDisk(const fs::path db_path, bool is_snapshot)
EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
{
@@ -5295,7 +5283,7 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
CBlockIndex* snapshot_start_block = WITH_LOCK(::cs_main, return m_blockman.LookupBlockIndex(base_blockhash));
if (!snapshot_start_block) {
- // Needed for ComputeUTXOStats and ExpectedAssumeutxo to determine the
+ // Needed for ComputeUTXOStats to determine the
// height and to avoid a crash when base_blockhash.IsNull()
LogPrintf("[snapshot] Did not find snapshot start blockheader %s\n",
base_blockhash.ToString());
@@ -5303,7 +5291,7 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
}
int base_height = snapshot_start_block->nHeight;
- auto maybe_au_data = ExpectedAssumeutxo(base_height, GetParams());
+ const auto& maybe_au_data = GetParams().AssumeutxoForHeight(base_height);
if (!maybe_au_data) {
LogPrintf("[snapshot] assumeutxo height in snapshot metadata not recognized "
@@ -5572,7 +5560,7 @@ SnapshotCompletionResult ChainstateManager::MaybeCompleteSnapshotValidation()
CCoinsViewDB& ibd_coins_db = m_ibd_chainstate->CoinsDB();
m_ibd_chainstate->ForceFlushStateToDisk();
- auto maybe_au_data = ExpectedAssumeutxo(curr_height, m_options.chainparams);
+ const auto& maybe_au_data = m_options.chainparams.AssumeutxoForHeight(curr_height);
if (!maybe_au_data) {
LogPrintf("[snapshot] assumeutxo data not found for height "
"(%d) - refusing to validate snapshot\n", curr_height);
diff --git a/src/validation.h b/src/validation.h
index 4e9e91c299..c2434264d6 100644
--- a/src/validation.h
+++ b/src/validation.h
@@ -1242,15 +1242,6 @@ bool DeploymentEnabled(const ChainstateManager& chainman, DEP dep)
return DeploymentEnabled(chainman.GetConsensus(), dep);
}
-/**
- * Return the expected assumeutxo value for a given height, if one exists.
- *
- * @param[in] height 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);
-
/** Identifies blocks that overwrote an existing coinbase output in the UTXO set (see BIP30) */
bool IsBIP30Repeat(const CBlockIndex& block_index);