Bitcoin Core 31.99.0
P2P Digital Currency
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.
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
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 };
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
370{
371private:
374
375public:
378
379 ValidationCache(size_t script_execution_cache_bytes, size_t signature_cache_bytes);
380
383
386};
387
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
425enum class VerifyDBResult {
426 SUCCESS,
428 INTERRUPTED,
431};
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.
456
457struct ConnectedBlock;
458
460inline constexpr std::array FlushStateModeNames{"NONE", "IF_NEEDED", "PERIODIC", "FORCE_FLUSH", "FORCE_SYNC"};
461enum class FlushStateMode: uint8_t {
462 NONE,
463 IF_NEEDED,
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{
511 CRITICAL = 2,
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 {
528 VALIDATED,
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 }
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
695 {
698 return *Assert(m_coins_views->m_cacheview);
699 }
700
703 {
705 return Assert(m_coins_views)->m_dbview;
706 }
707
710 {
711 return m_mempool;
712 }
713
717 {
719 return Assert(m_coins_views)->m_catcherview;
720 }
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,
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
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
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;
1070 int32_t nBlockReverseSequenceId = -1;
1072 arith_uint256 nLastPreciousChainwork = 0;
1073
1074 // Reset the memory-only sequence counters we use to track block arrival
1075 // (used by tests to reset state)
1077 {
1079 nBlockSequenceId = SEQ_ID_INIT_FROM_DISK + 1;
1080 nBlockReverseSequenceId = -1;
1081 }
1082
1083
1088 CBlockIndex* m_best_header GUARDED_BY(::cs_main){nullptr};
1089
1092 size_t m_total_coinstip_cache{0};
1093 //
1096 size_t m_total_coinsdb_cache{0};
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;
1178 CChain& ActiveChain() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex()) { return ActiveChainstate().m_chain; }
1179 int ActiveHeight() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex()) { return ActiveChain().Height(); }
1180 CBlockIndex* ActiveTip() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex()) { return ActiveChain().Tip(); }
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
1214 double GuessVerificationProgress(const CBlockIndex* pindex) const EXCLUSIVE_LOCKS_REQUIRED(GetMutex());
1215
1217 double GetBackgroundVerificationProgress(const CBlockIndex& pindex) const EXCLUSIVE_LOCKS_REQUIRED(GetMutex());
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
1323 bool LoadBlockIndex() EXCLUSIVE_LOCKS_REQUIRED(cs_main);
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
1385 CCheckQueue<CScriptCheck>& GetCheckQueue() { return m_script_check_queue; }
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
int ret
int flags
Definition: bitcoin-tx.cpp:530
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:116
#define Assume(val)
Assume is the identity function.
Definition: check.h:128
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
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
bool cacheStore
Definition: validation.h:344
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.
Definition: transaction.h:281
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.
Definition: transaction.h:140
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
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(
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...
Definition: validation.cpp:303
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.
Definition: validation.cpp:129
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(
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
Definition: validation.h:1000
Chainstate * HistoricalChainstate() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Return historical chainstate targeting a specific block, if any.
Definition: validation.h:1141
const uint256 & AssumedValidBlock() const
Definition: validation.h:1021
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,...
Definition: validation.h:1088
ValidationCache m_validation_cache
Definition: validation.h:1050
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
SteadyClock::duration GUARDED_BY(::cs_main) time_post_connect
Definition: validation.h:1003
std::unique_ptr< Chainstate > RemoveChainstate(Chainstate &chainstate) EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Remove a chainstate.
Definition: validation.h:1161
kernel::Notifications & GetNotifications() const
Definition: validation.h:1022
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.
Definition: validation.h:1042
SteadyClock::duration GUARDED_BY(::cs_main) time_total
Definition: validation.h:998
SteadyClock::duration GUARDED_BY(::cs_main) time_chainstate
Definition: validation.h:1002
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())
Definition: validation.h:1180
CBlockIndex *m_best_invalid GUARDED_BY(::cs_main)
Definition: validation.h:1006
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...
Definition: validation.h:1132
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
Definition: validation.h:1044
int ActiveHeight() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Definition: validation.h:1179
VersionBitsCache m_versionbitscache
Track versionbit status.
Definition: validation.h:1205
Chainstate & ValidatedChainstate() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Return fully validated chainstate that should be used for indexing, to support indexes that need to i...
Definition: validation.h:1152
const CChainParams & GetParams() const
Definition: validation.h:1017
const Consensus::Params & GetConsensus() const
Definition: validation.h:1018
const arith_uint256 & MinimumChainWork() const
Definition: validation.h:1020
const Options m_options
Definition: validation.h:1045
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.
Definition: validation.h:1118
SteadyClock::duration GUARDED_BY(::cs_main) time_verify
Definition: validation.h:995
CChain & ActiveChain() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Definition: validation.h:1178
SteadyClock::duration GUARDED_BY(::cs_main) time_connect
Definition: validation.h:994
void ResetBlockSequenceCounters() EXCLUSIVE_LOCKS_REQUIRED(
Definition: validation.h:1076
node::BlockManager m_blockman
A single BlockManager instance is shared across each constructed chainstate to avoid duplicating bloc...
Definition: validation.h:1048
SteadyClock::duration GUARDED_BY(::cs_main) time_flush
Definition: validation.h:1001
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.
CoinsViews(DBParams db_params, CoinsViewOptions options)
This constructor initializes CCoinsViewDB and CCoinsViewErrorCatcher instances, but it does not creat...
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...
Definition: blockstorage.h:194
Metadata describing a serialized version of a UTXO set from which an assumeutxo Chainstate can be con...
Definition: utxo_snapshot.h:38
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
static void LoadExternalBlockFile(benchmark::Bench &bench)
The LoadExternalBlockFile() function is used during -reindex and -loadblock.
unsigned int nHeight
Transaction validation functions.
Definition: messages.h:21
std::unordered_map< uint256, CBlockIndex, BlockHasher > BlockMap
Definition: blockstorage.h:136
std::string ToString(const T &t)
Locale-independent version of std::to_string.
Definition: string.h:250
std::vector< CTransactionRef > Package
A package is an ordered list of transactions.
Definition: packages.h:45
std::shared_ptr< const CTransaction > CTransactionRef
Definition: transaction.h:403
@ OK
The message verification was successful.
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 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 EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:49
#define LOCKS_EXCLUDED(...)
Definition: threadsafety.h:48
#define LOCK_RETURNED(x)
Definition: threadsafety.h:47
bool CheckFinalTxAtTip(const CBlockIndex &active_chain_tip, const CTransaction &tx)
Definition: validation.cpp:156
AssertLockHeld(pool.cs)
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.
Definition: validation.cpp:255
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.
Definition: validation.h:1401
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)
Definition: validation.h:1413
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 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.
const std::vector< std::string > CHECKLEVEL_DOC
Documentation for argument 'checklevel'.
Definition: validation.cpp:102
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)
Definition: validation.h:1407
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)