Bitcoin Core 32.1.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 {
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.
87inline constexpr uint64_t MIN_DISK_SPACE_FOR_BLOCK_FILES{550_MiB};
88
90inline constexpr int MAX_SCRIPTCHECK_THREADS{15};
91
93inline constexpr int32_t MAX_PREVOUTFETCH_THREADS{16};
94
97 INIT_REINDEX,
98 INIT_DOWNLOAD,
99 POST_INIT
100};
101
103extern const std::vector<std::string> CHECKLEVEL_DOC;
104
105CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams);
106
107bool FatalError(kernel::Notifications& notifications, BlockValidationState& state, const bilingual_str& message);
108
110void PruneBlockFilesManual(Chainstate& active_chainstate, int nManualPruneHeight);
111
136 enum class ResultType {
137 VALID,
138 INVALID,
139 MEMPOOL_ENTRY,
140 DIFFERENT_WITNESS,
141 };
142
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
175 CFeeRate effective_feerate,
176 const std::vector<Wtxid>& wtxids_fee_calculations) {
177 return MempoolAcceptResult(state, effective_feerate, wtxids_fee_calculations);
178 }
179
180 static MempoolAcceptResult Success(std::list<CTransactionRef>&& replaced_txns,
181 int64_t vsize,
182 CAmount fees,
183 CFeeRate effective_feerate,
184 const std::vector<Wtxid>& wtxids_fee_calculations) {
185 return MempoolAcceptResult(std::move(replaced_txns), vsize, fees,
186 effective_feerate, wtxids_fee_calculations);
187 }
188
189 static MempoolAcceptResult MempoolTx(int64_t vsize, CAmount fees) {
190 return MempoolAcceptResult(vsize, fees);
191 }
192
194 return MempoolAcceptResult(other_wtxid);
195 }
196
197// Private constructors. Use static methods MempoolAcceptResult::Success, etc. to construct.
198private:
201 : m_result_type(ResultType::INVALID), m_state(state) {
202 Assume(!state.IsValid()); // Can be invalid or error
203 }
204
206 explicit MempoolAcceptResult(std::list<CTransactionRef>&& replaced_txns,
207 int64_t vsize,
208 CAmount fees,
209 CFeeRate effective_feerate,
210 const std::vector<Wtxid>& wtxids_fee_calculations)
211 : m_result_type(ResultType::VALID),
212 m_replaced_transactions(std::move(replaced_txns)),
213 m_vsize{vsize},
214 m_base_fees(fees),
215 m_effective_feerate(effective_feerate),
216 m_wtxids_fee_calculations(wtxids_fee_calculations) {}
217
220 CFeeRate effective_feerate,
221 const std::vector<Wtxid>& wtxids_fee_calculations)
222 : m_result_type(ResultType::INVALID),
223 m_state(state),
224 m_effective_feerate(effective_feerate),
225 m_wtxids_fee_calculations(wtxids_fee_calculations) {}
226
228 explicit MempoolAcceptResult(int64_t vsize, CAmount fees)
229 : m_result_type(ResultType::MEMPOOL_ENTRY), m_vsize{vsize}, m_base_fees(fees) {}
230
232 explicit MempoolAcceptResult(const Wtxid& other_wtxid)
233 : m_result_type(ResultType::DIFFERENT_WITNESS), m_other_wtxid(other_wtxid) {}
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
255 explicit PackageMempoolAcceptResult(const Wtxid& wtxid, const MempoolAcceptResult& result)
256 : m_tx_results{ {wtxid, result} } {}
257};
258
274 int64_t accept_time, bool bypass_limits, bool test_accept)
276
288 const Package& txns, bool test_accept, const std::optional<CFeeRate>& client_maxfeerate)
290
291/* Mempool validation helper functions */
292
296bool CheckFinalTxAtTip(const CBlockIndex& active_chain_tip, const CTransaction& tx) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
297
316std::optional<LockPoints> CalculateLockPointsAtTip(
317 CBlockIndex* tip,
318 const CCoinsView& coins_view,
319 const CTransaction& tx);
320
331 const LockPoints& lock_points);
332
338{
339private:
342 unsigned int nIn;
347
348public:
349 CScriptCheck(const CTxOut& outIn, const CTransaction& txToIn, SignatureCache& signature_cache, unsigned int nInIn, script_verify_flags flags, bool cacheIn, PrecomputedTransactionData* txdataIn) :
350 m_tx_out(outIn), ptxTo(&txToIn), nIn(nInIn), m_flags(flags), cacheStore(cacheIn), txdata(txdataIn), m_signature_cache(&signature_cache) { }
351
352 CScriptCheck(const CScriptCheck&) = delete;
356
357 std::optional<std::pair<ScriptError, std::string>> operator()();
358};
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
389
391bool CheckBlock(const CBlock& block, BlockValidationState& state, const Consensus::Params& consensusParams, bool fCheckPOW = true, bool fCheckMerkleRoot = true);
392
411 Chainstate& chainstate,
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
435{
436private:
438
439public:
440 explicit CVerifyDB(kernel::Notifications& notifications);
441 ~CVerifyDB();
442 [[nodiscard]] VerifyDBResult VerifyDB(
443 Chainstate& chainstate,
444 const Consensus::Params& consensus_params,
445 CCoinsView& coinsview,
446 int nCheckLevel,
447 int nCheckDepth) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
448};
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.
455};
456
457struct ConnectedBlock;
458
460inline constexpr std::array FlushStateModeNames{"NONE", "IF_NEEDED", "PERIODIC", "FORCE_FLUSH", "FORCE_SYNC"};
461enum class FlushStateMode: uint8_t {
462 NONE,
464 PERIODIC,
467};
468
479
480public:
484
487
490 std::unique_ptr<CCoinsViewCache> m_cacheview GUARDED_BY(cs_main);
491
494 std::unique_ptr<CoinsViewOverlay> m_connect_block_view GUARDED_BY(cs_main);
495
502 CoinsViews(DBParams db_params, CoinsViewOptions options);
503
505 void InitCache(int32_t prevoutfetch_threads) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
506};
507
509{
513 LARGE = 1,
514 OK = 0
515};
516
517constexpr int64_t LargeCoinsCacheThreshold(int64_t total_space) noexcept
518{
519 // No periodic flush needed if at least this much space is free
520 constexpr int64_t MAX_BLOCK_COINSDB_USAGE_BYTES{int64_t(10_MiB)};
521 return std::max((total_space * 9) / 10,
522 total_space - MAX_BLOCK_COINSDB_USAGE_BYTES);
523}
524
526enum class Assumeutxo {
532 INVALID,
533};
534
550{
551protected:
558
562
564 std::unique_ptr<CoinsViews> m_coins_views;
565
567 mutable const CBlockIndex* m_cached_snapshot_base GUARDED_BY(::cs_main){nullptr};
568
573 std::optional<uint256> m_target_blockhash GUARDED_BY(::cs_main);
574
576 mutable const CBlockIndex* m_cached_target_block GUARDED_BY(::cs_main){nullptr};
577
578 std::optional<const char*> m_last_script_check_reason_logged GUARDED_BY(::cs_main){};
579
580public:
584
589
590 explicit Chainstate(
591 CTxMemPool* mempool,
592 node::BlockManager& blockman,
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
618 void InitCoinsCache(size_t cache_size_bytes) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
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
653 const CBlockIndex* SnapshotBase() const EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
654
659 const CBlockIndex* TargetBlock() const EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
664 {
666 return m_target_blockhash;
667 }
668
671 void SetTargetBlock(CBlockIndex* block) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
674 void SetTargetBlockHash(uint256 block_hash) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
675
678 {
679 const CBlockIndex* target_block{TargetBlock()};
680 assert(!target_block || target_block->GetAncestor(m_chain.Height()) == m_chain.Tip());
681 return target_block && target_block == m_chain.Tip();
682 }
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
780 bool ActivateBestChain(
782 std::shared_ptr<const CBlock> pblock = nullptr)
785
786 // Block (dis)connection on a given view:
787 DisconnectResult DisconnectBlock(const CBlock& block, const CBlockIndex* pindex, CCoinsViewCache& view)
789 bool ConnectBlock(const CBlock& block, BlockValidationState& state, CBlockIndex* pindex,
790 CCoinsViewCache& view, bool fJustCheck = false) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
791
792 // Apply the effects of a block disconnection on the UTXO set.
794
795 // Manual block validity manipulation:
800 bool PreciousBlock(BlockValidationState& state, CBlockIndex* pindex)
803
808
810 void SetBlockFailureFlags(CBlockIndex* pindex) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
811
814
816 bool ReplayBlocks();
817
819 [[nodiscard]] bool NeedsRedownload() const EXCLUSIVE_LOCKS_REQUIRED(cs_main);
820
823
825
826 void ClearBlockIndexCandidates() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
827
829 void PopulateBlockIndexCandidates() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
830
833
836
840 CoinsCacheSizeState GetCoinsCacheSizeState() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
841
842 CoinsCacheSizeState GetCoinsCacheSizeState(
843 size_t max_coins_cache_size_bytes,
844 size_t max_mempool_size_bytes) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
845
847
849 const CBlockIndex* GetLastFlushedBlock() const EXCLUSIVE_LOCKS_REQUIRED(::cs_main) { return m_last_flushed_block; }
850
853 {
854 return m_mempool ? &m_mempool->cs : nullptr;
855 }
856
860 std::pair<int, int> GetPruneRange(int last_height_can_prune) const EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
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(
866 CBlockIndex* pindexNew,
867 std::shared_ptr<const CBlock> block_to_connect,
868 std::vector<ConnectedBlock>& connected_blocks,
870
873
875
878
893 DisconnectedBlockTransactions& disconnectpool,
895
897 void UpdateTip(const CBlockIndex* pindexNew)
899
900 NodeClock::time_point m_next_write{NodeClock::time_point::max()};
901 const CBlockIndex* m_last_flushed_block GUARDED_BY(::cs_main){nullptr};
902
907 [[nodiscard]] util::Result<void> InvalidateCoinsDBOnDisk() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
908
910};
911
913 SUCCESS,
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
954 CBlockIndex* m_last_notified_header GUARDED_BY(GetMutex()){nullptr};
955
956 bool NotifyHeaderTip() LOCKS_EXCLUDED(GetMutex());
957
965 [[nodiscard]] util::Result<void> PopulateAndValidateSnapshot(
966 Chainstate& snapshot_chainstate,
967 AutoFile& coins_file,
968 const node::SnapshotMetadata& metadata);
969
977 bool AcceptBlockHeader(
978 const CBlockHeader& block,
980 CBlockIndex** ppindex,
981 bool min_pow_checked) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
983
985 MockableSteadyClock::time_point m_last_presync_update GUARDED_BY(GetMutex()){};
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{};
999 int64_t GUARDED_BY(::cs_main) num_blocks_total{0};
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:
1006 CBlockIndex* m_best_invalid GUARDED_BY(::cs_main){nullptr};
1007
1008public:
1010
1011 explicit ChainstateManager(const util::SignalInterrupt& interrupt, Options options, node::BlockManager::Options blockman_options);
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
1059 std::atomic_bool m_cached_is_ibd{true};
1060
1068 int32_t nBlockSequenceId GUARDED_BY(::cs_main) = SEQ_ID_INIT_FROM_DISK + 1;
1073
1074 // Reset the memory-only sequence counters we use to track block arrival
1075 // (used by tests to reset state)
1082
1083
1088 CBlockIndex* m_best_header GUARDED_BY(::cs_main){nullptr};
1089
1093 //
1097
1099 [[nodiscard]] bool LoadGenesisBlock();
1100
1104 // constructor
1105 Chainstate& InitializeChainstate(CTxMemPool* mempool) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1106
1119 AutoFile& coins_file, const node::SnapshotMetadata& metadata, bool in_memory);
1120
1129 SnapshotCompletionResult MaybeValidateSnapshot(Chainstate& validated_cs, Chainstate& unvalidated_cs) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1130
1133 {
1134 for (auto& cs : m_chainstates) {
1135 if (cs && cs->m_assumeutxo != Assumeutxo::INVALID && !cs->TargetBlockHash()) return *cs;
1136 }
1137 abort();
1138 }
1139
1142 {
1143 for (auto& cs : m_chainstates) {
1144 if (cs && cs->m_assumeutxo != Assumeutxo::INVALID && cs->TargetBlockHash() && !cs->m_target_utxohash) return cs.get();
1145 }
1146 return nullptr;
1147 }
1148
1153 {
1154 for (auto* cs : {&CurrentChainstate(), HistoricalChainstate()}) {
1155 if (cs && cs->m_assumeutxo == Assumeutxo::VALIDATED) return *cs;
1156 }
1157 abort();
1158 }
1159
1161 std::unique_ptr<Chainstate> RemoveChainstate(Chainstate& chainstate) EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
1162 {
1163 auto it{std::find_if(m_chainstates.begin(), m_chainstates.end(), [&](auto& cs) { return cs.get() == &chainstate; })};
1164 if (it != m_chainstates.end()) {
1165 auto ret{std::move(*it)};
1166 m_chainstates.erase(it);
1167 return ret;
1168 }
1169 return nullptr;
1170 }
1171
1177 Chainstate& ActiveChainstate() const;
1179 int ActiveHeight() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex()) { return ActiveChain().Height(); }
1182
1194 void UpdateIBDStatus() EXCLUSIVE_LOCKS_REQUIRED(cs_main);
1195
1197 {
1199 return m_blockman.m_block_index;
1200 }
1201
1206
1208 bool IsInitialBlockDownload() const noexcept;
1209
1215
1218
1246 AutoFile& file_in,
1247 FlatFilePos* dbp = nullptr,
1248 std::multimap<uint256, FlatFilePos>* blocks_with_unknown_parent = nullptr);
1249
1274 bool ProcessNewBlock(const std::shared_ptr<const CBlock>& block, bool force_processing, bool min_pow_checked, bool* new_block) LOCKS_EXCLUDED(cs_main);
1275
1288 bool ProcessNewBlockHeaders(std::span<const CBlockHeader> headers, bool min_pow_checked, BlockValidationState& state, const CBlockIndex** ppindex = nullptr) LOCKS_EXCLUDED(cs_main);
1289
1309 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);
1310
1311 void ReceivedBlockTransactions(const CBlock& block, CBlockIndex* pindexNew, const FlatFilePos& pos) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
1312
1319 [[nodiscard]] MempoolAcceptResult ProcessTransaction(const CTransactionRef& tx, bool test_accept=false)
1321
1324
1327 void MaybeRebalanceCaches() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1328
1334 void UpdateUncommittedBlockStructures(CBlock& block, const CBlockIndex* pindexPrev) const;
1335
1337 void GenerateCoinbaseCommitment(CBlock& block, const CBlockIndex* pindexPrev) const;
1338
1343 void ReportHeadersPresync(int64_t height, int64_t timestamp);
1344
1348 Chainstate* LoadAssumeutxoChainstate() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1349
1351 Chainstate& AddChainstate(std::unique_ptr<Chainstate> chainstate) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1352
1353 void ResetChainstates() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1354
1357 [[nodiscard]] bool DeleteChainstate(Chainstate& chainstate) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1358
1368 bool ValidatedSnapshotCleanup(Chainstate& validated_cs, Chainstate& unvalidated_cs) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1369
1371 std::optional<std::pair<const CBlockIndex*, const CBlockIndex*>> GetHistoricalBlockRange() const EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1372
1374 util::Result<void> ActivateBestChains() LOCKS_EXCLUDED(::cs_main);
1375
1379 void RecalculateBestHeader() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1380
1383 std::optional<int> BlocksAheadOfTip() const LOCKS_EXCLUDED(::cs_main);
1384
1386
1388
1396 std::vector<std::unique_ptr<Chainstate>> m_chainstates GUARDED_BY(::cs_main);
1397};
1398
1400template<typename DEP>
1401bool DeploymentActiveAfter(const CBlockIndex* pindexPrev, const ChainstateManager& chainman, DEP dep)
1402{
1403 return DeploymentActiveAfter(pindexPrev, chainman.GetConsensus(), dep, chainman.m_versionbitscache);
1404}
1405
1406template<typename DEP>
1407bool DeploymentActiveAt(const CBlockIndex& index, const ChainstateManager& chainman, DEP dep)
1408{
1409 return DeploymentActiveAt(index, chainman.GetConsensus(), dep, chainman.m_versionbitscache);
1410}
1411
1412template<typename DEP>
1413bool DeploymentEnabled(const ChainstateManager& chainman, DEP dep)
1414{
1415 return DeploymentEnabled(chainman.GetConsensus(), dep);
1416}
1417
1419bool IsBIP30Repeat(const CBlockIndex& block_index);
1420
1422bool IsBIP30Unspendable(const uint256& block_hash, int block_height);
1423
1424// Returns the script flags which should be checked for a given block
1425script_verify_flags GetBlockScriptFlags(const CBlockIndex& block_index, const ChainstateManager& chainman);
1426
1427#endif // BITCOIN_VALIDATION_H
int64_t CAmount
Amount in satoshis (Can be negative).
Definition amount.h:12
static void pool cs
int ret
std::string ToString(const T &t)
Locale-independent version of std::to_string.
Definition string.h:250
void InvalidateBlock(ChainstateManager &chainman, const uint256 block_hash)
constexpr int32_t SEQ_ID_INIT_FROM_DISK
Definition chain.h:40
#define Assert(val)
Identity function.
Definition check.h:116
#define Assume(val)
Assume is the identity function.
Definition check.h:128
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
CBlockIndex * GetAncestor(int height)
Efficiently find an ancestor of this block.
Definition chain.cpp:109
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:808
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:187
An output of a transaction.
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
CVerifyDB(kernel::Notifications &notifications)
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(
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)
CChain m_chain
Definition validation.h:630
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
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
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)
Initialize the CoinsViews UTXO set database management data structures.
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 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
Try to make some progress towards making index_most_work the active block.
CTxMemPool * m_mempool
Definition validation.h:561
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(bool 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
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
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
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
Definition validation.h:588
void SetTargetBlock(CBlockIndex *block) EXCLUSIVE_LOCKS_REQUIRED(void SetTargetBlockHash(uint256 block_hash) EXCLUSIVE_LOCKS_REQUIRED(bool ReachedTarget() const EXCLUSIVE_LOCKS_REQUIRED(
Return true if chainstate reached target block.
Definition validation.h:677
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
void UpdateTip(const CBlockIndex *pindexNew) EXCLUSIVE_LOCKS_REQUIRED(NodeClock::time_point m_next_write
Check warning conditions and do some notifications on new chain tip set.
Definition validation.h:900
bool ReplayBlocks()
Replay blocks that aren't fully applied to the database.
bool PreciousBlock(BlockValidationState &state, CBlockIndex *pindex) LOCKS_EXCLUDED(bool InvalidateBlock(BlockValidationState &state, CBlockIndex *pindex) LOCKS_EXCLUDED(void SetBlockFailureFlags(CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(void ResetBlockFailureFlags(CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Mark a block as precious and reorganize.
Definition validation.h:813
void PruneBlockIndexCandidates()
Delete all entries in setBlockIndexCandidates that are worse than the current tip.
Assumeutxo m_assumeutxo GUARDED_BY(::cs_main)
std::optional< AssumeutxoHash > m_target_utxohash GUARDED_BY(::cs_main)
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()
bool ResizeCoinsCaches(size_t coinstip_size, size_t coinsdb_size) EXCLUSIVE_LOCKS_REQUIRED(bool FlushStateToDisk(BlockValidationState &state, FlushStateMode mode, int nManualPruneHeight=0)
Update the on-disk chain state.
node::BlockManager & m_blockman
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)
Chainstate(CTxMemPool *mempool, node::BlockManager &blockman, ChainstateManager &chainman, std::optional< uint256 > from_snapshot_blockhash=std::nullopt)
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(
Get the last block that was flushed to disk.
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
kernel::ChainstateManagerOpts Options
Chainstate * HistoricalChainstate() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Return historical chainstate targeting a specific block, if any.
const uint256 & AssumedValidBlock() const
node::BlockMap & BlockIndex() EXCLUSIVE_LOCKS_REQUIRED(
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
double GetBackgroundVerificationProgress(const CBlockIndex &pindex) const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Guess background verification progress in case assume-utxo was used (as a fraction between 0....
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
double GuessVerificationProgress(const CBlockIndex *pindex) const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Guess verification progress (as a fraction between 0.0=genesis and 1.0=current tip).
bool IsInitialBlockDownload() const noexcept
Check whether we are doing an initial block download (synchronizing from disk or network).
size_t m_total_coinstip_cache
MempoolAcceptResult ProcessTransaction(const CTransactionRef &tx, bool test_accept=false) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Try to add a transaction to the memory pool.
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
void ReceivedBlockTransactions(const CBlock &block, CBlockIndex *pindexNew, const FlatFilePos &pos) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Mark a block as having its data received and checked (up to BLOCK_VALID_TRANSACTIONS).
SteadyClock::duration GUARDED_BY(::cs_main) time_check
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)
Chainstate & ActiveChainstate() const
SnapshotCompletionResult MaybeValidateSnapshot(Chainstate &validated_cs, Chainstate &unvalidated_cs) EXCLUSIVE_LOCKS_REQUIRED(Chainstate & CurrentChainstate() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Return current chainstate targeting the most-work, network tip.
SteadyClock::duration GUARDED_BY(::cs_main) time_forks
Definition validation.h:993
bool ProcessNewBlock(const std::shared_ptr< const CBlock > &block, bool force_processing, bool min_pow_checked, bool *new_block) LOCKS_EXCLUDED(cs_main)
Process an incoming block.
size_t m_total_coinsdb_cache
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)
const util::SignalInterrupt & m_interrupt
void LoadExternalBlockFile(AutoFile &file_in, FlatFilePos *dbp=nullptr, std::multimap< uint256, FlatFilePos > *blocks_with_unknown_parent=nullptr)
Import blocks from an external file.
int ActiveHeight() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
VersionBitsCache m_versionbitscache
Track versionbit status.
Chainstate & ValidatedChainstate() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
std::function< void()> snapshot_download_completed
const CChainParams & GetParams() const
void GenerateCoinbaseCommitment(CBlock &block, const CBlockIndex *pindexPrev) const
Produce the necessary coinbase commitment for a block (modifies the hash, don't call for mined blocks...
bool ProcessNewBlockHeaders(std::span< const CBlockHeader > headers, bool min_pow_checked, BlockValidationState &state, const CBlockIndex **ppindex=nullptr) LOCKS_EXCLUDED(cs_main)
Process incoming block headers.
const Consensus::Params & GetConsensus() const
ChainstateManager(const util::SignalInterrupt &interrupt, Options options, node::BlockManager::Options blockman_options)
const arith_uint256 & MinimumChainWork() const
Chainstate &InitializeChainstate(CTxMemPool *mempool) EXCLUSIVE_LOCKS_REQUIRED(util::Result< CBlockIndex * > ActivateSnapshot(AutoFile &coins_file, const node::SnapshotMetadata &metadata, bool in_memory)
const Options m_options
bool LoadBlockIndex() EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Load the block tree and coins database from disk, initializing state if we're running with -reindex.
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...
SteadyClock::duration GUARDED_BY(::cs_main) time_verify
Definition validation.h:995
CChain & ActiveChain() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
arith_uint256 nLastPreciousChainwork
chainwork for the last block that preciousblock has been applied to.
void ReportHeadersPresync(int64_t height, int64_t timestamp)
This is used by net_processing to report pre-synchronization progress of headers, as headers are not ...
std::atomic_bool m_cached_is_ibd
Whether initial block download (IBD) is ongoing.
void MaybeRebalanceCaches() EXCLUSIVE_LOCKS_REQUIRED(void UpdateUncommittedBlockStructures(CBlock &block, const CBlockIndex *pindexPrev) const
Update uncommitted block structures (currently: only the witness reserved value).
SteadyClock::duration GUARDED_BY(::cs_main) time_connect
Definition validation.h:994
void ResetBlockSequenceCounters() EXCLUSIVE_LOCKS_REQUIRED(
Chainstate *LoadAssumeutxoChainstate() EXCLUSIVE_LOCKS_REQUIRED(Chainstate &AddChainstate(std::unique_ptr< Chainstate > chainstate) EXCLUSIVE_LOCKS_REQUIRED(void ResetChainstates() EXCLUSIVE_LOCKS_REQUIRED(bool DeleteChainstate(Chainstate &chainstate) EXCLUSIVE_LOCKS_REQUIRED(bool ValidatedSnapshotCleanup(Chainstate &validated_cs, Chainstate &unvalidated_cs) EXCLUSIVE_LOCKS_REQUIRED(std::optional< std::pair< const CBlockIndex *, const CBlockIndex * > > GetHistoricalBlockRange() const EXCLUSIVE_LOCKS_REQUIRED(util::Result< void > ActivateBestChains() LOCKS_EXCLUDED(void RecalculateBestHeader() EXCLUSIVE_LOCKS_REQUIRED(std::optional< int > BlocksAheadOfTip() const LOCKS_EXCLUDED(CCheckQueue< CScriptCheck > & GetCheckQueue()
Add new chainstate.
int32_t nBlockReverseSequenceId
Decreasing counter (used by subsequent preciousblock calls).
node::BlockManager m_blockman
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)
Sufficiently validate a block for disk storage (and store on disk).
SteadyClock::duration GUARDED_BY(::cs_main) time_flush
std::unique_ptr< CCoinsViewCache > m_cacheview GUARDED_BY(cs_main)
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)
CCoinsViewDB m_dbview GUARDED_BY(cs_main)
CoinsViews(DBParams db_params, CoinsViewOptions options)
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
ValidationCache(size_t script_execution_cache_bytes, size_t signature_cache_bytes)
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...
kernel::BlockManagerOpts Options
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
bool DeploymentActiveAfter(const CBlockIndex *pindexPrev, const Consensus::Params &params, Consensus::BuriedDeployment dep, VersionBitsCache &versionbitscache)
Determine if a deployment is active for the next block.
bool DeploymentEnabled(const Consensus::Params &params, Consensus::BuriedDeployment dep)
Determine if a deployment is enabled (can ever be active).
bool DeploymentActiveAt(const CBlockIndex &index, const Consensus::Params &params, Consensus::BuriedDeployment dep, VersionBitsCache &versionbitscache)
Determine if a deployment is active for this block.
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
@ OK
The message verification was successful.
Definition signmessage.h:40
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:42
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
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 ChainstateManager, more ergonomically referred to as ChainstateManager::Options...
Information about chainstate that notifications are sent from.
Definition types.h:18
AnnotatedMixin< std::mutex > Mutex
Wrapped mutex: supports waiting but not recursive locking.
Definition sync.h:131
AnnotatedMixin< std::recursive_mutex > RecursiveMutex
Wrapped mutex: supports recursive locking, but no waiting TODO: We should move away from using the re...
Definition sync.h:128
#define AssertLockHeld(cs)
Definition sync.h:144
#define EXCLUSIVE_LOCKS_REQUIRED(...)
#define LOCKS_EXCLUDED(...)
#define LOCK_RETURNED(x)
transaction_identifier< true > Wtxid
Wtxid commits to all transaction fields including the witness.
PackageMempoolAcceptResult ProcessNewPackage(Chainstate &active_chainstate, CTxMemPool &pool, const Package &package, bool test_accept, const std::optional< CFeeRate > &client_maxfeerate)
Validate (and maybe submit) a package to the mempool.
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).
std::unordered_map< uint256, CBlockIndex, BlockHasher > BlockMap
bool CheckFinalTxAtTip(const CBlockIndex &active_chain_tip, const CTransaction &tx)
CAmount GetBlockSubsidy(int nHeight, const Consensus::Params &consensusParams)
MempoolAcceptResult AcceptToMemoryPool(Chainstate &active_chainstate, const CTransactionRef &tx, int64_t accept_time, bool bypass_limits, bool test_accept)
Try to add a transaction to the mempool.
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 FatalError(Notifications &notifications, BlockValidationState &state, const bilingual_str &message)
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.
arith_uint256 CalculateClaimedHeadersWork(std::span< const CBlockHeader > headers)
Return the sum of the claimed work on a given set of headers.
const std::vector< std::string > CHECKLEVEL_DOC
Documentation for argument 'checklevel'.
bool CheckBlock(const CBlock &block, BlockValidationState &state, const Consensus::Params &consensusParams, bool fCheckPOW, bool fCheckMerkleRoot)
Functions for validating blocks and updating the block tree.
void PruneBlockFilesManual(Chainstate &active_chainstate, int nManualPruneHeight)
Prune block files up to a given height.
BlockValidationState TestBlockValidity(Chainstate &chainstate, const CBlock &block, const bool check_pow, const bool check_merkle_root)
Verify a block, including transactions.
assert(!tx.IsCoinBase())
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
SnapshotCompletionResult
Definition validation.h:912
Assumeutxo
Chainstate assumeutxo validity.
Definition validation.h:526
@ VALIDATED
Every block in the chain has been validated.
Definition validation.h:528
@ UNVALIDATED
Blocks after an assumeutxo snapshot have been validated but the snapshot itself has not been validate...
Definition validation.h:530
@ INVALID
The assumeutxo snapshot failed validation.
Definition validation.h:532
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
constexpr int64_t LargeCoinsCacheThreshold(int64_t total_space) noexcept
Definition validation.h:517
constexpr uint64_t MIN_DISK_SPACE_FOR_BLOCK_FILES
Definition validation.h:87
VerifyDBResult
Definition validation.h:425
constexpr int32_t MAX_PREVOUTFETCH_THREADS
Maximum number of dedicated threads allowed for prefetching block input prevouts.
Definition validation.h:93
FlushStateMode
Definition validation.h:461
CoinsCacheSizeState
Definition validation.h:509
@ LARGE
The cache is at >= 90% capacity.
Definition validation.h:513
@ CRITICAL
The coins cache is in immediate need of a flush.
Definition validation.h:511
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 IsBIP30Repeat(const CBlockIndex &block_index)
Identifies blocks that overwrote an existing coinbase output in the UTXO set (see BIP30).
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).