5#include <chainparams.h>
29#include <boost/test/unit_test.hpp>
43 std::vector<Chainstate*> chainstates;
50 chainstates.push_back(&c1);
54 auto all = manager.
GetAll();
55 BOOST_CHECK_EQUAL_COLLECTIONS(all.begin(), all.end(), chainstates.begin(), chainstates.end());
71 const uint256 snapshot_blockhash = active_tip->GetBlockHash();
73 chainstates.push_back(&c2);
75 1 << 23,
true,
false);
78 c2.InitCoinsCache(1 << 23);
91 auto all2 = manager.
GetAll();
92 BOOST_CHECK_EQUAL_COLLECTIONS(all2.begin(), all2.end(), chainstates.begin(), chainstates.end());
116 size_t max_cache = 10000;
120 std::vector<Chainstate*> chainstates;
125 chainstates.push_back(&c1);
128 c1.InitCoinsCache(1 << 23);
129 manager.MaybeRebalanceCaches();
139 chainstates.push_back(&c2);
141 1 << 23,
true,
false);
154 c2.InitCoinsCache(1 << 23);
155 manager.MaybeRebalanceCaches();
174 .coins_db_in_memory =
false,
175 .block_tree_db_in_memory =
false,
194 size_t initial_total_coins{100};
201 size_t total_coins{0};
222 constexpr int snapshot_height = 110;
225 initial_total_coins += 10;
301 int chains_tested{0};
304 BOOST_TEST_MESSAGE(
"Checking coins in " << chainstate->ToString());
310 size_t total_coins{0};
327 constexpr size_t new_coins{100};
328 mineBlocks(new_coins);
332 size_t coins_in_active{0};
333 size_t coins_in_background{0};
334 size_t coins_missing_from_background{0};
337 BOOST_TEST_MESSAGE(
"Checking coins in " << chainstate->ToString());
344 (is_background ? coins_in_background : coins_in_active)++;
345 }
else if (is_background) {
346 coins_missing_from_background++;
362 loaded_snapshot_blockhash);
363 return std::make_tuple(&validation_chainstate, &snapshot_chainstate);
374 BOOST_TEST_MESSAGE(
"Simulating node restart");
378 cs->ForceFlushStateToDisk();
383 chainman.ResetChainstates();
392 const BlockManager::Options blockman_opts{
393 .chainparams = chainman_opts.chainparams,
394 .blocks_dir = m_args.GetBlocksDirPath(),
395 .notifications = chainman_opts.notifications,
409 this->SetupSnapshot();
430 const int expected_assumed_valid{20};
431 const int last_assumed_valid_idx{111};
432 const int assumed_valid_start_idx = last_assumed_valid_idx - expected_assumed_valid;
443 auto reload_all_block_indexes = [&]() {
450 cs->ClearBlockIndexCandidates();
459 reload_all_block_indexes();
468 if (i < last_assumed_valid_idx && i >= assumed_valid_start_idx) {
471 index->m_chain_tx_count = 0;
477 if (i == (assumed_valid_start_idx - 1)) {
478 validated_tip = index;
481 if (i == last_assumed_valid_idx - 1) {
482 assumed_base = index;
488 return chainman.ActivateExistingSnapshot(*assumed_base->phashBlock));
504 reload_all_block_indexes();
561 this->SetupSnapshot();
571 auto all_chainstates = chainman.
GetAll();
593 BOOST_TEST_MESSAGE(
"Performing Load/Verify/Activate of chainstate");
596 this->LoadVerifyActivateChainstate();
609 "Ensure we can mine blocks on top of the initialized snapshot chainstate");
627 this->SetupSnapshot();
656 auto all_chainstates = chainman.
GetAll();
675 BOOST_TEST_MESSAGE(
"Performing Load/Verify/Activate of chainstate");
679 this->LoadVerifyActivateChainstate();
700 "Ensure we can mine blocks on top of the \"new\" IBD chainstate");
710 auto chainstates = this->SetupSnapshot();
711 Chainstate& validation_chainstate = *std::get<0>(chainstates);
719 return validation_chainstate.
CoinsTip());
736 auto all_chainstates = chainman.
GetAll();
749 BOOST_TEST_MESSAGE(
"Performing Load/Verify/Activate of chainstate");
753 this->LoadVerifyActivateChainstate();
767 "Ensure we can mine blocks on top of the \"new\" IBD chainstate");
776template <
typename Options>
778 const std::vector<const char*>&
args)
780 const auto argv{
Cat({
"ignore"},
args)};
793 auto get_opts = [&](
const std::vector<const char*>&
args) {
798 .notifications = notifications};
802 auto get_valid_opts = [&](
const std::vector<const char*>&
args) {
803 const auto result{get_opts(
args)};
809 BOOST_CHECK(!get_valid_opts({}).assumed_valid_block);
815 std::string assume_valid{
"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"};
819 BOOST_CHECK(!get_opts({
"-assumevalid=01234567890123456789012345678901234567890123456789012345678901234"}));
822 BOOST_CHECK(!get_valid_opts({}).minimum_chain_work);
827 std::string minimum_chainwork{
"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"};
831 BOOST_CHECK(!get_opts({
"-minimumchainwork=01234567890123456789012345678901234567890123456789012345678901234"}));
arith_uint256 UintToArith256(const uint256 &a)
@ BLOCK_VALID_TREE
All parent headers found, difficulty matches, timestamp >= median previous, checkpoint.
const CChainParams & Params()
Return the currently selected parameters.
#define Assert(val)
Identity function.
bool ParseParameters(int argc, const char *const argv[], std::string &error)
fs::path GetDataDirNet() const
Get data directory path with appended network identifier.
Non-refcounted RAII wrapper for FILE*.
The block chain is a tree shaped structure starting with the genesis block at the root,...
uint64_t m_chain_tx_count
(memory only) Number of transactions in the chain up to and including this block.
uint256 GetBlockHash() const
CBlockIndex * Tip() const
Returns the index entry for the tip of this chain, or nullptr if none.
void SetTip(CBlockIndex &block)
Set/initialize a chain with a given tip.
int Height() const
Return the maximal height in the chain.
std::optional< AssumeutxoData > AssumeutxoForHeight(int height) const
CCoinsView that adds a memory cache for transactions to another CCoinsView.
void AddCoin(const COutPoint &outpoint, Coin &&coin, bool possible_overwrite)
Add a coin.
unsigned int GetCacheSize() const
Calculate the size of the cache (in number of transaction outputs)
void SetBestBlock(const uint256 &hashBlock)
bool HaveCoin(const COutPoint &outpoint) const override
Just check whether a given outpoint is unspent.
An outpoint - a combination of a transaction hash and an index n into its vout.
Chainstate stores and provides an API to update our local knowledge of the current best chain.
const CBlockIndex *SnapshotBase() EXCLUSIVE_LOCKS_REQUIRED(std::set< CBlockIndex *, node::CBlockIndexWorkComparator > setBlockIndexCandidates
The base of the snapshot this chainstate was created from.
CChain m_chain
The current chain of blockheaders we consult and build on.
size_t m_coinstip_cache_size_bytes
The cache size of the in-memory coins view.
CCoinsViewCache & CoinsTip() EXCLUSIVE_LOCKS_REQUIRED(
bool LoadChainTip() EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Update the chain tip based on database information, i.e.
size_t m_coinsdb_cache_size_bytes
The cache size of the on-disk coins view.
bool DisconnectTip(BlockValidationState &state, DisconnectedBlockTransactions *disconnectpool) EXCLUSIVE_LOCKS_REQUIRED(cs_main
Disconnect m_chain's tip.
ChainstateRole GetRole() const EXCLUSIVE_LOCKS_REQUIRED(void InitCoinsDB(size_t cache_size_bytes, bool in_memory, bool should_wipe, fs::path leveldb_name="chainstate")
Return the current role of the chainstate.
CoinsCacheSizeState GetCoinsCacheSizeState() EXCLUSIVE_LOCKS_REQUIRED(CoinsCacheSizeState GetCoinsCacheSizeState(size_t max_coins_cache_size_bytes, size_t max_mempool_size_bytes) EXCLUSIVE_LOCKS_REQUIRED(std::string ToString() EXCLUSIVE_LOCKS_REQUIRED(RecursiveMutex * MempoolMutex() const LOCK_RETURNED(m_mempool -> cs)
Dictates whether we need to flush the cache to disk or not.
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
SnapshotCompletionResult MaybeCompleteSnapshotValidation() EXCLUSIVE_LOCKS_REQUIRED(const CBlockIndex *GetSnapshotBaseBlock() const EXCLUSIVE_LOCKS_REQUIRED(Chainstate ActiveChainstate)() const
Once the background validation chainstate has reached the height which is the base of the UTXO snapsh...
size_t m_total_coinstip_cache
The total number of bytes available for us to use across all in-memory coins caches.
RecursiveMutex & GetMutex() const LOCK_RETURNED(
Alias for cs_main.
bool IsSnapshotValidated() const EXCLUSIVE_LOCKS_REQUIRED(
Is there a snapshot in use and has it been fully validated?
CBlockIndex * ActiveTip() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
size_t m_total_coinsdb_cache
The total number of bytes available for us to use across all leveldb coins databases.
int ActiveHeight() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
bool IsSnapshotActive() const
bool LoadBlockIndex() EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Load the block tree and coins database from disk, initializing state if we're running with -reindex.
std::optional< uint256 > SnapshotBlockhash() const
CChain & ActiveChain() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Chainstate &InitializeChainstate(CTxMemPool *mempool) EXCLUSIVE_LOCKS_REQUIRED(std::vector< Chainstate * GetAll)()
Instantiate a new chainstate.
void ResetBlockSequenceCounters() EXCLUSIVE_LOCKS_REQUIRED(
node::BlockManager m_blockman
A single BlockManager instance is shared across each constructed chainstate to avoid duplicating bloc...
CTxOut out
unspent transaction output
uint32_t nHeight
at which height this containing transaction was included in the active block chain
DisconnectedBlockTransactions.
256-bit unsigned big integer.
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
A base class defining functions for notifying about certain kernel events.
Maintains a tree of blocks (stored in m_block_index) which is consulted to determine where the most-w...
CBlockIndex * LookupBlockIndex(const uint256 &hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
void assign(size_type n, const T &val)
static transaction_identifier FromUint256(const uint256 &id)
static const uint256 ZERO
static std::optional< uint256 > FromHex(std::string_view str)
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup)
Test Suite for CuckooCache.
BOOST_AUTO_TEST_SUITE_END()
static const unsigned int MAX_DISCONNECTED_TX_POOL_BYTES
Maximum bytes for transactions to store for processing during reorg.
static bool exists(const path &p)
util::Result< void > ApplyArgsManOptions(const ArgsManager &args, BlockManager::Options &opts)
std::optional< uint256 > ReadSnapshotBaseBlockhash(fs::path chaindir)
std::optional< fs::path > FindSnapshotChainstateDir(const fs::path &data_dir)
Return a path to the snapshot-based chainstate dir, if one exists.
bilingual_str ErrorString(const Result< T > &result)
#define BOOST_CHECK_EQUAL(v1, v2)
#define BOOST_CHECK(expr)
std::shared_ptr< const CTransaction > CTransactionRef
uint64_t ReadCompactSize(Stream &is, bool range_check=true)
Decode a CompactSize-encoded variable-length integer.
std::tuple< Chainstate *, Chainstate * > SetupSnapshot()
ChainstateManager & SimulateNodeRestart()
Testing fixture that pre-creates a 100-block REGTEST-mode block chain.
Testing setup that configures a complete environment.
An options struct for ChainstateManager, more ergonomically referred to as ChainstateManager::Options...
const CChainParams & chainparams
std::unique_ptr< ValidationSignals > validation_signals
Issues calls about blocks and transactions.
std::unique_ptr< ChainstateManager > chainman
std::unique_ptr< node::Warnings > warnings
Manages all the node warnings.
std::function< bool()> shutdown_request
Function to request a shutdown.
std::unique_ptr< KernelNotifications > notifications
Issues blocking calls about sync status, errors and warnings.
util::SignalInterrupt * shutdown_signal
Interrupt object used to track whether node shutdown was requested.
std::atomic< int > exit_status
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
static bool CreateAndActivateUTXOSnapshot(TestingSetup *fixture, F malleation=NoMalleation, bool reset_chainstate=false, bool in_memory_chainstate=false)
Create and activate a UTXO snapshot, optionally providing a function to malleate the snapshot.
#define ASSERT_DEBUG_LOG(message)
consteval auto _(util::TranslatedLiteral str)
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
BOOST_FIXTURE_TEST_CASE(chainstatemanager, TestChain100Setup)
Basic tests for ChainstateManager.
util::Result< Options > SetOptsFromArgs(ArgsManager &args_man, Options opts, const std::vector< const char * > &args)
Helper function to parse args into args_man and return the result of applying them to opts.
V Cat(V v1, V &&v2)
Concatenate two vectors, moving elements.