Bitcoin Core 28.0.0
P2P Digital Currency
Loading...
Searching...
No Matches
validation.h
Go to the documentation of this file.
1// Copyright (c) 2009-2010 Satoshi Nakamoto
2// Copyright (c) 2009-2022 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 <consensus/amount.h>
14#include <cuckoocache.h>
15#include <deploymentstatus.h>
16#include <kernel/chain.h>
17#include <kernel/chainparams.h>
19#include <kernel/cs_main.h> // IWYU pragma: export
20#include <node/blockstorage.h>
21#include <policy/feerate.h>
22#include <policy/packages.h>
23#include <policy/policy.h>
24#include <script/script_error.h>
25#include <script/sigcache.h>
26#include <sync.h>
27#include <txdb.h>
28#include <txmempool.h> // For CTxMemPool::cs
29#include <uint256.h>
30#include <util/check.h>
31#include <util/fs.h>
32#include <util/hasher.h>
33#include <util/result.h>
34#include <util/translation.h>
35#include <versionbits.h>
36
37#include <atomic>
38#include <map>
39#include <memory>
40#include <optional>
41#include <set>
42#include <stdint.h>
43#include <string>
44#include <thread>
45#include <type_traits>
46#include <utility>
47#include <vector>
48
49class Chainstate;
50class CTxMemPool;
52struct ChainTxData;
55struct LockPoints;
56struct AssumeutxoData;
57namespace node {
58class SnapshotMetadata;
59} // namespace node
60namespace Consensus {
61struct Params;
62} // namespace Consensus
63namespace util {
64class SignalInterrupt;
65} // namespace util
66
68static const unsigned int MIN_BLOCKS_TO_KEEP = 288;
69static const signed int DEFAULT_CHECKBLOCKS = 6;
70static constexpr int DEFAULT_CHECKLEVEL{3};
71// Require that user allocate at least 550 MiB for block & undo files (blk???.dat and rev???.dat)
72// At 1MB per block, 288 blocks = 288MB.
73// Add 15% for Undo data = 331MB
74// Add 20% for Orphan block rate = 397MB
75// We want the low water mark after pruning to be at least 397 MB and since we prune in
76// full block file chunks, we need the high water mark which triggers the prune to be
77// one 128MB block file + added 15% undo data = 147MB greater for a total of 545MB
78// Setting the target to >= 550 MiB will make it likely we can respect the target.
79static const uint64_t MIN_DISK_SPACE_FOR_BLOCK_FILES = 550 * 1024 * 1024;
80
87
89extern std::condition_variable g_best_block_cv;
92
94extern const std::vector<std::string> CHECKLEVEL_DOC;
95
96CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams);
97
98bool FatalError(kernel::Notifications& notifications, BlockValidationState& state, const bilingual_str& message);
99
101double GuessVerificationProgress(const ChainTxData& data, const CBlockIndex* pindex);
102
104void PruneBlockFilesManual(Chainstate& active_chainstate, int nManualPruneHeight);
105
130 enum class ResultType {
131 VALID,
132 INVALID,
135 };
138
141
143 const std::list<CTransactionRef> m_replaced_transactions;
145 const std::optional<int64_t> m_vsize;
147 const std::optional<CAmount> m_base_fees;
153 const std::optional<CFeeRate> m_effective_feerate;
159 const std::optional<std::vector<Wtxid>> m_wtxids_fee_calculations;
160
162 const std::optional<uint256> m_other_wtxid;
163
165 return MempoolAcceptResult(state);
166 }
167
169 CFeeRate effective_feerate,
170 const std::vector<Wtxid>& wtxids_fee_calculations) {
171 return MempoolAcceptResult(state, effective_feerate, wtxids_fee_calculations);
172 }
173
174 static MempoolAcceptResult Success(std::list<CTransactionRef>&& replaced_txns,
175 int64_t vsize,
176 CAmount fees,
177 CFeeRate effective_feerate,
178 const std::vector<Wtxid>& wtxids_fee_calculations) {
179 return MempoolAcceptResult(std::move(replaced_txns), vsize, fees,
180 effective_feerate, wtxids_fee_calculations);
181 }
182
183 static MempoolAcceptResult MempoolTx(int64_t vsize, CAmount fees) {
184 return MempoolAcceptResult(vsize, fees);
185 }
186
188 return MempoolAcceptResult(other_wtxid);
189 }
190
191// Private constructors. Use static methods MempoolAcceptResult::Success, etc. to construct.
192private:
196 Assume(!state.IsValid()); // Can be invalid or error
197 }
198
200 explicit MempoolAcceptResult(std::list<CTransactionRef>&& replaced_txns,
201 int64_t vsize,
202 CAmount fees,
203 CFeeRate effective_feerate,
204 const std::vector<Wtxid>& wtxids_fee_calculations)
206 m_replaced_transactions(std::move(replaced_txns)),
207 m_vsize{vsize},
208 m_base_fees(fees),
209 m_effective_feerate(effective_feerate),
210 m_wtxids_fee_calculations(wtxids_fee_calculations) {}
211
214 CFeeRate effective_feerate,
215 const std::vector<Wtxid>& wtxids_fee_calculations)
217 m_state(state),
218 m_effective_feerate(effective_feerate),
219 m_wtxids_fee_calculations(wtxids_fee_calculations) {}
220
222 explicit MempoolAcceptResult(int64_t vsize, CAmount fees)
224
226 explicit MempoolAcceptResult(const uint256& other_wtxid)
228};
229
234{
242 std::map<uint256, MempoolAcceptResult> m_tx_results;
243
245 std::map<uint256, MempoolAcceptResult>&& results)
246 : m_state{state}, m_tx_results(std::move(results)) {}
247
249 std::map<uint256, MempoolAcceptResult>&& results)
250 : m_state{state}, m_tx_results(std::move(results)) {}
251
253 explicit PackageMempoolAcceptResult(const uint256& wtxid, const MempoolAcceptResult& result)
254 : m_tx_results{ {wtxid, result} } {}
255};
256
272 int64_t accept_time, bool bypass_limits, bool test_accept)
274
286 const Package& txns, bool test_accept, const std::optional<CFeeRate>& client_maxfeerate)
288
289/* Mempool validation helper functions */
290
294bool CheckFinalTxAtTip(const CBlockIndex& active_chain_tip, const CTransaction& tx) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
295
314std::optional<LockPoints> CalculateLockPointsAtTip(
315 CBlockIndex* tip,
316 const CCoinsView& coins_view,
317 const CTransaction& tx);
318
329 const LockPoints& lock_points);
330
336{
337private:
340 unsigned int nIn;
341 unsigned int nFlags;
346
347public:
348 CScriptCheck(const CTxOut& outIn, const CTransaction& txToIn, SignatureCache& signature_cache, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn, PrecomputedTransactionData* txdataIn) :
349 m_tx_out(outIn), ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), cacheStore(cacheIn), txdata(txdataIn), m_signature_cache(&signature_cache) { }
350
351 CScriptCheck(const CScriptCheck&) = delete;
355
356 bool operator()();
357
358 ScriptError GetScriptError() const { return error; }
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
388
392bool CheckBlock(const CBlock& block, BlockValidationState& state, const Consensus::Params& consensusParams, bool fCheckPOW = true, bool fCheckMerkleRoot = true);
393
396 const CChainParams& chainparams,
397 Chainstate& chainstate,
398 const CBlock& block,
399 CBlockIndex* pindexPrev,
400 bool fCheckPOW = true,
401 bool fCheckMerkleRoot = true) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
402
404bool HasValidProofOfWork(const std::vector<CBlockHeader>& headers, const Consensus::Params& consensusParams);
405
407bool IsBlockMutated(const CBlock& block, bool check_witness_root);
408
411
419
422{
423private:
425
426public:
427 explicit CVerifyDB(kernel::Notifications& notifications);
428 ~CVerifyDB();
429 [[nodiscard]] VerifyDBResult VerifyDB(
430 Chainstate& chainstate,
431 const Consensus::Params& consensus_params,
432 CCoinsView& coinsview,
433 int nCheckLevel,
434 int nCheckDepth) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
435};
436
438{
439 DISCONNECT_OK, // All good.
440 DISCONNECT_UNCLEAN, // Rolled back, but UTXO set was inconsistent with block.
441 DISCONNECT_FAILED // Something else went wrong.
443
444class ConnectTrace;
445
447enum class FlushStateMode {
448 NONE,
449 IF_NEEDED,
450 PERIODIC,
451 ALWAYS
452};
453
464
465public:
469
472
475 std::unique_ptr<CCoinsViewCache> m_cacheview GUARDED_BY(cs_main);
476
483 CoinsViews(DBParams db_params, CoinsViewOptions options);
484
486 void InitCache() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
487};
488
490{
492 CRITICAL = 2,
494 LARGE = 1,
495 OK = 0
496};
497
513{
514protected:
521
525
527 std::unique_ptr<CoinsViews> m_coins_views;
528
540 bool m_disabled GUARDED_BY(::cs_main) {false};
541
543 const CBlockIndex* m_cached_snapshot_base GUARDED_BY(::cs_main) {nullptr};
544
545public:
549
554
555 explicit Chainstate(
556 CTxMemPool* mempool,
557 node::BlockManager& blockman,
558 ChainstateManager& chainman,
559 std::optional<uint256> from_snapshot_blockhash = std::nullopt);
560
566
573 void InitCoinsDB(
574 size_t cache_size_bytes,
575 bool in_memory,
576 bool should_wipe,
577 fs::path leveldb_name = "chainstate");
578
581 void InitCoinsCache(size_t cache_size_bytes) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
582
585 bool CanFlushToDisk() const EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
586 {
588 return m_coins_views && m_coins_views->m_cacheview;
589 }
590
594
600 const std::optional<uint256> m_from_snapshot_blockhash;
601
607 const CBlockIndex* SnapshotBase() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
608
616 std::set<CBlockIndex*, node::CBlockIndexWorkComparator> setBlockIndexCandidates;
617
620 {
622 Assert(m_coins_views);
623 return *Assert(m_coins_views->m_cacheview);
624 }
625
628 {
630 return Assert(m_coins_views)->m_dbview;
631 }
632
635 {
636 return m_mempool;
637 }
638
642 {
644 return Assert(m_coins_views)->m_catcherview;
645 }
646
648 void ResetCoinsViews() { m_coins_views.reset(); }
649
651 bool HasCoinsViews() const { return (bool)m_coins_views; }
652
654 size_t m_coinsdb_cache_size_bytes{0};
655
657 size_t m_coinstip_cache_size_bytes{0};
658
661 bool ResizeCoinsCaches(size_t coinstip_size, size_t coinsdb_size)
663
675 bool FlushStateToDisk(
677 FlushStateMode mode,
678 int nManualPruneHeight = 0);
679
681 void ForceFlushStateToDisk();
682
685 void PruneAndFlush();
686
708 bool ActivateBestChain(
710 std::shared_ptr<const CBlock> pblock = nullptr)
711 EXCLUSIVE_LOCKS_REQUIRED(!m_chainstate_mutex)
713
714 // Block (dis)connection on a given view:
715 DisconnectResult DisconnectBlock(const CBlock& block, const CBlockIndex* pindex, CCoinsViewCache& view)
717 bool ConnectBlock(const CBlock& block, BlockValidationState& state, CBlockIndex* pindex,
718 CCoinsViewCache& view, bool fJustCheck = false) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
719
720 // Apply the effects of a block disconnection on the UTXO set.
721 bool DisconnectTip(BlockValidationState& state, DisconnectedBlockTransactions* disconnectpool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_mempool->cs);
722
723 // Manual block validity manipulation:
728 bool PreciousBlock(BlockValidationState& state, CBlockIndex* pindex)
729 EXCLUSIVE_LOCKS_REQUIRED(!m_chainstate_mutex)
731
733 bool InvalidateBlock(BlockValidationState& state, CBlockIndex* pindex)
734 EXCLUSIVE_LOCKS_REQUIRED(!m_chainstate_mutex)
736
738 void ResetBlockFailureFlags(CBlockIndex* pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
739
741 bool ReplayBlocks();
742
744 [[nodiscard]] bool NeedsRedownload() const EXCLUSIVE_LOCKS_REQUIRED(cs_main);
746 bool LoadGenesisBlock();
747
748 void TryAddBlockIndexCandidate(CBlockIndex* pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
749
750 void PruneBlockIndexCandidates();
751
752 void ClearBlockIndexCandidates() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
753
755 const CBlockIndex* FindForkInGlobalIndex(const CBlockLocator& locator) const EXCLUSIVE_LOCKS_REQUIRED(cs_main);
756
758 bool LoadChainTip() EXCLUSIVE_LOCKS_REQUIRED(cs_main);
759
763 CoinsCacheSizeState GetCoinsCacheSizeState() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
764
765 CoinsCacheSizeState GetCoinsCacheSizeState(
766 size_t max_coins_cache_size_bytes,
767 size_t max_mempool_size_bytes) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
768
769 std::string ToString() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
770
772 RecursiveMutex* MempoolMutex() const LOCK_RETURNED(m_mempool->cs)
773 {
774 return m_mempool ? &m_mempool->cs : nullptr;
775 }
776
777private:
778 bool ActivateBestChainStep(BlockValidationState& state, CBlockIndex* pindexMostWork, const std::shared_ptr<const CBlock>& pblock, bool& fInvalidFound, ConnectTrace& connectTrace) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_mempool->cs);
779 bool ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew, const std::shared_ptr<const CBlock>& pblock, ConnectTrace& connectTrace, DisconnectedBlockTransactions& disconnectpool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_mempool->cs);
780
781 void InvalidBlockFound(CBlockIndex* pindex, const BlockValidationState& state) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
782 CBlockIndex* FindMostWorkChain() EXCLUSIVE_LOCKS_REQUIRED(cs_main);
783
784 bool RollforwardBlock(const CBlockIndex* pindex, CCoinsViewCache& inputs) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
785
786 void CheckForkWarningConditions() EXCLUSIVE_LOCKS_REQUIRED(cs_main);
787 void InvalidChainFound(CBlockIndex* pindexNew) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
788
802 void MaybeUpdateMempoolForReorg(
803 DisconnectedBlockTransactions& disconnectpool,
804 bool fAddToMempool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_mempool->cs);
805
807 void UpdateTip(const CBlockIndex* pindexNew)
809
810 SteadyClock::time_point m_last_write{};
811 SteadyClock::time_point m_last_flush{};
812
817 [[nodiscard]] util::Result<void> InvalidateCoinsDBOnDisk() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
818
820};
821
823 SUCCESS,
824 SKIPPED,
825
826 // Expected assumeutxo configuration data is not found for the height of the
827 // base block.
829
830 // Failed to generate UTXO statistics (to check UTXO set hash) for the background
831 // chainstate.
833
834 // The UTXO set hash of the background validation chainstate does not match
835 // the one expected by assumeutxo chainparams.
837
838 // The blockhash of the current tip of the background validation chainstate does
839 // not match the one expected by the snapshot chainstate.
841};
842
871{
872private:
889 std::unique_ptr<Chainstate> m_ibd_chainstate GUARDED_BY(::cs_main);
890
901 std::unique_ptr<Chainstate> m_snapshot_chainstate GUARDED_BY(::cs_main);
902
905 Chainstate* m_active_chainstate GUARDED_BY(::cs_main) {nullptr};
906
907 CBlockIndex* m_best_invalid GUARDED_BY(::cs_main){nullptr};
908
910 CBlockIndex* m_last_notified_header GUARDED_BY(GetMutex()){nullptr};
911
912 bool NotifyHeaderTip() LOCKS_EXCLUDED(GetMutex());
913
921 [[nodiscard]] util::Result<void> PopulateAndValidateSnapshot(
922 Chainstate& snapshot_chainstate,
923 AutoFile& coins_file,
924 const node::SnapshotMetadata& metadata);
925
933 bool AcceptBlockHeader(
934 const CBlockHeader& block,
936 CBlockIndex** ppindex,
937 bool min_pow_checked) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
939
941 std::chrono::time_point<std::chrono::steady_clock> m_last_presync_update GUARDED_BY(::cs_main) {};
942
943 std::array<ThresholdConditionCache, VERSIONBITS_NUM_BITS> m_warningcache GUARDED_BY(::cs_main);
944
951 return cs && !cs->m_disabled;
952 }
953
956
959 SteadyClock::duration GUARDED_BY(::cs_main) time_check{};
960 SteadyClock::duration GUARDED_BY(::cs_main) time_forks{};
961 SteadyClock::duration GUARDED_BY(::cs_main) time_connect{};
962 SteadyClock::duration GUARDED_BY(::cs_main) time_verify{};
963 SteadyClock::duration GUARDED_BY(::cs_main) time_undo{};
964 SteadyClock::duration GUARDED_BY(::cs_main) time_index{};
965 SteadyClock::duration GUARDED_BY(::cs_main) time_total{};
966 int64_t GUARDED_BY(::cs_main) num_blocks_total{0};
967 SteadyClock::duration GUARDED_BY(::cs_main) time_connect_total{};
968 SteadyClock::duration GUARDED_BY(::cs_main) time_flush{};
969 SteadyClock::duration GUARDED_BY(::cs_main) time_chainstate{};
970 SteadyClock::duration GUARDED_BY(::cs_main) time_post_connect{};
971
972public:
974
975 explicit ChainstateManager(const util::SignalInterrupt& interrupt, Options options, node::BlockManager::Options blockman_options);
976
979 std::function<void()> snapshot_download_completed = std::function<void()>();
980
981 const CChainParams& GetParams() const { return m_options.chainparams; }
982 const Consensus::Params& GetConsensus() const { return m_options.chainparams.GetConsensus(); }
983 bool ShouldCheckBlockIndex() const;
984 const arith_uint256& MinimumChainWork() const { return *Assert(m_options.minimum_chain_work); }
985 const uint256& AssumedValidBlock() const { return *Assert(m_options.assumed_valid_block); }
986 kernel::Notifications& GetNotifications() const { return m_options.notifications; };
987
993 void CheckBlockIndex();
994
1006 RecursiveMutex& GetMutex() const LOCK_RETURNED(::cs_main) { return ::cs_main; }
1007
1010 std::thread m_thread_load;
1014
1016
1024 mutable std::atomic<bool> m_cached_finished_ibd{false};
1025
1031 int32_t nBlockSequenceId GUARDED_BY(::cs_main) = 1;
1033 int32_t nBlockReverseSequenceId = -1;
1035 arith_uint256 nLastPreciousChainwork = 0;
1036
1037 // Reset the memory-only sequence counters we use to track block arrival
1038 // (used by tests to reset state)
1040 {
1042 nBlockSequenceId = 1;
1043 nBlockReverseSequenceId = -1;
1044 }
1045
1046
1066 std::set<CBlockIndex*> m_failed_blocks;
1067
1069 CBlockIndex* m_best_header GUARDED_BY(::cs_main){nullptr};
1070
1073 int64_t m_total_coinstip_cache{0};
1074 //
1077 int64_t m_total_coinsdb_cache{0};
1078
1082 // constructor
1083 Chainstate& InitializeChainstate(CTxMemPool* mempool) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1084
1086 std::vector<Chainstate*> GetAll();
1087
1100 [[nodiscard]] util::Result<CBlockIndex*> ActivateSnapshot(
1101 AutoFile& coins_file, const node::SnapshotMetadata& metadata, bool in_memory);
1102
1110 SnapshotCompletionResult MaybeCompleteSnapshotValidation() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1111
1113 const CBlockIndex* GetSnapshotBaseBlock() const EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1114
1116 Chainstate& ActiveChainstate() const;
1117 CChain& ActiveChain() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex()) { return ActiveChainstate().m_chain; }
1118 int ActiveHeight() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex()) { return ActiveChain().Height(); }
1119 CBlockIndex* ActiveTip() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex()) { return ActiveChain().Tip(); }
1120
1123 return IsUsable(m_snapshot_chainstate.get()) && IsUsable(m_ibd_chainstate.get());
1124 }
1125
1128 return BackgroundSyncInProgress() ? m_ibd_chainstate->m_chain.Tip() : nullptr;
1129 }
1130
1132 {
1134 return m_blockman.m_block_index;
1135 }
1136
1141
1144 bool IsSnapshotActive() const;
1145
1146 std::optional<uint256> SnapshotBlockhash() const;
1147
1150 {
1151 return m_snapshot_chainstate && m_ibd_chainstate && m_ibd_chainstate->m_disabled;
1152 }
1153
1155 bool IsInitialBlockDownload() const;
1156
1184 AutoFile& file_in,
1185 FlatFilePos* dbp = nullptr,
1186 std::multimap<uint256, FlatFilePos>* blocks_with_unknown_parent = nullptr);
1187
1212 bool ProcessNewBlock(const std::shared_ptr<const CBlock>& block, bool force_processing, bool min_pow_checked, bool* new_block) LOCKS_EXCLUDED(cs_main);
1213
1225 bool ProcessNewBlockHeaders(const std::vector<CBlockHeader>& block, bool min_pow_checked, BlockValidationState& state, const CBlockIndex** ppindex = nullptr) LOCKS_EXCLUDED(cs_main);
1226
1246 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);
1247
1248 void ReceivedBlockTransactions(const CBlock& block, CBlockIndex* pindexNew, const FlatFilePos& pos) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
1249
1256 [[nodiscard]] MempoolAcceptResult ProcessTransaction(const CTransactionRef& tx, bool test_accept=false)
1258
1260 bool LoadBlockIndex() EXCLUSIVE_LOCKS_REQUIRED(cs_main);
1261
1264 void MaybeRebalanceCaches() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1265
1267 void UpdateUncommittedBlockStructures(CBlock& block, const CBlockIndex* pindexPrev) const;
1268
1270 std::vector<unsigned char> GenerateCoinbaseCommitment(CBlock& block, const CBlockIndex* pindexPrev) const;
1271
1276 void ReportHeadersPresync(const arith_uint256& work, int64_t height, int64_t timestamp);
1277
1280 bool DetectSnapshotChainstate() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1281
1282 void ResetChainstates() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1283
1286 [[nodiscard]] bool DeleteSnapshotChainstate() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1287
1290 Chainstate& ActivateExistingSnapshot(uint256 base_blockhash) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1291
1301 bool ValidatedSnapshotCleanup() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1302
1311 Chainstate& GetChainstateForIndexing() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1312
1316 std::pair<int, int> GetPruneRange(
1317 const Chainstate& chainstate, int last_height_can_prune) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1318
1321 std::optional<int> GetSnapshotBaseHeight() const EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
1322
1323 CCheckQueue<CScriptCheck>& GetCheckQueue() { return m_script_check_queue; }
1324
1326};
1327
1329template<typename DEP>
1330bool DeploymentActiveAfter(const CBlockIndex* pindexPrev, const ChainstateManager& chainman, DEP dep)
1331{
1332 return DeploymentActiveAfter(pindexPrev, chainman.GetConsensus(), dep, chainman.m_versionbitscache);
1333}
1334
1335template<typename DEP>
1336bool DeploymentActiveAt(const CBlockIndex& index, const ChainstateManager& chainman, DEP dep)
1337{
1338 return DeploymentActiveAt(index, chainman.GetConsensus(), dep, chainman.m_versionbitscache);
1339}
1340
1341template<typename DEP>
1342bool DeploymentEnabled(const ChainstateManager& chainman, DEP dep)
1343{
1344 return DeploymentEnabled(chainman.GetConsensus(), dep);
1345}
1346
1348bool IsBIP30Repeat(const CBlockIndex& block_index);
1349
1351bool IsBIP30Unspendable(const CBlockIndex& block_index);
1352
1353#endif // BITCOIN_VALIDATION_H
int64_t CAmount
Amount in satoshis (Can be negative)
Definition amount.h:12
const CChainParams & Params()
Return the currently selected parameters.
#define Assert(val)
Identity function.
Definition check.h:77
#define Assume(val)
Assume is the identity function.
Definition check.h:89
static void CheckBlockIndex(benchmark::Bench &bench)
Non-refcounted RAII wrapper for FILE*.
Definition streams.h:389
Nodes collect new transactions into a block, hash them into a hash tree, and scan through nonce value...
Definition block.h:22
Definition block.h:69
The block chain is a tree shaped structure starting with the genesis block at the root,...
Definition chain.h:141
An in-memory indexed chain of blocks.
Definition chain.h:417
CChainParams defines various tweakable parameters of a given instance of the Bitcoin system.
Definition chainparams.h:81
Queue for verifications that have to be performed.
Definition checkqueue.h:28
CCoinsView that adds a memory cache for transactions to another CCoinsView.
Definition coins.h:360
CCoinsView backed by the coin database (chainstate/)
Definition txdb.h:54
This is a minimally invasive approach to shutdown on LevelDB read errors from the chainstate,...
Definition coins.h:509
Abstract view on the open txout dataset.
Definition coins.h:304
Fee rate in satoshis per kilovirtualbyte: CAmount / kvB.
Definition feerate.h:33
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:336
CScriptCheck & operator=(CScriptCheck &&)=default
ScriptError GetScriptError() const
Definition validation.h:358
SignatureCache * m_signature_cache
Definition validation.h:345
CScriptCheck(const CScriptCheck &)=delete
PrecomputedTransactionData * txdata
Definition validation.h:344
CTxOut m_tx_out
Definition validation.h:338
CScriptCheck(CScriptCheck &&)=default
ScriptError error
Definition validation.h:343
unsigned int nFlags
Definition validation.h:341
CScriptCheck(const CTxOut &outIn, const CTransaction &txToIn, SignatureCache &signature_cache, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn, PrecomputedTransactionData *txdataIn)
Definition validation.h:348
const CTransaction * ptxTo
Definition validation.h:339
unsigned int nIn
Definition validation.h:340
CScriptCheck & operator=(const CScriptCheck &)=delete
The basic transaction that is broadcasted on the network and contained in blocks.
CTxMemPool stores valid-according-to-the-current-best-chain transactions that may be included in the ...
Definition txmempool.h:304
RecursiveMutex cs
This mutex needs to be locked when accessing mapTx or other members that are guarded by it.
Definition txmempool.h:390
An output of a transaction.
RAII wrapper for VerifyDB: Verify consistency of the block and coin databases.
Definition validation.h:422
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:424
CVerifyDB(kernel::Notifications &notifications)
Chainstate stores and provides an API to update our local knowledge of the current best chain.
Definition validation.h:513
Mutex m_chainstate_mutex
The ChainState Mutex A lock that must be held when modifying this ChainState - held in ActivateBestCh...
Definition validation.h:520
CChain m_chain
The current chain of blockheaders we consult and build on.
Definition validation.h:593
bool HasCoinsViews() const
Does this chainstate have a UTXO set attached?
Definition validation.h:651
CTxMemPool * GetMempool()
Definition validation.h:634
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:600
CTxMemPool * m_mempool
Optional mempool that is kept in sync with the chain.
Definition validation.h:524
bool m_disabled GUARDED_BY(::cs_main)
This toggle exists for use when doing background validation for UTXO snapshots.
Definition validation.h:540
CCoinsViewDB & CoinsDB() EXCLUSIVE_LOCKS_REQUIRED(
Definition validation.h:627
ChainstateManager & m_chainman
The chainstate manager that owns this chainstate.
Definition validation.h:553
std::unique_ptr< CoinsViews > m_coins_views
Manages the UTXO set, which is a reflection of the contents of m_chain.
Definition validation.h:527
void ResetCoinsViews()
Destructs all objects related to accessing the UTXO set.
Definition validation.h:648
node::BlockManager & m_blockman
Reference to a BlockManager instance which itself is shared across all Chainstate instances.
Definition validation.h:548
const CBlockIndex *m_cached_snapshot_base GUARDED_BY(::cs_main)
Cached result of LookupBlockIndex(*m_from_snapshot_blockhash)
Definition validation.h:543
CCoinsViewErrorCatcher & CoinsErrorCatcher() EXCLUSIVE_LOCKS_REQUIRED(
Definition validation.h:641
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
Definition validation.h:871
SteadyClock::duration GUARDED_BY(::cs_main) time_connect_total
Definition validation.h:967
std::unique_ptr< Chainstate > m_ibd_chainstate GUARDED_BY(::cs_main)
The chainstate used under normal operation (i.e.
const uint256 & AssumedValidBlock() const
Definition validation.h:985
node::BlockMap & BlockIndex() EXCLUSIVE_LOCKS_REQUIRED(
CBlockIndex *m_best_header GUARDED_BY(::cs_main)
Best header we've seen so far (used for getheaders queries' starting points).
ValidationCache m_validation_cache
int64_t GUARDED_BY(::cs_main) num_blocks_total
Definition validation.h:966
SteadyClock::duration GUARDED_BY(::cs_main) time_undo
Definition validation.h:963
SteadyClock::duration GUARDED_BY(::cs_main) time_index
Definition validation.h:964
const CBlockIndex * GetBackgroundSyncTip() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
The tip of the background sync chain.
SteadyClock::duration GUARDED_BY(::cs_main) time_post_connect
Definition validation.h:970
std::thread m_thread_load
kernel::Notifications & GetNotifications() const
Definition validation.h:986
SteadyClock::duration GUARDED_BY(::cs_main) time_check
Timers and counters used for benchmarking validation in both background and active chainstates.
Definition validation.h:959
RecursiveMutex & GetMutex() const LOCK_RETURNED(
Alias for cs_main.
SteadyClock::duration GUARDED_BY(::cs_main) time_total
Definition validation.h:965
SteadyClock::duration GUARDED_BY(::cs_main) time_chainstate
Definition validation.h:969
bool IsSnapshotValidated() const EXCLUSIVE_LOCKS_REQUIRED(
Is there a snapshot in use and has it been fully validated?
CCheckQueue< CScriptCheck > m_script_check_queue
A queue for script verifications that have to be performed by worker threads.
Definition validation.h:955
CBlockIndex * ActiveTip() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
CBlockIndex *m_best_invalid GUARDED_BY(::cs_main)
Definition validation.h:907
SteadyClock::duration GUARDED_BY(::cs_main) time_forks
Definition validation.h:960
bool BackgroundSyncInProgress() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
The state of a background sync (for net processing)
CBlockIndex *m_last_notified_header GUARDED_BY(GetMutex())
The last header for which a headerTip notification was issued.
Definition validation.h:910
const util::SignalInterrupt & m_interrupt
int ActiveHeight() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
VersionBitsCache m_versionbitscache
Track versionbit status.
const CChainParams & GetParams() const
Definition validation.h:981
const Consensus::Params & GetConsensus() const
Definition validation.h:982
const arith_uint256 & MinimumChainWork() const
Definition validation.h:984
const Options m_options
int32_t nBlockSequenceId GUARDED_BY(::cs_main)
Every received block is assigned a unique and increasing identifier, so we know which one to give pri...
std::array< ThresholdConditionCache, VERSIONBITS_NUM_BITS > m_warningcache GUARDED_BY(::cs_main)
SteadyClock::duration GUARDED_BY(::cs_main) time_verify
Definition validation.h:962
Chainstate *m_active_chainstate GUARDED_BY(::cs_main)
Points to either the ibd or snapshot chainstate; indicates our most-work chain.
Definition validation.h:905
Chainstate &InitializeChainstate(CTxMemPool *mempool) EXCLUSIVE_LOCKS_REQUIRED(std::vector< Chainstate * GetAll)()
Instantiate a new chainstate.
std::set< CBlockIndex * > m_failed_blocks
In order to efficiently track invalidity of headers, we keep the set of blocks which we tried to conn...
SteadyClock::duration GUARDED_BY(::cs_main) time_connect
Definition validation.h:961
bool IsUsable(const Chainstate *const cs) const EXCLUSIVE_LOCKS_REQUIRED(
Return true if a chainstate is considered usable.
Definition validation.h:950
std::unique_ptr< Chainstate > m_snapshot_chainstate GUARDED_BY(::cs_main)
A chainstate initialized on the basis of a UTXO snapshot.
void ResetBlockSequenceCounters() EXCLUSIVE_LOCKS_REQUIRED(
node::BlockManager m_blockman
A single BlockManager instance is shared across each constructed chainstate to avoid duplicating bloc...
SteadyClock::duration GUARDED_BY(::cs_main) time_flush
Definition validation.h:968
A convenience class for constructing the CCoinsView* hierarchy used to facilitate access to the UTXO ...
Definition validation.h:463
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.
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...
Used to track blocks whose transactions were applied to the UTXO state as a part of a single Activate...
cache implements a cache with properties similar to a cuckoo-set.
DisconnectedBlockTransactions.
Different type to mark Mutex at global scope.
Definition sync.h:140
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:122
BIP 9 allows multiple softforks to be deployed in parallel.
Definition versionbits.h:81
256-bit unsigned big integer.
A base class defining functions for notifying about certain kernel events.
Maintains a tree of blocks (stored in m_block_index) which is consulted to determine where the most-w...
Metadata describing a serialized version of a UTXO set from which an assumeutxo Chainstate can be con...
256-bit opaque blob.
Definition uint256.h:178
Helper class that manages an interrupt flag, and allows a thread or signal to interrupt another threa...
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
Definition cs_main.cpp:8
bool DeploymentActiveAfter(const CBlockIndex *pindexPrev, const Consensus::Params &params, Consensus::BuriedDeployment dep, VersionBitsCache &versionbitscache)
Determine if a deployment is active for the next block.
bool DeploymentEnabled(const Consensus::Params &params, Consensus::BuriedDeployment dep)
Determine if a deployment is enabled (can ever be active)
bool DeploymentActiveAt(const CBlockIndex &index, const Consensus::Params &params, Consensus::BuriedDeployment dep, VersionBitsCache &versionbitscache)
Determine if a deployment is active for this block.
ChainstateRole
This enum describes the various roles a specific Chainstate instance can take.
Definition chain.h:25
static void LoadExternalBlockFile(benchmark::Bench &bench)
The LoadExternalBlockFile() function is used during -reindex and -loadblock.
unsigned int nHeight
static void pool cs
Transaction validation functions.
Filesystem operations and types.
std::unordered_map< uint256, CBlockIndex, BlockHasher > BlockMap
std::vector< CTransactionRef > Package
A package is an ordered list of transactions.
Definition packages.h:50
std::shared_ptr< const CTransaction > CTransactionRef
enum ScriptError_t ScriptError
@ SCRIPT_ERR_UNKNOWN_ERROR
Holds configuration for use during UTXO snapshot load and validation.
Definition chainparams.h:47
Describes a place in the block chain to another node such that if the other node doesn't have the sam...
Definition block.h:124
Holds various statistics on transactions within a chain.
Definition chainparams.h:70
User-controlled performance and debug options.
Definition txdb.h:44
Parameters that influence chain consensus.
Definition params.h:74
Application-specific storage settings.
Definition dbwrapper.h:33
Validation result for a transaction evaluated by MemPoolAccept (single or package).
Definition validation.h:128
const std::optional< int64_t > m_vsize
Virtual size as used by the mempool, calculated using serialized size and sigops.
Definition validation.h:145
const ResultType m_result_type
Result type.
Definition validation.h:137
MempoolAcceptResult(int64_t vsize, CAmount fees)
Constructor for already-in-mempool case.
Definition validation.h:222
const std::optional< CAmount > m_base_fees
Raw base fees in satoshis.
Definition validation.h:147
MempoolAcceptResult(TxValidationState state)
Constructor for failure case.
Definition validation.h:194
const TxValidationState m_state
Contains information about why the transaction failed.
Definition validation.h:140
static MempoolAcceptResult MempoolTxDifferentWitness(const uint256 &other_wtxid)
Definition validation.h:187
ResultType
Used to indicate the results of mempool validation.
Definition validation.h:130
static MempoolAcceptResult Failure(TxValidationState state)
Definition validation.h:164
static MempoolAcceptResult FeeFailure(TxValidationState state, CFeeRate effective_feerate, const std::vector< Wtxid > &wtxids_fee_calculations)
Definition validation.h:168
const std::optional< CFeeRate > m_effective_feerate
The feerate at which this transaction was considered.
Definition validation.h:153
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:200
const std::optional< uint256 > m_other_wtxid
The wtxid of the transaction in the mempool which has the same txid but different witness.
Definition validation.h:162
const std::list< CTransactionRef > m_replaced_transactions
Mempool transactions replaced by the tx.
Definition validation.h:143
static MempoolAcceptResult MempoolTx(int64_t vsize, CAmount fees)
Definition validation.h:183
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:174
MempoolAcceptResult(TxValidationState state, CFeeRate effective_feerate, const std::vector< Wtxid > &wtxids_fee_calculations)
Constructor for fee-related failure case.
Definition validation.h:213
const std::optional< std::vector< Wtxid > > m_wtxids_fee_calculations
Contains the wtxids of the transactions used for fee-related checks.
Definition validation.h:159
MempoolAcceptResult(const uint256 &other_wtxid)
Constructor for witness-swapped case.
Definition validation.h:226
Validation result for package mempool acceptance.
Definition validation.h:234
PackageValidationState m_state
Definition validation.h:235
PackageMempoolAcceptResult(PackageValidationState state, std::map< uint256, MempoolAcceptResult > &&results)
Definition validation.h:244
PackageMempoolAcceptResult(const uint256 &wtxid, const MempoolAcceptResult &result)
Constructor to create a PackageMempoolAcceptResult from a single MempoolAcceptResult.
Definition validation.h:253
std::map< uint256, MempoolAcceptResult > m_tx_results
Map from wtxid to finished MempoolAcceptResults.
Definition validation.h:242
PackageMempoolAcceptResult(PackageValidationState state, CFeeRate feerate, std::map< uint256, MempoolAcceptResult > &&results)
Definition validation.h:248
Bilingual messages:
Definition translation.h:18
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...
#define AssertLockHeld(cs)
Definition sync.h:142
#define EXCLUSIVE_LOCKS_REQUIRED(...)
#define GUARDED_BY(x)
#define LOCKS_EXCLUDED(...)
#define LOCK_RETURNED(x)
std::chrono::steady_clock SteadyClock
Definition time.h:25
bool CheckFinalTxAtTip(const CBlockIndex &active_chain_tip, const CTransaction &tx)
bool IsBIP30Unspendable(const CBlockIndex &block_index)
Identifies blocks which coinbase output was subsequently overwritten in the UTXO set (see BIP30)
bool IsBIP30Repeat(const CBlockIndex &block_index)
Identifies blocks that overwrote an existing coinbase output in the UTXO set (see BIP30)
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).
GlobalMutex g_best_block_mutex
std::condition_variable g_best_block_cv
static constexpr int DEFAULT_CHECKLEVEL
Definition validation.h:70
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:314
double GuessVerificationProgress(const ChainTxData &data, const CBlockIndex *pindex)
Guess verification progress (as a fraction between 0.0=genesis and 1.0=current tip).
static const uint64_t MIN_DISK_SPACE_FOR_BLOCK_FILES
Definition validation.h:79
CAmount GetBlockSubsidy(int nHeight, const Consensus::Params &consensusParams)
bool CheckSequenceLocksAtTip(CBlockIndex *tip, const LockPoints &lock_points)
Check if transaction will be BIP68 final in the next block to be created on top of tip.
bool FatalError(kernel::Notifications &notifications, BlockValidationState &state, const bilingual_str &message)
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:68
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 HasValidProofOfWork(const std::vector< CBlockHeader > &headers, const Consensus::Params &consensusParams)
Check with the proof of work on each blockheader matches the value in nBits.
SnapshotCompletionResult
Definition validation.h:822
SynchronizationState
Current sync state passed to tip changed callbacks.
Definition validation.h:82
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.
VerifyDBResult
Definition validation.h:412
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'.
void PruneBlockFilesManual(Chainstate &active_chainstate, int nManualPruneHeight)
Prune block files up to a given height.
CoinsCacheSizeState
Definition validation.h:490
@ LARGE
The cache is at >= 90% capacity.
@ CRITICAL
The coins cache is in immediate need of a flush.
bool TestBlockValidity(BlockValidationState &state, const CChainParams &chainparams, Chainstate &chainstate, const CBlock &block, CBlockIndex *pindexPrev, bool fCheckPOW=true, bool fCheckMerkleRoot=true) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Check a block is completely valid from start to finish (only works on top of our current best block)
arith_uint256 CalculateClaimedHeadersWork(const std::vector< CBlockHeader > &headers)
Return the sum of the claimed work on a given set of headers.
static const signed int DEFAULT_CHECKBLOCKS
Definition validation.h:69
FlushStateMode
Definition validation.h:447
uint256 g_best_block
Used to notify getblocktemplate RPC of new tips.
DisconnectResult
Definition validation.h:438
@ DISCONNECT_FAILED
Definition validation.h:441
@ DISCONNECT_UNCLEAN
Definition validation.h:440
@ DISCONNECT_OK
Definition validation.h:439