Bitcoin Core 32.99.0
P2P Digital Currency
Loading...
Searching...
No Matches
validation.h
Go to the documentation of this file.
1// Copyright (c) 2009-2010 Satoshi Nakamoto
2// Copyright (c) 2009-present The Bitcoin Core developers
3// Distributed under the MIT software license, see the accompanying
4// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6#ifndef BITCOIN_VALIDATION_H
7#define BITCOIN_VALIDATION_H
8
9#include <arith_uint256.h>
10#include <attributes.h>
11#include <chain.h>
12#include <checkqueue.h>
13#include <coins.h>
14#include <consensus/amount.h>
15#include <cuckoocache.h>
16#include <deploymentstatus.h>
17#include <kernel/chain.h>
18#include <kernel/chainparams.h>
20#include <kernel/cs_main.h> // IWYU pragma: export
21#include <node/blockstorage.h>
22#include <policy/feerate.h>
23#include <policy/packages.h>
24#include <policy/policy.h>
25#include <script/script_error.h>
26#include <script/sigcache.h>
27#include <script/verify_flags.h>
28#include <sync.h>
29#include <txdb.h>
30#include <txmempool.h>
31#include <uint256.h>
32#include <util/byte_units.h>
33#include <util/check.h>
34#include <util/fs.h>
35#include <util/hasher.h>
36#include <util/result.h>
37#include <util/time.h>
38#include <util/translation.h>
39#include <versionbits.h>
40
41#include <algorithm>
42#include <atomic>
43#include <cstdint>
44#include <map>
45#include <memory>
46#include <optional>
47#include <set>
48#include <span>
49#include <string>
50#include <type_traits>
51#include <utility>
52#include <vector>
53
54class Chainstate;
55class CTxMemPool;
57struct ChainTxData;
60struct LockPoints;
61struct AssumeutxoData;
62namespace kernel {
63struct ChainstateRole;
64} // namespace kernel
65namespace node {
66class SnapshotMetadata;
67} // namespace node
68namespace Consensus {
69struct Params;
70} // namespace Consensus
71namespace util {
72class SignalInterrupt;
73} // namespace util
74
76inline constexpr unsigned int MIN_BLOCKS_TO_KEEP = 288;
77inline constexpr signed int DEFAULT_CHECKBLOCKS = 6;
78inline constexpr int DEFAULT_CHECKLEVEL{3};
79// Require that user allocate at least 550 MiB for block & undo files (blk???.dat and rev???.dat)
80// At 1MB per block, 288 blocks = 288MB.
81// Add 15% for Undo data = 331MB
82// Add 20% for Orphan block rate = 397MB
83// We want the low water mark after pruning to be at least 397 MB and since we prune in
84// full block file chunks, we need the high water mark which triggers the prune to be
85// one 128MB block file + added 15% undo data = 147MB greater for a total of 545MB
86// Setting the target to >= 550 MiB will make it likely we can respect the target.
88
90inline constexpr int MAX_SCRIPTCHECK_THREADS{15};
91
93inline constexpr int32_t MAX_PREVOUTFETCH_THREADS{16};
94
101
103extern const std::vector<std::string> CHECKLEVEL_DOC;
104
106
107bool FatalError(kernel::Notifications& notifications, BlockValidationState& state, const bilingual_str& message);
108
111
136 enum class ResultType {
137 VALID,
138 INVALID,
141 };
144
147
149 const std::list<CTransactionRef> m_replaced_transactions;
151 const std::optional<int64_t> m_vsize;
153 const std::optional<CAmount> m_base_fees;
159 const std::optional<CFeeRate> m_effective_feerate;
165 const std::optional<std::vector<Wtxid>> m_wtxids_fee_calculations;
166
168 const std::optional<Wtxid> m_other_wtxid;
169
171 return MempoolAcceptResult(state);
172 }
173
179
180 static MempoolAcceptResult Success(std::list<CTransactionRef>&& replaced_txns,
181 int64_t vsize,
184 const std::vector<Wtxid>& wtxids_fee_calculations) {
185 return MempoolAcceptResult(std::move(replaced_txns), vsize, fees,
187 }
188
190 return MempoolAcceptResult(vsize, fees);
191 }
192
196
197// Private constructors. Use static methods MempoolAcceptResult::Success, etc. to construct.
198private:
202 Assume(!state.IsValid()); // Can be invalid or error
203 }
204
217
226
230
234};
235
240{
248 std::map<Wtxid, MempoolAcceptResult> m_tx_results;
249
251 std::map<Wtxid, MempoolAcceptResult>&& results)
252 : m_state{state}, m_tx_results(std::move(results)) {}
253
256 : m_tx_results{ {wtxid, result} } {}
257};
258
276
288 const Package& txns, bool test_accept, const std::optional<CFeeRate>& client_maxfeerate)
290
291/* Mempool validation helper functions */
292
297
316std::optional<LockPoints> CalculateLockPointsAtTip(
318 const CCoinsView& coins_view,
319 const CTransaction& tx);
320
331 const LockPoints& lock_points);
332
359
360// CScriptCheck is used a lot in std::vector, make sure that's efficient
361static_assert(std::is_nothrow_move_assignable_v<CScriptCheck>);
362static_assert(std::is_nothrow_move_constructible_v<CScriptCheck>);
363static_assert(std::is_nothrow_destructible_v<CScriptCheck>);
364
387
391bool CheckBlock(const CBlock& block, BlockValidationState& state, const Consensus::Params& consensusParams, bool fCheckPOW = true, bool fCheckMerkleRoot = true);
392
412 const CBlock& block,
413 bool check_pow,
414 bool check_merkle_root) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
415
417bool HasValidProofOfWork(std::span<const CBlockHeader> headers, const Consensus::Params& consensusParams);
418
420bool IsBlockMutated(const CBlock& block, bool check_witness_root);
421
423arith_uint256 CalculateClaimedHeadersWork(std::span<const CBlockHeader> headers);
424
432
449
451{
452 DISCONNECT_OK, // All good.
453 DISCONNECT_UNCLEAN, // Rolled back, but UTXO set was inconsistent with block.
454 DISCONNECT_FAILED // Something else went wrong.
456
457struct ConnectedBlock;
458
460inline constexpr std::array FlushStateModeNames{"NONE", "IF_NEEDED", "PERIODIC", "FORCE_FLUSH", "FORCE_SYNC"};
462 NONE,
463 IF_NEEDED,
464 PERIODIC,
467};
468
507
509{
511 CRITICAL = 2,
513 LARGE = 1,
514 OK = 0
515};
516
518{
519 // No periodic flush needed if at least this much space is free
521 return std::max((total_space * 9) / 10,
523}
524
526enum class Assumeutxo {
528 VALIDATED,
532 INVALID,
533};
534
550{
551protected:
558
562
564 std::unique_ptr<CoinsViews> m_coins_views;
565
568
573 std::optional<uint256> m_target_blockhash GUARDED_BY(::cs_main);
574
577
579
580public:
584
589
590 explicit Chainstate(
591 CTxMemPool* mempool,
593 ChainstateManager& chainman,
594 std::optional<uint256> from_snapshot_blockhash = std::nullopt);
595
597 fs::path StoragePath() const;
598
604
611 void InitCoinsDB(
612 size_t cache_size_bytes,
613 bool in_memory,
614 bool should_wipe);
615
619
623 {
625 return m_coins_views && m_coins_views->m_cacheview;
626 }
627
631
636
642 const std::optional<uint256> m_from_snapshot_blockhash;
643
646 std::optional<AssumeutxoHash> m_target_utxohash GUARDED_BY(::cs_main);
647
654
675
683
691 std::set<CBlockIndex*, node::CBlockIndexWorkComparator> setBlockIndexCandidates;
692
700
707
710 {
711 return m_mempool;
712 }
713
721
723 void ResetCoinsViews() { m_coins_views.reset(); }
724
727
730
733 bool ResizeCoinsCaches(size_t coinstip_size, size_t coinsdb_size)
735
747 bool FlushStateToDisk(
749 FlushStateMode mode,
750 int nManualPruneHeight = 0);
751
753 void ForceFlushStateToDisk(bool wipe_cache = true);
754
757 void PruneAndFlush();
758
782 std::shared_ptr<const CBlock> pblock = nullptr)
785
786 // Block (dis)connection on a given view:
789 bool ConnectBlock(const CBlock& block, BlockValidationState& state, CBlockIndex* pindex,
791
792 // Apply the effects of a block disconnection on the UTXO set.
794
795 // Manual block validity manipulation:
803
808
811
814
816 bool ReplayBlocks();
817
820
823
825
827
830
833
836
841
845
846 std::string ToString() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
847
850
853 {
854 return m_mempool ? &m_mempool->cs : nullptr;
855 }
856
861
862protected:
863 bool ActivateBestChainStep(BlockValidationState& state, CBlockIndex& index_most_work, const std::shared_ptr<const CBlock>& pblock, bool& fInvalidFound, std::vector<ConnectedBlock>& connected_blocks) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_mempool->cs);
864 bool ConnectTip(
867 std::shared_ptr<const CBlock> block_to_connect,
868 std::vector<ConnectedBlock>& connected_blocks,
870
873
875
878
895
897 void UpdateTip(const CBlockIndex* pindexNew)
899
900 NodeClock::time_point m_next_write{NodeClock::time_point::max()};
902
908
910};
911
913 SUCCESS,
914 SKIPPED,
915
916 // Expected assumeutxo configuration data is not found for the height of the
917 // base block.
919
920 // Failed to generate UTXO statistics (to check UTXO set hash) for the
921 // validated chainstate.
923
924 // The UTXO set hash of the validated chainstate does not match the one
925 // expected by assumeutxo chainparams.
927};
928
950{
951private:
952
955
956 bool NotifyHeaderTip() LOCKS_EXCLUDED(GetMutex());
957
965 [[nodiscard]] util::Result<void> PopulateAndValidateSnapshot(
968 const node::SnapshotMetadata& metadata);
969
977 bool AcceptBlockHeader(
978 const CBlockHeader& block,
983
986
989
992 SteadyClock::duration GUARDED_BY(::cs_main) time_check{};
993 SteadyClock::duration GUARDED_BY(::cs_main) time_forks{};
994 SteadyClock::duration GUARDED_BY(::cs_main) time_connect{};
995 SteadyClock::duration GUARDED_BY(::cs_main) time_verify{};
996 SteadyClock::duration GUARDED_BY(::cs_main) time_undo{};
997 SteadyClock::duration GUARDED_BY(::cs_main) time_index{};
998 SteadyClock::duration GUARDED_BY(::cs_main) time_total{};
1000 SteadyClock::duration GUARDED_BY(::cs_main) time_connect_total{};
1001 SteadyClock::duration GUARDED_BY(::cs_main) time_flush{};
1002 SteadyClock::duration GUARDED_BY(::cs_main) time_chainstate{};
1003 SteadyClock::duration GUARDED_BY(::cs_main) time_post_connect{};
1004
1005protected:
1007
1008public:
1010
1012
1015 std::function<void()> snapshot_download_completed = std::function<void()>();
1016
1017 const CChainParams& GetParams() const { return m_options.chainparams; }
1018 const Consensus::Params& GetConsensus() const { return m_options.chainparams.GetConsensus(); }
1019 bool ShouldCheckBlockIndex() const;
1020 const arith_uint256& MinimumChainWork() const { return *Assert(m_options.minimum_chain_work); }
1021 const uint256& AssumedValidBlock() const { return *Assert(m_options.assumed_valid_block); }
1022 kernel::Notifications& GetNotifications() const { return m_options.notifications; };
1023
1029 void CheckBlockIndex() const;
1030
1042 RecursiveMutex& GetMutex() const LOCK_RETURNED(::cs_main) { return ::cs_main; }
1043
1049
1051 static script_verify_flags GetAllConsensusScriptFlags(const Consensus::Params& params);
1052
1055
1057
1065 std::atomic_bool m_cached_is_ibd{true};
1066
1076 int32_t nBlockReverseSequenceId = -1;
1078 arith_uint256 nLastPreciousChainwork = 0;
1079
1080 // Reset the memory-only sequence counters we use to track block arrival
1081 // (used by tests to reset state)
1083 {
1086 nBlockReverseSequenceId = -1;
1087 }
1088
1089
1095
1098 size_t m_total_coinstip_cache{0};
1099 //
1102 size_t m_total_coinsdb_cache{0};
1103
1105 [[nodiscard]] bool LoadGenesisBlock();
1106
1110 // constructor
1112
1126
1136
1139 {
1140 for (auto& cs : m_chainstates) {
1141 if (cs && cs->m_assumeutxo != Assumeutxo::INVALID && !cs->TargetBlockHash()) return *cs;
1142 }
1143 abort();
1144 }
1145
1148 {
1149 for (auto& cs : m_chainstates) {
1150 if (cs && cs->m_assumeutxo != Assumeutxo::INVALID && cs->TargetBlockHash() && !cs->m_target_utxohash) return cs.get();
1151 }
1152 return nullptr;
1153 }
1154
1159 {
1160 for (auto* cs : {&CurrentChainstate(), HistoricalChainstate()}) {
1161 if (cs && cs->m_assumeutxo == Assumeutxo::VALIDATED) return *cs;
1162 }
1163 abort();
1164 }
1165
1167 std::unique_ptr<Chainstate> RemoveChainstate(Chainstate& chainstate) EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
1168 {
1169 auto it{std::find_if(m_chainstates.begin(), m_chainstates.end(), [&](auto& cs) { return cs.get() == &chainstate; })};
1170 if (it != m_chainstates.end()) {
1171 auto ret{std::move(*it)};
1172 m_chainstates.erase(it);
1173 return ret;
1174 }
1175 return nullptr;
1176 }
1177
1183 Chainstate& ActiveChainstate() const;
1184 CChain& ActiveChain() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex()) { return ActiveChainstate().m_chain; }
1185 int ActiveHeight() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex()) { return ActiveChain().Height(); }
1186 CBlockIndex* ActiveTip() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex()) { return ActiveChain().Tip(); }
1188
1200 void UpdateIBDStatus() EXCLUSIVE_LOCKS_REQUIRED(cs_main);
1201
1202 node::BlockMap& BlockIndex() EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
1203 {
1205 return m_blockman.m_block_index;
1206 }
1207
1212
1214 bool IsInitialBlockDownload() const noexcept;
1215
1220 double GuessVerificationProgress(const CBlockIndex* pindex) const EXCLUSIVE_LOCKS_REQUIRED(GetMutex());
1221
1223 double GetBackgroundVerificationProgress(const CBlockIndex& pindex) const EXCLUSIVE_LOCKS_REQUIRED(GetMutex());
1224
1253 FlatFilePos* dbp = nullptr,
1255
1280 bool ProcessNewBlock(const std::shared_ptr<const CBlock>& block, bool force_processing, bool min_pow_checked, bool* new_block) LOCKS_EXCLUDED(cs_main);
1281
1294 bool ProcessNewBlockHeaders(std::span<const CBlockHeader> headers, bool min_pow_checked, BlockValidationState& state, const CBlockIndex** ppindex = nullptr) LOCKS_EXCLUDED(cs_main);
1295
1315 bool AcceptBlock(const std::shared_ptr<const CBlock>& pblock, BlockValidationState& state, CBlockIndex** ppindex, bool fRequested, const FlatFilePos* dbp, bool* fNewBlock, bool min_pow_checked) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
1316
1317 void ReceivedBlockTransactions(const CBlock& block, CBlockIndex* pindexNew, const FlatFilePos& pos) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
1318
1325 [[nodiscard]] MempoolAcceptResult ProcessTransaction(const CTransactionRef& tx, bool test_accept=false)
1327
1329 bool LoadBlockIndex() EXCLUSIVE_LOCKS_REQUIRED(cs_main);
1330
1334
1340 void UpdateUncommittedBlockStructures(CBlock& block, const CBlockIndex* pindexPrev) const;
1341
1343 void GenerateCoinbaseCommitment(CBlock& block, const CBlockIndex* pindexPrev) const;
1344
1349 void ReportHeadersPresync(int64_t height, int64_t timestamp);
1350
1355
1358
1360
1364
1375
1378
1380 util::Result<void> ActivateBestChains() LOCKS_EXCLUDED(::cs_main);
1381
1386
1389 std::optional<int> BlocksAheadOfTip() const LOCKS_EXCLUDED(::cs_main);
1390
1391 CCheckQueue<CScriptCheck>& GetCheckQueue() { return m_script_check_queue; }
1392
1394
1402 std::vector<std::unique_ptr<Chainstate>> m_chainstates GUARDED_BY(::cs_main);
1403};
1404
1406template<typename DEP>
1408{
1409 return DeploymentActiveAfter(pindexPrev, chainman.GetConsensus(), dep, chainman.m_versionbitscache);
1410}
1411
1412template<typename DEP>
1413bool DeploymentActiveAt(const CBlockIndex& index, const ChainstateManager& chainman, DEP dep)
1414{
1415 return DeploymentActiveAt(index, chainman.GetConsensus(), dep, chainman.m_versionbitscache);
1416}
1417
1418template<typename DEP>
1419bool DeploymentEnabled(const ChainstateManager& chainman, DEP dep)
1420{
1421 return DeploymentEnabled(chainman.GetConsensus(), dep);
1422}
1423
1426
1428bool IsBIP30Unspendable(const uint256& block_hash, int block_height);
1429
1443
1444// Returns the script flags which should be checked for a given block
1445// (a subset of CONSENSUS_SCRIPT_VERIFY_FLAGS)
1447
1455 Block,
1456 Mempool,
1457};
1458
1459bool CheckInputScripts(const CTransaction& tx, TxValidationState& state,
1460 const CCoinsViewCache& inputs,
1463 bool cacheSigStore,
1466 std::vector<CScriptCheck>* pvChecks = nullptr)
1468
1469#endif // BITCOIN_VALIDATION_H
int64_t CAmount
Amount in satoshis (Can be negative)
Definition amount.h:12
int ret
int flags
void InvalidateBlock(ChainstateManager &chainman, const uint256 block_hash)
constexpr int32_t SEQ_ID_INIT_FROM_DISK
Definition chain.h:40
const CChainParams & Params()
Return the currently selected parameters.
#define Assert(val)
Identity function.
Definition check.h:119
#define Assume(val)
Assume is the identity function.
Definition check.h:131
static void CheckBlockIndex(benchmark::Bench &bench)
Non-refcounted RAII wrapper for FILE*.
Definition streams.h:395
Nodes collect new transactions into a block, hash them into a hash tree, and scan through nonce value...
Definition block.h:27
Definition block.h:74
The block chain is a tree shaped structure starting with the genesis block at the root,...
Definition chain.h:94
An in-memory indexed chain of blocks.
Definition chain.h:380
CBlockIndex * Tip() const
Returns the index entry for the tip of this chain, or nullptr if none.
Definition chain.h:396
int Height() const
Return the maximal height in the chain.
Definition chain.h:425
CChainParams defines various tweakable parameters of a given instance of the Bitcoin system.
Definition chainparams.h:77
Queue for verifications that have to be performed.
Definition checkqueue.h:34
CCoinsView that adds a memory cache for transactions to another CCoinsView.
Definition coins.h:437
CCoinsView backed by the coin database (chainstate/)
Definition txdb.h:37
This is a minimally invasive approach to shutdown on LevelDB read errors from the chainstate,...
Definition coins.h:807
Pure abstract view on the open txout dataset.
Definition coins.h:356
Fee rate in satoshis per virtualbyte: CAmount / vB the feerate is represented internally as FeeFrac.
Definition feerate.h:32
A hasher class for SHA-256.
Definition sha256.h:14
Closure representing one script verification Note that this stores references to the spending transac...
Definition validation.h:338
CScriptCheck & operator=(CScriptCheck &&)=default
SignatureCache * m_signature_cache
Definition validation.h:346
CScriptCheck(const CScriptCheck &)=delete
PrecomputedTransactionData * txdata
Definition validation.h:345
CTxOut m_tx_out
Definition validation.h:340
script_verify_flags m_flags
Definition validation.h:343
CScriptCheck(CScriptCheck &&)=default
std::optional< std::pair< ScriptError, std::string > > operator()()
const CTransaction * ptxTo
Definition validation.h:341
unsigned int nIn
Definition validation.h:342
CScriptCheck(const CTxOut &outIn, const CTransaction &txToIn, SignatureCache &signature_cache, unsigned int nInIn, script_verify_flags flags, bool cacheIn, PrecomputedTransactionData *txdataIn)
Definition validation.h:349
CScriptCheck & operator=(const CScriptCheck &)=delete
The basic transaction that is broadcasted on the network and contained in blocks.
CTxMemPool stores valid-according-to-the-current-best-chain transactions that may be included in the ...
Definition txmempool.h:188
An output of a transaction.
RAII wrapper for VerifyDB: Verify consistency of the block and coin databases.
Definition validation.h:435
VerifyDBResult VerifyDB(Chainstate &chainstate, const Consensus::Params &consensus_params, CCoinsView &coinsview, int nCheckLevel, int nCheckDepth) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
kernel::Notifications & m_notifications
Definition validation.h:437
Chainstate stores and provides an API to update our local knowledge of the current best chain.
Definition validation.h:550
void InitCoinsCache(size_t cache_size_bytes) EXCLUSIVE_LOCKS_REQUIRED(bool CanFlushToDisk() const EXCLUSIVE_LOCKS_REQUIRED(
Initialize the in-memory coins cache (to be done after the health of the on-disk database is verified...
Definition validation.h:622
Mutex m_chainstate_mutex
The ChainState Mutex A lock that must be held when modifying this ChainState - held in ActivateBestCh...
Definition validation.h:557
std::optional< uint256 > m_target_blockhash GUARDED_BY(::cs_main)
Target block for this chainstate.
CChain m_chain
The current chain of blockheaders we consult and build on.
Definition validation.h:630
void SetTargetBlock(CBlockIndex *block) EXCLUSIVE_LOCKS_REQUIRED(void SetTargetBlockHash(uint256 block_hash) EXCLUSIVE_LOCKS_REQUIRED(boo ReachedTarget)() const EXCLUSIVE_LOCKS_REQUIRED(
Set target block for this chainstate.
Definition validation.h:677
CTxMemPool * GetMempool()
Definition validation.h:709
bool RollforwardBlock(const CBlockIndex *pindex, CCoinsViewCache &inputs) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Apply the effects of a block on the utxo cache, ignoring that it may already have been applied.
size_t m_coinstip_cache_size_bytes
The cache size of the in-memory coins view.
Definition validation.h:729
void UpdateTip(const CBlockIndex *pindexNew) EXCLUSIVE_LOCKS_REQUIRED(NodeClock::time_poin m_next_write)
Check warning conditions and do some notifications on new chain tip set.
Definition validation.h:900
CCoinsViewCache & CoinsTip() EXCLUSIVE_LOCKS_REQUIRED(
Definition validation.h:694
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.
Definition validation.h:726
bool PreciousBlock(BlockValidationState &state, CBlockIndex *pindex) LOCKS_EXCLUDED(bool InvalidateBlock(BlockValidationState &state, CBlockIndex *pindex) LOCKS_EXCLUDED(void SetBlockFailureFlags(CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(voi ResetBlockFailureFlags)(CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Mark a block as precious and reorganize.
Definition validation.h:813
void InvalidBlockFound(CBlockIndex *pindex, const BlockValidationState &state) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
bool ConnectTip(BlockValidationState &state, CBlockIndex *pindexNew, std::shared_ptr< const CBlock > block_to_connect, std::vector< ConnectedBlock > &connected_blocks, DisconnectedBlockTransactions &disconnectpool) EXCLUSIVE_LOCKS_REQUIRED(cs_main
Connect a new block to m_chain.
void CheckForkWarningConditions() EXCLUSIVE_LOCKS_REQUIRED(cs_main)
kernel::ChainstateRole GetRole() const EXCLUSIVE_LOCKS_REQUIRED(void InitCoinsDB(size_t cache_size_bytes, bool in_memory, bool should_wipe)
Return the current role of the chainstate.
const std::optional< uint256 > m_from_snapshot_blockhash
The blockhash which is the base of the snapshot this chainstate was created from.
Definition validation.h:642
bool ActivateBestChain(BlockValidationState &state, std::shared_ptr< const CBlock > pblock=nullptr) LOCKS_EXCLUDED(DisconnectResult DisconnectBlock(const CBlock &block, const CBlockIndex *pindex, CCoinsViewCache &view) EXCLUSIVE_LOCKS_REQUIRED(boo ConnectBlock)(const CBlock &block, BlockValidationState &state, CBlockIndex *pindex, CCoinsViewCache &view, bool fJustCheck=false) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Find the best known block, and make it the tip of the block chain.
Definition validation.h:789
const CBlockIndex *SnapshotBase() const EXCLUSIVE_LOCKS_REQUIRED(const CBlockIndex *TargetBlock() const EXCLUSIVE_LOCKS_REQUIRED(std::optional< uint256 TargetBlockHash)() const EXCLUSIVE_LOCKS_REQUIRED(
The base of the snapshot this chainstate was created from.
Definition validation.h:663
bool ActivateBestChainStep(BlockValidationState &state, CBlockIndex &index_most_work, const std::shared_ptr< const CBlock > &pblock, bool &fInvalidFound, std::vector< ConnectedBlock > &connected_blocks) EXCLUSIVE_LOCKS_REQUIRED(cs_main
Return the [start, end] (inclusive) of block heights we can prune.
CTxMemPool * m_mempool
Optional mempool that is kept in sync with the chain.
Definition validation.h:561
CCoinsViewDB & CoinsDB() EXCLUSIVE_LOCKS_REQUIRED(
Definition validation.h:702
std::optional< const char * > m_last_script_check_reason_logged GUARDED_BY(::cs_main)
Definition validation.h:578
const CBlockIndex *m_cached_target_block GUARDED_BY(::cs_main)
Cached result of LookupBlockIndex(*m_target_blockhash)
Definition validation.h:576
bool DisconnectTip(BlockValidationState &state, DisconnectedBlockTransactions *disconnectpool) EXCLUSIVE_LOCKS_REQUIRED(cs_main
Disconnect m_chain's tip.
CBlockIndex * FindMostWorkChain() EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Return the tip of the chain with the most work in it, that isn't known to be invalid (it's however fa...
std::set< CBlockIndex *, node::CBlockIndexWorkComparator > setBlockIndexCandidates
The set of all CBlockIndex entries that have as much work as our current tip or more,...
Definition validation.h:691
util::Result< void > InvalidateCoinsDBOnDisk() EXCLUSIVE_LOCKS_REQUIRED(friend ChainstateManager
In case of an invalid snapshot, rename the coins leveldb directory so that it can be examined for iss...
Definition validation.h:907
ChainstateManager & m_chainman
The chainstate manager that owns this chainstate.
Definition validation.h:588
std::unique_ptr< CoinsViews > m_coins_views
Manages the UTXO set, which is a reflection of the contents of m_chain.
Definition validation.h:564
bool m_mempool cs
Definition validation.h:793
bool ReplayBlocks()
Replay blocks that aren't fully applied to the database.
void PruneBlockIndexCandidates()
Delete all entries in setBlockIndexCandidates that are worse than the current tip.
Assumeutxo m_assumeutxo GUARDED_BY(::cs_main)
Assumeutxo state indicating whether all blocks in the chain were validated, or if the chainstate is b...
std::optional< AssumeutxoHash > m_target_utxohash GUARDED_BY(::cs_main)
Hash of the UTXO set at the target block, computed when the chainstate reaches the target block,...
void ResetCoinsViews()
Destructs all objects related to accessing the UTXO set.
Definition validation.h:723
void TryAddBlockIndexCandidate(CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Add a block to the candidate set if it has as much work as the current tip.
void PruneAndFlush()
Prune blockfiles from the disk if necessary and then flush chainstate changes if we pruned.
bool ResizeCoinsCaches(size_t coinstip_size, size_t coinsdb_size) EXCLUSIVE_LOCKS_REQUIRED(bool FlushStateToDisk(BlockValidationState &state, FlushStateMode mode, int nManualPruneHeight=0)
Resize the CoinsViews caches dynamically and flush state to disk.
node::BlockManager & m_blockman
Reference to a BlockManager instance which itself is shared across all Chainstate instances.
Definition validation.h:583
void ForceFlushStateToDisk(bool wipe_cache=true)
Flush all changes to disk.
void MaybeUpdateMempoolForReorg(DisconnectedBlockTransactions &disconnectpool, bool fAddToMempool) EXCLUSIVE_LOCKS_REQUIRED(cs_main
Make mempool consistent after a reorg, by re-adding or recursively erasing disconnected block transac...
const CBlockIndex *m_cached_snapshot_base GUARDED_BY(::cs_main)
Cached result of LookupBlockIndex(*m_from_snapshot_blockhash)
Definition validation.h:567
CCoinsViewErrorCatcher & CoinsErrorCatcher() EXCLUSIVE_LOCKS_REQUIRED(
Definition validation.h:716
void ClearBlockIndexCandidates() EXCLUSIVE_LOCKS_REQUIRED(void PopulateBlockIndexCandidates() EXCLUSIVE_LOCKS_REQUIRED(const CBlockIndex * FindForkInGlobalIndex(const CBlockLocator &locator) const EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Populate the candidate set by calling TryAddBlockIndexCandidate on all valid block indices.
void InvalidChainFound(CBlockIndex *pindexNew) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
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(const CBlockIndex * GetLastFlushedBlock() const EXCLUSIVE_LOCKS_REQUIRED(
Dictates whether we need to flush the cache to disk or not.
Definition validation.h:849
RecursiveMutex * MempoolMutex() const LOCK_RETURNED(m_mempool -> cs)
Indirection necessary to make lock annotations work with an optional mempool.
Definition validation.h:852
const CBlockIndex *m_last_flushed_block GUARDED_BY(::cs_main)
Definition validation.h:901
fs::path StoragePath() const
Return path to chainstate leveldb directory.
bool NeedsRedownload() const EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Whether the chain state needs to be redownloaded due to lack of witness data.
Interface for managing multiple Chainstate objects, where each chainstate is associated with chainsta...
Definition validation.h:950
SteadyClock::duration GUARDED_BY(::cs_main) time_connect_total
Chainstate * HistoricalChainstate() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Return historical chainstate targeting a specific block, if any.
const uint256 & AssumedValidBlock() const
CBlockIndex *m_best_header GUARDED_BY(::cs_main)
Best header we've seen so far for which the block is not known to be invalid (used,...
ValidationCache m_validation_cache
int64_t GUARDED_BY(::cs_main) num_blocks_total
Definition validation.h:999
SteadyClock::duration GUARDED_BY(::cs_main) time_undo
Definition validation.h:996
SteadyClock::duration GUARDED_BY(::cs_main) time_index
Definition validation.h:997
const script_verify_flags m_all_consensus_script_flags
Store the potential consensus script flags for this manager's selected params.
SteadyClock::duration GUARDED_BY(::cs_main) time_post_connect
std::unique_ptr< Chainstate > RemoveChainstate(Chainstate &chainstate) EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Remove a chainstate.
kernel::Notifications & GetNotifications() const
SteadyClock::duration GUARDED_BY(::cs_main) time_check
Timers and counters used for benchmarking validation in both background and active chainstates.
Definition validation.h:992
RecursiveMutex & GetMutex() const LOCK_RETURNED(
Alias for cs_main.
SteadyClock::duration GUARDED_BY(::cs_main) time_total
Definition validation.h:998
SteadyClock::duration GUARDED_BY(::cs_main) time_chainstate
CCheckQueue< CScriptCheck > m_script_check_queue
A queue for script verifications that have to be performed by worker threads.
Definition validation.h:988
CBlockIndex * ActiveTip() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
CBlockIndex *m_best_invalid GUARDED_BY(::cs_main)
SnapshotCompletionResult MaybeValidateSnapshot(Chainstate &validated_cs, Chainstate &unvalidated_cs) EXCLUSIVE_LOCKS_REQUIRED(Chainstate & CurrentChainstate() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Try to validate an assumeutxo snapshot by using a validated historical chainstate targeted at the sna...
SteadyClock::duration GUARDED_BY(::cs_main) time_forks
Definition validation.h:993
CBlockIndex *m_last_notified_header GUARDED_BY(GetMutex())
The last header for which a headerTip notification was issued.
Definition validation.h:954
std::vector< std::unique_ptr< Chainstate > > m_chainstates GUARDED_BY(::cs_main)
List of chainstates.
const util::SignalInterrupt & m_interrupt
int ActiveHeight() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
VersionBitsCache m_versionbitscache
Track versionbit status.
Chainstate & ValidatedChainstate() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Return fully validated chainstate that should be used for indexing, to support indexes that need to i...
const CChainParams & GetParams() const
const Consensus::Params & GetConsensus() const
const arith_uint256 & MinimumChainWork() const
const Options m_options
int32_t nBlockSequenceId GUARDED_BY(::cs_main)
Every received block is assigned a unique and increasing identifier, so we know which one to give pri...
Chainstate &InitializeChainstate(CTxMemPool *mempool) EXCLUSIVE_LOCKS_REQUIRED(util::Result< CBlockIndex * ActivateSnapshot)(AutoFile &coins_file, const node::SnapshotMetadata &metadata, bool in_memory)
Instantiate a new chainstate.
SteadyClock::duration GUARDED_BY(::cs_main) time_verify
Definition validation.h:995
CChain & ActiveChain() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
SteadyClock::duration GUARDED_BY(::cs_main) time_connect
Definition validation.h:994
void ResetBlockSequenceCounters() EXCLUSIVE_LOCKS_REQUIRED(
node::BlockManager m_blockman
A single BlockManager instance is shared across each constructed chainstate to avoid duplicating bloc...
SteadyClock::duration GUARDED_BY(::cs_main) time_flush
A convenience class for constructing the CCoinsView* hierarchy used to facilitate access to the UTXO ...
Definition validation.h:478
std::unique_ptr< CCoinsViewCache > m_cacheview GUARDED_BY(cs_main)
This is the top layer of the cache hierarchy - it keeps as many coins in memory as can fit per the db...
CCoinsViewErrorCatcher m_catcherview GUARDED_BY(cs_main)
This view wraps access to the leveldb instance and handles read errors gracefully.
std::unique_ptr< CoinsViewOverlay > m_connect_block_view GUARDED_BY(cs_main)
Reused CoinsViewOverlay layered on top of m_cacheview and passed to ConnectBlock().
CCoinsViewDB m_dbview GUARDED_BY(cs_main)
The lowest level of the CoinsViews cache hierarchy sits in a leveldb database on disk.
cache implements a cache with properties similar to a cuckoo-set.
DisconnectedBlockTransactions.
Valid signature cache, to avoid doing expensive ECDSA signature checking twice for every transaction ...
Definition sigcache.h:40
Convenience class for initializing and passing the script execution cache and signature cache.
Definition validation.h:370
CuckooCache::cache< uint256, SignatureCacheHasher > m_script_execution_cache
Definition validation.h:376
ValidationCache & operator=(const ValidationCache &)=delete
ValidationCache(const ValidationCache &)=delete
CSHA256 ScriptExecutionCacheHasher() const
Return a copy of the pre-initialized hasher.
Definition validation.h:385
CSHA256 m_script_execution_cache_hasher
Pre-initialized hasher to avoid having to recreate it for every hash calculation.
Definition validation.h:373
SignatureCache m_signature_cache
Definition validation.h:377
bool IsValid() const
Definition validation.h:112
BIP 9 allows multiple softforks to be deployed in parallel.
Definition versionbits.h:78
256-bit unsigned big integer.
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...
Metadata describing a serialized version of a UTXO set from which an assumeutxo Chainstate can be con...
256-bit opaque blob.
Definition uint256.h:196
Helper class that manages an interrupt flag, and allows a thread or signal to interrupt another threa...
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
Definition cs_main.cpp:8
HTTPHeaders headers
constexpr script_verify_flags SCRIPT_VERIFY_NONE
Script verification flags.
Definition interpreter.h:48
static void LoadExternalBlockFile(benchmark::Bench &bench)
The LoadExternalBlockFile() function is used during -reindex and -loadblock.
unsigned int nHeight
Transaction validation functions.
std::vector< CTransactionRef > Package
A package is an ordered list of transactions.
Definition packages.h:45
std::shared_ptr< const CTransaction > CTransactionRef
Holds configuration for use during UTXO snapshot load and validation.
Definition chainparams.h:34
Describes a place in the block chain to another node such that if the other node doesn't have the sam...
Definition block.h:117
Holds various statistics on transactions within a chain.
Definition chainparams.h:57
User-controlled performance and debug options.
Definition txdb.h:28
Parameters that influence chain consensus.
Definition params.h:88
Application-specific storage settings.
Definition dbwrapper.h:43
Validation result for a transaction evaluated by MemPoolAccept (single or package).
Definition validation.h:134
const std::optional< int64_t > m_vsize
Virtual size as used by the mempool, calculated using serialized size and sigops.
Definition validation.h:151
const ResultType m_result_type
Result type.
Definition validation.h:143
MempoolAcceptResult(int64_t vsize, CAmount fees)
Constructor for already-in-mempool case.
Definition validation.h:228
const std::optional< CAmount > m_base_fees
Raw base fees in satoshis.
Definition validation.h:153
MempoolAcceptResult(TxValidationState state)
Constructor for failure case.
Definition validation.h:200
const TxValidationState m_state
Contains information about why the transaction failed.
Definition validation.h:146
ResultType
Used to indicate the results of mempool validation.
Definition validation.h:136
@ DIFFERENT_WITNESS
‍Valid, transaction was already in the mempool.
@ INVALID
‍Fully validated, valid.
static MempoolAcceptResult Failure(TxValidationState state)
Definition validation.h:170
static MempoolAcceptResult FeeFailure(TxValidationState state, CFeeRate effective_feerate, const std::vector< Wtxid > &wtxids_fee_calculations)
Definition validation.h:174
const std::optional< CFeeRate > m_effective_feerate
The feerate at which this transaction was considered.
Definition validation.h:159
MempoolAcceptResult(std::list< CTransactionRef > &&replaced_txns, int64_t vsize, CAmount fees, CFeeRate effective_feerate, const std::vector< Wtxid > &wtxids_fee_calculations)
Constructor for success case.
Definition validation.h:206
const std::optional< Wtxid > m_other_wtxid
The wtxid of the transaction in the mempool which has the same txid but different witness.
Definition validation.h:168
const std::list< CTransactionRef > m_replaced_transactions
Mempool transactions replaced by the tx.
Definition validation.h:149
MempoolAcceptResult(const Wtxid &other_wtxid)
Constructor for witness-swapped case.
Definition validation.h:232
static MempoolAcceptResult MempoolTxDifferentWitness(const Wtxid &other_wtxid)
Definition validation.h:193
static MempoolAcceptResult MempoolTx(int64_t vsize, CAmount fees)
Definition validation.h:189
static MempoolAcceptResult Success(std::list< CTransactionRef > &&replaced_txns, int64_t vsize, CAmount fees, CFeeRate effective_feerate, const std::vector< Wtxid > &wtxids_fee_calculations)
Definition validation.h:180
MempoolAcceptResult(TxValidationState state, CFeeRate effective_feerate, const std::vector< Wtxid > &wtxids_fee_calculations)
Constructor for fee-related failure case.
Definition validation.h:219
const std::optional< std::vector< Wtxid > > m_wtxids_fee_calculations
Contains the wtxids of the transactions used for fee-related checks.
Definition validation.h:165
Version of SteadyClock that is mockable in the context of tests (via FakeSteadyClock,...
Definition time.h:47
Version of the system clock that is mockable in the context of tests (via FakeNodeClock or SetMockTim...
Definition time.h:27
Validation result for package mempool acceptance.
Definition validation.h:240
PackageValidationState m_state
Definition validation.h:241
PackageMempoolAcceptResult(const Wtxid &wtxid, const MempoolAcceptResult &result)
Constructor to create a PackageMempoolAcceptResult from a single MempoolAcceptResult.
Definition validation.h:255
PackageMempoolAcceptResult(PackageValidationState state, std::map< Wtxid, MempoolAcceptResult > &&results)
Definition validation.h:250
std::map< Wtxid, MempoolAcceptResult > m_tx_results
Map from wtxid to finished MempoolAcceptResults.
Definition validation.h:248
Bilingual messages:
Definition translation.h:24
An options struct for BlockManager, more ergonomically referred to as BlockManager::Options due to th...
An options struct for ChainstateManager, more ergonomically referred to as ChainstateManager::Options...
Information about chainstate that notifications are sent from.
Definition types.h:18
#define AssertLockHeld(cs)
Definition sync.h:144
#define EXCLUSIVE_LOCKS_REQUIRED(...)
#define GUARDED_BY(x)
#define LOCKS_EXCLUDED(...)
#define LOCK_RETURNED(x)
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.
Definition time.h:82
bool CheckFinalTxAtTip(const CBlockIndex &active_chain_tip, const CTransaction &tx)
assert(!tx.IsCoinBase())
bool IsBlockMutated(const CBlock &block, bool check_witness_root)
Check if a block has been mutated (with respect to its merkle root and witness commitments).
constexpr signed int DEFAULT_CHECKBLOCKS
Definition validation.h:77
script_verify_flags GetBlockScriptFlags(const CBlockIndex &block_index, const ChainstateManager &chainman)
constexpr int MAX_SCRIPTCHECK_THREADS
Maximum number of dedicated script-checking threads allowed.
Definition validation.h:90
constexpr int DEFAULT_CHECKLEVEL
Definition validation.h:78
CAmount GetBlockSubsidy(int nHeight, const Consensus::Params &consensusParams)
bool HasValidProofOfWork(std::span< const CBlockHeader > headers, const Consensus::Params &consensusParams)
Check that the proof of work on each blockheader matches the value in nBits.
bool CheckSequenceLocksAtTip(CBlockIndex *tip, const LockPoints &lock_points)
Check if transaction will be BIP68 final in the next block to be created on top of tip.
bool FatalError(kernel::Notifications &notifications, BlockValidationState &state, const bilingual_str &message)
MempoolAcceptResult AcceptToMemoryPool(Chainstate &active_chainstate, const CTransactionRef &tx, int64_t accept_time, bool bypass_limits, bool test_accept) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Try to add a transaction to the mempool.
bool DeploymentActiveAfter(const CBlockIndex *pindexPrev, const ChainstateManager &chainman, DEP dep)
Deployment* info via ChainstateManager.
BlockValidationState TestBlockValidity(Chainstate &chainstate, const CBlock &block, bool check_pow, bool check_merkle_root) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Verify a block, including transactions.
SnapshotCompletionResult
Definition validation.h:912
bool DeploymentEnabled(const ChainstateManager &chainman, DEP dep)
Assumeutxo
Chainstate assumeutxo validity.
Definition validation.h:526
@ VALIDATED
Every block in the chain has been validated.
@ UNVALIDATED
Blocks after an assumeutxo snapshot have been validated but the snapshot itself has not been validate...
@ INVALID
The assumeutxo snapshot failed validation.
SynchronizationState
Current sync state passed to tip changed callbacks.
Definition validation.h:96
constexpr std::array FlushStateModeNames
Definition validation.h:460
bool CheckFinalTxAtTip(const CBlockIndex &active_chain_tip, const CTransaction &tx) EXCLUSIVE_LOCKS_REQUIRED(std::optional< LockPoints > CalculateLockPointsAtTip(CBlockIndex *tip, const CCoinsView &coins_view, const CTransaction &tx)
Check if transaction will be final in the next block to be created.
Definition validation.h:316
PackageMempoolAcceptResult ProcessNewPackage(Chainstate &active_chainstate, CTxMemPool &pool, const Package &txns, bool test_accept, const std::optional< CFeeRate > &client_maxfeerate) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Validate (and maybe submit) a package to the mempool.
constexpr int64_t LargeCoinsCacheThreshold(int64_t total_space) noexcept
Definition validation.h:517
arith_uint256 CalculateClaimedHeadersWork(std::span< const CBlockHeader > headers)
Return the sum of the claimed work on a given set of headers.
constexpr uint64_t MIN_DISK_SPACE_FOR_BLOCK_FILES
Definition validation.h:87
VerifyDBResult
Definition validation.h:425
constexpr script_verify_flags CONSENSUS_SCRIPT_VERIFY_FLAGS
Set of script verify flags that may be enforced at the consensus level (for some combination of chain...
constexpr int32_t MAX_PREVOUTFETCH_THREADS
Maximum number of dedicated threads allowed for prefetching block input prevouts.
Definition validation.h:93
bool CheckBlock(const CBlock &block, BlockValidationState &state, const Consensus::Params &consensusParams, bool fCheckPOW=true, bool fCheckMerkleRoot=true)
Functions for validating blocks and updating the block tree.
CheckInputScriptsFor
The context CheckInputScripts is called in, which decides how a script failure is reported: as a cons...
const std::vector< std::string > CHECKLEVEL_DOC
Documentation for argument 'checklevel'.
void PruneBlockFilesManual(Chainstate &active_chainstate, int nManualPruneHeight)
Prune block files up to a given height.
FlushStateMode
Definition validation.h:461
CoinsCacheSizeState
Definition validation.h:509
@ LARGE
The cache is at >= 90% capacity.
@ CRITICAL
The coins cache is in immediate need of a flush.
constexpr unsigned int MIN_BLOCKS_TO_KEEP
Block files containing a block-height within MIN_BLOCKS_TO_KEEP of ActiveChain().Tip() will not be pr...
Definition validation.h:76
bool DeploymentActiveAt(const CBlockIndex &index, const ChainstateManager &chainman, DEP dep)
bool IsBIP30Repeat(const CBlockIndex &block_index)
Identifies blocks that overwrote an existing coinbase output in the UTXO set (see BIP30)
bool CheckInputScripts(const CTransaction &tx, TxValidationState &state, const CCoinsViewCache &inputs, script_verify_flags flags, CheckInputScriptsFor check_for, bool cacheSigStore, bool cacheFullScriptStore, PrecomputedTransactionData &txdata, ValidationCache &validation_cache, std::vector< CScriptCheck > *pvChecks=nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Check whether all of this transaction's input scripts succeed.
DisconnectResult
Definition validation.h:451
@ DISCONNECT_FAILED
Definition validation.h:454
@ DISCONNECT_UNCLEAN
Definition validation.h:453
@ DISCONNECT_OK
Definition validation.h:452
bool IsBIP30Unspendable(const uint256 &block_hash, int block_height)
Identifies blocks which coinbase output was subsequently overwritten in the UTXO set (see BIP30)