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
76static const unsigned int MIN_BLOCKS_TO_KEEP = 288;
77static const signed int DEFAULT_CHECKBLOCKS = 6;
78static 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.
87static const uint64_t MIN_DISK_SPACE_FOR_BLOCK_FILES = 550 * 1024 * 1024;
88
90static constexpr int MAX_SCRIPTCHECK_THREADS{15};
91
97};
98
100extern const std::vector<std::string> CHECKLEVEL_DOC;
101
102CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams);
103
104bool FatalError(kernel::Notifications& notifications, BlockValidationState& state, const bilingual_str& message);
105
107void PruneBlockFilesManual(Chainstate& active_chainstate, int nManualPruneHeight);
108
133 enum class ResultType {
134 VALID,
135 INVALID,
136 MEMPOOL_ENTRY,
137 DIFFERENT_WITNESS,
138 };
141
144
146 const std::list<CTransactionRef> m_replaced_transactions;
148 const std::optional<int64_t> m_vsize;
150 const std::optional<CAmount> m_base_fees;
156 const std::optional<CFeeRate> m_effective_feerate;
162 const std::optional<std::vector<Wtxid>> m_wtxids_fee_calculations;
163
165 const std::optional<Wtxid> m_other_wtxid;
166
168 return MempoolAcceptResult(state);
169 }
170
172 CFeeRate effective_feerate,
173 const std::vector<Wtxid>& wtxids_fee_calculations) {
174 return MempoolAcceptResult(state, effective_feerate, wtxids_fee_calculations);
175 }
176
177 static MempoolAcceptResult Success(std::list<CTransactionRef>&& replaced_txns,
178 int64_t vsize,
179 CAmount fees,
180 CFeeRate effective_feerate,
181 const std::vector<Wtxid>& wtxids_fee_calculations) {
182 return MempoolAcceptResult(std::move(replaced_txns), vsize, fees,
183 effective_feerate, wtxids_fee_calculations);
184 }
185
186 static MempoolAcceptResult MempoolTx(int64_t vsize, CAmount fees) {
187 return MempoolAcceptResult(vsize, fees);
188 }
189
191 return MempoolAcceptResult(other_wtxid);
192 }
193
194// Private constructors. Use static methods MempoolAcceptResult::Success, etc. to construct.
195private:
198 : m_result_type(ResultType::INVALID), m_state(state) {
199 Assume(!state.IsValid()); // Can be invalid or error
200 }
201
203 explicit MempoolAcceptResult(std::list<CTransactionRef>&& replaced_txns,
204 int64_t vsize,
205 CAmount fees,
206 CFeeRate effective_feerate,
207 const std::vector<Wtxid>& wtxids_fee_calculations)
208 : m_result_type(ResultType::VALID),
209 m_replaced_transactions(std::move(replaced_txns)),
210 m_vsize{vsize},
211 m_base_fees(fees),
212 m_effective_feerate(effective_feerate),
213 m_wtxids_fee_calculations(wtxids_fee_calculations) {}
214
217 CFeeRate effective_feerate,
218 const std::vector<Wtxid>& wtxids_fee_calculations)
219 : m_result_type(ResultType::INVALID),
220 m_state(state),
221 m_effective_feerate(effective_feerate),
222 m_wtxids_fee_calculations(wtxids_fee_calculations) {}
223
225 explicit MempoolAcceptResult(int64_t vsize, CAmount fees)
226 : m_result_type(ResultType::MEMPOOL_ENTRY), m_vsize{vsize}, m_base_fees(fees) {}
227
229 explicit MempoolAcceptResult(const Wtxid& other_wtxid)
230 : m_result_type(ResultType::DIFFERENT_WITNESS), m_other_wtxid(other_wtxid) {}
231};
232
237{
245 std::map<Wtxid, MempoolAcceptResult> m_tx_results;
246
248 std::map<Wtxid, MempoolAcceptResult>&& results)
249 : m_state{state}, m_tx_results(std::move(results)) {}
250
252 std::map<Wtxid, MempoolAcceptResult>&& results)
253 : m_state{state}, m_tx_results(std::move(results)) {}
254
256 explicit PackageMempoolAcceptResult(const Wtxid& wtxid, const MempoolAcceptResult& result)
257 : m_tx_results{ {wtxid, result} } {}
258};
259
275 int64_t accept_time, bool bypass_limits, bool test_accept)
277
289 const Package& txns, bool test_accept, const std::optional<CFeeRate>& client_maxfeerate)
291
292/* Mempool validation helper functions */
293
297bool CheckFinalTxAtTip(const CBlockIndex& active_chain_tip, const CTransaction& tx) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
298
317std::optional<LockPoints> CalculateLockPointsAtTip(
318 CBlockIndex* tip,
319 const CCoinsView& coins_view,
320 const CTransaction& tx);
321
332 const LockPoints& lock_points);
333
339{
340private:
343 unsigned int nIn;
348
349public:
350 CScriptCheck(const CTxOut& outIn, const CTransaction& txToIn, SignatureCache& signature_cache, unsigned int nInIn, script_verify_flags flags, bool cacheIn, PrecomputedTransactionData* txdataIn) :
351 m_tx_out(outIn), ptxTo(&txToIn), nIn(nInIn), m_flags(flags), cacheStore(cacheIn), txdata(txdataIn), m_signature_cache(&signature_cache) { }
352
353 CScriptCheck(const CScriptCheck&) = delete;
357
358 std::optional<std::pair<ScriptError, std::string>> operator()();
359};
360
361// CScriptCheck is used a lot in std::vector, make sure that's efficient
362static_assert(std::is_nothrow_move_assignable_v<CScriptCheck>);
363static_assert(std::is_nothrow_move_constructible_v<CScriptCheck>);
364static_assert(std::is_nothrow_destructible_v<CScriptCheck>);
365
371{
372private:
375
376public:
379
380 ValidationCache(size_t script_execution_cache_bytes, size_t signature_cache_bytes);
381
384
387};
388
392bool CheckBlock(const CBlock& block, BlockValidationState& state, const Consensus::Params& consensusParams, bool fCheckPOW = true, bool fCheckMerkleRoot = true);
393
412 Chainstate& chainstate,
413 const CBlock& block,
414 bool check_pow,
415 bool check_merkle_root) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
416
418bool HasValidProofOfWork(std::span<const CBlockHeader> headers, const Consensus::Params& consensusParams);
419
421bool IsBlockMutated(const CBlock& block, bool check_witness_root);
422
424arith_uint256 CalculateClaimedHeadersWork(std::span<const CBlockHeader> headers);
425
426enum class VerifyDBResult {
427 SUCCESS,
429 INTERRUPTED,
432};
433
436{
437private:
439
440public:
441 explicit CVerifyDB(kernel::Notifications& notifications);
442 ~CVerifyDB();
443 [[nodiscard]] VerifyDBResult VerifyDB(
444 Chainstate& chainstate,
445 const Consensus::Params& consensus_params,
446 CCoinsView& coinsview,
447 int nCheckLevel,
448 int nCheckDepth) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
449};
450
452{
453 DISCONNECT_OK, // All good.
454 DISCONNECT_UNCLEAN, // Rolled back, but UTXO set was inconsistent with block.
455 DISCONNECT_FAILED // Something else went wrong.
457
458struct ConnectedBlock;
459
461inline constexpr std::array FlushStateModeNames{"NONE", "IF_NEEDED", "PERIODIC", "FORCE_FLUSH", "FORCE_SYNC"};
462enum class FlushStateMode: uint8_t {
463 NONE,
464 IF_NEEDED,
465 PERIODIC,
468};
469
480
481public:
485
488
491 std::unique_ptr<CCoinsViewCache> m_cacheview GUARDED_BY(cs_main);
492
495 std::unique_ptr<CoinsViewOverlay> m_connect_block_view GUARDED_BY(cs_main);
496
503 CoinsViews(DBParams db_params, CoinsViewOptions options);
504
506 void InitCache() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
507};
508
510{
512 CRITICAL = 2,
514 LARGE = 1,
515 OK = 0
516};
517
518constexpr int64_t LargeCoinsCacheThreshold(int64_t total_space) noexcept
519{
520 // No periodic flush needed if at least this much space is free
521 constexpr int64_t MAX_BLOCK_COINSDB_USAGE_BYTES{int64_t(10_MiB)};
522 return std::max((total_space * 9) / 10,
523 total_space - MAX_BLOCK_COINSDB_USAGE_BYTES);
524}
525
527enum class Assumeutxo {
529 VALIDATED,
533 INVALID,
534};
535
551{
552protected:
559
563
565 std::unique_ptr<CoinsViews> m_coins_views;
566
568 mutable const CBlockIndex* m_cached_snapshot_base GUARDED_BY(::cs_main){nullptr};
569
571 mutable const CBlockIndex* m_cached_target_block GUARDED_BY(::cs_main){nullptr};
572
573 std::optional<const char*> m_last_script_check_reason_logged GUARDED_BY(::cs_main){};
574
575public:
579
584
585 explicit Chainstate(
586 CTxMemPool* mempool,
587 node::BlockManager& blockman,
588 ChainstateManager& chainman,
589 std::optional<uint256> from_snapshot_blockhash = std::nullopt);
590
592 fs::path StoragePath() const;
593
599
606 void InitCoinsDB(
607 size_t cache_size_bytes,
608 bool in_memory,
609 bool should_wipe);
610
613 void InitCoinsCache(size_t cache_size_bytes) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
614
617 bool CanFlushToDisk() const EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
618 {
620 return m_coins_views && m_coins_views->m_cacheview;
621 }
622
626
631
637 const std::optional<uint256> m_from_snapshot_blockhash;
638
643 std::optional<uint256> m_target_blockhash GUARDED_BY(::cs_main);
644
647 std::optional<AssumeutxoHash> m_target_utxohash GUARDED_BY(::cs_main);
648
654 const CBlockIndex* SnapshotBase() const EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
655
659 const CBlockIndex* TargetBlock() const EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
663 void SetTargetBlock(CBlockIndex* block) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
666 void SetTargetBlockHash(uint256 block_hash) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
667
669 bool ReachedTarget() const EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
670 {
671 const CBlockIndex* target_block{TargetBlock()};
672 assert(!target_block || target_block->GetAncestor(m_chain.Height()) == m_chain.Tip());
673 return target_block && target_block == m_chain.Tip();
674 }
675
683 std::set<CBlockIndex*, node::CBlockIndexWorkComparator> setBlockIndexCandidates;
684
687 {
689 Assert(m_coins_views);
690 return *Assert(m_coins_views->m_cacheview);
691 }
692
695 {
697 return Assert(m_coins_views)->m_dbview;
698 }
699
702 {
703 return m_mempool;
704 }
705
709 {
711 return Assert(m_coins_views)->m_catcherview;
712 }
713
715 void ResetCoinsViews() { m_coins_views.reset(); }
716
718 size_t m_coinsdb_cache_size_bytes{0};
719
721 size_t m_coinstip_cache_size_bytes{0};
722
725 bool ResizeCoinsCaches(size_t coinstip_size, size_t coinsdb_size)
727
739 bool FlushStateToDisk(
741 FlushStateMode mode,
742 int nManualPruneHeight = 0);
743
745 void ForceFlushStateToDisk(bool wipe_cache = true);
746
749 void PruneAndFlush();
750
772 bool ActivateBestChain(
774 std::shared_ptr<const CBlock> pblock = nullptr)
775 EXCLUSIVE_LOCKS_REQUIRED(!m_chainstate_mutex)
777
778 // Block (dis)connection on a given view:
779 DisconnectResult DisconnectBlock(const CBlock& block, const CBlockIndex* pindex, CCoinsViewCache& view)
781 bool ConnectBlock(const CBlock& block, BlockValidationState& state, CBlockIndex* pindex,
782 CCoinsViewCache& view, bool fJustCheck = false) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
783
784 // Apply the effects of a block disconnection on the UTXO set.
785 bool DisconnectTip(BlockValidationState& state, DisconnectedBlockTransactions* disconnectpool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_mempool->cs);
786
787 // Manual block validity manipulation:
792 bool PreciousBlock(BlockValidationState& state, CBlockIndex* pindex)
793 EXCLUSIVE_LOCKS_REQUIRED(!m_chainstate_mutex)
795
798 EXCLUSIVE_LOCKS_REQUIRED(!m_chainstate_mutex)
800
802 void SetBlockFailureFlags(CBlockIndex* pindex) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
803
805 void ResetBlockFailureFlags(CBlockIndex* pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
806
808 bool ReplayBlocks();
809
811 [[nodiscard]] bool NeedsRedownload() const EXCLUSIVE_LOCKS_REQUIRED(cs_main);
813 bool LoadGenesisBlock();
814
816 void TryAddBlockIndexCandidate(CBlockIndex* pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
817
818 void PruneBlockIndexCandidates();
819
820 void ClearBlockIndexCandidates() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
821
823 void PopulateBlockIndexCandidates() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
824
826 const CBlockIndex* FindForkInGlobalIndex(const CBlockLocator& locator) const EXCLUSIVE_LOCKS_REQUIRED(cs_main);
827
829 bool LoadChainTip() EXCLUSIVE_LOCKS_REQUIRED(cs_main);
830
834 CoinsCacheSizeState GetCoinsCacheSizeState() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
835
836 CoinsCacheSizeState GetCoinsCacheSizeState(
837 size_t max_coins_cache_size_bytes,
838 size_t max_mempool_size_bytes) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
839
841
843 RecursiveMutex* MempoolMutex() const LOCK_RETURNED(m_mempool->cs)
844 {
845 return m_mempool ? &m_mempool->cs : nullptr;
846 }
847
851 std::pair<int, int> GetPruneRange(int last_height_can_prune) const EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
852
853protected:
854 bool ActivateBestChainStep(BlockValidationState& state, CBlockIndex* pindexMostWork, const std::shared_ptr<const CBlock>& pblock, bool& fInvalidFound, std::vector<ConnectedBlock>& connected_blocks) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_mempool->cs);
855 bool ConnectTip(
857 CBlockIndex* pindexNew,
858 std::shared_ptr<const CBlock> block_to_connect,
859 std::vector<ConnectedBlock>& connected_blocks,
860 DisconnectedBlockTransactions& disconnectpool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_mempool->cs);
861
862 void InvalidBlockFound(CBlockIndex* pindex, const BlockValidationState& state) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
863 CBlockIndex* FindMostWorkChain() EXCLUSIVE_LOCKS_REQUIRED(cs_main);
864
865 bool RollforwardBlock(const CBlockIndex* pindex, CCoinsViewCache& inputs) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
866
867 void CheckForkWarningConditions() EXCLUSIVE_LOCKS_REQUIRED(cs_main);
868 void InvalidChainFound(CBlockIndex* pindexNew) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
869
883 void MaybeUpdateMempoolForReorg(
884 DisconnectedBlockTransactions& disconnectpool,
885 bool fAddToMempool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_mempool->cs);
886
888 void UpdateTip(const CBlockIndex* pindexNew)
890
891 NodeClock::time_point m_next_write{NodeClock::time_point::max()};
892
897 [[nodiscard]] util::Result<void> InvalidateCoinsDBOnDisk() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
898
900};
901
903 SUCCESS,
904 SKIPPED,
905
906 // Expected assumeutxo configuration data is not found for the height of the
907 // base block.
909
910 // Failed to generate UTXO statistics (to check UTXO set hash) for the
911 // validated chainstate.
913
914 // The UTXO set hash of the validated chainstate does not match the one
915 // expected by assumeutxo chainparams.
917};
918
940{
941private:
942
944 CBlockIndex* m_last_notified_header GUARDED_BY(GetMutex()){nullptr};
945
946 bool NotifyHeaderTip() LOCKS_EXCLUDED(GetMutex());
947
955 [[nodiscard]] util::Result<void> PopulateAndValidateSnapshot(
956 Chainstate& snapshot_chainstate,
957 AutoFile& coins_file,
958 const node::SnapshotMetadata& metadata);
959
967 bool AcceptBlockHeader(
968 const CBlockHeader& block,
970 CBlockIndex** ppindex,
971 bool min_pow_checked) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
973
975 MockableSteadyClock::time_point m_last_presync_update GUARDED_BY(GetMutex()){};
976
979
982 SteadyClock::duration GUARDED_BY(::cs_main) time_check{};
983 SteadyClock::duration GUARDED_BY(::cs_main) time_forks{};
984 SteadyClock::duration GUARDED_BY(::cs_main) time_connect{};
985 SteadyClock::duration GUARDED_BY(::cs_main) time_verify{};
986 SteadyClock::duration GUARDED_BY(::cs_main) time_undo{};
987 SteadyClock::duration GUARDED_BY(::cs_main) time_index{};
988 SteadyClock::duration GUARDED_BY(::cs_main) time_total{};
989 int64_t GUARDED_BY(::cs_main) num_blocks_total{0};
990 SteadyClock::duration GUARDED_BY(::cs_main) time_connect_total{};
991 SteadyClock::duration GUARDED_BY(::cs_main) time_flush{};
992 SteadyClock::duration GUARDED_BY(::cs_main) time_chainstate{};
993 SteadyClock::duration GUARDED_BY(::cs_main) time_post_connect{};
994
995protected:
996 CBlockIndex* m_best_invalid GUARDED_BY(::cs_main){nullptr};
997
998public:
1000
1001 explicit ChainstateManager(const util::SignalInterrupt& interrupt, Options options, node::BlockManager::Options blockman_options);
1002
1005 std::function<void()> snapshot_download_completed = std::function<void()>();
1006
1007 const CChainParams& GetParams() const { return m_options.chainparams; }
1008 const Consensus::Params& GetConsensus() const { return m_options.chainparams.GetConsensus(); }
1009 bool ShouldCheckBlockIndex() const;
1010 const arith_uint256& MinimumChainWork() const { return *Assert(m_options.minimum_chain_work); }
1011 const uint256& AssumedValidBlock() const { return *Assert(m_options.assumed_valid_block); }
1012 kernel::Notifications& GetNotifications() const { return m_options.notifications; };
1013
1019 void CheckBlockIndex() const;
1020
1033
1039
1041
1049 std::atomic_bool m_cached_is_ibd{true};
1050
1058 int32_t nBlockSequenceId GUARDED_BY(::cs_main) = SEQ_ID_INIT_FROM_DISK + 1;
1060 int32_t nBlockReverseSequenceId = -1;
1062 arith_uint256 nLastPreciousChainwork = 0;
1063
1064 // Reset the memory-only sequence counters we use to track block arrival
1065 // (used by tests to reset state)
1067 {
1069 nBlockSequenceId = SEQ_ID_INIT_FROM_DISK + 1;
1070 nBlockReverseSequenceId = -1;
1071 }
1072
1073
1078 CBlockIndex* m_best_header GUARDED_BY(::cs_main){nullptr};
1079
1082 size_t m_total_coinstip_cache{0};
1083 //
1086 size_t m_total_coinsdb_cache{0};
1087
1091 // constructor
1092 Chainstate& InitializeChainstate(CTxMemPool* mempool) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1093
1106 AutoFile& coins_file, const node::SnapshotMetadata& metadata, bool in_memory);
1107
1116 SnapshotCompletionResult MaybeValidateSnapshot(Chainstate& validated_cs, Chainstate& unvalidated_cs) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1117
1120 {
1121 for (auto& cs : m_chainstates) {
1122 if (cs && cs->m_assumeutxo != Assumeutxo::INVALID && !cs->m_target_blockhash) return *cs;
1123 }
1124 abort();
1125 }
1126
1129 {
1130 for (auto& cs : m_chainstates) {
1131 if (cs && cs->m_assumeutxo != Assumeutxo::INVALID && cs->m_target_blockhash && !cs->m_target_utxohash) return cs.get();
1132 }
1133 return nullptr;
1134 }
1135
1140 {
1141 for (auto* cs : {&CurrentChainstate(), HistoricalChainstate()}) {
1142 if (cs && cs->m_assumeutxo == Assumeutxo::VALIDATED) return *cs;
1143 }
1144 abort();
1145 }
1146
1148 std::unique_ptr<Chainstate> RemoveChainstate(Chainstate& chainstate) EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
1149 {
1150 auto it{std::find_if(m_chainstates.begin(), m_chainstates.end(), [&](auto& cs) { return cs.get() == &chainstate; })};
1151 if (it != m_chainstates.end()) {
1152 auto ret{std::move(*it)};
1153 m_chainstates.erase(it);
1154 return ret;
1155 }
1156 return nullptr;
1157 }
1158
1164 Chainstate& ActiveChainstate() const;
1165 CChain& ActiveChain() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex()) { return ActiveChainstate().m_chain; }
1166 int ActiveHeight() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex()) { return ActiveChain().Height(); }
1167 CBlockIndex* ActiveTip() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex()) { return ActiveChain().Tip(); }
1169
1181 void UpdateIBDStatus() EXCLUSIVE_LOCKS_REQUIRED(cs_main);
1182
1184 {
1186 return m_blockman.m_block_index;
1187 }
1188
1193
1195 bool IsInitialBlockDownload() const noexcept;
1196
1198 double GuessVerificationProgress(const CBlockIndex* pindex) const EXCLUSIVE_LOCKS_REQUIRED(GetMutex());
1199
1227 AutoFile& file_in,
1228 FlatFilePos* dbp = nullptr,
1229 std::multimap<uint256, FlatFilePos>* blocks_with_unknown_parent = nullptr);
1230
1255 bool ProcessNewBlock(const std::shared_ptr<const CBlock>& block, bool force_processing, bool min_pow_checked, bool* new_block) LOCKS_EXCLUDED(cs_main);
1256
1269 bool ProcessNewBlockHeaders(std::span<const CBlockHeader> headers, bool min_pow_checked, BlockValidationState& state, const CBlockIndex** ppindex = nullptr) LOCKS_EXCLUDED(cs_main);
1270
1290 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);
1291
1292 void ReceivedBlockTransactions(const CBlock& block, CBlockIndex* pindexNew, const FlatFilePos& pos) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
1293
1300 [[nodiscard]] MempoolAcceptResult ProcessTransaction(const CTransactionRef& tx, bool test_accept=false)
1302
1304 bool LoadBlockIndex() EXCLUSIVE_LOCKS_REQUIRED(cs_main);
1305
1308 void MaybeRebalanceCaches() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1309
1315 void UpdateUncommittedBlockStructures(CBlock& block, const CBlockIndex* pindexPrev) const;
1316
1318 void GenerateCoinbaseCommitment(CBlock& block, const CBlockIndex* pindexPrev) const;
1319
1324 void ReportHeadersPresync(int64_t height, int64_t timestamp);
1325
1329 Chainstate* LoadAssumeutxoChainstate() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1330
1332 Chainstate& AddChainstate(std::unique_ptr<Chainstate> chainstate) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1333
1334 void ResetChainstates() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1335
1338 [[nodiscard]] bool DeleteChainstate(Chainstate& chainstate) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1339
1349 bool ValidatedSnapshotCleanup(Chainstate& validated_cs, Chainstate& unvalidated_cs) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1350
1352 std::optional<std::pair<const CBlockIndex*, const CBlockIndex*>> GetHistoricalBlockRange() const EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1353
1355 util::Result<void> ActivateBestChains() LOCKS_EXCLUDED(::cs_main);
1356
1360 void RecalculateBestHeader() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1361
1364 std::optional<int> BlocksAheadOfTip() const LOCKS_EXCLUDED(::cs_main);
1365
1366 CCheckQueue<CScriptCheck>& GetCheckQueue() { return m_script_check_queue; }
1367
1369
1377 std::vector<std::unique_ptr<Chainstate>> m_chainstates GUARDED_BY(::cs_main);
1378};
1379
1381template<typename DEP>
1382bool DeploymentActiveAfter(const CBlockIndex* pindexPrev, const ChainstateManager& chainman, DEP dep)
1383{
1384 return DeploymentActiveAfter(pindexPrev, chainman.GetConsensus(), dep, chainman.m_versionbitscache);
1385}
1386
1387template<typename DEP>
1388bool DeploymentActiveAt(const CBlockIndex& index, const ChainstateManager& chainman, DEP dep)
1389{
1390 return DeploymentActiveAt(index, chainman.GetConsensus(), dep, chainman.m_versionbitscache);
1391}
1392
1393template<typename DEP>
1394bool DeploymentEnabled(const ChainstateManager& chainman, DEP dep)
1395{
1396 return DeploymentEnabled(chainman.GetConsensus(), dep);
1397}
1398
1400bool IsBIP30Repeat(const CBlockIndex& block_index);
1401
1403bool IsBIP30Unspendable(const uint256& block_hash, int block_height);
1404
1405// Returns the script flags which should be checked for a given block
1406script_verify_flags GetBlockScriptFlags(const CBlockIndex& block_index, const ChainstateManager& chainman);
1407
1408#endif // BITCOIN_VALIDATION_H
int64_t CAmount
Amount in satoshis (Can be negative)
Definition: amount.h:12
static void pool cs
int ret
int flags
Definition: bitcoin-tx.cpp:529
void InvalidateBlock(ChainstateManager &chainman, const uint256 block_hash)
static 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:113
#define Assume(val)
Assume is the identity function.
Definition: check.h:125
static void CheckBlockIndex(benchmark::Bench &bench)
Non-refcounted RAII wrapper for FILE*.
Definition: streams.h:373
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:368
CCoinsView backed by the coin database (chainstate/)
Definition: txdb.h:35
This is a minimally invasive approach to shutdown on LevelDB read errors from the chainstate,...
Definition: coins.h:572
Abstract view on the open txout dataset.
Definition: coins.h:308
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:339
CScriptCheck & operator=(CScriptCheck &&)=default
SignatureCache * m_signature_cache
Definition: validation.h:347
CScriptCheck(const CScriptCheck &)=delete
PrecomputedTransactionData * txdata
Definition: validation.h:346
CTxOut m_tx_out
Definition: validation.h:341
script_verify_flags m_flags
Definition: validation.h:344
CScriptCheck(CScriptCheck &&)=default
bool cacheStore
Definition: validation.h:345
std::optional< std::pair< ScriptError, std::string > > operator()()
const CTransaction * ptxTo
Definition: validation.h:342
unsigned int nIn
Definition: validation.h:343
CScriptCheck(const CTxOut &outIn, const CTransaction &txToIn, SignatureCache &signature_cache, unsigned int nInIn, script_verify_flags flags, bool cacheIn, PrecomputedTransactionData *txdataIn)
Definition: validation.h:350
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:436
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:438
CVerifyDB(kernel::Notifications &notifications)
Chainstate stores and provides an API to update our local knowledge of the current best chain.
Definition: validation.h:551
Mutex m_chainstate_mutex
The ChainState Mutex A lock that must be held when modifying this ChainState - held in ActivateBestCh...
Definition: validation.h:558
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:625
CTxMemPool * GetMempool()
Definition: validation.h:701
CCoinsViewCache & CoinsTip() EXCLUSIVE_LOCKS_REQUIRED(
Definition: validation.h:686
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:637
CTxMemPool * m_mempool
Optional mempool that is kept in sync with the chain.
Definition: validation.h:562
CCoinsViewDB & CoinsDB() EXCLUSIVE_LOCKS_REQUIRED(
Definition: validation.h:694
std::optional< const char * > m_last_script_check_reason_logged GUARDED_BY(::cs_main)
Definition: validation.h:573
const CBlockIndex *m_cached_target_block GUARDED_BY(::cs_main)
Cached result of LookupBlockIndex(*m_target_blockhash)
Definition: validation.h:571
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:683
ChainstateManager & m_chainman
The chainstate manager that owns this chainstate.
Definition: validation.h:583
std::unique_ptr< CoinsViews > m_coins_views
Manages the UTXO set, which is a reflection of the contents of m_chain.
Definition: validation.h:565
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:715
node::BlockManager & m_blockman
Reference to a BlockManager instance which itself is shared across all Chainstate instances.
Definition: validation.h:578
const CBlockIndex *m_cached_snapshot_base GUARDED_BY(::cs_main)
Cached result of LookupBlockIndex(*m_from_snapshot_blockhash)
Definition: validation.h:568
CCoinsViewErrorCatcher & CoinsErrorCatcher() EXCLUSIVE_LOCKS_REQUIRED(
Definition: validation.h:708
Interface for managing multiple Chainstate objects, where each chainstate is associated with chainsta...
Definition: validation.h:940
SteadyClock::duration GUARDED_BY(::cs_main) time_connect_total
Definition: validation.h:990
Chainstate * HistoricalChainstate() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Return historical chainstate targeting a specific block, if any.
Definition: validation.h:1128
const uint256 & AssumedValidBlock() const
Definition: validation.h:1011
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:1078
ValidationCache m_validation_cache
Definition: validation.h:1040
int64_t GUARDED_BY(::cs_main) num_blocks_total
Definition: validation.h:989
SteadyClock::duration GUARDED_BY(::cs_main) time_undo
Definition: validation.h:986
SteadyClock::duration GUARDED_BY(::cs_main) time_index
Definition: validation.h:987
SteadyClock::duration GUARDED_BY(::cs_main) time_post_connect
Definition: validation.h:993
std::unique_ptr< Chainstate > RemoveChainstate(Chainstate &chainstate) EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Remove a chainstate.
Definition: validation.h:1148
kernel::Notifications & GetNotifications() const
Definition: validation.h:1012
SteadyClock::duration GUARDED_BY(::cs_main) time_check
Timers and counters used for benchmarking validation in both background and active chainstates.
Definition: validation.h:982
RecursiveMutex & GetMutex() const LOCK_RETURNED(
Alias for cs_main.
Definition: validation.h:1032
SteadyClock::duration GUARDED_BY(::cs_main) time_total
Definition: validation.h:988
SteadyClock::duration GUARDED_BY(::cs_main) time_chainstate
Definition: validation.h:992
CCheckQueue< CScriptCheck > m_script_check_queue
A queue for script verifications that have to be performed by worker threads.
Definition: validation.h:978
CBlockIndex * ActiveTip() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Definition: validation.h:1167
CBlockIndex *m_best_invalid GUARDED_BY(::cs_main)
Definition: validation.h:996
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:1119
SteadyClock::duration GUARDED_BY(::cs_main) time_forks
Definition: validation.h:983
CBlockIndex *m_last_notified_header GUARDED_BY(GetMutex())
The last header for which a headerTip notification was issued.
Definition: validation.h:944
std::vector< std::unique_ptr< Chainstate > > m_chainstates GUARDED_BY(::cs_main)
List of chainstates.
const util::SignalInterrupt & m_interrupt
Definition: validation.h:1034
int ActiveHeight() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Definition: validation.h:1166
VersionBitsCache m_versionbitscache
Track versionbit status.
Definition: validation.h:1192
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:1139
const CChainParams & GetParams() const
Definition: validation.h:1007
const Consensus::Params & GetConsensus() const
Definition: validation.h:1008
const arith_uint256 & MinimumChainWork() const
Definition: validation.h:1010
const Options m_options
Definition: validation.h:1035
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:1105
SteadyClock::duration GUARDED_BY(::cs_main) time_verify
Definition: validation.h:985
CChain & ActiveChain() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Definition: validation.h:1165
SteadyClock::duration GUARDED_BY(::cs_main) time_connect
Definition: validation.h:984
void ResetBlockSequenceCounters() EXCLUSIVE_LOCKS_REQUIRED(
Definition: validation.h:1066
node::BlockManager m_blockman
A single BlockManager instance is shared across each constructed chainstate to avoid duplicating bloc...
Definition: validation.h:1038
SteadyClock::duration GUARDED_BY(::cs_main) time_flush
Definition: validation.h:991
A convenience class for constructing the CCoinsView* hierarchy used to facilitate access to the UTXO ...
Definition: validation.h:479
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:39
Convenience class for initializing and passing the script execution cache and signature cache.
Definition: validation.h:371
ValidationCache(size_t script_execution_cache_bytes, size_t signature_cache_bytes)
CuckooCache::cache< uint256, SignatureCacheHasher > m_script_execution_cache
Definition: validation.h:377
ValidationCache & operator=(const ValidationCache &)=delete
ValidationCache(const ValidationCache &)=delete
CSHA256 ScriptExecutionCacheHasher() const
Return a copy of the pre-initialized hasher.
Definition: validation.h:386
CSHA256 m_script_execution_cache_hasher
Pre-initialized hasher to avoid having to recreate it for every hash calculation.
Definition: validation.h:374
SignatureCache m_signature_cache
Definition: validation.h:378
bool IsValid() const
Definition: validation.h:105
BIP 9 allows multiple softforks to be deployed in parallel.
Definition: versionbits.h:77
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:192
Metadata describing a serialized version of a UTXO set from which an assumeutxo Chainstate can be con...
Definition: utxo_snapshot.h:38
transaction_identifier represents the two canonical transaction identifier types (txid,...
256-bit opaque blob.
Definition: uint256.h:195
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
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:135
Definition: common.h:29
std::string ToString(const T &t)
Locale-independent version of std::to_string.
Definition: string.h:246
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:26
Parameters that influence chain consensus.
Definition: params.h:84
Application-specific storage settings.
Definition: dbwrapper.h:33
Validation result for a transaction evaluated by MemPoolAccept (single or package).
Definition: validation.h:131
const std::optional< int64_t > m_vsize
Virtual size as used by the mempool, calculated using serialized size and sigops.
Definition: validation.h:148
const ResultType m_result_type
Result type.
Definition: validation.h:140
MempoolAcceptResult(int64_t vsize, CAmount fees)
Constructor for already-in-mempool case.
Definition: validation.h:225
const std::optional< CAmount > m_base_fees
Raw base fees in satoshis.
Definition: validation.h:150
MempoolAcceptResult(TxValidationState state)
Constructor for failure case.
Definition: validation.h:197
const TxValidationState m_state
Contains information about why the transaction failed.
Definition: validation.h:143
ResultType
Used to indicate the results of mempool validation.
Definition: validation.h:133
static MempoolAcceptResult Failure(TxValidationState state)
Definition: validation.h:167
static MempoolAcceptResult FeeFailure(TxValidationState state, CFeeRate effective_feerate, const std::vector< Wtxid > &wtxids_fee_calculations)
Definition: validation.h:171
const std::optional< CFeeRate > m_effective_feerate
The feerate at which this transaction was considered.
Definition: validation.h:156
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:203
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:165
const std::list< CTransactionRef > m_replaced_transactions
Mempool transactions replaced by the tx.
Definition: validation.h:146
MempoolAcceptResult(const Wtxid &other_wtxid)
Constructor for witness-swapped case.
Definition: validation.h:229
static MempoolAcceptResult MempoolTxDifferentWitness(const Wtxid &other_wtxid)
Definition: validation.h:190
static MempoolAcceptResult MempoolTx(int64_t vsize, CAmount fees)
Definition: validation.h:186
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:177
MempoolAcceptResult(TxValidationState state, CFeeRate effective_feerate, const std::vector< Wtxid > &wtxids_fee_calculations)
Constructor for fee-related failure case.
Definition: validation.h:216
const std::optional< std::vector< Wtxid > > m_wtxids_fee_calculations
Contains the wtxids of the transactions used for fee-related checks.
Definition: validation.h:162
Version of SteadyClock that is mockable in the context of tests (via SteadyClockContext,...
Definition: time.h:38
Version of the system clock that is mockable in the context of tests (via NodeClockContext or SetMock...
Definition: time.h:19
Validation result for package mempool acceptance.
Definition: validation.h:237
PackageValidationState m_state
Definition: validation.h:238
PackageMempoolAcceptResult(const Wtxid &wtxid, const MempoolAcceptResult &result)
Constructor to create a PackageMempoolAcceptResult from a single MempoolAcceptResult.
Definition: validation.h:256
PackageMempoolAcceptResult(PackageValidationState state, CFeeRate feerate, std::map< Wtxid, MempoolAcceptResult > &&results)
Definition: validation.h:251
PackageMempoolAcceptResult(PackageValidationState state, std::map< Wtxid, MempoolAcceptResult > &&results)
Definition: validation.h:247
std::map< Wtxid, MempoolAcceptResult > m_tx_results
Map from wtxid to finished MempoolAcceptResults.
Definition: validation.h:245
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:51
#define LOCKS_EXCLUDED(...)
Definition: threadsafety.h:50
#define LOCK_RETURNED(x)
Definition: threadsafety.h:49
bool CheckFinalTxAtTip(const CBlockIndex &active_chain_tip, const CTransaction &tx)
Definition: validation.cpp:147
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).
script_verify_flags GetBlockScriptFlags(const CBlockIndex &block_index, const ChainstateManager &chainman)
static constexpr int MAX_SCRIPTCHECK_THREADS
Maximum number of dedicated script-checking threads allowed.
Definition: validation.h:90
static constexpr int DEFAULT_CHECKLEVEL
Definition: validation.h:78
static const uint64_t MIN_DISK_SPACE_FOR_BLOCK_FILES
Definition: validation.h:87
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:246
bool FatalError(kernel::Notifications &notifications, BlockValidationState &state, const bilingual_str &message)
static const 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
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:1382
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:902
bool DeploymentEnabled(const ChainstateManager &chainman, DEP dep)
Definition: validation.h:1394
Assumeutxo
Chainstate assumeutxo validity.
Definition: validation.h:527
@ 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:93
constexpr std::array FlushStateModeNames
Definition: validation.h:461
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:317
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:518
arith_uint256 CalculateClaimedHeadersWork(std::span< const CBlockHeader > headers)
Return the sum of the claimed work on a given set of headers.
VerifyDBResult
Definition: validation.h:426
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:100
void PruneBlockFilesManual(Chainstate &active_chainstate, int nManualPruneHeight)
Prune block files up to a given height.
FlushStateMode
Definition: validation.h:462
CoinsCacheSizeState
Definition: validation.h:510
@ LARGE
The cache is at >= 90% capacity.
@ CRITICAL
The coins cache is in immediate need of a flush.
bool DeploymentActiveAt(const CBlockIndex &index, const ChainstateManager &chainman, DEP dep)
Definition: validation.h:1388
bool IsBIP30Repeat(const CBlockIndex &block_index)
Identifies blocks that overwrote an existing coinbase output in the UTXO set (see BIP30)
static const signed int DEFAULT_CHECKBLOCKS
Definition: validation.h:77
DisconnectResult
Definition: validation.h:452
@ DISCONNECT_FAILED
Definition: validation.h:455
@ DISCONNECT_UNCLEAN
Definition: validation.h:454
@ DISCONNECT_OK
Definition: validation.h:453
bool IsBIP30Unspendable(const uint256 &block_hash, int block_height)
Identifies blocks which coinbase output was subsequently overwritten in the UTXO set (see BIP30)