Bitcoin Core 31.99.0
P2P Digital Currency
validation.cpp
Go to the documentation of this file.
1// Copyright (c) 2020-present The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
6
7#include <coins.h>
9#include <node/blockstorage.h>
10#include <node/mining_types.h>
11#include <test/util/mining.h>
12#include <test/util/script.h>
14#include <test/util/time.h>
15#include <test/util/txmempool.h>
16#include <txmempool.h>
17#include <util/check.h>
18#include <util/time.h>
19#include <validation.h>
20#include <validationinterface.h>
21
22#include <memory>
23#include <utility>
24#include <vector>
25
27
29{
30 m_dirty_blockindex.clear();
31 m_dirty_fileinfo.clear();
32 m_blockfile_info.resize(1);
33}
34
36{
37 struct TestChainstate : public Chainstate {
38 void ResetNextWrite() { m_next_write = NodeClock::time_point::max() - 1s; }
39 };
41 for (const auto& cs : m_chainstates) {
42 static_cast<TestChainstate&>(*cs).ResetNextWrite();
43 }
44}
45
47{
48 m_cached_is_ibd = true;
50}
51
53{
55 m_cached_is_ibd = false;
57}
58
60 const ChainstateRole& role,
62 const std::shared_ptr<const CBlock>& block,
63 const CBlockIndex* pindex)
64{
65 obj.BlockConnected(role, block, pindex);
66}
68{
69 struct TestChainstate : public Chainstate {
70 void CallInvalidBlockFound(CBlockIndex* pindex, const BlockValidationState& state) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
71 {
72 InvalidBlockFound(pindex, state);
73 }
74 };
75
76 static_cast<TestChainstate*>(&ActiveChainstate())->CallInvalidBlockFound(pindex, state);
77}
78
80{
81 struct TestChainstate : public Chainstate {
82 void CallInvalidChainFound(CBlockIndex* pindexNew) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
83 {
84 InvalidChainFound(pindexNew);
85 }
86 };
87
88 static_cast<TestChainstate*>(&ActiveChainstate())->CallInvalidChainFound(pindexNew);
89}
90
92{
93 struct TestChainstate : public Chainstate {
94 CBlockIndex* CallFindMostWorkChain() EXCLUSIVE_LOCKS_REQUIRED(cs_main)
95 {
96 return FindMostWorkChain();
97 }
98 };
99
100 return static_cast<TestChainstate*>(&ActiveChainstate())->CallFindMostWorkChain();
101}
102
104{
105 m_best_invalid = nullptr;
106}
107
108std::vector<std::pair<COutPoint, CAmount>> ResetChainmanAndMempool(TestingSetup& setup)
109{
110 GetFakeNodeClock().set(setup.m_node.chainman->GetParams().GenesisBlock().Time());
111
112 bilingual_str error{};
113 setup.m_node.mempool.reset();
114 setup.m_node.mempool = std::make_unique<CTxMemPool>(MemPoolOptionsForTest(setup.m_node), error);
115 Assert(error.empty());
116
117 setup.m_node.chainman.reset();
118 setup.m_make_chainman();
119 setup.LoadVerifyActivateChainstate();
120
123
124 std::vector<std::pair<COutPoint, CAmount>> mature_coinbase;
125 for (int i = 0; i < 2 * COINBASE_MATURITY; ++i) {
126 COutPoint prevout{MineBlock(setup.m_node, options)};
127 if (i < COINBASE_MATURITY) {
128 LOCK(cs_main);
129 CAmount subsidy{setup.m_node.chainman->ActiveChainstate().CoinsTip().GetCoin(prevout)->out.nValue};
130 mature_coinbase.emplace_back(prevout, subsidy);
131 }
132 }
133 return mature_coinbase;
134}
int64_t CAmount
Amount in satoshis (Can be negative)
Definition: amount.h:12
#define Assert(val)
Identity function.
Definition: check.h:116
The block chain is a tree shaped structure starting with the genesis block at the root,...
Definition: chain.h:94
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: transaction.h:29
Implement this to subscribe to events generated in validation and mempool.
virtual void BlockConnected(const kernel::ChainstateRole &role, const std::shared_ptr< const CBlock > &block, const CBlockIndex *pindex)
Notifies listeners of a block being connected.
Chainstate stores and provides an API to update our local knowledge of the current best chain.
Definition: validation.h:554
bool IsInitialBlockDownload() const noexcept
Check whether we are doing an initial block download (synchronizing from disk or network)
Chainstate & ActiveChainstate() const
Alternatives to CurrentChainstate() used by older code to query latest chainstate information without...
std::atomic_bool m_cached_is_ibd
Whether initial block download (IBD) is ongoing.
Definition: validation.h:1054
void set(NodeSeconds t)
Set mocktime.
Definition: time.h:71
static void BlockConnected(const kernel::ChainstateRole &role, CValidationInterface &obj, const std::shared_ptr< const CBlock > &block, const CBlockIndex *pindex)
Definition: validation.cpp:59
std::set< int > m_dirty_fileinfo
Dirty block file entries.
Definition: blockstorage.h:316
std::set< CBlockIndex * > m_dirty_blockindex
Dirty block index entries.
Definition: blockstorage.h:313
std::vector< CBlockFileInfo > m_blockfile_info
Definition: blockstorage.h:310
static const int COINBASE_MATURITY
Coinbase transaction outputs can only be spent after this number of new blocks (network rule)
Definition: consensus.h:19
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
Definition: cs_main.cpp:8
is used externally by mining IPC clients, so it should only declare simple data definitions.
void CleanupForFuzzing()
Test-only method to clear internal state for fuzzing.
Definition: validation.cpp:28
void ResetBestInvalid() EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Definition: validation.cpp:103
void InvalidChainFound(CBlockIndex *pindexNew) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Definition: validation.cpp:79
CBlockIndex * FindMostWorkChain() EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Definition: validation.cpp:91
void DisableNextWrite()
Disable the next write of all chainstates.
Definition: validation.cpp:35
void InvalidBlockFound(CBlockIndex *pindex, const BlockValidationState &state) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Wrappers that avoid making chainstatemanager internals public for tests.
Definition: validation.cpp:67
void JumpOutOfIbd()
Toggle IsInitialBlockDownload from true to false.
Definition: validation.cpp:52
void ResetIbd()
Reset the ibd cache to its initial state.
Definition: validation.cpp:46
Testing setup that configures a complete environment.
Definition: setup_common.h:115
Bilingual messages:
Definition: translation.h:24
Information about chainstate that notifications are sent from.
Definition: types.h:18
Block template creation options.
Definition: mining_types.h:33
CScript coinbase_output_script
Script to put in the coinbase transaction.
Definition: mining_types.h:86
#define LOCK(cs)
Definition: sync.h:268
COutPoint MineBlock(const NodeContext &node, const node::BlockCreateOptions &assembler_options)
Returns the generated coin.
Definition: mining.cpp:78
static const CScript P2WSH_OP_TRUE
Definition: script.h:13
FakeNodeClock & GetFakeNodeClock()
Definition: time.h:79
CTxMemPool::Options MemPoolOptionsForTest(const NodeContext &node)
Definition: txmempool.cpp:21
std::vector< std::pair< COutPoint, CAmount > > ResetChainmanAndMempool(TestingSetup &setup)
Definition: validation.cpp:108
static int setup(void)
Definition: tests.c:8082
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:49
static bool pool cs
Definition: validation.cpp:409
assert(!tx.IsCoinBase())