Bitcoin ABC 0.34.2
P2P Digital Currency
validation.cpp
Go to the documentation of this file.
1// Copyright (c) 2009-2010 Satoshi Nakamoto
2// Copyright (c) 2009-2018 The Bitcoin Core developers
3// Copyright (c) 2017-2020 The Bitcoin developers
4// Distributed under the MIT software license, see the accompanying
5// file COPYING or http://www.opensource.org/licenses/mit-license.php.
6
7#include <validation.h>
8
9#include <kernel/chain.h>
10#include <kernel/chainparams.h>
11#include <kernel/coinstats.h>
14
15#include <arith_uint256.h>
16#include <avalanche/avalanche.h>
17#include <avalanche/processor.h>
18#include <blockvalidity.h>
19#include <chainparams.h>
20#include <checkpoints.h>
21#include <checkqueue.h>
22#include <config.h>
24#include <consensus/amount.h>
25#include <consensus/merkle.h>
26#include <consensus/tx_check.h>
27#include <consensus/tx_verify.h>
29#include <hash.h>
31#include <logging.h>
32#include <logging/timer.h>
33#include <minerfund.h>
34#include <node/blockstorage.h>
35#include <node/utxo_snapshot.h>
38#include <policy/block/rtt.h>
40#include <policy/policy.h>
41#include <policy/settings.h>
42#include <pow/pow.h>
43#include <primitives/block.h>
45#include <random.h>
46#include <reverse_iterator.h>
47#include <script/script.h>
48#include <script/scriptcache.h>
49#include <script/sigcache.h>
50#include <tinyformat.h>
51#include <txdb.h>
52#include <txmempool.h>
53#include <undo.h>
54#include <util/check.h>
55#include <util/fs.h>
56#include <util/fs_helpers.h>
58#include <util/strencodings.h>
59#include <util/string.h>
60#include <util/time.h>
61#include <util/trace.h>
62#include <util/translation.h>
63#include <validationinterface.h>
64#include <warnings.h>
65
66#include <algorithm>
67#include <atomic>
68#include <cassert>
69#include <chrono>
70#include <deque>
71#include <numeric>
72#include <optional>
73#include <string>
74#include <thread>
75#include <tuple>
76
81
84using node::BlockMap;
86
93static constexpr auto DATABASE_WRITE_INTERVAL_MIN{50min};
94static constexpr auto DATABASE_WRITE_INTERVAL_MAX{70min};
95const std::vector<std::string> CHECKLEVEL_DOC{
96 "level 0 reads the blocks from disk",
97 "level 1 verifies block validity",
98 "level 2 verifies undo data",
99 "level 3 checks disconnection of tip blocks",
100 "level 4 tries to reconnect the blocks",
101 "each level includes the checks of the previous levels",
102};
109static constexpr int PRUNE_LOCK_BUFFER{10};
110
111static constexpr uint64_t HEADERS_TIME_VERSION{1};
112
114std::condition_variable g_best_block_cv;
116
118 : excessiveBlockSize(config.GetMaxBlockSize()), checkPoW(true),
119 checkMerkleRoot(true) {}
120
121const CBlockIndex *
124
125 // Find the latest block common to locator and chain - we expect that
126 // locator.vHave is sorted descending by height.
127 for (const BlockHash &hash : locator.vHave) {
128 const CBlockIndex *pindex{m_blockman.LookupBlockIndex(hash)};
129 if (pindex) {
130 if (m_chain.Contains(pindex)) {
131 return pindex;
132 }
133 if (pindex->GetAncestor(m_chain.Height()) == m_chain.Tip()) {
134 return m_chain.Tip();
135 }
136 }
137 }
138 return m_chain.Genesis();
139}
140
141static uint32_t GetNextBlockScriptFlags(const CBlockIndex *pindex,
142 const ChainstateManager &chainman);
143
144namespace {
156std::optional<std::vector<int>> CalculatePrevHeights(const CBlockIndex &tip,
157 const CCoinsView &coins,
158 const CTransaction &tx) {
159 std::vector<int> prev_heights;
160 prev_heights.resize(tx.vin.size());
161 for (size_t i = 0; i < tx.vin.size(); ++i) {
162 if (auto coin{coins.GetCoin(tx.vin[i].prevout)}) {
163 // Assume all mempool transaction confirm in the next block.
164 prev_heights[i] = coin->GetHeight() == MEMPOOL_HEIGHT
165 ? tip.nHeight + 1
166 : coin->GetHeight();
167 } else {
168 LogPrintf("ERROR: %s: Missing input %d in transaction \'%s\'\n",
169 __func__, i, tx.GetHash().GetHex());
170 return std::nullopt;
171 }
172 }
173 return prev_heights;
174}
175} // namespace
176
177std::optional<LockPoints> CalculateLockPointsAtTip(CBlockIndex *tip,
178 const CCoinsView &coins_view,
179 const CTransaction &tx) {
180 assert(tip);
181
182 auto prev_heights{CalculatePrevHeights(*tip, coins_view, tx)};
183 if (!prev_heights.has_value()) {
184 return std::nullopt;
185 }
186
187 CBlockIndex next_tip;
188 next_tip.pprev = tip;
189 // When SequenceLocks() is called within ConnectBlock(), the height
190 // of the block *being* evaluated is what is used.
191 // Thus if we want to know if a transaction can be part of the
192 // *next* block, we need to use one more than
193 // active_chainstate.m_chain.Height()
194 next_tip.nHeight = tip->nHeight + 1;
195 const auto [min_height, min_time] = CalculateSequenceLocks(
196 tx, STANDARD_LOCKTIME_VERIFY_FLAGS, prev_heights.value(), next_tip);
197
198 return LockPoints{min_height, min_time};
199}
200
201bool CheckSequenceLocksAtTip(CBlockIndex *tip, const LockPoints &lock_points) {
202 assert(tip != nullptr);
203
204 CBlockIndex index;
205 index.pprev = tip;
206 // CheckSequenceLocksAtTip() uses active_chainstate.m_chain.Height()+1 to
207 // evaluate height based locks because when SequenceLocks() is called within
208 // ConnectBlock(), the height of the block *being* evaluated is what is
209 // used. Thus if we want to know if a transaction can be part of the *next*
210 // block, we need to use one more than active_chainstate.m_chain.Height()
211 index.nHeight = tip->nHeight + 1;
212
213 return EvaluateSequenceLocks(index, {lock_points.height, lock_points.time});
214}
215
216// Command-line argument "-replayprotectionactivationtime=<timestamp>" will
217// cause the node to switch to replay protected SigHash ForkID value when the
218// median timestamp of the previous 11 blocks is greater than or equal to
219// <timestamp>. Defaults to the pre-defined timestamp when not set.
220static bool
222 const CBlockIndex *pindexPrev,
223 const std::optional<int64_t> activation_time) {
224 if (pindexPrev == nullptr) {
225 return false;
226 }
227
228 return pindexPrev->GetMedianTimePast() >=
229 activation_time.value_or(params.sandersActivationTime);
230}
231
238 const CTransaction &tx, TxValidationState &state,
239 const CCoinsViewCache &view, const CTxMemPool &pool, const uint32_t flags,
240 PrecomputedTransactionData &txdata, ValidationCache &validation_cache,
241 int &nSigChecksOut, CCoinsViewCache &coins_tip)
245
246 assert(!tx.IsCoinBase());
247 for (const CTxIn &txin : tx.vin) {
248 const Coin &coin = view.AccessCoin(txin.prevout);
249
250 // This coin was checked in PreChecks and MemPoolAccept
251 // has been holding cs_main since then.
252 Assume(!coin.IsSpent());
253 if (coin.IsSpent()) {
254 return false;
255 }
256
257 // If the Coin is available, there are 2 possibilities:
258 // it is available in our current ChainstateActive UTXO set,
259 // or it's a UTXO provided by a transaction in our mempool.
260 // Ensure the scriptPubKeys in Coins from CoinsView are correct.
261 const CTransactionRef &txFrom = pool.get(txin.prevout.GetTxId());
262 if (txFrom) {
263 assert(txFrom->GetId() == txin.prevout.GetTxId());
264 assert(txFrom->vout.size() > txin.prevout.GetN());
265 assert(txFrom->vout[txin.prevout.GetN()] == coin.GetTxOut());
266 } else {
267 const Coin &coinFromUTXOSet = coins_tip.AccessCoin(txin.prevout);
268 assert(!coinFromUTXOSet.IsSpent());
269 assert(coinFromUTXOSet.GetTxOut() == coin.GetTxOut());
270 }
271 }
272
273 // Call CheckInputScripts() to cache signature and script validity against
274 // current tip consensus rules.
275 return CheckInputScripts(tx, state, view, flags, /*sigCacheStore=*/true,
276 /*scriptCacheStore=*/true, txdata,
277 validation_cache, nSigChecksOut);
278}
279
280namespace {
281
282class MemPoolAccept {
283public:
284 MemPoolAccept(CTxMemPool &mempool, Chainstate &active_chainstate)
285 : m_pool(mempool), m_view(&m_dummy),
286 m_viewmempool(&active_chainstate.CoinsTip(), m_pool),
287 m_active_chainstate(active_chainstate) {}
288
289 // We put the arguments we're handed into a struct, so we can pass them
290 // around easier.
291 struct ATMPArgs {
292 const Config &m_config;
293 const int64_t m_accept_time;
294 const bool m_bypass_limits;
295 /*
296 * Return any outpoints which were not previously present in the coins
297 * cache, but were added as a result of validating the tx for mempool
298 * acceptance. This allows the caller to optionally remove the cache
299 * additions if the associated transaction ends up being rejected by
300 * the mempool.
301 */
302 std::vector<COutPoint> &m_coins_to_uncache;
303 const bool m_test_accept;
304 const unsigned int m_heightOverride;
310 const bool m_package_submission;
316 const bool m_package_feerates;
317
319 static ATMPArgs SingleAccept(const Config &config, int64_t accept_time,
320 bool bypass_limits,
321 std::vector<COutPoint> &coins_to_uncache,
322 bool test_accept,
323 unsigned int heightOverride) {
324 return ATMPArgs{
325 config,
326 accept_time,
327 bypass_limits,
328 coins_to_uncache,
329 test_accept,
330 heightOverride,
331 /*package_submission=*/false,
332 /*package_feerates=*/false,
333 };
334 }
335
340 static ATMPArgs
341 PackageTestAccept(const Config &config, int64_t accept_time,
342 std::vector<COutPoint> &coins_to_uncache) {
343 return ATMPArgs{
344 config,
345 accept_time,
346 /*bypass_limits=*/false,
347 coins_to_uncache,
348 /*test_accept=*/true,
349 /*height_override=*/0,
350 // not submitting to mempool
351 /*package_submission=*/false,
352 /*package_feerates=*/false,
353 };
354 }
355
357 static ATMPArgs
358 PackageChildWithParents(const Config &config, int64_t accept_time,
359 std::vector<COutPoint> &coins_to_uncache) {
360 return ATMPArgs{
361 config,
362 accept_time,
363 /*bypass_limits=*/false,
364 coins_to_uncache,
365 /*test_accept=*/false,
366 /*height_override=*/0,
367 /*package_submission=*/true,
368 /*package_feerates=*/true,
369 };
370 }
371
373 static ATMPArgs SingleInPackageAccept(const ATMPArgs &package_args) {
374 return ATMPArgs{
375 /*config=*/package_args.m_config,
376 /*accept_time=*/package_args.m_accept_time,
377 /*bypass_limits=*/false,
378 /*coins_to_uncache=*/package_args.m_coins_to_uncache,
379 /*test_accept=*/package_args.m_test_accept,
380 /*height_override=*/package_args.m_heightOverride,
381 // do not LimitMempoolSize in Finalize()
382 /*package_submission=*/true,
383 // only 1 transaction
384 /*package_feerates=*/false,
385 };
386 }
387
388 private:
389 // Private ctor to avoid exposing details to clients and allowing the
390 // possibility of mixing up the order of the arguments. Use static
391 // functions above instead.
392 ATMPArgs(const Config &config, int64_t accept_time, bool bypass_limits,
393 std::vector<COutPoint> &coins_to_uncache, bool test_accept,
394 unsigned int height_override, bool package_submission,
395 bool package_feerates)
396 : m_config{config}, m_accept_time{accept_time},
397 m_bypass_limits{bypass_limits},
398 m_coins_to_uncache{coins_to_uncache}, m_test_accept{test_accept},
399 m_heightOverride{height_override},
400 m_package_submission{package_submission},
401 m_package_feerates(package_feerates) {}
402 };
403
404 // Single transaction acceptance
405 MempoolAcceptResult AcceptSingleTransaction(const CTransactionRef &ptx,
406 ATMPArgs &args)
408
416 AcceptMultipleTransactions(const std::vector<CTransactionRef> &txns,
417 ATMPArgs &args)
419
433 AcceptSubPackage(const std::vector<CTransactionRef> &subpackage,
434 ATMPArgs &args)
436
442 PackageMempoolAcceptResult AcceptPackage(const Package &package,
443 ATMPArgs &args)
445
446private:
447 // All the intermediate state that gets passed between the various levels
448 // of checking a given transaction.
449 struct Workspace {
450 Workspace(const CTransactionRef &ptx,
451 const uint32_t next_block_script_verify_flags)
452 : m_ptx(ptx),
453 m_next_block_script_verify_flags(next_block_script_verify_flags) {
454 }
460 std::unique_ptr<CTxMemPoolEntry> m_entry;
461
466 int64_t m_vsize;
471 Amount m_base_fees;
472
477 Amount m_modified_fees;
478
485 CFeeRate m_package_feerate{Amount::zero()};
486
487 const CTransactionRef &m_ptx;
488 TxValidationState m_state;
494 PrecomputedTransactionData m_precomputed_txdata;
495
496 // ABC specific flags that are used in both PreChecks and
497 // ConsensusScriptChecks
498 const uint32_t m_next_block_script_verify_flags;
499 int m_sig_checks_standard;
500 };
501
502 // Run the policy checks on a given transaction, excluding any script
503 // checks. Looks up inputs, calculates feerate, considers replacement,
504 // evaluates package limits, etc. As this function can be invoked for "free"
505 // by a peer, only tests that are fast should be done here (to avoid CPU
506 // DoS).
507 bool PreChecks(ATMPArgs &args, Workspace &ws)
509
510 // Re-run the script checks, using consensus flags, and try to cache the
511 // result in the scriptcache. This should be done after
512 // PolicyScriptChecks(). This requires that all inputs either be in our
513 // utxo set or in the mempool.
514 bool ConsensusScriptChecks(const ATMPArgs &args, Workspace &ws)
516
517 // Try to add the transaction to the mempool, removing any conflicts first.
518 // Returns true if the transaction is in the mempool after any size
519 // limiting is performed, false otherwise.
520 bool Finalize(const ATMPArgs &args, Workspace &ws)
522
523 // Submit all transactions to the mempool and call ConsensusScriptChecks to
524 // add to the script cache - should only be called after successful
525 // validation of all transactions in the package.
526 // Does not call LimitMempoolSize(), so mempool max_size_bytes may be
527 // temporarily exceeded.
528 bool SubmitPackage(const ATMPArgs &args, std::vector<Workspace> &workspaces,
529 PackageValidationState &package_state,
530 std::map<TxId, MempoolAcceptResult> &results)
532
533 // Compare a package's feerate against minimum allowed.
534 bool CheckFeeRate(size_t package_size, size_t package_vsize,
535 Amount package_fee, TxValidationState &state)
538 AssertLockHeld(m_pool.cs);
539
540 const Amount mempoolRejectFee =
541 m_pool.GetMinFee().GetFee(package_vsize);
542
543 if (mempoolRejectFee > Amount::zero() &&
544 package_fee < mempoolRejectFee) {
545 return state.Invalid(
547 "mempool min fee not met",
548 strprintf("%d < %d", package_fee, mempoolRejectFee));
549 }
550
551 // Do not change this to use virtualsize without coordinating a network
552 // policy upgrade.
553 if (package_fee <
554 m_pool.m_opts.min_relay_feerate.GetFee(package_size)) {
555 return state.Invalid(
557 "min relay fee not met",
558 strprintf(
559 "%d < %d", package_fee,
560 m_pool.m_opts.min_relay_feerate.GetFee(package_size)));
561 }
562
563 return true;
564 }
565
566 ValidationCache &GetValidationCache() {
567 return m_active_chainstate.m_chainman.m_validation_cache;
568 }
569
570private:
571 CTxMemPool &m_pool;
572 CCoinsViewCache m_view;
573 CCoinsViewMemPool m_viewmempool;
574 CCoinsView m_dummy;
575
576 Chainstate &m_active_chainstate;
577};
578
579bool MemPoolAccept::PreChecks(ATMPArgs &args, Workspace &ws) {
581 AssertLockHeld(m_pool.cs);
582 const CTransactionRef &ptx = ws.m_ptx;
583 const CTransaction &tx = *ws.m_ptx;
584 const TxId &txid = ws.m_ptx->GetId();
585
586 // Copy/alias what we need out of args
587 const int64_t nAcceptTime = args.m_accept_time;
588 const bool bypass_limits = args.m_bypass_limits;
589 std::vector<COutPoint> &coins_to_uncache = args.m_coins_to_uncache;
590 const unsigned int heightOverride = args.m_heightOverride;
591
592 // Alias what we need out of ws
593 TxValidationState &state = ws.m_state;
594 // Coinbase is only valid in a block, not as a loose transaction.
595 if (!CheckRegularTransaction(tx, state)) {
596 // state filled in by CheckRegularTransaction.
597 return false;
598 }
599
600 // Rather not work on nonstandard transactions (unless -testnet)
601 std::string reason;
602 if (m_pool.m_opts.require_standard &&
603 !IsStandardTx(tx, m_pool.m_opts.max_datacarrier_bytes,
604 m_pool.m_opts.permit_bare_multisig,
605 m_pool.m_opts.dust_relay_feerate, reason)) {
606 return state.Invalid(TxValidationResult::TX_NOT_STANDARD, reason);
607 }
608
609 // Only accept nLockTime-using transactions that can be mined in the next
610 // block; we don't want our mempool filled up with transactions that can't
611 // be mined yet.
612 TxValidationState ctxState;
614 *Assert(m_active_chainstate.m_chain.Tip()),
615 args.m_config.GetChainParams().GetConsensus(), tx, ctxState)) {
616 // We copy the state from a dummy to ensure we don't increase the
617 // ban score of peer for transaction that could be valid in the future.
619 ctxState.GetRejectReason(),
620 ctxState.GetDebugMessage());
621 }
622
623 // Is it already in the memory pool?
624 if (m_pool.exists(txid)) {
626 "txn-already-in-mempool");
627 }
628
629 // Check for conflicts with in-memory transactions
630 for (const CTxIn &txin : tx.vin) {
631 if (const auto ptxConflicting = m_pool.GetConflictTx(txin.prevout)) {
632 if (m_pool.isAvalancheFinalizedPreConsensus(
633 ptxConflicting->GetId())) {
635 "finalized-tx-conflict");
636 }
637
638 return state.Invalid(
640 "txn-mempool-conflict");
641 }
642 }
643
644 m_view.SetBackend(m_viewmempool);
645
646 const CCoinsViewCache &coins_cache = m_active_chainstate.CoinsTip();
647 // Do all inputs exist?
648 for (const CTxIn &txin : tx.vin) {
649 if (!coins_cache.HaveCoinInCache(txin.prevout)) {
650 coins_to_uncache.push_back(txin.prevout);
651 }
652
653 // Note: this call may add txin.prevout to the coins cache
654 // (coins_cache.cacheCoins) by way of FetchCoin(). It should be
655 // removed later (via coins_to_uncache) if this tx turns out to be
656 // invalid.
657 if (!m_view.HaveCoin(txin.prevout)) {
658 // Are inputs missing because we already have the tx?
659 for (size_t out = 0; out < tx.vout.size(); out++) {
660 // Optimistically just do efficient check of cache for
661 // outputs.
662 if (coins_cache.HaveCoinInCache(COutPoint(txid, out))) {
664 "txn-already-known");
665 }
666 }
667
668 // Otherwise assume this might be an orphan tx for which we just
669 // haven't seen parents yet.
671 "bad-txns-inputs-missingorspent");
672 }
673 }
674
675 // Are the actual inputs available?
676 if (!m_view.HaveInputs(tx)) {
678 "bad-txns-inputs-spent");
679 }
680
681 // Bring the best block into scope.
682 m_view.GetBestBlock();
683
684 // we have all inputs cached now, so switch back to dummy (to protect
685 // against bugs where we pull more inputs from disk that miss being
686 // added to coins_to_uncache)
687 m_view.SetBackend(m_dummy);
688
689 assert(m_active_chainstate.m_blockman.LookupBlockIndex(
690 m_view.GetBestBlock()) == m_active_chainstate.m_chain.Tip());
691
692 // Only accept BIP68 sequence locked transactions that can be mined in
693 // the next block; we don't want our mempool filled up with transactions
694 // that can't be mined yet.
695 // Pass in m_view which has all of the relevant inputs cached. Note that,
696 // since m_view's backend was removed, it no longer pulls coins from the
697 // mempool.
698 const std::optional<LockPoints> lock_points{CalculateLockPointsAtTip(
699 m_active_chainstate.m_chain.Tip(), m_view, tx)};
700 if (!lock_points.has_value() ||
701 !CheckSequenceLocksAtTip(m_active_chainstate.m_chain.Tip(),
702 *lock_points)) {
704 "non-BIP68-final");
705 }
706
707 // The mempool holds txs for the next block, so pass height+1 to
708 // CheckTxInputs
709 if (!Consensus::CheckTxInputs(tx, state, m_view,
710 m_active_chainstate.m_chain.Height() + 1,
711 ws.m_base_fees)) {
712 // state filled in by CheckTxInputs
713 return false;
714 }
715
716 // Check for non-standard pay-to-script-hash in inputs
717 if (m_pool.m_opts.require_standard &&
718 !AreInputsStandard(tx, m_view, ws.m_next_block_script_verify_flags)) {
720 "bad-txns-nonstandard-inputs");
721 }
722
723 // ws.m_modified_fess includes any fee deltas from PrioritiseTransaction
724 ws.m_modified_fees = ws.m_base_fees;
725 m_pool.ApplyDelta(txid, ws.m_modified_fees);
726
727 unsigned int nSize = tx.GetTotalSize();
728
729 // Validate input scripts against standard script flags.
730 const uint32_t scriptVerifyFlags =
731 ws.m_next_block_script_verify_flags | STANDARD_SCRIPT_VERIFY_FLAGS;
732 ws.m_precomputed_txdata = PrecomputedTransactionData{tx};
733 if (!CheckInputScripts(tx, state, m_view, scriptVerifyFlags, true, false,
734 ws.m_precomputed_txdata, GetValidationCache(),
735 ws.m_sig_checks_standard)) {
736 // State filled in by CheckInputScripts
737 return false;
738 }
739
740 ws.m_entry = std::make_unique<CTxMemPoolEntry>(
741 ptx, ws.m_base_fees, nAcceptTime,
742 heightOverride ? heightOverride : m_active_chainstate.m_chain.Height(),
743 ws.m_sig_checks_standard, lock_points.value());
744
745 ws.m_vsize = ws.m_entry->GetTxVirtualSize();
746
747 // No individual transactions are allowed below the min relay feerate except
748 // from disconnected blocks. This requirement, unlike CheckFeeRate, cannot
749 // be bypassed using m_package_feerates because, while a tx could be package
750 // CPFP'd when entering the mempool, we do not have a DoS-resistant method
751 // of ensuring the tx remains bumped. For example, the fee-bumping child
752 // could disappear due to a replacement.
753 if (!bypass_limits &&
754 ws.m_modified_fees <
755 m_pool.m_opts.min_relay_feerate.GetFee(ws.m_ptx->GetTotalSize())) {
756 // Even though this is a fee-related failure, this result is
757 // TX_MEMPOOL_POLICY, not TX_PACKAGE_RECONSIDERABLE, because it cannot
758 // be bypassed using package validation.
759 return state.Invalid(
760 TxValidationResult::TX_MEMPOOL_POLICY, "min relay fee not met",
761 strprintf("%d < %d", ws.m_modified_fees,
762 m_pool.m_opts.min_relay_feerate.GetFee(nSize)));
763 }
764 // No individual transactions are allowed below the mempool min feerate
765 // except from disconnected blocks and transactions in a package. Package
766 // transactions will be checked using package feerate later.
767 if (!bypass_limits && !args.m_package_feerates &&
768 !CheckFeeRate(nSize, ws.m_vsize, ws.m_modified_fees, state)) {
769 return false;
770 }
771
772 return true;
773}
774
775bool MemPoolAccept::ConsensusScriptChecks(const ATMPArgs &args, Workspace &ws) {
777 AssertLockHeld(m_pool.cs);
778 const CTransaction &tx = *ws.m_ptx;
779 const TxId &txid = tx.GetId();
780 TxValidationState &state = ws.m_state;
781
782 // Check again against the next block's script verification flags
783 // to cache our script execution flags.
784 //
785 // This is also useful in case of bugs in the standard flags that cause
786 // transactions to pass as valid when they're actually invalid. For
787 // instance the STRICTENC flag was incorrectly allowing certain CHECKSIG
788 // NOT scripts to pass, even though they were invalid.
789 //
790 // There is a similar check in CreateNewBlock() to prevent creating
791 // invalid blocks (using TestBlockValidity), however allowing such
792 // transactions into the mempool can be exploited as a DoS attack.
793 int nSigChecksConsensus;
795 tx, state, m_view, m_pool, ws.m_next_block_script_verify_flags,
796 ws.m_precomputed_txdata, GetValidationCache(), nSigChecksConsensus,
797 m_active_chainstate.CoinsTip())) {
798 // This can occur under some circumstances, if the node receives an
799 // unrequested tx which is invalid due to new consensus rules not
800 // being activated yet (during IBD).
801 LogPrintf("BUG! PLEASE REPORT THIS! CheckInputScripts failed against "
802 "latest-block but not STANDARD flags %s, %s\n",
803 txid.ToString(), state.ToString());
804 return Assume(false);
805 }
806
807 if (ws.m_sig_checks_standard != nSigChecksConsensus) {
808 // We can't accept this transaction as we've used the standard count
809 // for the mempool/mining, but the consensus count will be enforced
810 // in validation (we don't want to produce bad block templates).
811 LogError(
812 "%s: BUG! PLEASE REPORT THIS! SigChecks count differed between "
813 "standard and consensus flags in %s\n",
814 __func__, txid.ToString());
815 return false;
816 }
817 return true;
818}
819
820bool MemPoolAccept::Finalize(const ATMPArgs &args, Workspace &ws) {
822 AssertLockHeld(m_pool.cs);
823 const TxId &txid = ws.m_ptx->GetId();
824 TxValidationState &state = ws.m_state;
825 const bool bypass_limits = args.m_bypass_limits;
826
827 // Store transaction in memory
828 CTxMemPoolEntry *pentry = ws.m_entry.release();
829 auto entry = CTxMemPoolEntryRef::acquire(pentry);
830 m_pool.addUnchecked(entry);
831
832 auto spentCoins = GetSpentCoins(ws.m_ptx, m_view);
833 Assume(spentCoins.has_value());
834
835 if (m_pool.m_opts.signals) {
836 m_pool.m_opts.signals->TransactionAddedToMempool(
837 ws.m_ptx,
838 // Spent coins should never be null, but better be safe than sorry.
839 spentCoins.has_value() ? std::make_shared<const std::vector<Coin>>(
840 std::move(*spentCoins))
841 : nullptr,
842 m_pool.GetAndIncrementSequence());
843 }
844
845 // Trim mempool and check if tx was trimmed.
846 // If we are validating a package, don't trim here because we could evict a
847 // previous transaction in the package. LimitMempoolSize() should be called
848 // at the very end to make sure the mempool is still within limits and
849 // package submission happens atomically.
850 if (!args.m_package_submission && !bypass_limits) {
851 m_pool.LimitSize(m_active_chainstate.CoinsTip());
852 if (!m_pool.exists(txid)) {
853 // The tx no longer meets our (new) mempool minimum feerate but
854 // could be reconsidered in a package.
856 "mempool full");
857 }
858 }
859 return true;
860}
861
862bool MemPoolAccept::SubmitPackage(
863 const ATMPArgs &args, std::vector<Workspace> &workspaces,
864 PackageValidationState &package_state,
865 std::map<TxId, MempoolAcceptResult> &results) {
867 AssertLockHeld(m_pool.cs);
868 // Sanity check: none of the transactions should be in the mempool.
869 assert(std::all_of(
870 workspaces.cbegin(), workspaces.cend(),
871 [this](const auto &ws) { return !m_pool.exists(ws.m_ptx->GetId()); }));
872
873 bool all_submitted = true;
874 // ConsensusScriptChecks adds to the script cache and is therefore
875 // consensus-critical; CheckInputsFromMempoolAndCache asserts that
876 // transactions only spend coins available from the mempool or UTXO set.
877 // Submit each transaction to the mempool immediately after calling
878 // ConsensusScriptChecks to make the outputs available for subsequent
879 // transactions.
880 for (Workspace &ws : workspaces) {
881 if (!ConsensusScriptChecks(args, ws)) {
882 results.emplace(ws.m_ptx->GetId(),
883 MempoolAcceptResult::Failure(ws.m_state));
884 // Since PreChecks() passed, this should never fail.
885 all_submitted = false;
886 package_state.Invalid(
888 strprintf("BUG! PolicyScriptChecks succeeded but "
889 "ConsensusScriptChecks failed: %s",
890 ws.m_ptx->GetId().ToString()));
891 }
892
893 // If we call LimitMempoolSize() for each individual Finalize(), the
894 // mempool will not take the transaction's descendant feerate into
895 // account because it hasn't seen them yet. Also, we risk evicting a
896 // transaction that a subsequent package transaction depends on.
897 // Instead, allow the mempool to temporarily bypass limits, the maximum
898 // package size) while submitting transactions individually and then
899 // trim at the very end.
900 if (!Finalize(args, ws)) {
901 results.emplace(ws.m_ptx->GetId(),
902 MempoolAcceptResult::Failure(ws.m_state));
903 // Since LimitMempoolSize() won't be called, this should never fail.
904 all_submitted = false;
906 strprintf("BUG! Adding to mempool failed: %s",
907 ws.m_ptx->GetId().ToString()));
908 }
909 }
910
911 // It may or may not be the case that all the transactions made it into the
912 // mempool. Regardless, make sure we haven't exceeded max mempool size.
913 m_pool.LimitSize(m_active_chainstate.CoinsTip());
914
915 std::vector<TxId> all_package_txids;
916 all_package_txids.reserve(workspaces.size());
917 std::transform(workspaces.cbegin(), workspaces.cend(),
918 std::back_inserter(all_package_txids),
919 [](const auto &ws) { return ws.m_ptx->GetId(); });
920
921 // Add successful results. The returned results may change later if
922 // LimitMempoolSize() evicts them.
923 for (Workspace &ws : workspaces) {
924 const auto effective_feerate =
925 args.m_package_feerates
926 ? ws.m_package_feerate
927 : CFeeRate{ws.m_modified_fees,
928 static_cast<int32_t>(ws.m_vsize)};
929 const auto effective_feerate_txids =
930 args.m_package_feerates ? all_package_txids
931 : std::vector<TxId>({ws.m_ptx->GetId()});
932 results.emplace(ws.m_ptx->GetId(),
933 MempoolAcceptResult::Success(ws.m_vsize, ws.m_base_fees,
934 effective_feerate,
935 effective_feerate_txids));
936 }
937 return all_submitted;
938}
939
941MemPoolAccept::AcceptSingleTransaction(const CTransactionRef &ptx,
942 ATMPArgs &args) {
944 // mempool "read lock" (held through
945 // m_pool.m_opts.signals->TransactionAddedToMempool())
946 LOCK(m_pool.cs);
947
948 const CBlockIndex *tip = m_active_chainstate.m_chain.Tip();
949
950 Workspace ws(ptx,
951 GetNextBlockScriptFlags(tip, m_active_chainstate.m_chainman));
952
953 const std::vector<TxId> single_txid{ws.m_ptx->GetId()};
954
955 // Perform the inexpensive checks first and avoid hashing and signature
956 // verification unless those checks pass, to mitigate CPU exhaustion
957 // denial-of-service attacks.
958 if (!PreChecks(args, ws)) {
959 if (ws.m_state.GetResult() ==
961 // Failed for fee reasons. Provide the effective feerate and which
962 // tx was included.
964 ws.m_state, CFeeRate(ws.m_modified_fees, ws.m_vsize),
965 single_txid);
966 }
967 return MempoolAcceptResult::Failure(ws.m_state);
968 }
969
970 if (!ConsensusScriptChecks(args, ws)) {
971 return MempoolAcceptResult::Failure(ws.m_state);
972 }
973
974 const TxId txid = ptx->GetId();
975
976 // Mempool sanity check -- in our new mempool no tx can be added if its
977 // outputs are already spent in the mempool (that is, no children before
978 // parents allowed; the mempool must be consistent at all times).
979 //
980 // This means that on reorg, the disconnectpool *must* always import
981 // the existing mempool tx's, clear the mempool, and then re-add
982 // remaining tx's in topological order via this function. Our new mempool
983 // has fast adds, so this is ok.
984 if (auto it = m_pool.mapNextTx.lower_bound(COutPoint{txid, 0});
985 it != m_pool.mapNextTx.end() && it->first->GetTxId() == txid) {
986 LogPrintf("%s: BUG! PLEASE REPORT THIS! Attempt to add txid %s, but "
987 "its outputs are already spent in the "
988 "mempool\n",
989 __func__, txid.ToString());
991 "txn-child-before-parent");
992 return MempoolAcceptResult::Failure(ws.m_state);
993 }
994
995 const CFeeRate effective_feerate{ws.m_modified_fees,
996 static_cast<int32_t>(ws.m_vsize)};
997 // Tx was accepted, but not added
998 if (args.m_test_accept) {
999 return MempoolAcceptResult::Success(ws.m_vsize, ws.m_base_fees,
1000 effective_feerate, single_txid);
1001 }
1002
1003 if (!Finalize(args, ws)) {
1004 // The only possible failure reason is fee-related (mempool full).
1005 // Failed for fee reasons. Provide the effective feerate and which txns
1006 // were included.
1007 Assume(ws.m_state.GetResult() ==
1010 ws.m_state, CFeeRate(ws.m_modified_fees, ws.m_vsize), single_txid);
1011 }
1012
1013 return MempoolAcceptResult::Success(ws.m_vsize, ws.m_base_fees,
1014 effective_feerate, single_txid);
1015}
1016
1017PackageMempoolAcceptResult MemPoolAccept::AcceptMultipleTransactions(
1018 const std::vector<CTransactionRef> &txns, ATMPArgs &args) {
1020
1021 // These context-free package limits can be done before taking the mempool
1022 // lock.
1023 PackageValidationState package_state;
1024 if (!CheckPackage(txns, package_state)) {
1025 return PackageMempoolAcceptResult(package_state, {});
1026 }
1027
1028 std::vector<Workspace> workspaces{};
1029 workspaces.reserve(txns.size());
1030 std::transform(
1031 txns.cbegin(), txns.cend(), std::back_inserter(workspaces),
1032 [this](const auto &tx) {
1033 return Workspace(
1034 tx, GetNextBlockScriptFlags(m_active_chainstate.m_chain.Tip(),
1035 m_active_chainstate.m_chainman));
1036 });
1037 std::map<TxId, MempoolAcceptResult> results;
1038
1039 LOCK(m_pool.cs);
1040
1041 // Do all PreChecks first and fail fast to avoid running expensive script
1042 // checks when unnecessary.
1043 std::vector<TxId> valid_txids;
1044 for (Workspace &ws : workspaces) {
1045 if (!PreChecks(args, ws)) {
1047 "transaction failed");
1048 // Exit early to avoid doing pointless work. Update the failed tx
1049 // result; the rest are unfinished.
1050 results.emplace(ws.m_ptx->GetId(),
1051 MempoolAcceptResult::Failure(ws.m_state));
1052 return PackageMempoolAcceptResult(package_state,
1053 std::move(results));
1054 }
1055 // Make the coins created by this transaction available for subsequent
1056 // transactions in the package to spend.
1057 m_viewmempool.PackageAddTransaction(ws.m_ptx);
1058 valid_txids.push_back(ws.m_ptx->GetId());
1059 }
1060
1061 // Transactions must meet two minimum feerates: the mempool minimum fee and
1062 // min relay fee. For transactions consisting of exactly one child and its
1063 // parents, it suffices to use the package feerate
1064 // (total modified fees / total size or vsize) to check this requirement.
1065 // Note that this is an aggregate feerate; this function has not checked
1066 // that there are transactions too low feerate to pay for themselves, or
1067 // that the child transactions are higher feerate than their parents. Using
1068 // aggregate feerate may allow "parents pay for child" behavior and permit
1069 // a child that is below mempool minimum feerate. To avoid these behaviors,
1070 // callers of AcceptMultipleTransactions need to restrict txns topology
1071 // (e.g. to ancestor sets) and check the feerates of individuals and
1072 // subsets.
1073 const auto m_total_size = std::accumulate(
1074 workspaces.cbegin(), workspaces.cend(), int64_t{0},
1075 [](int64_t sum, auto &ws) { return sum + ws.m_ptx->GetTotalSize(); });
1076 const auto m_total_vsize =
1077 std::accumulate(workspaces.cbegin(), workspaces.cend(), int64_t{0},
1078 [](int64_t sum, auto &ws) { return sum + ws.m_vsize; });
1079 const auto m_total_modified_fees = std::accumulate(
1080 workspaces.cbegin(), workspaces.cend(), Amount::zero(),
1081 [](Amount sum, auto &ws) { return sum + ws.m_modified_fees; });
1082 const CFeeRate package_feerate(m_total_modified_fees, m_total_vsize);
1083 std::vector<TxId> all_package_txids;
1084 all_package_txids.reserve(workspaces.size());
1085 std::transform(workspaces.cbegin(), workspaces.cend(),
1086 std::back_inserter(all_package_txids),
1087 [](const auto &ws) { return ws.m_ptx->GetId(); });
1088 TxValidationState placeholder_state;
1089 if (args.m_package_feerates &&
1090 !CheckFeeRate(m_total_size, m_total_vsize, m_total_modified_fees,
1091 placeholder_state)) {
1093 "transaction failed");
1095 package_state, {{workspaces.back().m_ptx->GetId(),
1097 placeholder_state,
1098 CFeeRate(m_total_modified_fees, m_total_vsize),
1099 all_package_txids)}});
1100 }
1101
1102 for (Workspace &ws : workspaces) {
1103 ws.m_package_feerate = package_feerate;
1104 const TxId &ws_txid = ws.m_ptx->GetId();
1105 if (args.m_test_accept &&
1106 std::find(valid_txids.begin(), valid_txids.end(), ws_txid) !=
1107 valid_txids.end()) {
1108 const auto effective_feerate =
1109 args.m_package_feerates
1110 ? ws.m_package_feerate
1111 : CFeeRate{ws.m_modified_fees,
1112 static_cast<int32_t>(ws.m_vsize)};
1113 const auto effective_feerate_txids =
1114 args.m_package_feerates ? all_package_txids
1115 : std::vector<TxId>{ws.m_ptx->GetId()};
1116 // When test_accept=true, transactions that pass PreChecks
1117 // are valid because there are no further mempool checks (passing
1118 // PreChecks implies passing ConsensusScriptChecks).
1119 results.emplace(ws_txid,
1121 ws.m_vsize, ws.m_base_fees, effective_feerate,
1122 effective_feerate_txids));
1123 }
1124 }
1125
1126 if (args.m_test_accept) {
1127 return PackageMempoolAcceptResult(package_state, std::move(results));
1128 }
1129
1130 if (!SubmitPackage(args, workspaces, package_state, results)) {
1131 // PackageValidationState filled in by SubmitPackage().
1132 return PackageMempoolAcceptResult(package_state, std::move(results));
1133 }
1134
1135 return PackageMempoolAcceptResult(package_state, std::move(results));
1136}
1137
1139MemPoolAccept::AcceptSubPackage(const std::vector<CTransactionRef> &subpackage,
1140 ATMPArgs &args) {
1142 AssertLockHeld(m_pool.cs);
1143
1144 auto result = [&]() EXCLUSIVE_LOCKS_REQUIRED(::cs_main, m_pool.cs) {
1145 if (subpackage.size() > 1) {
1146 return AcceptMultipleTransactions(subpackage, args);
1147 }
1148 const auto &tx = subpackage.front();
1149 ATMPArgs single_args = ATMPArgs::SingleInPackageAccept(args);
1150 const auto single_res = AcceptSingleTransaction(tx, single_args);
1151 PackageValidationState package_state_wrapped;
1152 if (single_res.m_result_type !=
1154 package_state_wrapped.Invalid(PackageValidationResult::PCKG_TX,
1155 "transaction failed");
1156 }
1157 return PackageMempoolAcceptResult(package_state_wrapped,
1158 {{tx->GetId(), single_res}});
1159 }();
1160
1161 // Clean up m_view and m_viewmempool so that other subpackage evaluations
1162 // don't have access to coins they shouldn't. Keep some coins in order to
1163 // minimize re-fetching coins from the UTXO set.
1164 //
1165 // There are 3 kinds of coins in m_view:
1166 // (1) Temporary coins from the transactions in subpackage, constructed by
1167 // m_viewmempool.
1168 // (2) Mempool coins from transactions in the mempool, constructed by
1169 // m_viewmempool.
1170 // (3) Confirmed coins fetched from our current UTXO set.
1171 //
1172 // (1) Temporary coins need to be removed, regardless of whether the
1173 // transaction was submitted. If the transaction was submitted to the
1174 // mempool, m_viewmempool will be able to fetch them from there. If it
1175 // wasn't submitted to mempool, it is incorrect to keep them - future calls
1176 // may try to spend those coins that don't actually exist.
1177 // (2) Mempool coins also need to be removed. If the mempool contents have
1178 // changed as a result of submitting or replacing transactions, coins
1179 // previously fetched from mempool may now be spent or nonexistent. Those
1180 // coins need to be deleted from m_view.
1181 // (3) Confirmed coins don't need to be removed. The chainstate has not
1182 // changed (we are holding cs_main and no blocks have been processed) so the
1183 // confirmed tx cannot disappear like a mempool tx can. The coin may now be
1184 // spent after we submitted a tx to mempool, but we have already checked
1185 // that the package does not have 2 transactions spending the same coin.
1186 // Keeping them in m_view is an optimization to not re-fetch confirmed coins
1187 // if we later look up inputs for this transaction again.
1188 for (const auto &outpoint : m_viewmempool.GetNonBaseCoins()) {
1189 // In addition to resetting m_viewmempool, we also need to manually
1190 // delete these coins from m_view because it caches copies of the coins
1191 // it fetched from m_viewmempool previously.
1192 m_view.Uncache(outpoint);
1193 }
1194 // This deletes the temporary and mempool coins.
1195 m_viewmempool.Reset();
1196 return result;
1197}
1198
1199PackageMempoolAcceptResult MemPoolAccept::AcceptPackage(const Package &package,
1200 ATMPArgs &args) {
1202 // Used if returning a PackageMempoolAcceptResult directly from this
1203 // function.
1204 PackageValidationState package_state_quit_early;
1205
1206 // Check that the package is well-formed. If it isn't, we won't try to
1207 // validate any of the transactions and thus won't return any
1208 // MempoolAcceptResults, just a package-wide error.
1209
1210 // Context-free package checks.
1211 if (!CheckPackage(package, package_state_quit_early)) {
1212 return PackageMempoolAcceptResult(package_state_quit_early, {});
1213 }
1214
1215 // All transactions in the package must be a parent of the last transaction.
1216 // This is just an opportunity for us to fail fast on a context-free check
1217 // without taking the mempool lock.
1218 if (!IsChildWithParents(package)) {
1219 package_state_quit_early.Invalid(PackageValidationResult::PCKG_POLICY,
1220 "package-not-child-with-parents");
1221 return PackageMempoolAcceptResult(package_state_quit_early, {});
1222 }
1223
1224 // IsChildWithParents() guarantees the package is > 1 transactions.
1225 assert(package.size() > 1);
1226 // The package must be 1 child with all of its unconfirmed parents. The
1227 // package is expected to be sorted, so the last transaction is the child.
1228 const auto &child = package.back();
1229 std::unordered_set<TxId, SaltedTxIdHasher> unconfirmed_parent_txids;
1230 std::transform(
1231 package.cbegin(), package.cend() - 1,
1232 std::inserter(unconfirmed_parent_txids, unconfirmed_parent_txids.end()),
1233 [](const auto &tx) { return tx->GetId(); });
1234
1235 // All child inputs must refer to a preceding package transaction or a
1236 // confirmed UTXO. The only way to verify this is to look up the child's
1237 // inputs in our current coins view (not including mempool), and enforce
1238 // that all parents not present in the package be available at chain tip.
1239 // Since this check can bring new coins into the coins cache, keep track of
1240 // these coins and uncache them if we don't end up submitting this package
1241 // to the mempool.
1242 const CCoinsViewCache &coins_tip_cache = m_active_chainstate.CoinsTip();
1243 for (const auto &input : child->vin) {
1244 if (!coins_tip_cache.HaveCoinInCache(input.prevout)) {
1245 args.m_coins_to_uncache.push_back(input.prevout);
1246 }
1247 }
1248 // Using the MemPoolAccept m_view cache allows us to look up these same
1249 // coins faster later. This should be connecting directly to CoinsTip, not
1250 // to m_viewmempool, because we specifically require inputs to be confirmed
1251 // if they aren't in the package.
1252 m_view.SetBackend(m_active_chainstate.CoinsTip());
1253 const auto package_or_confirmed = [this, &unconfirmed_parent_txids](
1254 const auto &input) {
1255 return unconfirmed_parent_txids.count(input.prevout.GetTxId()) > 0 ||
1256 m_view.HaveCoin(input.prevout);
1257 };
1258 if (!std::all_of(child->vin.cbegin(), child->vin.cend(),
1259 package_or_confirmed)) {
1260 package_state_quit_early.Invalid(
1262 "package-not-child-with-unconfirmed-parents");
1263 return PackageMempoolAcceptResult(package_state_quit_early, {});
1264 }
1265 // Protect against bugs where we pull more inputs from disk that miss being
1266 // added to coins_to_uncache. The backend will be connected again when
1267 // needed in PreChecks.
1268 m_view.SetBackend(m_dummy);
1269
1270 LOCK(m_pool.cs);
1271 // Stores results from which we will create the returned
1272 // PackageMempoolAcceptResult. A result may be changed if a mempool
1273 // transaction is evicted later due to LimitMempoolSize().
1274 std::map<TxId, MempoolAcceptResult> results_final;
1275 // Results from individual validation which will be returned if no other
1276 // result is available for this transaction. "Nonfinal" because if a
1277 // transaction fails by itself but succeeds later (i.e. when evaluated with
1278 // a fee-bumping child), the result in this map may be discarded.
1279 std::map<TxId, MempoolAcceptResult> individual_results_nonfinal;
1280 bool quit_early{false};
1281 std::vector<CTransactionRef> txns_package_eval;
1282 for (const auto &tx : package) {
1283 const auto &txid = tx->GetId();
1284 // An already confirmed tx is treated as one not in mempool, because all
1285 // we know is that the inputs aren't available.
1286 if (m_pool.exists(txid)) {
1287 // Exact transaction already exists in the mempool.
1288 // Node operators are free to set their mempool policies however
1289 // they please, nodes may receive transactions in different orders,
1290 // and malicious counterparties may try to take advantage of policy
1291 // differences to pin or delay propagation of transactions. As such,
1292 // it's possible for some package transaction(s) to already be in
1293 // the mempool, and we don't want to reject the entire package in
1294 // that case (as that could be a censorship vector). De-duplicate
1295 // the transactions that are already in the mempool, and only call
1296 // AcceptMultipleTransactions() with the new transactions. This
1297 // ensures we don't double-count transaction counts and sizes when
1298 // checking ancestor/descendant limits, or double-count transaction
1299 // fees for fee-related policy.
1300 auto iter = m_pool.GetIter(txid);
1301 assert(iter != std::nullopt);
1302 results_final.emplace(txid, MempoolAcceptResult::MempoolTx(
1303 (*iter.value())->GetTxSize(),
1304 (*iter.value())->GetFee()));
1305 } else {
1306 // Transaction does not already exist in the mempool.
1307 // Try submitting the transaction on its own.
1308 const auto single_package_res = AcceptSubPackage({tx}, args);
1309 const auto &single_res = single_package_res.m_tx_results.at(txid);
1310 if (single_res.m_result_type ==
1312 // The transaction succeeded on its own and is now in the
1313 // mempool. Don't include it in package validation, because its
1314 // fees should only be "used" once.
1315 assert(m_pool.exists(txid));
1316 results_final.emplace(txid, single_res);
1317 } else if (single_res.m_state.GetResult() !=
1319 single_res.m_state.GetResult() !=
1321 // Package validation policy only differs from individual policy
1322 // in its evaluation of feerate. For example, if a transaction
1323 // fails here due to violation of a consensus rule, the result
1324 // will not change when it is submitted as part of a package. To
1325 // minimize the amount of repeated work, unless the transaction
1326 // fails due to feerate or missing inputs (its parent is a
1327 // previous transaction in the package that failed due to
1328 // feerate), don't run package validation. Note that this
1329 // decision might not make sense if different types of packages
1330 // are allowed in the future. Continue individually validating
1331 // the rest of the transactions, because some of them may still
1332 // be valid.
1333 quit_early = true;
1334 package_state_quit_early.Invalid(
1335 PackageValidationResult::PCKG_TX, "transaction failed");
1336 individual_results_nonfinal.emplace(txid, single_res);
1337 } else {
1338 individual_results_nonfinal.emplace(txid, single_res);
1339 txns_package_eval.push_back(tx);
1340 }
1341 }
1342 }
1343
1344 auto multi_submission_result =
1345 quit_early || txns_package_eval.empty()
1346 ? PackageMempoolAcceptResult(package_state_quit_early, {})
1347 : AcceptSubPackage(txns_package_eval, args);
1348 PackageValidationState &package_state_final =
1349 multi_submission_result.m_state;
1350
1351 // Make sure we haven't exceeded max mempool size.
1352 // Package transactions that were submitted to mempool or already in mempool
1353 // may be evicted.
1354 m_pool.LimitSize(m_active_chainstate.CoinsTip());
1355
1356 for (const auto &tx : package) {
1357 const auto &txid = tx->GetId();
1358 if (multi_submission_result.m_tx_results.count(txid) > 0) {
1359 // We shouldn't have re-submitted if the tx result was already in
1360 // results_final.
1361 Assume(results_final.count(txid) == 0);
1362 // If it was submitted, check to see if the tx is still in the
1363 // mempool. It could have been evicted due to LimitMempoolSize()
1364 // above.
1365 const auto &txresult =
1366 multi_submission_result.m_tx_results.at(txid);
1367 if (txresult.m_result_type ==
1369 !m_pool.exists(txid)) {
1370 package_state_final.Invalid(PackageValidationResult::PCKG_TX,
1371 "transaction failed");
1372 TxValidationState mempool_full_state;
1373 mempool_full_state.Invalid(
1375 results_final.emplace(
1376 txid, MempoolAcceptResult::Failure(mempool_full_state));
1377 } else {
1378 results_final.emplace(txid, txresult);
1379 }
1380 } else if (const auto final_it{results_final.find(txid)};
1381 final_it != results_final.end()) {
1382 // Already-in-mempool transaction. Check to see if it's still there,
1383 // as it could have been evicted when LimitMempoolSize() was called.
1384 Assume(final_it->second.m_result_type !=
1386 Assume(individual_results_nonfinal.count(txid) == 0);
1387 if (!m_pool.exists(tx->GetId())) {
1388 package_state_final.Invalid(PackageValidationResult::PCKG_TX,
1389 "transaction failed");
1390 TxValidationState mempool_full_state;
1391 mempool_full_state.Invalid(
1393 // Replace the previous result.
1394 results_final.erase(txid);
1395 results_final.emplace(
1396 txid, MempoolAcceptResult::Failure(mempool_full_state));
1397 }
1398 } else if (const auto non_final_it{
1399 individual_results_nonfinal.find(txid)};
1400 non_final_it != individual_results_nonfinal.end()) {
1401 Assume(non_final_it->second.m_result_type ==
1403 // Interesting result from previous processing.
1404 results_final.emplace(txid, non_final_it->second);
1405 }
1406 }
1407 Assume(results_final.size() == package.size());
1408 return PackageMempoolAcceptResult(package_state_final,
1409 std::move(results_final));
1410}
1411} // namespace
1412
1414 const CTransactionRef &tx,
1415 int64_t accept_time, bool bypass_limits,
1416 bool test_accept,
1417 unsigned int heightOverride) {
1419 assert(active_chainstate.GetMempool() != nullptr);
1420 CTxMemPool &pool{*active_chainstate.GetMempool()};
1421
1422 std::vector<COutPoint> coins_to_uncache;
1423 auto args = MemPoolAccept::ATMPArgs::SingleAccept(
1424 active_chainstate.m_chainman.GetConfig(), accept_time, bypass_limits,
1425 coins_to_uncache, test_accept, heightOverride);
1426 MempoolAcceptResult result = MemPoolAccept(pool, active_chainstate)
1427 .AcceptSingleTransaction(tx, args);
1429 // Remove coins that were not present in the coins cache before calling
1430 // ATMPW; this is to prevent memory DoS in case we receive a large
1431 // number of invalid transactions that attempt to overrun the in-memory
1432 // coins cache
1433 // (`CCoinsViewCache::cacheCoins`).
1434
1435 for (const COutPoint &outpoint : coins_to_uncache) {
1436 active_chainstate.CoinsTip().Uncache(outpoint);
1437 }
1438 }
1439
1440 // After we've (potentially) uncached entries, ensure our coins cache is
1441 // still within its size limits
1442 BlockValidationState stateDummy;
1443 active_chainstate.FlushStateToDisk(stateDummy, FlushStateMode::PERIODIC);
1444 return result;
1445}
1446
1448 CTxMemPool &pool,
1449 const Package &package,
1450 bool test_accept) {
1452 assert(!package.empty());
1453 assert(std::all_of(package.cbegin(), package.cend(),
1454 [](const auto &tx) { return tx != nullptr; }));
1455
1456 const Config &config = active_chainstate.m_chainman.GetConfig();
1457
1458 std::vector<COutPoint> coins_to_uncache;
1459 auto result = [&]() EXCLUSIVE_LOCKS_REQUIRED(cs_main) {
1461 if (test_accept) {
1462 auto args = MemPoolAccept::ATMPArgs::PackageTestAccept(
1463 config, GetTime(), coins_to_uncache);
1464 return MemPoolAccept(pool, active_chainstate)
1465 .AcceptMultipleTransactions(package, args);
1466 } else {
1467 auto args = MemPoolAccept::ATMPArgs::PackageChildWithParents(
1468 config, GetTime(), coins_to_uncache);
1469 return MemPoolAccept(pool, active_chainstate)
1470 .AcceptPackage(package, args);
1471 }
1472 }();
1473
1474 // Uncache coins pertaining to transactions that were not submitted to the
1475 // mempool.
1476 if (test_accept || result.m_state.IsInvalid()) {
1477 for (const COutPoint &hashTx : coins_to_uncache) {
1478 active_chainstate.CoinsTip().Uncache(hashTx);
1479 }
1480 }
1481 // Ensure the coins cache is still within limits.
1482 BlockValidationState state_dummy;
1483 active_chainstate.FlushStateToDisk(state_dummy, FlushStateMode::PERIODIC);
1484 return result;
1485}
1486
1487Amount GetBlockSubsidy(int nHeight, const Consensus::Params &consensusParams) {
1488 int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
1489 // Force block reward to zero when right shift is undefined.
1490 if (halvings >= 64) {
1491 return Amount::zero();
1492 }
1493
1494 Amount nSubsidy = 50 * COIN;
1495 // Subsidy is cut in half every 210,000 blocks which will occur
1496 // approximately every 4 years.
1497 return ((nSubsidy / SATOSHI) >> halvings) * SATOSHI;
1498}
1499
1501 : m_dbview{std::move(db_params), std::move(options)},
1502 m_catcherview(&m_dbview) {}
1503
1504void CoinsViews::InitCache() {
1506 m_cacheview = std::make_unique<CCoinsViewCache>(&m_catcherview);
1507 m_connect_block_view = std::make_unique<CCoinsViewCache>(&*m_cacheview);
1508}
1509
1511 ChainstateManager &chainman,
1512 std::optional<BlockHash> from_snapshot_blockhash)
1513 : m_mempool(mempool), m_blockman(blockman), m_chainman(chainman),
1514 m_from_snapshot_blockhash(from_snapshot_blockhash) {}
1515
1516const CBlockIndex *Chainstate::SnapshotBase() {
1518 return nullptr;
1519 }
1520 if (!m_cached_snapshot_base) {
1521 m_cached_snapshot_base = Assert(
1523 }
1524 return m_cached_snapshot_base;
1525}
1526
1527void Chainstate::InitCoinsDB(size_t cache_size_bytes, bool in_memory,
1528 bool should_wipe, std::string leveldb_name) {
1530 leveldb_name += node::SNAPSHOT_CHAINSTATE_SUFFIX;
1531 }
1532
1533 m_coins_views = std::make_unique<CoinsViews>(
1534 DBParams{.path = m_chainman.m_options.datadir / leveldb_name,
1535 .cache_bytes = cache_size_bytes,
1536 .memory_only = in_memory,
1537 .wipe_data = should_wipe,
1538 .obfuscate = true,
1539 .options = m_chainman.m_options.coins_db},
1541}
1542
1543void Chainstate::InitCoinsCache(size_t cache_size_bytes) {
1545 assert(m_coins_views != nullptr);
1546 m_coinstip_cache_size_bytes = cache_size_bytes;
1547 m_coins_views->InitCache();
1548}
1549
1550// Note that though this is marked const, we may end up modifying
1551// `m_cached_finished_ibd`, which is a performance-related implementation
1552// detail. This function must be marked `const` so that `CValidationInterface`
1553// clients (which are given a `const Chainstate*`) can call it.
1554//
1556 // Optimization: pre-test latch before taking the lock.
1557 if (m_cached_finished_ibd.load(std::memory_order_relaxed)) {
1558 return false;
1559 }
1560
1561 LOCK(cs_main);
1562 if (m_cached_finished_ibd.load(std::memory_order_relaxed)) {
1563 return false;
1564 }
1565 if (m_blockman.LoadingBlocks()) {
1566 return true;
1567 }
1568 CChain &chain{ActiveChain()};
1569 if (chain.Tip() == nullptr) {
1570 return true;
1571 }
1572 if (chain.Tip()->nChainWork < MinimumChainWork()) {
1573 return true;
1574 }
1575 if (chain.Tip()->Time() < Now<NodeSeconds>() - m_options.max_tip_age) {
1576 return true;
1577 }
1578 LogPrintf("Leaving InitialBlockDownload (latching to false)\n");
1579 m_cached_finished_ibd.store(true, std::memory_order_relaxed);
1580 return false;
1581}
1582
1585
1586 // Before we get past initial download, we cannot reliably alert about forks
1587 // (we assume we don't get stuck on a fork before finishing our initial
1588 // sync)
1589 // Also not applicable to the background chainstate
1591 this->GetRole() == ChainstateRole::BACKGROUND) {
1592 return;
1593 }
1594
1595 // If our best fork is no longer within 72 blocks (+/- 12 hours if no one
1596 // mines it) of our head, or if it is back on the active chain, drop it
1599 m_best_fork_tip = nullptr;
1600 }
1601
1602 if (m_best_fork_tip ||
1603 (m_chainman.m_best_invalid &&
1604 m_chainman.m_best_invalid->nChainWork >
1605 m_chain.Tip()->nChainWork + (GetBlockProof(*m_chain.Tip()) * 6))) {
1607 std::string warning =
1608 std::string("'Warning: Large-work fork detected, forking after "
1609 "block ") +
1610 m_best_fork_base->phashBlock->ToString() + std::string("'");
1612 }
1613
1615 LogPrintf("%s: Warning: Large fork found\n forking the "
1616 "chain at height %d (%s)\n lasting to height %d "
1617 "(%s).\nChain state database corruption likely.\n",
1618 __func__, m_best_fork_base->nHeight,
1623 } else {
1624 LogPrintf("%s: Warning: Found invalid chain at least ~6 blocks "
1625 "longer than our best chain.\nChain state database "
1626 "corruption likely.\n",
1627 __func__);
1629 }
1630 } else {
1633 }
1634}
1635
1637 CBlockIndex *pindexNewForkTip) {
1639
1640 // If we are on a fork that is sufficiently large, set a warning flag.
1641 const CBlockIndex *pfork = m_chain.FindFork(pindexNewForkTip);
1642
1643 // We define a condition where we should warn the user about as a fork of at
1644 // least 7 blocks with a tip within 72 blocks (+/- 12 hours if no one mines
1645 // it) of ours. We use 7 blocks rather arbitrarily as it represents just
1646 // under 10% of sustained network hash rate operating on the fork, or a
1647 // chain that is entirely longer than ours and invalid (note that this
1648 // should be detected by both). We define it this way because it allows us
1649 // to only store the highest fork tip (+ base) which meets the 7-block
1650 // condition and from this always have the most-likely-to-cause-warning fork
1651 if (pfork &&
1652 (!m_best_fork_tip ||
1653 pindexNewForkTip->nHeight > m_best_fork_tip->nHeight) &&
1654 pindexNewForkTip->nChainWork - pfork->nChainWork >
1655 (GetBlockProof(*pfork) * 7) &&
1656 m_chain.Height() - pindexNewForkTip->nHeight < 72) {
1657 m_best_fork_tip = pindexNewForkTip;
1658 m_best_fork_base = pfork;
1659 }
1660
1662}
1663
1664// Called both upon regular invalid block discovery *and* InvalidateBlock
1667 if (!m_chainman.m_best_invalid ||
1668 pindexNew->nChainWork > m_chainman.m_best_invalid->nChainWork) {
1669 m_chainman.m_best_invalid = pindexNew;
1670 }
1671 SetBlockFailureFlags(pindexNew);
1672 if (m_chainman.m_best_header != nullptr &&
1673 m_chainman.m_best_header->GetAncestor(pindexNew->nHeight) ==
1674 pindexNew) {
1675 m_chainman.RecalculateBestHeader();
1676 }
1677
1678 // If the invalid chain found is supposed to be finalized, we need to move
1679 // back the finalization point.
1680 if (IsBlockAvalancheFinalized(pindexNew)) {
1682 m_avalancheFinalizedBlockIndex = pindexNew->pprev;
1683 }
1684
1685 LogPrintf("%s: invalid block=%s height=%d log2_work=%f date=%s\n",
1686 __func__, pindexNew->GetBlockHash().ToString(),
1687 pindexNew->nHeight,
1688 log(pindexNew->nChainWork.getdouble()) / log(2.0),
1689 FormatISO8601DateTime(pindexNew->GetBlockTime()));
1690 CBlockIndex *tip = m_chain.Tip();
1691 assert(tip);
1692 LogPrintf("%s: current best=%s height=%d log2_work=%f date=%s\n",
1693 __func__, tip->GetBlockHash().ToString(), m_chain.Height(),
1694 log(tip->nChainWork.getdouble()) / log(2.0),
1696}
1697
1698// Same as InvalidChainFound, above, except not called directly from
1699// InvalidateBlock, which does its own setBlockIndexCandidates management.
1701 const BlockValidationState &state) {
1704 pindex->nStatus = pindex->nStatus.withFailed();
1705 m_chainman.m_failed_blocks.insert(pindex);
1706 m_blockman.m_dirty_blockindex.insert(pindex);
1707 InvalidChainFound(pindex);
1708 }
1709}
1710
1711void SpendCoins(CCoinsViewCache &view, const CTransaction &tx, CTxUndo &txundo,
1712 int nHeight) {
1713 // Mark inputs spent.
1714 if (tx.IsCoinBase()) {
1715 return;
1716 }
1717
1718 txundo.vprevout.reserve(tx.vin.size());
1719 for (const CTxIn &txin : tx.vin) {
1720 txundo.vprevout.emplace_back();
1721 bool is_spent = view.SpendCoin(txin.prevout, &txundo.vprevout.back());
1722 assert(is_spent);
1723 }
1724}
1725
1726void UpdateCoins(CCoinsViewCache &view, const CTransaction &tx, CTxUndo &txundo,
1727 int nHeight) {
1728 SpendCoins(view, tx, txundo, nHeight);
1729 AddCoins(view, tx, nHeight);
1730}
1731
1732std::optional<std::vector<Coin>>
1733GetSpentCoins(const CTransactionRef &ptx, const CCoinsViewCache &coins_view) {
1734 std::vector<Coin> spent_coins;
1735 spent_coins.reserve(ptx->vin.size());
1736 for (const CTxIn &input : ptx->vin) {
1737 auto coin{coins_view.GetCoin(input.prevout)};
1738 if (!coin.has_value()) {
1739 return std::nullopt;
1740 }
1741 spent_coins.push_back(std::move(*coin));
1742 }
1743 return spent_coins;
1744}
1745
1746std::optional<std::pair<ScriptError, std::string>> CScriptCheck::operator()() {
1747 const CScript &scriptSig = ptxTo->vin[nIn].scriptSig;
1749 auto debug_str = strprintf("input %i of %s, spending %s:%i", nIn,
1750 ptxTo->GetId().ToString(),
1751 ptxTo->vin[nIn].prevout.GetTxId().ToString(),
1752 ptxTo->vin[nIn].prevout.GetN());
1753 if (!VerifyScript(scriptSig, m_tx_out.scriptPubKey, nFlags,
1757 metrics, &error)) {
1758 return std::make_pair(error, std::move(debug_str));
1759 }
1760 if ((pTxLimitSigChecks &&
1764 // we can't assign a meaningful script error (since the script
1765 // succeeded), but remove the ScriptError::OK which could be
1766 // misinterpreted.
1767 return std::make_pair(ScriptError::SIGCHECKS_LIMIT_EXCEEDED,
1768 std::move(debug_str));
1769 }
1770 return std::nullopt;
1771}
1772
1773ValidationCache::ValidationCache(const size_t script_execution_cache_bytes,
1774 const size_t signature_cache_bytes)
1775 : m_signature_cache{signature_cache_bytes} {
1776 // Setup the salted hasher
1777 uint256 nonce = GetRandHash();
1778 // We want the nonce to be 64 bytes long to force the hasher to process
1779 // this chunk, which makes later hash computations more efficient. We
1780 // just write our 32-byte entropy twice to fill the 64 bytes.
1783
1784 const auto [num_elems, approx_size_bytes] =
1785 m_script_execution_cache.setup_bytes(script_execution_cache_bytes);
1786 LogPrintf("Using %zu MiB out of %zu MiB requested for script execution "
1787 "cache, able to store %zu elements\n",
1788 approx_size_bytes >> 20, script_execution_cache_bytes >> 20,
1789 num_elems);
1790}
1791
1792bool CheckInputScripts(const CTransaction &tx, TxValidationState &state,
1793 const CCoinsViewCache &inputs, const uint32_t flags,
1794 bool sigCacheStore, bool scriptCacheStore,
1795 const PrecomputedTransactionData &txdata,
1796 ValidationCache &validation_cache, int &nSigChecksOut,
1797 TxSigCheckLimiter &txLimitSigChecks,
1798 CheckInputsLimiter *pBlockLimitSigChecks,
1799 std::vector<CScriptCheck> *pvChecks) {
1801 assert(!tx.IsCoinBase());
1802
1803 if (pvChecks) {
1804 pvChecks->reserve(tx.vin.size());
1805 }
1806
1807 // First check if script executions have been cached with the same flags.
1808 // Note that this assumes that the inputs provided are correct (ie that the
1809 // transaction hash which is in tx's prevouts properly commits to the
1810 // scriptPubKey in the inputs view of that transaction).
1811 ScriptCacheKey hashCacheEntry(
1812 tx, flags, validation_cache.ScriptExecutionCacheHasher());
1813 ScriptCacheElement elem(hashCacheEntry, 0);
1814 bool found_in_cache = validation_cache.m_script_execution_cache.get(
1815 elem, /*erase=*/!scriptCacheStore);
1816 nSigChecksOut = elem.nSigChecks;
1817 if (found_in_cache) {
1818 if (!txLimitSigChecks.consume_and_check(nSigChecksOut) ||
1819 (pBlockLimitSigChecks &&
1820 !pBlockLimitSigChecks->consume_and_check(nSigChecksOut))) {
1822 "too-many-sigchecks");
1823 }
1824 return true;
1825 }
1826
1827 int nSigChecksTotal = 0;
1828
1829 for (size_t i = 0; i < tx.vin.size(); i++) {
1830 const COutPoint &prevout = tx.vin[i].prevout;
1831 const Coin &coin = inputs.AccessCoin(prevout);
1832 assert(!coin.IsSpent());
1833
1834 // We very carefully only pass in things to CScriptCheck which are
1835 // clearly committed to by tx's hash. This provides a sanity
1836 // check that our caching is not introducing consensus failures through
1837 // additional data in, eg, the coins being spent being checked as a part
1838 // of CScriptCheck.
1839
1840 // Verify signature
1841 CScriptCheck check(
1842 coin.GetTxOut(), tx, validation_cache.m_signature_cache, i, flags,
1843 sigCacheStore, txdata, &txLimitSigChecks, pBlockLimitSigChecks);
1844
1845 // If pvChecks is not null, defer the check execution to the caller.
1846 if (pvChecks) {
1847 pvChecks->push_back(std::move(check));
1848 continue;
1849 }
1850
1851 if (auto result = check(); result.has_value()) {
1852 // Compute flags without the optional standardness flags.
1853 // This differs from MANDATORY_SCRIPT_VERIFY_FLAGS as it contains
1854 // additional upgrade flags (see AcceptToMemoryPoolWorker variable
1855 // extraFlags).
1856 uint32_t mandatoryFlags =
1857 flags & ~STANDARD_NOT_MANDATORY_VERIFY_FLAGS;
1858 if (flags != mandatoryFlags) {
1859 // Check whether the failure was caused by a non-mandatory
1860 // script verification check. If so, ensure we return
1861 // NOT_STANDARD instead of CONSENSUS to avoid downstream users
1862 // splitting the network between upgraded and non-upgraded nodes
1863 // by banning CONSENSUS-failing data providers.
1864 CScriptCheck check2(coin.GetTxOut(), tx,
1865 validation_cache.m_signature_cache, i,
1866 mandatoryFlags, sigCacheStore, txdata);
1867 auto mandatory_result = check2();
1868 if (!mandatory_result.has_value()) {
1869 return state.Invalid(
1871 strprintf("non-mandatory-script-verify-flag (%s)",
1872 ScriptErrorString(result->first)),
1873 result->second);
1874 }
1875 // If the second check failed, it failed due to a mandatory
1876 // script verification flag, but the first check might have
1877 // failed on a non-mandatory script verification flag.
1878 //
1879 // Avoid reporting a mandatory script check failure with a
1880 // non-mandatory error string by reporting the error from the
1881 // second check.
1882 result = mandatory_result;
1883 }
1884
1885 // MANDATORY flag failures correspond to
1886 // TxValidationResult::TX_CONSENSUS.
1887 return state.Invalid(
1889 strprintf("mandatory-script-verify-flag-failed (%s)",
1890 ScriptErrorString(result->first)),
1891 result->second);
1892 }
1893
1894 nSigChecksTotal += check.GetScriptExecutionMetrics().nSigChecks;
1895 }
1896
1897 nSigChecksOut = nSigChecksTotal;
1898
1899 if (scriptCacheStore && !pvChecks) {
1900 // We executed all of the provided scripts, and were told to cache the
1901 // result. Do so now.
1902 validation_cache.m_script_execution_cache.insert(
1903 ScriptCacheElement{hashCacheEntry, nSigChecksTotal});
1904 }
1905
1906 return true;
1907}
1908
1910 const std::string &strMessage,
1911 const bilingual_str &userMessage) {
1912 notifications.fatalError(strMessage, userMessage);
1913 return state.Error(strMessage);
1914}
1915
1918 const COutPoint &out) {
1919 bool fClean = true;
1920
1921 if (view.HaveCoin(out)) {
1922 // Overwriting transaction output.
1923 fClean = false;
1924 }
1925
1926 if (undo.GetHeight() == 0) {
1927 // Missing undo metadata (height and coinbase). Older versions included
1928 // this information only in undo records for the last spend of a
1929 // transactions' outputs. This implies that it must be present for some
1930 // other output of the same tx.
1931 const Coin &alternate = AccessByTxid(view, out.GetTxId());
1932 if (alternate.IsSpent()) {
1933 // Adding output for transaction without known metadata
1935 }
1936
1937 // This is somewhat ugly, but hopefully utility is limited. This is only
1938 // useful when working from legacy on disck data. In any case, putting
1939 // the correct information in there doesn't hurt.
1940 const_cast<Coin &>(undo) = Coin(undo.GetTxOut(), alternate.GetHeight(),
1941 alternate.IsCoinBase());
1942 }
1943
1944 // If the coin already exists as an unspent coin in the cache, then the
1945 // possible_overwrite parameter to AddCoin must be set to true. We have
1946 // already checked whether an unspent coin exists above using HaveCoin, so
1947 // we don't need to guess. When fClean is false, an unspent coin already
1948 // existed and it is an overwrite.
1949 view.AddCoin(out, std::move(undo), !fClean);
1950
1952}
1953
1958DisconnectResult Chainstate::DisconnectBlock(const CBlock &block,
1959 const CBlockIndex *pindex,
1960 CCoinsViewCache &view) {
1962 CBlockUndo blockUndo;
1963 if (!m_blockman.ReadBlockUndo(blockUndo, *pindex)) {
1964 LogError("DisconnectBlock(): failure reading undo data\n");
1966 }
1967
1968 return ApplyBlockUndo(std::move(blockUndo), block, pindex, view);
1969}
1970
1972 const CBlockIndex *pindex,
1973 CCoinsViewCache &view) {
1974 bool fClean = true;
1975
1976 if (blockUndo.vtxundo.size() + 1 != block.vtx.size()) {
1977 LogError("DisconnectBlock(): block and undo data inconsistent\n");
1979 }
1980
1981 // First, restore inputs.
1982 for (size_t i = 1; i < block.vtx.size(); i++) {
1983 const CTransaction &tx = *(block.vtx[i]);
1984 CTxUndo &txundo = blockUndo.vtxundo[i - 1];
1985 if (txundo.vprevout.size() != tx.vin.size()) {
1986 LogError(
1987 "DisconnectBlock(): transaction and undo data inconsistent\n");
1989 }
1990
1991 for (size_t j = 0; j < tx.vin.size(); j++) {
1992 const COutPoint &out = tx.vin[j].prevout;
1993 DisconnectResult res =
1994 UndoCoinSpend(std::move(txundo.vprevout[j]), view, out);
1995 if (res == DisconnectResult::FAILED) {
1997 }
1998 fClean = fClean && res != DisconnectResult::UNCLEAN;
1999 }
2000 // At this point, all of txundo.vprevout should have been moved out.
2001 }
2002
2003 // Second, revert created outputs.
2004 for (const auto &ptx : block.vtx) {
2005 const CTransaction &tx = *ptx;
2006 const TxId &txid = tx.GetId();
2007 const bool is_coinbase = tx.IsCoinBase();
2008
2009 // Check that all outputs are available and match the outputs in the
2010 // block itself exactly.
2011 for (size_t o = 0; o < tx.vout.size(); o++) {
2012 if (tx.vout[o].scriptPubKey.IsUnspendable()) {
2013 continue;
2014 }
2015
2016 COutPoint out(txid, o);
2017 Coin coin;
2018 bool is_spent = view.SpendCoin(out, &coin);
2019 if (!is_spent || tx.vout[o] != coin.GetTxOut() ||
2020 uint32_t(pindex->nHeight) != coin.GetHeight() ||
2021 is_coinbase != coin.IsCoinBase()) {
2022 // transaction output mismatch
2023 fClean = false;
2024 }
2025 }
2026 }
2027
2028 // Move best block pointer to previous block.
2029 view.SetBestBlock(block.hashPrevBlock);
2030
2032}
2033
2034// Returns the script flags which should be checked for the block after
2035// the given block.
2036static uint32_t GetNextBlockScriptFlags(const CBlockIndex *pindex,
2037 const ChainstateManager &chainman) {
2038 const Consensus::Params &consensusparams = chainman.GetConsensus();
2039
2040 uint32_t flags = SCRIPT_VERIFY_NONE;
2041
2042 // Enforce P2SH (BIP16)
2043 if (DeploymentActiveAfter(pindex, chainman, Consensus::DEPLOYMENT_P2SH)) {
2045 }
2046
2047 // Enforce the DERSIG (BIP66) rule.
2048 if (DeploymentActiveAfter(pindex, chainman, Consensus::DEPLOYMENT_DERSIG)) {
2050 }
2051
2052 // Start enforcing CHECKLOCKTIMEVERIFY (BIP65) rule.
2053 if (DeploymentActiveAfter(pindex, chainman, Consensus::DEPLOYMENT_CLTV)) {
2055 }
2056
2057 // Start enforcing CSV (BIP68, BIP112 and BIP113) rule.
2058 if (DeploymentActiveAfter(pindex, chainman, Consensus::DEPLOYMENT_CSV)) {
2060 }
2061
2062 // If the UAHF is enabled, we start accepting replay protected txns
2063 if (IsUAHFenabled(consensusparams, pindex)) {
2066 }
2067
2068 // If the DAA HF is enabled, we start rejecting transaction that use a high
2069 // s in their signature. We also make sure that signature that are supposed
2070 // to fail (for instance in multisig or other forms of smart contracts) are
2071 // null.
2072 if (IsDAAEnabled(consensusparams, pindex)) {
2075 }
2076
2077 // When the magnetic anomaly fork is enabled, we start accepting
2078 // transactions using the OP_CHECKDATASIG opcode and it's verify
2079 // alternative. We also start enforcing push only signatures and
2080 // clean stack.
2081 if (IsMagneticAnomalyEnabled(consensusparams, pindex)) {
2084 }
2085
2086 if (IsGravitonEnabled(consensusparams, pindex)) {
2089 }
2090
2091 if (IsPhononEnabled(consensusparams, pindex)) {
2093 }
2094
2095 // We make sure this node will have replay protection during the next hard
2096 // fork.
2098 consensusparams, pindex,
2101 }
2102
2103 return flags;
2104}
2105
2112bool Chainstate::ConnectBlock(const CBlock &block, BlockValidationState &state,
2113 CBlockIndex *pindex, CCoinsViewCache &view,
2114 BlockValidationOptions options, Amount *blockFees,
2115 bool fJustCheck) {
2117 assert(pindex);
2118
2119 const BlockHash block_hash{block.GetHash()};
2120 assert(*pindex->phashBlock == block_hash);
2121
2122 const auto time_start{SteadyClock::now()};
2123
2124 const CChainParams &params{m_chainman.GetParams()};
2125 const Consensus::Params &consensusParams = params.GetConsensus();
2126
2127 // Check it again in case a previous version let a bad block in
2128 // NOTE: We don't currently (re-)invoke ContextualCheckBlock() or
2129 // ContextualCheckBlockHeader() here. This means that if we add a new
2130 // consensus rule that is enforced in one of those two functions, then we
2131 // may have let in a block that violates the rule prior to updating the
2132 // software, and we would NOT be enforcing the rule here. Fully solving
2133 // upgrade from one software version to the next after a consensus rule
2134 // change is potentially tricky and issue-specific.
2135 // Also, currently the rule against blocks more than 2 hours in the future
2136 // is enforced in ContextualCheckBlockHeader(); we wouldn't want to
2137 // re-enforce that rule here (at least until we make it impossible for
2138 // m_adjusted_time_callback() to go backward).
2139 if (!CheckBlock(block, state, consensusParams,
2140 options.withCheckPoW(!fJustCheck)
2141 .withCheckMerkleRoot(!fJustCheck))) {
2143 // We don't write down blocks to disk if they may have been
2144 // corrupted, so this should be impossible unless we're having
2145 // hardware problems.
2146 return FatalError(m_chainman.GetNotifications(), state,
2147 "Corrupt block found indicating potential "
2148 "hardware failure; shutting down");
2149 }
2150 LogError("%s: Consensus::CheckBlock: %s\n", __func__, state.ToString());
2151 return false;
2152 }
2153
2154 // Verify that the view's current state corresponds to the previous block
2155 BlockHash hashPrevBlock =
2156 pindex->pprev == nullptr ? BlockHash() : pindex->pprev->GetBlockHash();
2157 assert(hashPrevBlock == view.GetBestBlock());
2158
2159 m_chainman.num_blocks_total++;
2160
2161 // Special case for the genesis block, skipping connection of its
2162 // transactions (its coinbase is unspendable)
2163 if (block_hash == consensusParams.hashGenesisBlock) {
2164 if (!fJustCheck) {
2165 view.SetBestBlock(pindex->GetBlockHash());
2166 }
2167
2168 return true;
2169 }
2170
2171 bool fScriptChecks = true;
2173 // We've been configured with the hash of a block which has been
2174 // externally verified to have a valid history. A suitable default value
2175 // is included with the software and updated from time to time. Because
2176 // validity relative to a piece of software is an objective fact these
2177 // defaults can be easily reviewed. This setting doesn't force the
2178 // selection of any particular chain but makes validating some faster by
2179 // effectively caching the result of part of the verification.
2180 BlockMap::const_iterator it{
2181 m_blockman.m_block_index.find(m_chainman.AssumedValidBlock())};
2182 if (it != m_blockman.m_block_index.end()) {
2183 if (it->second.GetAncestor(pindex->nHeight) == pindex &&
2184 m_chainman.m_best_header->GetAncestor(pindex->nHeight) ==
2185 pindex &&
2186 m_chainman.m_best_header->nChainWork >=
2188 // This block is a member of the assumed verified chain and an
2189 // ancestor of the best header.
2190 // Script verification is skipped when connecting blocks under
2191 // the assumevalid block. Assuming the assumevalid block is
2192 // valid this is safe because block merkle hashes are still
2193 // computed and checked, Of course, if an assumed valid block is
2194 // invalid due to false scriptSigs this optimization would allow
2195 // an invalid chain to be accepted.
2196 // The equivalent time check discourages hash power from
2197 // extorting the network via DOS attack into accepting an
2198 // invalid block through telling users they must manually set
2199 // assumevalid. Requiring a software change or burying the
2200 // invalid block, regardless of the setting, makes it hard to
2201 // hide the implication of the demand. This also avoids having
2202 // release candidates that are hardly doing any signature
2203 // verification at all in testing without having to artificially
2204 // set the default assumed verified block further back. The test
2205 // against the minimum chain work prevents the skipping when
2206 // denied access to any chain at least as good as the expected
2207 // chain.
2208 fScriptChecks = (GetBlockProofEquivalentTime(
2209 *m_chainman.m_best_header, *pindex,
2210 *m_chainman.m_best_header,
2211 consensusParams) <= 60 * 60 * 24 * 7 * 2);
2212 }
2213 }
2214 }
2215
2216 const auto time_1{SteadyClock::now()};
2217 m_chainman.time_check += time_1 - time_start;
2218 LogDebug(BCLog::BENCH, " - Sanity checks: %.2fms [%.2fs (%.2fms/blk)]\n",
2219 Ticks<MillisecondsDouble>(time_1 - time_start),
2220 Ticks<SecondsDouble>(m_chainman.time_check),
2221 Ticks<MillisecondsDouble>(m_chainman.time_check) /
2222 m_chainman.num_blocks_total);
2223
2224 // Do not allow blocks that contain transactions which 'overwrite' older
2225 // transactions, unless those are already completely spent. If such
2226 // overwrites are allowed, coinbases and transactions depending upon those
2227 // can be duplicated to remove the ability to spend the first instance --
2228 // even after being sent to another address.
2229 // See BIP30, CVE-2012-1909, and http://r6.ca/blog/20120206T005236Z.html
2230 // for more information. This rule was originally applied to all blocks
2231 // with a timestamp after March 15, 2012, 0:00 UTC. Now that the whole
2232 // chain is irreversibly beyond that time it is applied to all blocks
2233 // except the two in the chain that violate it. This prevents exploiting
2234 // the issue against nodes during their initial block download.
2235 bool fEnforceBIP30 = !((pindex->nHeight == 91842 &&
2236 pindex->GetBlockHash() ==
2237 uint256S("0x00000000000a4d0a398161ffc163c503763"
2238 "b1f4360639393e0e4c8e300e0caec")) ||
2239 (pindex->nHeight == 91880 &&
2240 pindex->GetBlockHash() ==
2241 uint256S("0x00000000000743f190a18c5577a3c2d2a1f"
2242 "610ae9601ac046a38084ccb7cd721")));
2243
2244 // Once BIP34 activated it was not possible to create new duplicate
2245 // coinbases and thus other than starting with the 2 existing duplicate
2246 // coinbase pairs, not possible to create overwriting txs. But by the time
2247 // BIP34 activated, in each of the existing pairs the duplicate coinbase had
2248 // overwritten the first before the first had been spent. Since those
2249 // coinbases are sufficiently buried it's no longer possible to create
2250 // further duplicate transactions descending from the known pairs either. If
2251 // we're on the known chain at height greater than where BIP34 activated, we
2252 // can save the db accesses needed for the BIP30 check.
2253
2254 // BIP34 requires that a block at height X (block X) has its coinbase
2255 // scriptSig start with a CScriptNum of X (indicated height X). The above
2256 // logic of no longer requiring BIP30 once BIP34 activates is flawed in the
2257 // case that there is a block X before the BIP34 height of 227,931 which has
2258 // an indicated height Y where Y is greater than X. The coinbase for block
2259 // X would also be a valid coinbase for block Y, which could be a BIP30
2260 // violation. An exhaustive search of all mainnet coinbases before the
2261 // BIP34 height which have an indicated height greater than the block height
2262 // reveals many occurrences. The 3 lowest indicated heights found are
2263 // 209,921, 490,897, and 1,983,702 and thus coinbases for blocks at these 3
2264 // heights would be the first opportunity for BIP30 to be violated.
2265
2266 // The search reveals a great many blocks which have an indicated height
2267 // greater than 1,983,702, so we simply remove the optimization to skip
2268 // BIP30 checking for blocks at height 1,983,702 or higher. Before we reach
2269 // that block in another 25 years or so, we should take advantage of a
2270 // future consensus change to do a new and improved version of BIP34 that
2271 // will actually prevent ever creating any duplicate coinbases in the
2272 // future.
2273 static constexpr int BIP34_IMPLIES_BIP30_LIMIT = 1983702;
2274
2275 // There is no potential to create a duplicate coinbase at block 209,921
2276 // because this is still before the BIP34 height and so explicit BIP30
2277 // checking is still active.
2278
2279 // The final case is block 176,684 which has an indicated height of
2280 // 490,897. Unfortunately, this issue was not discovered until about 2 weeks
2281 // before block 490,897 so there was not much opportunity to address this
2282 // case other than to carefully analyze it and determine it would not be a
2283 // problem. Block 490,897 was, in fact, mined with a different coinbase than
2284 // block 176,684, but it is important to note that even if it hadn't been or
2285 // is remined on an alternate fork with a duplicate coinbase, we would still
2286 // not run into a BIP30 violation. This is because the coinbase for 176,684
2287 // is spent in block 185,956 in transaction
2288 // d4f7fbbf92f4a3014a230b2dc70b8058d02eb36ac06b4a0736d9d60eaa9e8781. This
2289 // spending transaction can't be duplicated because it also spends coinbase
2290 // 0328dd85c331237f18e781d692c92de57649529bd5edf1d01036daea32ffde29. This
2291 // coinbase has an indicated height of over 4.2 billion, and wouldn't be
2292 // duplicatable until that height, and it's currently impossible to create a
2293 // chain that long. Nevertheless we may wish to consider a future soft fork
2294 // which retroactively prevents block 490,897 from creating a duplicate
2295 // coinbase. The two historical BIP30 violations often provide a confusing
2296 // edge case when manipulating the UTXO and it would be simpler not to have
2297 // another edge case to deal with.
2298
2299 // testnet3 has no blocks before the BIP34 height with indicated heights
2300 // post BIP34 before approximately height 486,000,000 and presumably will
2301 // be reset before it reaches block 1,983,702 and starts doing unnecessary
2302 // BIP30 checking again.
2303 assert(pindex->pprev);
2304 CBlockIndex *pindexBIP34height =
2305 pindex->pprev->GetAncestor(consensusParams.BIP34Height);
2306 // Only continue to enforce if we're below BIP34 activation height or the
2307 // block hash at that height doesn't correspond.
2308 fEnforceBIP30 =
2309 fEnforceBIP30 &&
2310 (!pindexBIP34height ||
2311 !(pindexBIP34height->GetBlockHash() == consensusParams.BIP34Hash));
2312
2313 // TODO: Remove BIP30 checking from block height 1,983,702 on, once we have
2314 // a consensus change that ensures coinbases at those heights can not
2315 // duplicate earlier coinbases.
2316 if (fEnforceBIP30 || pindex->nHeight >= BIP34_IMPLIES_BIP30_LIMIT) {
2317 for (const auto &tx : block.vtx) {
2318 for (size_t o = 0; o < tx->vout.size(); o++) {
2319 if (view.HaveCoin(COutPoint(tx->GetId(), o))) {
2321 "bad-txns-BIP30",
2322 "tried to overwrite transaction");
2323 }
2324 }
2325 }
2326 }
2327
2328 // Enforce BIP68 (sequence locks).
2329 int nLockTimeFlags = 0;
2330 if (DeploymentActiveAt(*pindex, consensusParams,
2332 nLockTimeFlags |= LOCKTIME_VERIFY_SEQUENCE;
2333 }
2334
2335 const uint32_t flags = GetNextBlockScriptFlags(pindex->pprev, m_chainman);
2336
2337 const auto time_2{SteadyClock::now()};
2338 m_chainman.time_forks += time_2 - time_1;
2339 LogDebug(BCLog::BENCH, " - Fork checks: %.2fms [%.2fs (%.2fms/blk)]\n",
2340 Ticks<MillisecondsDouble>(time_2 - time_1),
2341 Ticks<SecondsDouble>(m_chainman.time_forks),
2342 Ticks<MillisecondsDouble>(m_chainman.time_forks) /
2343 m_chainman.num_blocks_total);
2344
2345 std::vector<int> prevheights;
2346 Amount nFees = Amount::zero();
2347 int nInputs = 0;
2348
2349 // Limit the total executed signature operations in the block, a consensus
2350 // rule. Tracking during the CPU-consuming part (validation of uncached
2351 // inputs) is per-input atomic and validation in each thread stops very
2352 // quickly after the limit is exceeded, so an adversary cannot cause us to
2353 // exceed the limit by much at all.
2354 CheckInputsLimiter nSigChecksBlockLimiter(
2356
2357 std::vector<TxSigCheckLimiter> nSigChecksTxLimiters;
2358 nSigChecksTxLimiters.resize(block.vtx.size() - 1);
2359
2360 CBlockUndo blockundo;
2361 blockundo.vtxundo.resize(block.vtx.size() - 1);
2362
2363 std::optional<CCheckQueueControl<CScriptCheck>> control;
2364 if (fScriptChecks) {
2365 control.emplace(m_chainman.GetCheckQueue());
2366 }
2367
2368 // Add all outputs
2369 try {
2370 for (const auto &ptx : block.vtx) {
2371 AddCoins(view, *ptx, pindex->nHeight);
2372 }
2373 } catch (const std::logic_error &e) {
2374 // This error will be thrown from AddCoin if we try to connect a block
2375 // containing duplicate transactions. Such a thing should normally be
2376 // caught early nowadays (due to ContextualCheckBlock's CTOR
2377 // enforcement) however some edge cases can escape that:
2378 // - ContextualCheckBlock does not get re-run after saving the block to
2379 // disk, and older versions may have saved a weird block.
2380 // - its checks are not applied to pre-CTOR chains, which we might visit
2381 // with checkpointing off.
2383 "tx-duplicate", "tried to overwrite transaction");
2384 }
2385
2386 size_t txIndex = 0;
2387 // nSigChecksRet may be accurate (found in cache) or 0 (checks were
2388 // deferred into vChecks).
2389 int nSigChecksRet;
2390 for (const auto &ptx : block.vtx) {
2391 const CTransaction &tx = *ptx;
2392 const bool isCoinBase = tx.IsCoinBase();
2393 nInputs += tx.vin.size();
2394
2395 {
2396 Amount txfee = Amount::zero();
2397 TxValidationState tx_state;
2398 if (!isCoinBase &&
2399 !Consensus::CheckTxInputs(tx, tx_state, view, pindex->nHeight,
2400 txfee)) {
2401 // Any transaction validation failure in ConnectBlock is a block
2402 // consensus failure.
2404 tx_state.GetRejectReason(),
2405 tx_state.GetDebugMessage() + " in transaction " +
2406 tx.GetId().ToString());
2407 break;
2408 }
2409 nFees += txfee;
2410 }
2411
2412 if (!MoneyRange(nFees)) {
2414 "bad-txns-accumulated-fee-outofrange",
2415 "accumulated fee in the block out of range");
2416 break;
2417 }
2418
2419 // The following checks do not apply to the coinbase.
2420 if (isCoinBase) {
2421 continue;
2422 }
2423
2424 // Check that transaction is BIP68 final BIP68 lock checks (as
2425 // opposed to nLockTime checks) must be in ConnectBlock because they
2426 // require the UTXO set.
2427 prevheights.resize(tx.vin.size());
2428 for (size_t j = 0; j < tx.vin.size(); j++) {
2429 prevheights[j] = view.AccessCoin(tx.vin[j].prevout).GetHeight();
2430 }
2431
2432 if (!SequenceLocks(tx, nLockTimeFlags, prevheights, *pindex)) {
2434 "bad-txns-nonfinal",
2435 "contains a non-BIP68-final transaction " +
2436 tx.GetHash().ToString());
2437 break;
2438 }
2439
2440 // Don't cache results if we're actually connecting blocks (still
2441 // consult the cache, though).
2442 bool fCacheResults = fJustCheck;
2443
2444 const bool fEnforceSigCheck = flags & SCRIPT_ENFORCE_SIGCHECKS;
2445 if (!fEnforceSigCheck) {
2446 // Historically, there has been transactions with a very high
2447 // sigcheck count, so we need to disable this check for such
2448 // transactions.
2449 nSigChecksTxLimiters[txIndex] = TxSigCheckLimiter::getDisabled();
2450 }
2451
2452 std::vector<CScriptCheck> vChecks;
2453 TxValidationState tx_state;
2454 if (fScriptChecks &&
2455 !CheckInputScripts(tx, tx_state, view, flags, fCacheResults,
2456 fCacheResults, PrecomputedTransactionData(tx),
2457 m_chainman.m_validation_cache, nSigChecksRet,
2458 nSigChecksTxLimiters[txIndex],
2459 &nSigChecksBlockLimiter, &vChecks)) {
2460 // Any transaction validation failure in ConnectBlock is a block
2461 // consensus failure
2463 tx_state.GetRejectReason(),
2464 tx_state.GetDebugMessage());
2465 break;
2466 }
2467
2468 if (control) {
2469 control->Add(std::move(vChecks));
2470 }
2471
2472 // Note: this must execute in the same iteration as CheckTxInputs (not
2473 // in a separate loop) in order to detect double spends. However,
2474 // this does not prevent double-spending by duplicated transaction
2475 // inputs in the same transaction (cf. CVE-2018-17144) -- that check is
2476 // done in CheckBlock (CheckRegularTransaction).
2477 SpendCoins(view, tx, blockundo.vtxundo.at(txIndex), pindex->nHeight);
2478 txIndex++;
2479 }
2480 const auto time_3{SteadyClock::now()};
2481 m_chainman.time_connect += time_3 - time_2;
2483 " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) "
2484 "[%.2fs (%.2fms/blk)]\n",
2485 (unsigned)block.vtx.size(),
2486 Ticks<MillisecondsDouble>(time_3 - time_2),
2487 Ticks<MillisecondsDouble>(time_3 - time_2) / block.vtx.size(),
2488 nInputs <= 1
2489 ? 0
2490 : Ticks<MillisecondsDouble>(time_3 - time_2) / (nInputs - 1),
2491 Ticks<SecondsDouble>(m_chainman.time_connect),
2492 Ticks<MillisecondsDouble>(m_chainman.time_connect) /
2493 m_chainman.num_blocks_total);
2494
2495 const Amount blockReward =
2496 nFees + GetBlockSubsidy(pindex->nHeight, consensusParams);
2497 if (block.vtx[0]->GetValueOut() > blockReward && state.IsValid()) {
2498 state.Invalid(
2500 strprintf("coinbase pays too much (actual=%d vs limit=%d)",
2501 block.vtx[0]->GetValueOut(), blockReward));
2502 }
2503
2504 if (blockFees) {
2505 *blockFees = nFees;
2506 }
2507 if (control) {
2508 auto parallel_result = control->Complete();
2509 if (parallel_result.has_value() && state.IsValid()) {
2511 strprintf("mandatory-script-verify-flag-failed (%s)",
2512 ScriptErrorString(parallel_result->first)),
2513 parallel_result->second);
2514 }
2515 }
2516 if (!state.IsValid()) {
2517 LogInfo("Block validation error: %s\n", state.ToString());
2518 return false;
2519 }
2520 const auto time_4{SteadyClock::now()};
2521 m_chainman.time_verify += time_4 - time_2;
2522 LogDebug(
2524 " - Verify %u txins: %.2fms (%.3fms/txin) [%.2fs (%.2fms/blk)]\n",
2525 nInputs - 1, Ticks<MillisecondsDouble>(time_4 - time_2),
2526 nInputs <= 1
2527 ? 0
2528 : Ticks<MillisecondsDouble>(time_4 - time_2) / (nInputs - 1),
2529 Ticks<SecondsDouble>(m_chainman.time_verify),
2530 Ticks<MillisecondsDouble>(m_chainman.time_verify) /
2531 m_chainman.num_blocks_total);
2532
2533 if (fJustCheck) {
2534 return true;
2535 }
2536
2537 if (!m_blockman.WriteBlockUndo(blockundo, state, *pindex)) {
2538 return false;
2539 }
2540
2541 if (!pindex->IsValid(BlockValidity::SCRIPTS)) {
2543 m_blockman.m_dirty_blockindex.insert(pindex);
2544 }
2545
2546 // add this block to the view's block chain
2547 view.SetBestBlock(pindex->GetBlockHash());
2548
2549 const auto time_5{SteadyClock::now()};
2550 m_chainman.time_index += time_5 - time_4;
2551 LogDebug(BCLog::BENCH, " - Index writing: %.2fms [%.2fs (%.2fms/blk)]\n",
2552 Ticks<MillisecondsDouble>(time_5 - time_4),
2553 Ticks<SecondsDouble>(m_chainman.time_index),
2554 Ticks<MillisecondsDouble>(m_chainman.time_index) /
2555 m_chainman.num_blocks_total);
2556
2557 TRACE6(validation, block_connected, block_hash.data(), pindex->nHeight,
2558 block.vtx.size(), nInputs, nSigChecksRet,
2559 // in microseconds (µs)
2560 time_5 - time_start);
2561
2562 return true;
2563}
2564
2565CoinsCacheSizeState Chainstate::GetCoinsCacheSizeState() {
2567 return this->GetCoinsCacheSizeState(
2570}
2571
2573Chainstate::GetCoinsCacheSizeState(size_t max_coins_cache_size_bytes,
2574 size_t max_mempool_size_bytes) {
2576 int64_t nMempoolUsage = m_mempool ? m_mempool->DynamicMemoryUsage() : 0;
2577 int64_t cacheSize = CoinsTip().DynamicMemoryUsage();
2578 int64_t nTotalSpace =
2579 max_coins_cache_size_bytes +
2580 std::max<int64_t>(int64_t(max_mempool_size_bytes) - nMempoolUsage, 0);
2581
2583 static constexpr int64_t MAX_BLOCK_COINSDB_USAGE_BYTES =
2584 10 * 1024 * 1024; // 10MB
2585 int64_t large_threshold = std::max(
2586 (9 * nTotalSpace) / 10, nTotalSpace - MAX_BLOCK_COINSDB_USAGE_BYTES);
2587
2588 if (cacheSize > nTotalSpace) {
2589 LogPrintf("Cache size (%s) exceeds total space (%s)\n", cacheSize,
2590 nTotalSpace);
2592 } else if (cacheSize > large_threshold) {
2594 }
2596}
2597
2599 FlushStateMode mode, int nManualPruneHeight) {
2600 LOCK(cs_main);
2601 assert(this->CanFlushToDisk());
2602 std::set<int> setFilesToPrune;
2603 bool full_flush_completed = false;
2604
2605 [[maybe_unused]] const size_t coins_count{CoinsTip().GetCacheSize()};
2606 [[maybe_unused]] const size_t coins_mem_usage{
2608
2609 try {
2610 {
2611 bool fFlushForPrune = false;
2612
2613 CoinsCacheSizeState cache_state = GetCoinsCacheSizeState();
2615 if (m_blockman.IsPruneMode() &&
2616 (m_blockman.m_check_for_pruning || nManualPruneHeight > 0) &&
2618 // Make sure we don't prune any of the prune locks bestblocks.
2619 // Pruning is height-based.
2620 int last_prune{m_chain.Height()};
2621 // prune lock that actually was the limiting factor, only used
2622 // for logging
2623 std::optional<std::string> limiting_lock;
2624
2625 for (const auto &prune_lock : m_blockman.m_prune_locks) {
2626 if (prune_lock.second.height_first ==
2627 std::numeric_limits<int>::max()) {
2628 continue;
2629 }
2630 // Remove the buffer and one additional block here to get
2631 // actual height that is outside of the buffer
2632 const int lock_height{prune_lock.second.height_first -
2633 PRUNE_LOCK_BUFFER - 1};
2634 last_prune = std::max(1, std::min(last_prune, lock_height));
2635 if (last_prune == lock_height) {
2636 limiting_lock = prune_lock.first;
2637 }
2638 }
2639
2640 if (limiting_lock) {
2641 LogDebug(BCLog::PRUNE, "%s limited pruning to height %d\n",
2642 limiting_lock.value(), last_prune);
2643 }
2644
2645 if (nManualPruneHeight > 0) {
2647 "find files to prune (manual)", BCLog::BENCH);
2649 setFilesToPrune,
2650 std::min(last_prune, nManualPruneHeight), *this,
2651 m_chainman);
2652 } else {
2653 LOG_TIME_MILLIS_WITH_CATEGORY("find files to prune",
2654 BCLog::BENCH);
2655 m_blockman.FindFilesToPrune(setFilesToPrune, last_prune,
2656 *this, m_chainman);
2658 }
2659 if (!setFilesToPrune.empty()) {
2660 fFlushForPrune = true;
2662 m_blockman.m_block_tree_db->WriteFlag(
2663 "prunedblockfiles", true);
2665 }
2666 }
2667 }
2668 const auto nNow{NodeClock::now()};
2669 // The cache is large and we're within 10% and 10 MiB of the limit,
2670 // but we have time now (not in the middle of a block processing).
2671 bool fCacheLarge = mode == FlushStateMode::PERIODIC &&
2672 cache_state >= CoinsCacheSizeState::LARGE;
2673 // The cache is over the limit, we have to write now.
2674 bool fCacheCritical = mode == FlushStateMode::IF_NEEDED &&
2675 cache_state >= CoinsCacheSizeState::CRITICAL;
2676 // It's been a while since we wrote the block index and chain
2677 // state to disk. Do this frequently, so we don't need to
2678 // redownload or reindex after a crash.
2679 bool fPeriodicWrite =
2680 mode == FlushStateMode::PERIODIC && nNow >= m_next_write;
2681 // Combine all conditions that result in a write to disk.
2682 bool should_write = (mode == FlushStateMode::ALWAYS) ||
2683 fCacheLarge || fCacheCritical ||
2684 fPeriodicWrite || fFlushForPrune;
2685 // Write blocks, block index and best chain related state to disk.
2686 if (should_write) {
2687 // Ensure we can write block index
2689 return FatalError(m_chainman.GetNotifications(), state,
2690 "Disk space is too low!",
2691 _("Disk space is too low!"));
2692 }
2693
2694 {
2696 "write block and undo data to disk", BCLog::BENCH);
2697
2698 // First make sure all block and undo data is flushed to
2699 // disk.
2700 // TODO: Handle return error, or add detailed comment why
2701 // it is safe to not return an error upon failure.
2703 m_chain.Height())) {
2705 "%s: Failed to flush block file.\n",
2706 __func__);
2707 }
2708 }
2709 // Then update all block file information (which may refer to
2710 // block and undo files).
2711 {
2712 LOG_TIME_MILLIS_WITH_CATEGORY("write block index to disk",
2713 BCLog::BENCH);
2714
2715 m_blockman.WriteBlockIndexDB();
2716 }
2717
2718 // Finally remove any pruned files
2719 if (fFlushForPrune) {
2720 LOG_TIME_MILLIS_WITH_CATEGORY("unlink pruned files",
2721 BCLog::BENCH);
2722
2723 m_blockman.UnlinkPrunedFiles(setFilesToPrune);
2724 }
2725
2726 if (!CoinsTip().GetBestBlock().IsNull()) {
2727 // Typical Coin structures on disk are around 48 bytes in
2728 // size. Pushing a new one to the database can cause it to
2729 // be written twice (once in the log, and once in the
2730 // tables). This is already an overestimation, as most will
2731 // delete an existing entry or overwrite one. Still, use a
2732 // conservative safety factor of 2.
2734 48 * 2 * 2 *
2735 CoinsTip().GetDirtyCount())) {
2736 return FatalError(m_chainman.GetNotifications(), state,
2737 "Disk space is too low!",
2738 _("Disk space is too low!"));
2739 }
2740
2741 // Flush the chainstate (which may refer to block index
2742 // entries).
2743 const auto empty_cache{(mode == FlushStateMode::ALWAYS) ||
2744 fCacheLarge || fCacheCritical};
2745 empty_cache ? CoinsTip().Flush() : CoinsTip().Sync();
2746 full_flush_completed = true;
2747 TRACE5(utxocache, flush,
2748 int64_t{Ticks<std::chrono::microseconds>(
2749 SteadyClock::now() - nNow)},
2750 uint32_t(mode), coins_count,
2751 uint64_t(coins_mem_usage), fFlushForPrune);
2752 }
2753 }
2754
2755 if (should_write || m_next_write == NodeClock::time_point::max()) {
2756 constexpr auto range{DATABASE_WRITE_INTERVAL_MAX -
2760 }
2761 }
2762
2763 if (full_flush_completed && m_chainman.m_options.signals) {
2764 // Update best block in wallet (so we can detect restored wallets).
2766 this->GetRole(), m_chain.GetLocator());
2767 }
2768 } catch (const std::runtime_error &e) {
2769 return FatalError(m_chainman.GetNotifications(), state,
2770 std::string("System error while flushing: ") +
2771 e.what());
2772 }
2773 return true;
2774}
2775
2778 if (!this->FlushStateToDisk(state, FlushStateMode::ALWAYS)) {
2779 LogPrintf("%s: failed to flush state (%s)\n", __func__,
2780 state.ToString());
2781 }
2782}
2783
2787 if (!this->FlushStateToDisk(state, FlushStateMode::NONE)) {
2788 LogPrintf("%s: failed to flush state (%s)\n", __func__,
2789 state.ToString());
2790 }
2791}
2792
2793static void UpdateTipLog(const CCoinsViewCache &coins_tip,
2794 const CBlockIndex *tip, const CChainParams &params,
2795 const std::string &func_name,
2796 const std::string &prefix)
2799
2800 // Disable rate limiting in LogPrintLevel_ so this source location may log
2801 // during IBD.
2803 BCLog::LogFlags::ALL, BCLog::Level::Info,
2804 /*should_ratelimit=*/false,
2805 "%s%s: new best=%s height=%d version=0x%08x log2_work=%f tx=%lu "
2806 "date='%s' progress=%f cache=%.1fMiB(%utxo)\n",
2807 prefix, func_name, tip->GetBlockHash().ToString(), tip->nHeight,
2808 tip->nVersion, log(tip->nChainWork.getdouble()) / log(2.0),
2810 GuessVerificationProgress(params.TxData(), tip),
2811 coins_tip.DynamicMemoryUsage() * (1.0 / (1 << 20)),
2812 coins_tip.GetCacheSize());
2813}
2814
2815void Chainstate::UpdateTip(const CBlockIndex *pindexNew) {
2817 const auto &coins_tip = CoinsTip();
2818
2819 const CChainParams &params{m_chainman.GetParams()};
2820
2821 // The remainder of the function isn't relevant if we are not acting on
2822 // the active chainstate, so return if need be.
2823 if (this != &m_chainman.ActiveChainstate()) {
2824 // Only log every so often so that we don't bury log messages at the
2825 // tip.
2826 constexpr int BACKGROUND_LOG_INTERVAL = 2000;
2827 if (pindexNew->nHeight % BACKGROUND_LOG_INTERVAL == 0) {
2828 UpdateTipLog(coins_tip, pindexNew, params, __func__,
2829 "[background validation] ");
2830 }
2831 return;
2832 }
2833
2834 // New best block
2835 if (m_mempool) {
2837 }
2838
2839 {
2841 g_best_block = pindexNew;
2842 g_best_block_cv.notify_all();
2843 }
2844
2845 UpdateTipLog(coins_tip, pindexNew, params, __func__, "");
2846}
2847
2860 DisconnectedBlockTransactions *disconnectpool) {
2862 if (m_mempool) {
2864 }
2865
2866 CBlockIndex *pindexDelete = m_chain.Tip();
2867
2868 assert(pindexDelete);
2869 assert(pindexDelete->pprev);
2870
2871 // Read block from disk.
2872 std::shared_ptr<CBlock> pblock = std::make_shared<CBlock>();
2873 CBlock &block = *pblock;
2874 if (!m_blockman.ReadBlock(block, *pindexDelete)) {
2875 LogError("DisconnectTip(): Failed to read block\n");
2876 return false;
2877 }
2878
2879 // Apply the block atomically to the chain state.
2880 const auto time_start{SteadyClock::now()};
2881 {
2882 CCoinsViewCache view(&CoinsTip());
2883 assert(view.GetBestBlock() == pindexDelete->GetBlockHash());
2884 if (DisconnectBlock(block, pindexDelete, view) !=
2886 LogError("DisconnectTip(): DisconnectBlock %s failed\n",
2887 pindexDelete->GetBlockHash().ToString());
2888 return false;
2889 }
2890
2891 // local CCoinsViewCache goes out of scope
2892 view.Flush(/*reallocate_cache=*/false);
2893 }
2894 LogDebug(BCLog::BENCH, "- Disconnect block: %.2fms\n",
2895 Ticks<MillisecondsDouble>(SteadyClock::now() - time_start));
2896
2897 {
2898 // Prune locks that began at or after the tip should be moved backward
2899 // so they get a chance to reorg
2900 const int max_height_first{pindexDelete->nHeight - 1};
2901 for (auto &prune_lock : m_blockman.m_prune_locks) {
2902 if (prune_lock.second.height_first <= max_height_first) {
2903 continue;
2904 }
2905
2906 prune_lock.second.height_first = max_height_first;
2907 LogDebug(BCLog::PRUNE, "%s prune lock moved back to %d\n",
2908 prune_lock.first, max_height_first);
2909 }
2910 }
2911
2912 // Write the chain state to disk, if necessary.
2914 return false;
2915 }
2916
2917 if (m_mempool) {
2918 // If this block is deactivating a fork, we move all mempool
2919 // transactions in front of disconnectpool for reprocessing in a future
2920 // updateMempoolForReorg call
2921 if (pindexDelete->pprev != nullptr &&
2922 GetNextBlockScriptFlags(pindexDelete, m_chainman) !=
2923 GetNextBlockScriptFlags(pindexDelete->pprev, m_chainman)) {
2925 "Disconnecting mempool due to rewind of upgrade block\n");
2926 if (disconnectpool) {
2927 disconnectpool->importMempool(*m_mempool);
2928 }
2929 m_mempool->clear();
2930 }
2931
2932 if (disconnectpool) {
2933 disconnectpool->addForBlock(block.vtx, *m_mempool);
2934 }
2935 }
2936
2937 m_chain.SetTip(*pindexDelete->pprev);
2938
2939 UpdateTip(pindexDelete->pprev);
2940 // Let wallets know transactions went from 1-confirmed to
2941 // 0-confirmed or conflicted:
2943 m_chainman.m_options.signals->BlockDisconnected(pblock, pindexDelete);
2944 }
2945 return true;
2946}
2947
2953 BlockPolicyValidationState &blockPolicyState,
2954 CBlockIndex *pindexNew,
2955 const std::shared_ptr<const CBlock> &pblock,
2956 DisconnectedBlockTransactions &disconnectpool,
2957 const avalanche::Processor *const avalanche,
2958 const ChainstateRole chainstate_role) {
2960 if (m_mempool) {
2962 }
2963
2964 const Consensus::Params &consensusParams = m_chainman.GetConsensus();
2965
2966 assert(pindexNew->pprev == m_chain.Tip());
2967 // Read block from disk.
2968 const auto time_1{SteadyClock::now()};
2969 std::shared_ptr<const CBlock> pthisBlock;
2970 if (!pblock) {
2971 std::shared_ptr<CBlock> pblockNew = std::make_shared<CBlock>();
2972 if (!m_blockman.ReadBlock(*pblockNew, *pindexNew)) {
2973 return FatalError(m_chainman.GetNotifications(), state,
2974 "Failed to read block");
2975 }
2976 pthisBlock = pblockNew;
2977 } else {
2978 pthisBlock = pblock;
2979 }
2980
2981 const CBlock &blockConnecting = *pthisBlock;
2982
2983 // Apply the block atomically to the chain state.
2984 const auto time_2{SteadyClock::now()};
2985 SteadyClock::time_point time_3;
2986 // When adding aggregate statistics in the future, keep in mind that
2987 // num_blocks_total may be zero until the ConnectBlock() call below.
2988 LogDebug(BCLog::BENCH, " - Load block from disk: %.2fms\n",
2989 Ticks<MillisecondsDouble>(time_2 - time_1));
2990 {
2991 Amount blockFees{Amount::zero()};
2992 CCoinsViewCache &view{*m_coins_views->m_connect_block_view};
2993 const auto reset_guard{view.CreateResetGuard()};
2994 bool rv = ConnectBlock(blockConnecting, state, pindexNew, view,
2996 &blockFees);
2998 m_chainman.m_options.signals->BlockChecked(blockConnecting, state);
2999 }
3000 if (!rv) {
3001 if (state.IsInvalid()) {
3002 InvalidBlockFound(pindexNew, state);
3003 }
3004
3005 LogError("%s: ConnectBlock %s failed, %s\n", __func__,
3006 pindexNew->GetBlockHash().ToString(), state.ToString());
3007 return false;
3008 }
3009
3021 const BlockHash blockhash = pindexNew->GetBlockHash();
3025
3026 const Amount blockReward =
3027 blockFees +
3028 GetBlockSubsidy(pindexNew->nHeight, consensusParams);
3029
3030 std::vector<std::unique_ptr<ParkingPolicy>> parkingPolicies;
3031 parkingPolicies.emplace_back(std::make_unique<MinerFundPolicy>(
3032 consensusParams, *pindexNew, blockConnecting, blockReward));
3033
3034 if (avalanche) {
3035 // Only enable the RTT policy if the node already finalized a
3036 // block. This is because it's very possible that new blocks
3037 // will be parked after a node restart (but after IBD) if the
3038 // node is behind by a few blocks. We want to make sure that the
3039 // node will be able to switch back to the right tip in this
3040 // case.
3041 if (avalanche->hasFinalizedTip()) {
3042 // Special case for testnet, don't reject blocks mined with
3043 // the min difficulty
3044 if (!consensusParams.fPowAllowMinDifficultyBlocks ||
3045 (blockConnecting.GetBlockTime() <=
3046 pindexNew->pprev->GetBlockTime() +
3047 2 * consensusParams.nPowTargetSpacing)) {
3048 parkingPolicies.emplace_back(
3049 std::make_unique<RTTPolicy>(consensusParams,
3050 *pindexNew));
3051 }
3052 }
3053
3054 parkingPolicies.emplace_back(
3055 std::make_unique<StakingRewardsPolicy>(
3056 *avalanche, consensusParams, *pindexNew,
3057 blockConnecting, blockReward));
3058
3059 if (m_mempool) {
3060 parkingPolicies.emplace_back(
3061 std::make_unique<PreConsensusPolicy>(
3062 *avalanche, *pindexNew, blockConnecting, m_mempool,
3063 &disconnectpool));
3064 }
3065 }
3066
3067 // If any block policy is violated, bail on the first one found
3068 if (std::find_if_not(parkingPolicies.begin(), parkingPolicies.end(),
3069 [&](const auto &policy) {
3070 bool ret = (*policy)(blockPolicyState);
3071 if (!ret) {
3072 LogPrintf(
3073 "Park block because it "
3074 "violated a block policy: %s\n",
3075 blockPolicyState.ToString());
3076 }
3077 return ret;
3078 }) != parkingPolicies.end()) {
3079 pindexNew->nStatus = pindexNew->nStatus.withParked();
3080 m_blockman.m_dirty_blockindex.insert(pindexNew);
3081 return false;
3082 }
3083 }
3084
3085 time_3 = SteadyClock::now();
3086 m_chainman.time_connect_total += time_3 - time_2;
3087 assert(m_chainman.num_blocks_total > 0);
3089 " - Connect total: %.2fms [%.2fs (%.2fms/blk)]\n",
3090 Ticks<MillisecondsDouble>(time_3 - time_2),
3091 Ticks<SecondsDouble>(m_chainman.time_connect_total),
3092 Ticks<MillisecondsDouble>(m_chainman.time_connect_total) /
3093 m_chainman.num_blocks_total);
3094 // No need to reallocate since it only has capacity for 1 block
3095 view.Flush(/*reallocate_cache=*/false);
3096 }
3097
3098 const auto time_4{SteadyClock::now()};
3099 m_chainman.time_flush += time_4 - time_3;
3100 LogDebug(BCLog::BENCH, " - Flush: %.2fms [%.2fs (%.2fms/blk)]\n",
3101 Ticks<MillisecondsDouble>(time_4 - time_3),
3102 Ticks<SecondsDouble>(m_chainman.time_flush),
3103 Ticks<MillisecondsDouble>(m_chainman.time_flush) /
3104 m_chainman.num_blocks_total);
3105 // Write the chain state to disk, if necessary.
3106 if (!FlushStateToDisk(state, FlushStateMode::IF_NEEDED)) {
3107 return false;
3108 }
3109 const auto time_5{SteadyClock::now()};
3110 m_chainman.time_chainstate += time_5 - time_4;
3112 " - Writing chainstate: %.2fms [%.2fs (%.2fms/blk)]\n",
3113 Ticks<MillisecondsDouble>(time_5 - time_4),
3114 Ticks<SecondsDouble>(m_chainman.time_chainstate),
3115 Ticks<MillisecondsDouble>(m_chainman.time_chainstate) /
3116 m_chainman.num_blocks_total);
3117 // Remove conflicting transactions from the mempool.
3118 if (m_mempool) {
3119 disconnectpool.removeForBlock(blockConnecting.vtx, *m_mempool);
3120
3121 // If this block is activating a fork, we move all mempool transactions
3122 // in front of disconnectpool for reprocessing in a future
3123 // updateMempoolForReorg call
3124 if (pindexNew->pprev != nullptr &&
3125 GetNextBlockScriptFlags(pindexNew, m_chainman) !=
3126 GetNextBlockScriptFlags(pindexNew->pprev, m_chainman)) {
3127 LogDebug(
3129 "Disconnecting mempool due to acceptance of upgrade block\n");
3130 disconnectpool.importMempool(*m_mempool);
3131 }
3132 }
3133
3134 // Update m_chain & related variables.
3135 m_chain.SetTip(*pindexNew);
3136 UpdateTip(pindexNew);
3137
3138 const auto time_6{SteadyClock::now()};
3139 m_chainman.time_post_connect += time_6 - time_5;
3140 m_chainman.time_total += time_6 - time_1;
3142 " - Connect postprocess: %.2fms [%.2fs (%.2fms/blk)]\n",
3143 Ticks<MillisecondsDouble>(time_6 - time_5),
3144 Ticks<SecondsDouble>(m_chainman.time_post_connect),
3145 Ticks<MillisecondsDouble>(m_chainman.time_post_connect) /
3146 m_chainman.num_blocks_total);
3147 LogDebug(BCLog::BENCH, "- Connect block: %.2fms [%.2fs (%.2fms/blk)]\n",
3148 Ticks<MillisecondsDouble>(time_6 - time_1),
3149 Ticks<SecondsDouble>(m_chainman.time_total),
3150 Ticks<MillisecondsDouble>(m_chainman.time_total) /
3151 m_chainman.num_blocks_total);
3152
3153 // If we are the background validation chainstate, check to see if we are
3154 // done validating the snapshot (i.e. our tip has reached the snapshot's
3155 // base block).
3156 if (this != &m_chainman.ActiveChainstate()) {
3157 // This call may set `m_disabled`, which is referenced immediately
3158 // afterwards in ActivateBestChain, so that we stop connecting blocks
3159 // past the snapshot base.
3160 m_chainman.MaybeCompleteSnapshotValidation();
3161 }
3162
3163 if (m_chainman.m_options.signals) {
3164 m_chainman.m_options.signals->BlockConnected(chainstate_role,
3165 pthisBlock, pindexNew);
3166 }
3167 return true;
3168}
3169
3175 std::vector<const CBlockIndex *> &blocksToReconcile, bool fAutoUnpark) {
3177 do {
3178 CBlockIndex *pindexNew = nullptr;
3179
3180 // Find the best candidate header.
3181 {
3182 std::set<CBlockIndex *, CBlockIndexWorkComparator>::reverse_iterator
3183 it = setBlockIndexCandidates.rbegin();
3184 if (it == setBlockIndexCandidates.rend()) {
3185 return nullptr;
3186 }
3187 pindexNew = *it;
3188 }
3189
3190 // If this block will cause an avalanche finalized block to be reorged,
3191 // then we park it.
3192 {
3194 if (m_avalancheFinalizedBlockIndex &&
3195 !AreOnTheSameFork(pindexNew, m_avalancheFinalizedBlockIndex)) {
3196 LogPrintf("Park block %s because it forks prior to the "
3197 "avalanche finalized chaintip.\n",
3198 pindexNew->GetBlockHash().ToString());
3199 pindexNew->nStatus = pindexNew->nStatus.withParked();
3200 m_blockman.m_dirty_blockindex.insert(pindexNew);
3201 }
3202 }
3203
3204 const CBlockIndex *pindexFork = m_chain.FindFork(pindexNew);
3205
3206 // Check whether all blocks on the path between the currently active
3207 // chain and the candidate are valid. Just going until the active chain
3208 // is an optimization, as we know all blocks in it are valid already.
3209 CBlockIndex *pindexTest = pindexNew;
3210 bool hasValidAncestor = true;
3211 while (hasValidAncestor && pindexTest && pindexTest != pindexFork) {
3212 assert(pindexTest->HaveNumChainTxs() || pindexTest->nHeight == 0);
3213
3214 // If this is a parked chain, but it has enough PoW, clear the park
3215 // state.
3216 bool fParkedChain = pindexTest->nStatus.isOnParkedChain();
3217 if (fAutoUnpark && fParkedChain) {
3218 const CBlockIndex *pindexTip = m_chain.Tip();
3219
3220 // During initialization, pindexTip and/or pindexFork may be
3221 // null. In this case, we just ignore the fact that the chain is
3222 // parked.
3223 if (!pindexTip || !pindexFork) {
3224 UnparkBlock(pindexTest);
3225 continue;
3226 }
3227
3228 // A parked chain can be unparked if it has twice as much PoW
3229 // accumulated as the main chain has since the fork block.
3230 CBlockIndex const *pindexExtraPow = pindexTip;
3231 arith_uint256 requiredWork = pindexTip->nChainWork;
3232 switch (pindexTip->nHeight - pindexFork->nHeight) {
3233 // Limit the penality for depth 1, 2 and 3 to half a block
3234 // worth of work to ensure we don't fork accidentally.
3235 case 3:
3236 case 2:
3237 pindexExtraPow = pindexExtraPow->pprev;
3238 // FALLTHROUGH
3239 case 1: {
3240 const arith_uint256 deltaWork =
3241 pindexExtraPow->nChainWork - pindexFork->nChainWork;
3242 requiredWork += (deltaWork >> 1);
3243 break;
3244 }
3245 default:
3246 requiredWork +=
3247 pindexExtraPow->nChainWork - pindexFork->nChainWork;
3248 break;
3249 }
3250
3251 if (pindexNew->nChainWork > requiredWork) {
3252 // We have enough, clear the parked state.
3253 LogPrintf("Unpark chain up to block %s as it has "
3254 "accumulated enough PoW.\n",
3255 pindexNew->GetBlockHash().ToString());
3256 fParkedChain = false;
3257 UnparkBlock(pindexTest);
3258 }
3259 }
3260
3261 // Pruned nodes may have entries in setBlockIndexCandidates for
3262 // which block files have been deleted. Remove those as candidates
3263 // for the most work chain if we come across them; we can't switch
3264 // to a chain unless we have all the non-active-chain parent blocks.
3265 bool fInvalidChain = pindexTest->nStatus.isInvalid();
3266 bool fMissingData = !pindexTest->nStatus.hasData();
3267 if (!(fInvalidChain || fParkedChain || fMissingData)) {
3268 // The current block is acceptable, move to the parent, up to
3269 // the fork point.
3270 pindexTest = pindexTest->pprev;
3271 continue;
3272 }
3273
3274 // Candidate chain is not usable (either invalid or parked or
3275 // missing data)
3276 hasValidAncestor = false;
3277 setBlockIndexCandidates.erase(pindexTest);
3278
3279 if (fInvalidChain && (m_chainman.m_best_invalid == nullptr ||
3280 pindexNew->nChainWork >
3281 m_chainman.m_best_invalid->nChainWork)) {
3282 m_chainman.m_best_invalid = pindexNew;
3283 }
3284
3285 if (fParkedChain && (m_chainman.m_best_parked == nullptr ||
3286 pindexNew->nChainWork >
3287 m_chainman.m_best_parked->nChainWork)) {
3288 m_chainman.m_best_parked = pindexNew;
3289 }
3290
3291 LogPrintf("Considered switching to better tip %s but that chain "
3292 "contains a%s%s%s block.\n",
3293 pindexNew->GetBlockHash().ToString(),
3294 fInvalidChain ? "n invalid" : "",
3295 fParkedChain ? " parked" : "",
3296 fMissingData ? " missing-data" : "");
3297
3298 CBlockIndex *pindexFailed = pindexNew;
3299 // Remove the entire chain from the set.
3300 while (pindexTest != pindexFailed) {
3301 if (fInvalidChain || fParkedChain) {
3302 pindexFailed->nStatus =
3303 pindexFailed->nStatus.withFailedParent(fInvalidChain)
3304 .withParkedParent(fParkedChain);
3305 m_blockman.m_dirty_blockindex.insert(pindexFailed);
3306 } else if (fMissingData) {
3307 // If we're missing data, then add back to
3308 // m_blocks_unlinked, so that if the block arrives in the
3309 // future we can try adding to setBlockIndexCandidates
3310 // again.
3312 std::make_pair(pindexFailed->pprev, pindexFailed));
3313 }
3314 setBlockIndexCandidates.erase(pindexFailed);
3315 pindexFailed = pindexFailed->pprev;
3316 }
3317
3318 if (fInvalidChain || fParkedChain) {
3319 // We discovered a new chain tip that is either parked or
3320 // invalid, we may want to warn.
3322 }
3323 }
3324
3325 blocksToReconcile.push_back(pindexNew);
3326
3327 // We found a candidate that has valid ancestors. This is our guy.
3328 if (hasValidAncestor) {
3329 return pindexNew;
3330 }
3331 } while (true);
3332}
3333
3339 // Note that we can't delete the current block itself, as we may need to
3340 // return to it later in case a reorganization to a better block fails.
3341 auto it = setBlockIndexCandidates.begin();
3342 while (it != setBlockIndexCandidates.end() &&
3343 setBlockIndexCandidates.value_comp()(*it, m_chain.Tip())) {
3344 setBlockIndexCandidates.erase(it++);
3345 }
3346
3347 // Either the current tip or a successor of it we're working towards is left
3348 // in setBlockIndexCandidates.
3350}
3351
3360 BlockValidationState &state, CBlockIndex *pindexMostWork,
3361 const std::shared_ptr<const CBlock> &pblock, bool &fInvalidFound,
3362 const avalanche::Processor *const avalanche,
3363 const ChainstateRole chainstate_role) {
3365 if (m_mempool) {
3367 }
3368
3369 const CBlockIndex *pindexOldTip = m_chain.Tip();
3370 const CBlockIndex *pindexFork = m_chain.FindFork(pindexMostWork);
3371
3372 // Disconnect active blocks which are no longer in the best chain.
3373 bool fBlocksDisconnected = false;
3374 DisconnectedBlockTransactions disconnectpool;
3375 while (m_chain.Tip() && m_chain.Tip() != pindexFork) {
3376 if (m_mempool && !fBlocksDisconnected) {
3377 // Import and clear mempool; we must do this to preserve
3378 // topological ordering in the mempool index. This is ok since
3379 // inserts into the mempool are very fast now in our new
3380 // implementation.
3381 disconnectpool.importMempool(*m_mempool);
3382 }
3383
3384 if (!DisconnectTip(state, &disconnectpool)) {
3385 // This is likely a fatal error, but keep the mempool consistent,
3386 // just in case. Only remove from the mempool in this case.
3387 if (m_mempool) {
3388 disconnectpool.updateMempoolForReorg(*this, false, *m_mempool);
3389 }
3390
3391 // If we're unable to disconnect a block during normal operation,
3392 // then that is a failure of our local system -- we should abort
3393 // rather than stay on a less work chain.
3395 "Failed to disconnect block; see debug.log for details");
3396 return false;
3397 }
3398
3399 fBlocksDisconnected = true;
3400 }
3401
3402 // Build list of new blocks to connect.
3403 std::vector<CBlockIndex *> vpindexToConnect;
3404 bool fContinue = true;
3405 int nHeight = pindexFork ? pindexFork->nHeight : -1;
3406 while (fContinue && nHeight != pindexMostWork->nHeight) {
3407 // Don't iterate the entire list of potential improvements toward the
3408 // best tip, as we likely only need a few blocks along the way.
3409 int nTargetHeight = std::min(nHeight + 32, pindexMostWork->nHeight);
3410 vpindexToConnect.clear();
3411 vpindexToConnect.reserve(nTargetHeight - nHeight);
3412 CBlockIndex *pindexIter = pindexMostWork->GetAncestor(nTargetHeight);
3413 while (pindexIter && pindexIter->nHeight != nHeight) {
3414 vpindexToConnect.push_back(pindexIter);
3415 pindexIter = pindexIter->pprev;
3416 }
3417
3418 nHeight = nTargetHeight;
3419
3420 // Connect new blocks.
3421 for (CBlockIndex *pindexConnect : reverse_iterate(vpindexToConnect)) {
3422 BlockPolicyValidationState blockPolicyState;
3423 if (!ConnectTip(state, blockPolicyState, pindexConnect,
3424 pindexConnect == pindexMostWork
3425 ? pblock
3426 : std::shared_ptr<const CBlock>(),
3427 disconnectpool, avalanche, chainstate_role)) {
3428 if (state.IsInvalid()) {
3429 // The block violates a consensus rule.
3430 if (state.GetResult() !=
3432 InvalidChainFound(vpindexToConnect.front());
3433 }
3434 state = BlockValidationState();
3435 fInvalidFound = true;
3436 fContinue = false;
3437 break;
3438 }
3439
3440 if (blockPolicyState.IsInvalid()) {
3441 // The block violates a policy rule.
3442 CBlockIndex *pindexParkedDescendant = pindexMostWork;
3443 while (pindexParkedDescendant &&
3444 pindexParkedDescendant != pindexConnect) {
3445 pindexParkedDescendant->nStatus =
3446 pindexParkedDescendant->nStatus.withParkedParent();
3448 pindexParkedDescendant);
3449 setBlockIndexCandidates.erase(pindexParkedDescendant);
3450 pindexParkedDescendant = pindexParkedDescendant->pprev;
3451 }
3452 fContinue = false;
3453 break;
3454 }
3455
3456 // A system error occurred (disk space, database error, ...).
3457 // Make the mempool consistent with the current tip, just in
3458 // case any observers try to use it before shutdown.
3459 if (m_mempool) {
3460 disconnectpool.updateMempoolForReorg(*this, false,
3461 *m_mempool);
3462 }
3463 return false;
3464 } else {
3466 if (!pindexOldTip ||
3467 m_chain.Tip()->nChainWork > pindexOldTip->nChainWork) {
3468 // We're in a better position than we were. Return
3469 // temporarily to release the lock.
3470 fContinue = false;
3471 break;
3472 }
3473 }
3474 }
3475 }
3476
3477 if (m_mempool) {
3478 if (fBlocksDisconnected || !disconnectpool.isEmpty()) {
3479 // If any blocks were disconnected, we need to update the mempool
3480 // even if disconnectpool is empty. The disconnectpool may also be
3481 // non-empty if the mempool was imported due to new validation rules
3482 // being in effect.
3484 "Updating mempool due to reorganization or "
3485 "rules upgrade/downgrade\n");
3486 disconnectpool.updateMempoolForReorg(*this, true, *m_mempool);
3487 }
3488
3489 m_mempool->check(this->CoinsTip(), this->m_chain.Height() + 1);
3490 }
3491
3492 // Callbacks/notifications for a new best chain.
3493 if (fInvalidFound) {
3495 } else {
3497 }
3498
3499 return true;
3500}
3501
3503 bool blockfiles_indexed) {
3504 if (!init) {
3506 }
3507 if (!blockfiles_indexed) {
3509 }
3511}
3512
3514 bool fNotify = false;
3515 bool fInitialBlockDownload = false;
3516 CBlockIndex *pindexHeader = nullptr;
3517 {
3518 LOCK(GetMutex());
3519 pindexHeader = m_best_header;
3520
3521 if (pindexHeader != m_last_notified_header) {
3522 fNotify = true;
3523 fInitialBlockDownload = IsInitialBlockDownload();
3524 m_last_notified_header = pindexHeader;
3525 }
3526 }
3527
3528 // Send block tip changed notifications without the lock held
3529 if (fNotify) {
3531 GetSynchronizationState(fInitialBlockDownload,
3533 pindexHeader->nHeight, pindexHeader->nTime, false);
3534 }
3535 return fNotify;
3536}
3537
3541
3542 if (signals.CallbacksPending() > 10) {
3543 signals.SyncWithValidationInterfaceQueue();
3544 }
3545}
3546
3548 std::shared_ptr<const CBlock> pblock,
3551
3552 // Note that while we're often called here from ProcessNewBlock, this is
3553 // far from a guarantee. Things in the P2P/RPC will often end up calling
3554 // us in the middle of ProcessNewBlock - do not assume pblock is set
3555 // sanely for performance or correctness!
3557
3558 // ABC maintains a fair degree of expensive-to-calculate internal state
3559 // because this function periodically releases cs_main so that it does not
3560 // lock up other threads for too long during large connects - and to allow
3561 // for e.g. the callback queue to drain we use m_chainstate_mutex to enforce
3562 // mutual exclusion so that only one caller may execute this function at a
3563 // time
3565
3566 // Belt-and-suspenders check that we aren't attempting to advance the
3567 // background chainstate past the snapshot base block.
3568 if (WITH_LOCK(::cs_main, return m_disabled)) {
3569 LogPrintf("m_disabled is set - this chainstate should not be in "
3570 "operation. Please report this as a bug. %s\n",
3571 PACKAGE_BUGREPORT);
3572 return false;
3573 }
3574
3575 CBlockIndex *pindexMostWork = nullptr;
3576 CBlockIndex *pindexNewTip = nullptr;
3577 bool exited_ibd{false};
3578 do {
3579 // Block until the validation queue drains. This should largely
3580 // never happen in normal operation, however may happen during
3581 // reindex, causing memory blowup if we run too far ahead.
3582 // Note that if a validationinterface callback ends up calling
3583 // ActivateBestChain this may lead to a deadlock! We should
3584 // probably have a DEBUG_LOCKORDER test for this in the future.
3587 }
3588
3589 std::vector<const CBlockIndex *> blocksToReconcile;
3590 bool blocks_connected = false;
3591
3592 {
3593 LOCK(cs_main);
3594 // Lock transaction pool for at least as long as it takes for
3595 // updateMempoolForReorg to be executed if needed
3596 LOCK(MempoolMutex());
3597 const bool was_in_ibd = m_chainman.IsInitialBlockDownload();
3598 CBlockIndex *starting_tip = m_chain.Tip();
3599 do {
3600 // We absolutely may not unlock cs_main until we've made forward
3601 // progress (with the exception of shutdown due to hardware
3602 // issues, low disk space, etc).
3603
3604 if (pindexMostWork == nullptr) {
3605 pindexMostWork = FindMostWorkChain(
3606 blocksToReconcile,
3608 }
3609
3610 // Whether we have anything to do at all.
3611 if (pindexMostWork == nullptr ||
3612 pindexMostWork == m_chain.Tip()) {
3613 break;
3614 }
3615
3616 bool fInvalidFound = false;
3617 std::shared_ptr<const CBlock> nullBlockPtr;
3618 // BlockConnected signals must be sent for the original role;
3619 // in case snapshot validation is completed during
3620 // ActivateBestChainStep, the result of GetRole() changes from
3621 // BACKGROUND to NORMAL.
3622 const ChainstateRole chainstate_role{this->GetRole()};
3624 state, pindexMostWork,
3625 pblock && pblock->GetHash() ==
3626 pindexMostWork->GetBlockHash()
3627 ? pblock
3628 : nullBlockPtr,
3629 fInvalidFound, avalanche, chainstate_role)) {
3630 // A system error occurred
3631 return false;
3632 }
3633 blocks_connected = true;
3634
3635 if (fInvalidFound ||
3636 (pindexMostWork &&
3637 pindexMostWork->nStatus.isOnParkedChain())) {
3638 // Wipe cache, we may need another branch now.
3639 pindexMostWork = nullptr;
3640 }
3641
3642 pindexNewTip = m_chain.Tip();
3643
3644 // This will have been toggled in
3645 // ActivateBestChainStep -> ConnectTip ->
3646 // MaybeCompleteSnapshotValidation, if at all, so we should
3647 // catch it here.
3648 //
3649 // Break this do-while to ensure we don't advance past the base
3650 // snapshot.
3651 if (m_disabled) {
3652 break;
3653 }
3654 } while (!m_chain.Tip() ||
3655 (starting_tip && CBlockIndexWorkComparator()(
3656 m_chain.Tip(), starting_tip)));
3657
3658 // Check the index once we're done with the above loop, since
3659 // we're going to release cs_main soon. If the index is in a bad
3660 // state now, then it's better to know immediately rather than
3661 // randomly have it cause a problem in a race.
3663
3664 if (blocks_connected) {
3665 const CBlockIndex *pindexFork = m_chain.FindFork(starting_tip);
3666 bool still_in_ibd = m_chainman.IsInitialBlockDownload();
3667
3668 if (was_in_ibd && !still_in_ibd) {
3669 // Active chainstate has exited IBD
3670 exited_ibd = true;
3671 }
3672
3673 // Notify external listeners about the new tip.
3674 // Enqueue while holding cs_main to ensure that UpdatedBlockTip
3675 // is called in the order in which blocks are connected
3676 if (this == &m_chainman.ActiveChainstate() &&
3677 pindexFork != pindexNewTip) {
3678 // Notify ValidationInterface subscribers
3681 pindexNewTip, pindexFork, still_in_ibd);
3682 }
3683
3684 // Always notify the UI if a new block tip was connected
3688 still_in_ibd,
3690 *pindexNewTip))) {
3691 // Just breaking and returning success for now. This
3692 // could be changed to bubble up the kernel::Interrupted
3693 // value to the caller so the caller could distinguish
3694 // between completed and interrupted operations.
3695 break;
3696 }
3697 }
3698 }
3699 }
3700 // When we reach this point, we switched to a new tip (stored in
3701 // pindexNewTip).
3702 if (avalanche) {
3703 const CBlockIndex *pfinalized =
3705 return m_avalancheFinalizedBlockIndex);
3706 for (const CBlockIndex *pindex : blocksToReconcile) {
3707 avalanche->addToReconcile(pindex);
3708
3709 // Compute staking rewards for all blocks with more chainwork to
3710 // just after the finalized block. We could stop at the fork
3711 // point, but this is more robust.
3712 if (blocks_connected) {
3713 const CBlockIndex *pindexTest = pindex;
3714 while (pindexTest && pindexTest != pfinalized) {
3715 if (pindexTest->nHeight < pindex->nHeight - 3) {
3716 // Only compute up to some max depth
3717 break;
3718 }
3719 avalanche->computeStakingReward(pindexTest);
3720 pindexTest = pindexTest->pprev;
3721 }
3722 }
3723 }
3724 }
3725
3726 if (!blocks_connected) {
3727 return true;
3728 }
3729
3730 if (exited_ibd) {
3731 // If a background chainstate is in use, we may need to rebalance
3732 // our allocation of caches once a chainstate exits initial block
3733 // download.
3734 LOCK(::cs_main);
3735 m_chainman.MaybeRebalanceCaches();
3736 }
3737
3738 if (WITH_LOCK(::cs_main, return m_disabled)) {
3739 // Background chainstate has reached the snapshot base block, so
3740 // exit.
3741
3742 // Restart indexes to resume indexing for all blocks unique to the
3743 // snapshot chain. This resumes indexing "in order" from where the
3744 // indexing on the background validation chain left off.
3745 //
3746 // This cannot be done while holding cs_main (within
3747 // MaybeCompleteSnapshotValidation) or a cs_main deadlock will
3748 // occur.
3751 }
3752 break;
3753 }
3754
3755 // We check interrupt only after giving ActivateBestChainStep a chance
3756 // to run once so that we never interrupt before connecting the genesis
3757 // block during LoadChainTip(). Previously this caused an assert()
3758 // failure during interrupt in such cases as the UTXO DB flushing checks
3759 // that the best block hash is non-null.
3760 if (m_chainman.m_interrupt) {
3761 break;
3762 }
3763 } while (pindexNewTip != pindexMostWork);
3764
3765 // Write changes periodically to disk, after relay.
3767 return false;
3768 }
3769
3770 return true;
3771}
3772
3777 {
3778 LOCK(cs_main);
3779 if (pindex->nChainWork < m_chain.Tip()->nChainWork) {
3780 // Nothing to do, this block is not at the tip.
3781 return true;
3782 }
3783
3785 // The chain has been extended since the last call, reset the
3786 // counter.
3788 }
3789
3791 setBlockIndexCandidates.erase(pindex);
3794 std::numeric_limits<int32_t>::min()) {
3795 // We can't keep reducing the counter if somebody really wants to
3796 // call preciousblock 2**31-1 times on the same set of tips...
3798 }
3799
3800 // In case this was parked, unpark it.
3801 UnparkBlock(pindex);
3802
3803 // Make sure it is added to the candidate list if appropriate.
3804 if (pindex->IsValid(BlockValidity::TRANSACTIONS) &&
3805 pindex->HaveNumChainTxs()) {
3806 setBlockIndexCandidates.insert(pindex);
3808 }
3809 }
3810
3811 return ActivateBestChain(state, /*pblock=*/nullptr, avalanche);
3812}
3813
3814namespace {
3815// Leverage RAII to run a functor at scope end
3816template <typename Func> struct Defer {
3817 Func func;
3818 Defer(Func &&f) : func(std::move(f)) {}
3819 ~Defer() { func(); }
3820};
3821} // namespace
3822
3824 bool invalidate) {
3825 // Genesis block can't be invalidated or parked
3826 assert(pindex);
3827 if (pindex->nHeight == 0) {
3828 return false;
3829 }
3830
3831 CBlockIndex *to_mark_failed_or_parked = pindex;
3832 bool pindex_was_in_chain = false;
3833 int disconnected = 0;
3834
3835 // We do not allow ActivateBestChain() to run while UnwindBlock() is
3836 // running, as that could cause the tip to change while we disconnect
3837 // blocks. (Note for backport of Core PR16849: we acquire
3838 // LOCK(m_chainstate_mutex) in the Park, Invalidate and FinalizeBlock
3839 // functions due to differences in our code)
3841
3842 // We'll be acquiring and releasing cs_main below, to allow the validation
3843 // callbacks to run. However, we should keep the block index in a
3844 // consistent state as we disconnect blocks -- in particular we need to
3845 // add equal-work blocks to setBlockIndexCandidates as we disconnect.
3846 // To avoid walking the block index repeatedly in search of candidates,
3847 // build a map once so that we can look up candidate blocks by chain
3848 // work as we go.
3849 std::multimap<const arith_uint256, CBlockIndex *> candidate_blocks_by_work;
3850
3851 {
3852 LOCK(cs_main);
3853 for (auto &entry : m_blockman.m_block_index) {
3854 CBlockIndex *candidate = &entry.second;
3855 // We don't need to put anything in our active chain into the
3856 // multimap, because those candidates will be found and considered
3857 // as we disconnect.
3858 // Instead, consider only non-active-chain blocks that have at
3859 // least as much work as where we expect the new tip to end up.
3860 if (!m_chain.Contains(candidate) &&
3861 !CBlockIndexWorkComparator()(candidate, pindex->pprev) &&
3863 candidate->HaveNumChainTxs()) {
3864 candidate_blocks_by_work.insert(
3865 std::make_pair(candidate->nChainWork, candidate));
3866 }
3867 }
3868 }
3869
3870 {
3871 LOCK(cs_main);
3872 // Lock for as long as disconnectpool is in scope to make sure
3873 // UpdateMempoolForReorg is called after DisconnectTip without unlocking
3874 // in between
3875 LOCK(MempoolMutex());
3876
3877 constexpr int maxDisconnectPoolBlocks = 10;
3878 bool ret = false;
3879 DisconnectedBlockTransactions disconnectpool;
3880 // After 10 blocks this becomes nullptr, so that DisconnectTip will
3881 // stop giving us unwound block txs if we are doing a deep unwind.
3882 DisconnectedBlockTransactions *optDisconnectPool = &disconnectpool;
3883
3884 // Disable thread safety analysis because we can't require m_mempool->cs
3885 // as m_mempool can be null. We keep the runtime analysis though.
3886 Defer deferred([&]() NO_THREAD_SAFETY_ANALYSIS {
3888 if (m_mempool && !disconnectpool.isEmpty()) {
3890 // DisconnectTip will add transactions to disconnectpool.
3891 // When all unwinding is done and we are on a new tip, we must
3892 // add all transactions back to the mempool against the new tip.
3893 disconnectpool.updateMempoolForReorg(*this,
3894 /* fAddToMempool = */ ret,
3895 *m_mempool);
3896 }
3897 });
3898
3899 // Disconnect (descendants of) pindex, and mark them invalid.
3900 while (true) {
3901 if (m_chainman.m_interrupt) {
3902 break;
3903 }
3904
3905 // Make sure the queue of validation callbacks doesn't grow
3906 // unboundedly.
3907 // FIXME this commented code is a regression and could cause OOM if
3908 // a very old block is invalidated via the invalidateblock RPC.
3909 // This can be uncommented if the main signals are moved away from
3910 // cs_main or this code is refactored so that cs_main can be
3911 // released at this point.
3912 //
3913 // LimitValidationInterfaceQueue();
3914
3915 if (!m_chain.Contains(pindex)) {
3916 break;
3917 }
3918
3919 if (m_mempool && disconnected == 0) {
3920 // On first iteration, we grab all the mempool txs to preserve
3921 // topological ordering. This has the side-effect of temporarily
3922 // clearing the mempool, but we will re-add later in
3923 // updateMempoolForReorg() (above). This technique guarantees
3924 // mempool consistency as well as ensures that our topological
3925 // entry_id index is always correct.
3926 disconnectpool.importMempool(*m_mempool);
3927 }
3928
3929 pindex_was_in_chain = true;
3930 CBlockIndex *invalid_walk_tip = m_chain.Tip();
3931
3932 // ActivateBestChain considers blocks already in m_chain
3933 // unconditionally valid already, so force disconnect away from it.
3934
3935 ret = DisconnectTip(state, optDisconnectPool);
3936 ++disconnected;
3937
3938 if (optDisconnectPool && disconnected > maxDisconnectPoolBlocks) {
3939 // Stop using the disconnect pool after 10 blocks. After 10
3940 // blocks we no longer add block tx's to the disconnectpool.
3941 // However, when this scope ends we will reconcile what's
3942 // in the pool with the new tip (in the deferred d'tor above).
3943 optDisconnectPool = nullptr;
3944 }
3945
3946 if (!ret) {
3947 return false;
3948 }
3949
3950 assert(invalid_walk_tip->pprev == m_chain.Tip());
3951
3952 // We immediately mark the disconnected blocks as invalid.
3953 // This prevents a case where pruned nodes may fail to
3954 // invalidateblock and be left unable to start as they have no tip
3955 // candidates (as there are no blocks that meet the "have data and
3956 // are not invalid per nStatus" criteria for inclusion in
3957 // setBlockIndexCandidates).
3958
3959 invalid_walk_tip->nStatus =
3960 invalidate ? invalid_walk_tip->nStatus.withFailed()
3961 : invalid_walk_tip->nStatus.withParked();
3962
3963 m_blockman.m_dirty_blockindex.insert(invalid_walk_tip);
3964 setBlockIndexCandidates.insert(invalid_walk_tip->pprev);
3965
3966 if (invalid_walk_tip == to_mark_failed_or_parked->pprev &&
3967 (invalidate ? to_mark_failed_or_parked->nStatus.hasFailed()
3968 : to_mark_failed_or_parked->nStatus.isParked())) {
3969 // We only want to mark the last disconnected block as
3970 // Failed (or Parked); its children need to be FailedParent (or
3971 // ParkedParent) instead.
3972 to_mark_failed_or_parked->nStatus =
3973 (invalidate
3974 ? to_mark_failed_or_parked->nStatus.withFailed(false)
3975 .withFailedParent()
3976 : to_mark_failed_or_parked->nStatus.withParked(false)
3977 .withParkedParent());
3978
3979 m_blockman.m_dirty_blockindex.insert(to_mark_failed_or_parked);
3980 }
3981
3982 // Add any equal or more work headers to setBlockIndexCandidates
3983 auto candidate_it = candidate_blocks_by_work.lower_bound(
3984 invalid_walk_tip->pprev->nChainWork);
3985 while (candidate_it != candidate_blocks_by_work.end()) {
3986 if (!CBlockIndexWorkComparator()(candidate_it->second,
3987 invalid_walk_tip->pprev)) {
3988 setBlockIndexCandidates.insert(candidate_it->second);
3989 candidate_it = candidate_blocks_by_work.erase(candidate_it);
3990 } else {
3991 ++candidate_it;
3992 }
3993 }
3994
3995 // Track the last disconnected block, so we can correct its
3996 // FailedParent (or ParkedParent) status in future iterations, or,
3997 // if it's the last one, call InvalidChainFound on it.
3998 to_mark_failed_or_parked = invalid_walk_tip;
3999 }
4000 }
4001
4003
4004 {
4005 LOCK(cs_main);
4006 if (m_chain.Contains(to_mark_failed_or_parked)) {
4007 // If the to-be-marked invalid block is in the active chain,
4008 // something is interfering and we can't proceed.
4009 return false;
4010 }
4011
4012 // Mark pindex (or the last disconnected block) as invalid (or parked),
4013 // even when it never was in the main chain.
4014 to_mark_failed_or_parked->nStatus =
4015 invalidate ? to_mark_failed_or_parked->nStatus.withFailed()
4016 : to_mark_failed_or_parked->nStatus.withParked();
4017 m_blockman.m_dirty_blockindex.insert(to_mark_failed_or_parked);
4018 if (invalidate) {
4019 m_chainman.m_failed_blocks.insert(to_mark_failed_or_parked);
4020 }
4021
4022 // If any new blocks somehow arrived while we were disconnecting
4023 // (above), then the pre-calculation of what should go into
4024 // setBlockIndexCandidates may have missed entries. This would
4025 // technically be an inconsistency in the block index, but if we clean
4026 // it up here, this should be an essentially unobservable error.
4027 // Loop back over all block index entries and add any missing entries
4028 // to setBlockIndexCandidates.
4029 for (auto &[_, block_index] : m_blockman.m_block_index) {
4030 if (block_index.IsValid(BlockValidity::TRANSACTIONS) &&
4031 block_index.HaveNumChainTxs() &&
4032 !setBlockIndexCandidates.value_comp()(&block_index,
4033 m_chain.Tip())) {
4034 setBlockIndexCandidates.insert(&block_index);
4035 }
4036 }
4037
4038 if (invalidate) {
4039 InvalidChainFound(to_mark_failed_or_parked);
4040 }
4041 }
4042
4043 // Only notify about a new block tip if the active chain was modified.
4044 if (pindex_was_in_chain) {
4045 // Ignoring return value for now, this could be changed to bubble up
4046 // kernel::Interrupted value to the caller so the caller could
4047 // distinguish between completed and interrupted operations. It might
4048 // also make sense for the blockTip notification to have an enum
4049 // parameter indicating the source of the tip change so hooks can
4050 // distinguish user-initiated invalidateblock changes from other
4051 // changes.
4055 *to_mark_failed_or_parked->pprev);
4056 }
4057 return true;
4058}
4059
4061 CBlockIndex *pindex) {
4064 // See 'Note for backport of Core PR16849' in Chainstate::UnwindBlock
4066
4067 return UnwindBlock(state, pindex, true);
4068}
4069
4073 // See 'Note for backport of Core PR16849' in Chainstate::UnwindBlock
4075
4076 return UnwindBlock(state, pindex, false);
4077}
4078
4079template <typename F>
4081 CBlockIndex *pindex, F f) {
4082 BlockStatus newStatus = f(pindex->nStatus);
4083 if (pindex->nStatus != newStatus &&
4084 (!pindexBase ||
4085 pindex->GetAncestor(pindexBase->nHeight) == pindexBase)) {
4086 pindex->nStatus = newStatus;
4087 m_blockman.m_dirty_blockindex.insert(pindex);
4088 if (newStatus.isValid()) {
4089 m_chainman.m_failed_blocks.erase(pindex);
4090 }
4091
4092 if (pindex->IsValid(BlockValidity::TRANSACTIONS) &&
4093 pindex->HaveNumChainTxs() &&
4094 setBlockIndexCandidates.value_comp()(m_chain.Tip(), pindex)) {
4095 setBlockIndexCandidates.insert(pindex);
4096 }
4097 return true;
4098 }
4099 return false;
4100}
4101
4102template <typename F, typename C, typename AC>
4104 F f, C fChild, AC fAncestorWasChanged) {
4106
4107 // Update the current block and ancestors; while we're doing this, identify
4108 // which was the deepest ancestor we changed.
4109 CBlockIndex *pindexDeepestChanged = pindex;
4110 for (auto pindexAncestor = pindex; pindexAncestor != nullptr;
4111 pindexAncestor = pindexAncestor->pprev) {
4112 if (UpdateFlagsForBlock(nullptr, pindexAncestor, f)) {
4113 pindexDeepestChanged = pindexAncestor;
4114 }
4115 }
4116
4117 if (pindexReset &&
4118 pindexReset->GetAncestor(pindexDeepestChanged->nHeight) ==
4119 pindexDeepestChanged) {
4120 // reset pindexReset if it had a modified ancestor.
4121 pindexReset = nullptr;
4122 }
4123
4124 // Update all blocks under modified blocks.
4125 for (auto &[_, block_index] : m_blockman.m_block_index) {
4126 UpdateFlagsForBlock(pindex, &block_index, fChild);
4127 UpdateFlagsForBlock(pindexDeepestChanged, &block_index,
4128 fAncestorWasChanged);
4129 }
4130}
4131
4132void Chainstate::SetBlockFailureFlags(CBlockIndex *invalid_block) {
4134
4135 for (auto &[_, block_index] : m_blockman.m_block_index) {
4136 if (block_index.GetAncestor(invalid_block->nHeight) == invalid_block &&
4137 !block_index.nStatus.isInvalid()) {
4138 block_index.nStatus = block_index.nStatus.withFailedParent();
4139 }
4140 }
4141}
4142
4145
4147 pindex, m_chainman.m_best_invalid,
4148 [](const BlockStatus status) {
4149 return status.withClearedFailureFlags();
4150 },
4151 [](const BlockStatus status) {
4152 return status.withClearedFailureFlags();
4153 },
4154 [](const BlockStatus status) {
4155 return status.withFailedParent(false);
4156 });
4157}
4158
4161 // The block only is a candidate for the most-work-chain if it has the same
4162 // or more work than our current tip.
4163 if (m_chain.Tip() != nullptr &&
4164 setBlockIndexCandidates.value_comp()(pindex, m_chain.Tip())) {
4165 return;
4166 }
4167
4168 bool is_active_chainstate = this == &m_chainman.ActiveChainstate();
4169 if (is_active_chainstate) {
4170 // The active chainstate should always add entries that have more
4171 // work than the tip.
4172 setBlockIndexCandidates.insert(pindex);
4173 } else if (!m_disabled) {
4174 // For the background chainstate, we only consider connecting blocks
4175 // towards the snapshot base (which can't be nullptr or else we'll
4176 // never make progress).
4177 const CBlockIndex *snapshot_base{
4178 Assert(m_chainman.GetSnapshotBaseBlock())};
4179 if (snapshot_base->GetAncestor(pindex->nHeight) == pindex) {
4180 setBlockIndexCandidates.insert(pindex);
4181 }
4182 }
4183}
4184
4185void Chainstate::UnparkBlockImpl(CBlockIndex *pindex, bool fClearChildren) {
4187
4189 pindex, m_chainman.m_best_parked,
4190 [](const BlockStatus status) {
4191 return status.withClearedParkedFlags();
4192 },
4193 [fClearChildren](const BlockStatus status) {
4194 return fClearChildren ? status.withClearedParkedFlags()
4195 : status.withParkedParent(false);
4196 },
4197 [](const BlockStatus status) {
4198 return status.withParkedParent(false);
4199 });
4200}
4201
4203 return UnparkBlockImpl(pindex, true);
4204}
4205
4207 return UnparkBlockImpl(pindex, false);
4208}
4209
4210bool Chainstate::AvalancheFinalizeBlock(CBlockIndex *pindex,
4214
4215 if (!pindex) {
4216 return false;
4217 }
4218
4219 if (!m_chain.Contains(pindex)) {
4221 "The block to mark finalized by avalanche is not on the "
4222 "active chain: %s\n",
4223 pindex->GetBlockHash().ToString());
4224 return false;
4225 }
4226
4227 if (IsBlockAvalancheFinalized(pindex)) {
4228 return true;
4229 }
4230
4231 {
4233 m_avalancheFinalizedBlockIndex = pindex;
4234 }
4235
4238 }
4239
4240 return true;
4241}
4242
4245 m_avalancheFinalizedBlockIndex = nullptr;
4246}
4247
4250 return pindex && m_avalancheFinalizedBlockIndex &&
4251 m_avalancheFinalizedBlockIndex->GetAncestor(pindex->nHeight) ==
4252 pindex;
4253}
4254
4260 CBlockIndex *pindexNew,
4261 const FlatFilePos &pos) {
4262 pindexNew->nTx = block.vtx.size();
4263 // Typically nChainTX will be 0 at this point, but it can be nonzero if this
4264 // is a pruned block which is being downloaded again, or if this is an
4265 // assumeutxo snapshot block which has a hardcoded m_chain_tx_count value
4266 // from the snapshot metadata. If the pindex is not the snapshot block and
4267 // the m_chain_tx_count value is not zero, assert that value is actually
4268 // correct.
4269 auto prev_tx_sum = [](CBlockIndex &block) {
4270 return block.nTx + (block.pprev ? block.pprev->m_chain_tx_count : 0);
4271 };
4272 if (!Assume(pindexNew->m_chain_tx_count == 0 ||
4273 pindexNew->m_chain_tx_count == prev_tx_sum(*pindexNew) ||
4274 pindexNew == GetSnapshotBaseBlock())) {
4275 LogPrintf("Internal bug detected: block %d has unexpected "
4276 "m_chain_tx_count %lu that should be %lu. Please report "
4277 "this issue here: %s\n",
4278 pindexNew->nHeight, pindexNew->m_chain_tx_count,
4279 prev_tx_sum(*pindexNew), PACKAGE_BUGREPORT);
4280 pindexNew->m_chain_tx_count = 0;
4281 }
4282 pindexNew->nSize = ::GetSerializeSize(block);
4283 pindexNew->nFile = pos.nFile;
4284 pindexNew->nDataPos = pos.nPos;
4285 pindexNew->nUndoPos = 0;
4286 pindexNew->nStatus = pindexNew->nStatus.withData();
4288 m_blockman.m_dirty_blockindex.insert(pindexNew);
4289
4290 if (pindexNew->pprev == nullptr || pindexNew->pprev->HaveNumChainTxs()) {
4291 // If pindexNew is the genesis block or all parents are
4292 // BLOCK_VALID_TRANSACTIONS.
4293 std::deque<CBlockIndex *> queue;
4294 queue.push_back(pindexNew);
4295
4296 // Recursively process any descendant blocks that now may be eligible to
4297 // be connected.
4298 while (!queue.empty()) {
4299 CBlockIndex *pindex = queue.front();
4300 queue.pop_front();
4301 // Before setting m_chain_tx_count, assert that it is 0 or already
4302 // set to the correct value. This assert will fail after receiving
4303 // the assumeutxo snapshot block if assumeutxo snapshot metadata has
4304 // an incorrect hardcoded AssumeutxoData::m_chain_tx_count value.
4305 if (!Assume(pindex->m_chain_tx_count == 0 ||
4306 pindex->m_chain_tx_count == prev_tx_sum(*pindex))) {
4307 LogPrintf("Internal bug detected: block %d has unexpected "
4308 "m_chain_tx_count %lu that should be %lu. Please "
4309 "report this issue here: %s\n",
4310 pindex->nHeight, pindex->m_chain_tx_count,
4311 prev_tx_sum(*pindex), PACKAGE_BUGREPORT);
4312 }
4313 pindex->m_chain_tx_count = prev_tx_sum(*pindex);
4314 if (pindex->nSequenceId == 0) {
4315 // We assign a sequence is when transaction are received to
4316 // prevent a miner from being able to broadcast a block but not
4317 // its content. However, a sequence id may have been set
4318 // manually, for instance via PreciousBlock, in which case, we
4319 // don't need to assign one.
4320 pindex->nSequenceId = nBlockSequenceId++;
4321 }
4322 for (Chainstate *c : GetAll()) {
4323 c->TryAddBlockIndexCandidate(pindex);
4324 }
4325
4326 std::pair<std::multimap<CBlockIndex *, CBlockIndex *>::iterator,
4327 std::multimap<CBlockIndex *, CBlockIndex *>::iterator>
4328 range = m_blockman.m_blocks_unlinked.equal_range(pindex);
4329 while (range.first != range.second) {
4330 std::multimap<CBlockIndex *, CBlockIndex *>::iterator it =
4331 range.first;
4332 queue.push_back(it->second);
4333 range.first++;
4334 m_blockman.m_blocks_unlinked.erase(it);
4335 }
4336 }
4337 } else if (pindexNew->pprev &&
4338 pindexNew->pprev->IsValid(BlockValidity::TREE)) {
4340 std::make_pair(pindexNew->pprev, pindexNew));
4341 }
4342}
4343
4352static bool CheckBlockHeader(const CBlockHeader &block,
4353 BlockValidationState &state,
4354 const Consensus::Params &params,
4355 BlockValidationOptions validationOptions) {
4356 // Check proof of work matches claimed amount
4357 if (validationOptions.shouldValidatePoW() &&
4358 !CheckProofOfWork(block.GetHash(), block.nBits, params)) {
4360 "high-hash", "proof of work failed");
4361 }
4362
4363 return true;
4364}
4365
4366static bool CheckMerkleRoot(const CBlock &block, BlockValidationState &state) {
4367 if (block.m_checked_merkle_root) {
4368 return true;
4369 }
4370
4371 bool mutated;
4372 uint256 merkle_root = BlockMerkleRoot(block, &mutated);
4373 if (block.hashMerkleRoot != merkle_root) {
4374 return state.Invalid(
4376 /*reject_reason=*/"bad-txnmrklroot",
4377 /*debug_message=*/"hashMerkleRoot mismatch");
4378 }
4379
4380 // Check for merkle tree malleability (CVE-2012-2459): repeating sequences
4381 // of transactions in a block without affecting the merkle root of a block,
4382 // while still invalidating it.
4383 if (mutated) {
4384 return state.Invalid(
4386 /*reject_reason=*/"bad-txns-duplicate",
4387 /*debug_message=*/"duplicate transaction");
4388 }
4389
4390 block.m_checked_merkle_root = true;
4391 return true;
4392}
4393
4394bool CheckBlock(const CBlock &block, BlockValidationState &state,
4395 const Consensus::Params &params,
4396 BlockValidationOptions validationOptions) {
4397 // These are checks that are independent of context.
4398 if (block.fChecked) {
4399 return true;
4400 }
4401
4402 // Check that the header is valid (particularly PoW). This is mostly
4403 // redundant with the call in AcceptBlockHeader.
4404 if (!CheckBlockHeader(block, state, params, validationOptions)) {
4405 return false;
4406 }
4407
4408 // Check the merkle root.
4409 if (validationOptions.shouldValidateMerkleRoot() &&
4410 !CheckMerkleRoot(block, state)) {
4411 return false;
4412 }
4413
4414 // All potential-corruption validation must be done before we do any
4415 // transaction validation, as otherwise we may mark the header as invalid
4416 // because we receive the wrong transactions for it.
4417
4418 // First transaction must be coinbase.
4419 if (block.vtx.empty()) {
4421 "bad-cb-missing", "first tx is not coinbase");
4422 }
4423
4424 // Size limits.
4425 auto nMaxBlockSize = validationOptions.getExcessiveBlockSize();
4426
4427 // Bail early if there is no way this block is of reasonable size.
4428 if ((block.vtx.size() * MIN_TRANSACTION_SIZE) > nMaxBlockSize) {
4430 "bad-blk-length", "size limits failed");
4431 }
4432
4433 auto currentBlockSize = ::GetSerializeSize(block);
4434 if (currentBlockSize > nMaxBlockSize) {
4436 "bad-blk-length", "size limits failed");
4437 }
4438
4439 // And a valid coinbase.
4440 TxValidationState tx_state;
4441 if (!CheckCoinbase(*block.vtx[0], tx_state)) {
4443 tx_state.GetRejectReason(),
4444 strprintf("Coinbase check failed (txid %s) %s",
4445 block.vtx[0]->GetId().ToString(),
4446 tx_state.GetDebugMessage()));
4447 }
4448
4449 // Check transactions for regularity, skipping the first. Note that this
4450 // is the first time we check that all after the first are !IsCoinBase.
4451 for (size_t i = 1; i < block.vtx.size(); i++) {
4452 auto *tx = block.vtx[i].get();
4453 if (!CheckRegularTransaction(*tx, tx_state)) {
4454 return state.Invalid(
4456 tx_state.GetRejectReason(),
4457 strprintf("Transaction check failed (txid %s) %s",
4458 tx->GetId().ToString(), tx_state.GetDebugMessage()));
4459 }
4460 }
4461
4462 if (validationOptions.shouldValidatePoW() &&
4463 validationOptions.shouldValidateMerkleRoot()) {
4464 block.fChecked = true;
4465 }
4466
4467 return true;
4468}
4469
4470bool HasValidProofOfWork(const std::vector<CBlockHeader> &headers,
4471 const Consensus::Params &consensusParams) {
4472 return std::all_of(headers.cbegin(), headers.cend(),
4473 [&](const auto &header) {
4474 return CheckProofOfWork(
4475 header.GetHash(), header.nBits, consensusParams);
4476 });
4477}
4478
4479bool IsBlockMutated(const CBlock &block) {
4481 if (!CheckMerkleRoot(block, state)) {
4483 "Block mutated: %s\n", state.ToString());
4484 return true;
4485 }
4486
4487 if (block.vtx.empty() || !block.vtx[0]->IsCoinBase()) {
4488 // Consider the block mutated if any transaction is 64 bytes in size
4489 // (see 3.1 in "Weaknesses in Bitcoin’s Merkle Root Construction":
4490 // https://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20190225/a27d8837/attachment-0001.pdf).
4491 //
4492 // Note: This is not a consensus change as this only applies to blocks
4493 // that don't have a coinbase transaction and would therefore already be
4494 // invalid.
4495 return std::any_of(block.vtx.begin(), block.vtx.end(),
4496 [](auto &tx) { return GetSerializeSize(tx) == 64; });
4497 } else {
4498 // Theoretically it is still possible for a block with a 64 byte
4499 // coinbase transaction to be mutated but we neglect that possibility
4500 // here as it requires at least 224 bits of work.
4501 }
4502
4503 return false;
4504}
4505
4507CalculateClaimedHeadersWork(const std::vector<CBlockHeader> &headers) {
4508 arith_uint256 total_work{0};
4509 for (const CBlockHeader &header : headers) {
4510 CBlockIndex dummy(header);
4511 total_work += GetBlockProof(dummy);
4512 }
4513 return total_work;
4514}
4515
4527 const CBlockHeader &block, BlockValidationState &state,
4528 BlockManager &blockman, ChainstateManager &chainman,
4529 const CBlockIndex *pindexPrev, NodeClock::time_point now,
4530 const std::optional<CCheckpointData> &test_checkpoints = std::nullopt)
4533 assert(pindexPrev != nullptr);
4534 const int nHeight = pindexPrev->nHeight + 1;
4535
4536 const CChainParams &params = chainman.GetParams();
4537
4538 // Check proof of work
4539 if (block.nBits != GetNextWorkRequired(pindexPrev, &block, params)) {
4540 LogPrintf("bad bits after height: %d\n", pindexPrev->nHeight);
4542 "bad-diffbits", "incorrect proof of work");
4543 }
4544
4545 // Check against checkpoints
4546 if (chainman.m_options.checkpoints_enabled) {
4547 const CCheckpointData &checkpoints =
4548 test_checkpoints ? test_checkpoints.value() : params.Checkpoints();
4549
4550 // Check that the block chain matches the known block chain up to a
4551 // checkpoint.
4552 if (!Checkpoints::CheckBlock(checkpoints, nHeight, block.GetHash())) {
4554 "ERROR: %s: rejected by checkpoint lock-in at %d\n",
4555 __func__, nHeight);
4557 "checkpoint mismatch");
4558 }
4559
4560 // Don't accept any forks from the main chain prior to last checkpoint.
4561 // GetLastCheckpoint finds the last checkpoint in MapCheckpoints that's
4562 // in our BlockIndex().
4563
4564 const CBlockIndex *pcheckpoint =
4565 blockman.GetLastCheckpoint(checkpoints);
4566 if (pcheckpoint && nHeight < pcheckpoint->nHeight) {
4568 "ERROR: %s: forked chain older than last checkpoint "
4569 "(height %d)\n",
4570 __func__, nHeight);
4572 "bad-fork-prior-to-checkpoint");
4573 }
4574 }
4575
4576 // Check timestamp against prev
4577 if (block.GetBlockTime() <= pindexPrev->GetMedianTimePast()) {
4579 "time-too-old", "block's timestamp is too early");
4580 }
4581
4582 // Check timestamp
4583 if (block.Time() > now + std::chrono::seconds{MAX_FUTURE_BLOCK_TIME}) {
4585 "time-too-new",
4586 "block timestamp too far in the future");
4587 }
4588
4589 // Reject blocks with outdated version
4590 if ((block.nVersion < 2 &&
4591 DeploymentActiveAfter(pindexPrev, chainman,
4593 (block.nVersion < 3 &&
4594 DeploymentActiveAfter(pindexPrev, chainman,
4596 (block.nVersion < 4 &&
4597 DeploymentActiveAfter(pindexPrev, chainman,
4599 return state.Invalid(
4601 strprintf("bad-version(0x%08x)", block.nVersion),
4602 strprintf("rejected nVersion=0x%08x block", block.nVersion));
4603 }
4604
4605 return true;
4606}
4607
4615static bool ContextualCheckBlock(const CBlock &block,
4616 BlockValidationState &state,
4617 const ChainstateManager &chainman,
4618 const CBlockIndex *pindexPrev) {
4619 const int nHeight = pindexPrev == nullptr ? 0 : pindexPrev->nHeight + 1;
4620
4621 // Enforce BIP113 (Median Time Past).
4622 bool enforce_locktime_median_time_past{false};
4623 if (DeploymentActiveAfter(pindexPrev, chainman,
4625 assert(pindexPrev != nullptr);
4626 enforce_locktime_median_time_past = true;
4627 }
4628
4629 const int64_t nMedianTimePast =
4630 pindexPrev == nullptr ? 0 : pindexPrev->GetMedianTimePast();
4631
4632 const int64_t nLockTimeCutoff{enforce_locktime_median_time_past
4633 ? nMedianTimePast
4634 : block.GetBlockTime()};
4635
4636 const Consensus::Params params = chainman.GetConsensus();
4637 const bool fIsMagneticAnomalyEnabled =
4638 IsMagneticAnomalyEnabled(params, pindexPrev);
4639
4640 // Check transactions:
4641 // - canonical ordering
4642 // - ensure they are finalized
4643 // - check they have the minimum size
4644 const CTransaction *prevTx = nullptr;
4645 for (const auto &ptx : block.vtx) {
4646 const CTransaction &tx = *ptx;
4647 if (fIsMagneticAnomalyEnabled) {
4648 if (prevTx && (tx.GetId() <= prevTx->GetId())) {
4649 if (tx.GetId() == prevTx->GetId()) {
4651 "tx-duplicate",
4652 strprintf("Duplicated transaction %s",
4653 tx.GetId().ToString()));
4654 }
4655
4656 return state.Invalid(
4658 strprintf("Transaction order is invalid (%s < %s)",
4659 tx.GetId().ToString(),
4660 prevTx->GetId().ToString()));
4661 }
4662
4663 if (prevTx || !tx.IsCoinBase()) {
4664 prevTx = &tx;
4665 }
4666 }
4667
4668 TxValidationState tx_state;
4669 if (!ContextualCheckTransaction(params, tx, tx_state, nHeight,
4670 nLockTimeCutoff)) {
4672 tx_state.GetRejectReason(),
4673 tx_state.GetDebugMessage());
4674 }
4675 }
4676
4677 // Enforce rule that the coinbase starts with serialized block height
4678 if (DeploymentActiveAfter(pindexPrev, chainman,
4680 CScript expect = CScript() << nHeight;
4681 if (block.vtx[0]->vin[0].scriptSig.size() < expect.size() ||
4682 !std::equal(expect.begin(), expect.end(),
4683 block.vtx[0]->vin[0].scriptSig.begin())) {
4685 "bad-cb-height",
4686 "block height mismatch in coinbase");
4687 }
4688 }
4689
4690 return true;
4691}
4692
4699 const CBlockHeader &block, BlockValidationState &state,
4700 CBlockIndex **ppindex, bool min_pow_checked,
4701 const std::optional<CCheckpointData> &test_checkpoints) {
4703 const Config &config = this->GetConfig();
4704 const CChainParams &chainparams = config.GetChainParams();
4705
4706 // Check for duplicate
4707 BlockHash hash = block.GetHash();
4708 BlockMap::iterator miSelf{m_blockman.m_block_index.find(hash)};
4709 if (hash != chainparams.GetConsensus().hashGenesisBlock) {
4710 if (miSelf != m_blockman.m_block_index.end()) {
4711 // Block header is already known.
4712 CBlockIndex *pindex = &(miSelf->second);
4713 if (ppindex) {
4714 *ppindex = pindex;
4715 }
4716
4717 if (pindex->nStatus.isInvalid()) {
4718 LogDebug(BCLog::VALIDATION, "%s: block %s is marked invalid\n",
4719 __func__, hash.ToString());
4720 return state.Invalid(
4722 }
4723
4724 return true;
4725 }
4726
4727 if (!CheckBlockHeader(block, state, chainparams.GetConsensus(),
4728 BlockValidationOptions(config))) {
4730 "%s: Consensus::CheckBlockHeader: %s, %s\n", __func__,
4731 hash.ToString(), state.ToString());
4732 return false;
4733 }
4734
4735 // Get prev block index
4736 BlockMap::iterator mi{
4737 m_blockman.m_block_index.find(block.hashPrevBlock)};
4738 if (mi == m_blockman.m_block_index.end()) {
4740 "header %s has prev block not found: %s\n",
4741 hash.ToString(), block.hashPrevBlock.ToString());
4743 "prev-blk-not-found");
4744 }
4745
4746 CBlockIndex *pindexPrev = &((*mi).second);
4747 assert(pindexPrev);
4748 if (pindexPrev->nStatus.isInvalid()) {
4750 "header %s has prev block invalid: %s\n", hash.ToString(),
4751 block.hashPrevBlock.ToString());
4753 "bad-prevblk");
4754 }
4755
4757 block, state, m_blockman, *this, pindexPrev,
4758 m_options.adjusted_time_callback(), test_checkpoints)) {
4760 "%s: Consensus::ContextualCheckBlockHeader: %s, %s\n",
4761 __func__, hash.ToString(), state.ToString());
4762 return false;
4763 }
4764
4765 /* Determine if this block descends from any block which has been found
4766 * invalid (m_failed_blocks), then mark pindexPrev and any blocks
4767 * between them as failed. For example:
4768 *
4769 * D3
4770 * /
4771 * B2 - C2
4772 * / \
4773 * A D2 - E2 - F2
4774 * \
4775 * B1 - C1 - D1 - E1
4776 *
4777 * In the case that we attempted to reorg from E1 to F2, only to find
4778 * C2 to be invalid, we would mark D2, E2, and F2 as BLOCK_FAILED_CHILD
4779 * but NOT D3 (it was not in any of our candidate sets at the time).
4780 *
4781 * In any case D3 will also be marked as BLOCK_FAILED_CHILD at restart
4782 * in LoadBlockIndex.
4783 */
4784 if (!pindexPrev->IsValid(BlockValidity::SCRIPTS)) {
4785 // The above does not mean "invalid": it checks if the previous
4786 // block hasn't been validated up to BlockValidity::SCRIPTS. This is
4787 // a performance optimization, in the common case of adding a new
4788 // block to the tip, we don't need to iterate over the failed blocks
4789 // list.
4790 for (const CBlockIndex *failedit : m_failed_blocks) {
4791 if (pindexPrev->GetAncestor(failedit->nHeight) == failedit) {
4792 assert(failedit->nStatus.hasFailed());
4793 CBlockIndex *invalid_walk = pindexPrev;
4794 while (invalid_walk != failedit) {
4795 invalid_walk->nStatus =
4796 invalid_walk->nStatus.withFailedParent();
4797 m_blockman.m_dirty_blockindex.insert(invalid_walk);
4798 invalid_walk = invalid_walk->pprev;
4799 }
4801 "header %s has prev block invalid: %s\n",
4802 hash.ToString(), block.hashPrevBlock.ToString());
4803 return state.Invalid(
4805 "bad-prevblk");
4806 }
4807 }
4808 }
4809 }
4810 if (!min_pow_checked) {
4812 "%s: not adding new block header %s, missing anti-dos "
4813 "proof-of-work validation\n",
4814 __func__, hash.ToString());
4816 "too-little-chainwork");
4817 }
4818 CBlockIndex *pindex{m_blockman.AddToBlockIndex(block, m_best_header)};
4819
4820 if (ppindex) {
4821 *ppindex = pindex;
4822 }
4823
4824 // Since this is the earliest point at which we have determined that a
4825 // header is both new and valid, log here.
4826 //
4827 // These messages are valuable for detecting potential selfish mining
4828 // behavior; if multiple displacing headers are seen near simultaneously
4829 // across many nodes in the network, this might be an indication of selfish
4830 // mining. Having this log by default when not in IBD ensures broad
4831 // availability of this data in case investigation is merited.
4832 const auto msg = strprintf("Saw new header hash=%s height=%d",
4833 hash.ToString(), pindex->nHeight);
4834
4835 if (IsInitialBlockDownload()) {
4837 } else {
4838 LogPrintf("%s\n", msg);
4839 }
4840
4841 return true;
4842}
4843
4844// Exposed wrapper for AcceptBlockHeader
4846 const std::vector<CBlockHeader> &headers, bool min_pow_checked,
4847 BlockValidationState &state, const CBlockIndex **ppindex,
4848 const std::optional<CCheckpointData> &test_checkpoints) {
4850 {
4851 LOCK(cs_main);
4852 for (const CBlockHeader &header : headers) {
4853 // Use a temp pindex instead of ppindex to avoid a const_cast
4854 CBlockIndex *pindex = nullptr;
4855 bool accepted = AcceptBlockHeader(
4856 header, state, &pindex, min_pow_checked, test_checkpoints);
4858
4859 if (!accepted) {
4860 return false;
4861 }
4862
4863 if (ppindex) {
4864 *ppindex = pindex;
4865 }
4866 }
4867 }
4868
4869 if (NotifyHeaderTip()) {
4870 if (IsInitialBlockDownload() && ppindex && *ppindex) {
4871 const CBlockIndex &last_accepted{**ppindex};
4872 int64_t blocks_left{(NodeClock::now() - last_accepted.Time()) /
4874 blocks_left = std::max<int64_t>(0, blocks_left);
4875 const double progress{100.0 * last_accepted.nHeight /
4876 (last_accepted.nHeight + blocks_left)};
4877 LogInfo("Synchronizing blockheaders, height: %d (~%.2f%%)\n",
4878 last_accepted.nHeight, progress);
4879 }
4880 }
4881 return true;
4882}
4883
4885 int64_t height,
4886 int64_t timestamp) {
4888 {
4889 LOCK(cs_main);
4890 // Don't report headers presync progress if we already have a
4891 // post-minchainwork header chain.
4892 // This means we lose reporting for potentially legimate, but unlikely,
4893 // deep reorgs, but prevent attackers that spam low-work headers from
4894 // filling our logs.
4895 if (m_best_header->nChainWork >=
4896 UintToArith256(GetConsensus().nMinimumChainWork)) {
4897 return;
4898 }
4899 // Rate limit headers presync updates to 4 per second, as these are not
4900 // subject to DoS protection.
4901 auto now = Now<SteadyMilliseconds>();
4902 if (now < m_last_presync_update + 250ms) {
4903 return;
4904 }
4905 m_last_presync_update = now;
4906 }
4907 bool initial_download = IsInitialBlockDownload();
4909 GetSynchronizationState(initial_download,
4911 height, timestamp, /*presync=*/true);
4912 if (initial_download) {
4913 int64_t blocks_left{
4914 (NodeClock::now() - NodeSeconds{std::chrono::seconds{timestamp}}) /
4916 blocks_left = std::max<int64_t>(0, blocks_left);
4917 const double progress{100.0 * height / (height + blocks_left)};
4918 LogInfo("Pre-synchronizing blockheaders, height: %d (~%.2f%%)\n",
4919 height, progress);
4920 }
4921}
4922
4923bool ChainstateManager::AcceptBlock(const std::shared_ptr<const CBlock> &pblock,
4924 BlockValidationState &state,
4925 bool fRequested, const FlatFilePos *dbp,
4926 bool *fNewBlock, bool min_pow_checked) {
4928
4929 const CBlock &block = *pblock;
4930 if (fNewBlock) {
4931 *fNewBlock = false;
4932 }
4933
4934 CBlockIndex *pindex = nullptr;
4935
4936 bool accepted_header{
4937 AcceptBlockHeader(block, state, &pindex, min_pow_checked)};
4939
4940 if (!accepted_header) {
4941 return false;
4942 }
4943
4944 // Check all requested blocks that we do not already have for validity and
4945 // save them to disk. Skip processing of unrequested blocks as an anti-DoS
4946 // measure, unless the blocks have more work than the active chain tip, and
4947 // aren't too far ahead of it, so are likely to be attached soon.
4948 bool fAlreadyHave = pindex->nStatus.hasData();
4949
4950 // TODO: deal better with return value and error conditions for duplicate
4951 // and unrequested blocks.
4952 if (fAlreadyHave) {
4953 return true;
4954 }
4955
4956 // Compare block header timestamps and received times of the block and the
4957 // chaintip. If they have the same chain height, use these diffs as a
4958 // tie-breaker, attempting to pick the more honestly-mined block.
4959 int64_t newBlockTimeDiff = std::llabs(pindex->GetReceivedTimeDiff());
4960 int64_t chainTipTimeDiff =
4961 ActiveTip() ? std::llabs(ActiveTip()->GetReceivedTimeDiff()) : 0;
4962
4963 bool isSameHeight =
4964 ActiveTip() && (pindex->nChainWork == ActiveTip()->nChainWork);
4965 if (isSameHeight) {
4966 LogPrintf("Chain tip timestamp-to-received-time difference: hash=%s, "
4967 "diff=%d\n",
4968 ActiveTip()->GetBlockHash().ToString(), chainTipTimeDiff);
4969 LogPrintf("New block timestamp-to-received-time difference: hash=%s, "
4970 "diff=%d\n",
4971 pindex->GetBlockHash().ToString(), newBlockTimeDiff);
4972 }
4973
4974 bool fHasMoreOrSameWork =
4975 (ActiveTip() ? pindex->nChainWork >= ActiveTip()->nChainWork : true);
4976
4977 // Blocks that are too out-of-order needlessly limit the effectiveness of
4978 // pruning, because pruning will not delete block files that contain any
4979 // blocks which are too close in height to the tip. Apply this test
4980 // regardless of whether pruning is enabled; it should generally be safe to
4981 // not process unrequested blocks.
4982 bool fTooFarAhead{pindex->nHeight >
4984
4985 // TODO: Decouple this function from the block download logic by removing
4986 // fRequested
4987 // This requires some new chain data structure to efficiently look up if a
4988 // block is in a chain leading to a candidate for best tip, despite not
4989 // being such a candidate itself.
4990 // Note that this would break the getblockfrompeer RPC
4991
4992 // If we didn't ask for it:
4993 if (!fRequested) {
4994 // This is a previously-processed block that was pruned.
4995 if (pindex->nTx != 0) {
4996 return true;
4997 }
4998
4999 // Don't process less-work chains.
5000 if (!fHasMoreOrSameWork) {
5001 return true;
5002 }
5003
5004 // Block height is too high.
5005 if (fTooFarAhead) {
5006 return true;
5007 }
5008
5009 // Protect against DoS attacks from low-work chains.
5010 // If our tip is behind, a peer could try to send us
5011 // low-work blocks on a fake chain that we would never
5012 // request; don't process these.
5013 if (pindex->nChainWork < MinimumChainWork()) {
5014 return true;
5015 }
5016 }
5017
5018 if (!CheckBlock(block, state,
5021 !ContextualCheckBlock(block, state, *this, pindex->pprev)) {
5022 if (state.IsInvalid() &&
5024 pindex->nStatus = pindex->nStatus.withFailed();
5025 m_blockman.m_dirty_blockindex.insert(pindex);
5026 }
5027
5028 LogError("%s: %s (block %s)\n", __func__, state.ToString(),
5029 block.GetHash().ToString());
5030 return false;
5031 }
5032
5033 // If connecting the new block would require rewinding more than one block
5034 // from the active chain (i.e., a "deep reorg"), then mark the new block as
5035 // parked. If it has enough work then it will be automatically unparked
5036 // later, during FindMostWorkChain. We mark the block as parked at the very
5037 // last minute so we can make sure everything is ready to be reorged if
5038 // needed.
5040 // Blocks that are below the snapshot height can't cause reorgs, as the
5041 // active tip is at least thousands of blocks higher. Don't park them,
5042 // they will most likely connect on the tip of the background chain.
5043 std::optional<int> snapshot_base_height = GetSnapshotBaseHeight();
5044 const bool is_background_block =
5045 snapshot_base_height && BackgroundSyncInProgress() &&
5046 pindex->nHeight <= snapshot_base_height;
5047 const CBlockIndex *pindexFork = ActiveChain().FindFork(pindex);
5048 if (!is_background_block && pindexFork &&
5049 pindexFork->nHeight + 1 < ActiveHeight()) {
5050 LogPrintf("Park block %s as it would cause a deep reorg.\n",
5051 pindex->GetBlockHash().ToString());
5052 pindex->nStatus = pindex->nStatus.withParked();
5053 m_blockman.m_dirty_blockindex.insert(pindex);
5054 }
5055 }
5056
5057 // Header is valid/has work and the merkle tree is good.
5058 // Relay now, but if it does not build on our best tip, let the
5059 // SendMessages loop relay it.
5060 if (!IsInitialBlockDownload() && ActiveTip() == pindex->pprev &&
5062 m_options.signals->NewPoWValidBlock(pindex, pblock);
5063 }
5064
5065 // Write block to history file
5066 if (fNewBlock) {
5067 *fNewBlock = true;
5068 }
5069 try {
5070 FlatFilePos blockPos{};
5071 if (dbp) {
5072 blockPos = *dbp;
5073 m_blockman.UpdateBlockInfo(block, pindex->nHeight, blockPos);
5074 } else {
5075 blockPos = m_blockman.WriteBlock(block, pindex->nHeight);
5076 if (blockPos.IsNull()) {
5077 state.Error(strprintf(
5078 "%s: Failed to find position to write new block to disk",
5079 __func__));
5080 return false;
5081 }
5082 }
5083 ReceivedBlockTransactions(block, pindex, blockPos);
5084 } catch (const std::runtime_error &e) {
5085 return FatalError(GetNotifications(), state,
5086 std::string("System error: ") + e.what());
5087 }
5088
5089 // TODO: FlushStateToDisk() handles flushing of both block and chainstate
5090 // data, so we should move this to ChainstateManager so that we can be more
5091 // intelligent about how we flush.
5092 // For now, since FlushStateMode::NONE is used, all that can happen is that
5093 // the block files may be pruned, so we can just call this on one
5094 // chainstate (particularly if we haven't implemented pruning with
5095 // background validation yet).
5096 ActiveChainstate().FlushStateToDisk(state, FlushStateMode::NONE);
5097
5099
5100 return true;
5101}
5102
5104 const std::shared_ptr<const CBlock> &block, bool force_processing,
5105 bool min_pow_checked, bool *new_block,
5108
5109 {
5110 if (new_block) {
5111 *new_block = false;
5112 }
5113
5115
5116 // CheckBlock() does not support multi-threaded block validation
5117 // because CBlock::fChecked can cause data race.
5118 // Therefore, the following critical section must include the
5119 // CheckBlock() call as well.
5120 LOCK(cs_main);
5121
5122 // Skipping AcceptBlock() for CheckBlock() failures means that we will
5123 // never mark a block as invalid if CheckBlock() fails. This is
5124 // protective against consensus failure if there are any unknown form
5125 // s of block malleability that cause CheckBlock() to fail; see e.g.
5126 // CVE-2012-2459 and
5127 // https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2019-February/016697.html.
5128 // Because CheckBlock() is not very expensive, the anti-DoS benefits of
5129 // caching failure (of a definitely-invalid block) are not substantial.
5130 bool ret = CheckBlock(*block, state, this->GetConsensus(),
5132 if (ret) {
5133 // Store to disk
5134 ret = AcceptBlock(block, state, force_processing, nullptr,
5135 new_block, min_pow_checked);
5136 }
5137
5138 if (!ret) {
5139 if (m_options.signals) {
5140 m_options.signals->BlockChecked(*block, state);
5141 }
5142 LogError("%s: AcceptBlock FAILED (%s)\n", __func__,
5143 state.ToString());
5144 return false;
5145 }
5146 }
5147
5149
5150 // Only used to report errors, not invalidity - ignore it
5152 if (!ActiveChainstate().ActivateBestChain(state, block, avalanche)) {
5153 LogError("%s: ActivateBestChain failed (%s)\n", __func__,
5154 state.ToString());
5155 return false;
5156 }
5157
5159 ? m_ibd_chainstate.get()
5160 : nullptr)};
5161 BlockValidationState bg_state;
5162 if (bg_chain && !bg_chain->ActivateBestChain(bg_state, block)) {
5163 LogError("%s: [background] ActivateBestChain failed (%s)\n", __func__,
5164 bg_state.ToString());
5165 return false;
5166 }
5167
5168 return true;
5169}
5170
5173 bool test_accept) {
5175 Chainstate &active_chainstate = ActiveChainstate();
5176 if (!active_chainstate.GetMempool()) {
5177 TxValidationState state;
5178 state.Invalid(TxValidationResult::TX_NO_MEMPOOL, "no-mempool");
5179 return MempoolAcceptResult::Failure(state);
5180 }
5181 auto result = AcceptToMemoryPool(active_chainstate, tx, GetTime(),
5182 /*bypass_limits=*/false, test_accept);
5183 active_chainstate.GetMempool()->check(
5184 active_chainstate.CoinsTip(), active_chainstate.m_chain.Height() + 1);
5185 return result;
5186}
5187
5189 BlockValidationState &state, const CChainParams &params,
5190 Chainstate &chainstate, const CBlock &block, CBlockIndex *pindexPrev,
5191 const std::function<NodeClock::time_point()> &adjusted_time_callback,
5192 BlockValidationOptions validationOptions) {
5194 assert(pindexPrev && pindexPrev == chainstate.m_chain.Tip());
5195 CCoinsViewCache viewNew(&chainstate.CoinsTip());
5196 BlockHash block_hash(block.GetHash());
5197 CBlockIndex indexDummy(block);
5198 indexDummy.pprev = pindexPrev;
5199 indexDummy.nHeight = pindexPrev->nHeight + 1;
5200 indexDummy.phashBlock = &block_hash;
5201
5202 // NOTE: CheckBlockHeader is called by CheckBlock
5203 if (!ContextualCheckBlockHeader(block, state, chainstate.m_blockman,
5204 chainstate.m_chainman, pindexPrev,
5205 adjusted_time_callback())) {
5206 LogError("%s: Consensus::ContextualCheckBlockHeader: %s\n", __func__,
5207 state.ToString());
5208 return false;
5209 }
5210
5211 if (!CheckBlock(block, state, params.GetConsensus(), validationOptions)) {
5212 LogError("%s: Consensus::CheckBlock: %s\n", __func__, state.ToString());
5213 return false;
5214 }
5215
5216 if (!ContextualCheckBlock(block, state, chainstate.m_chainman,
5217 pindexPrev)) {
5218 LogError("%s: Consensus::ContextualCheckBlock: %s\n", __func__,
5219 state.ToString());
5220 return false;
5221 }
5222
5223 if (!chainstate.ConnectBlock(block, state, &indexDummy, viewNew,
5224 validationOptions, nullptr, true)) {
5225 return false;
5226 }
5227
5228 assert(state.IsValid());
5229 return true;
5230}
5231
5232/* This function is called from the RPC code for pruneblockchain */
5233void PruneBlockFilesManual(Chainstate &active_chainstate,
5234 int nManualPruneHeight) {
5236 if (active_chainstate.FlushStateToDisk(state, FlushStateMode::NONE,
5237 nManualPruneHeight)) {
5238 LogPrintf("%s: failed to flush state (%s)\n", __func__,
5239 state.ToString());
5240 }
5241}
5242
5245 const CCoinsViewCache &coins_cache = CoinsTip();
5246 // Never called when the coins view is empty
5247 assert(!coins_cache.GetBestBlock().IsNull());
5248 const CBlockIndex *tip = m_chain.Tip();
5249
5250 if (tip && tip->GetBlockHash() == coins_cache.GetBestBlock()) {
5251 return true;
5252 }
5253
5254 // Load pointer to end of best chain
5255 CBlockIndex *pindex =
5257 if (!pindex) {
5258 return false;
5259 }
5260 m_chain.SetTip(*pindex);
5262
5263 tip = m_chain.Tip();
5264 LogPrintf(
5265 "Loaded best chain: hashBestChain=%s height=%d date=%s progress=%f\n",
5266 tip->GetBlockHash().ToString(), m_chain.Height(),
5269 return true;
5270}
5271
5273 : m_notifications{notifications} {
5274 m_notifications.progress(_("Verifying blocks…"), 0, false);
5275}
5276
5278 m_notifications.progress(bilingual_str{}, 100, false);
5279}
5280
5282 CCoinsView &coinsview, int nCheckLevel,
5283 int nCheckDepth) {
5285
5286 const Config &config = chainstate.m_chainman.GetConfig();
5287 const CChainParams &params = config.GetChainParams();
5288 const Consensus::Params &consensusParams = params.GetConsensus();
5289
5290 if (chainstate.m_chain.Tip() == nullptr ||
5291 chainstate.m_chain.Tip()->pprev == nullptr) {
5293 }
5294
5295 // Verify blocks in the best chain
5296 if (nCheckDepth <= 0 || nCheckDepth > chainstate.m_chain.Height()) {
5297 nCheckDepth = chainstate.m_chain.Height();
5298 }
5299
5300 nCheckLevel = std::max(0, std::min(4, nCheckLevel));
5301 LogPrintf("Verifying last %i blocks at level %i\n", nCheckDepth,
5302 nCheckLevel);
5303
5304 CCoinsViewCache coins(&coinsview);
5305 CBlockIndex *pindex;
5306 CBlockIndex *pindexFailure = nullptr;
5307 int nGoodTransactions = 0;
5309 int reportDone = 0;
5310 bool skipped_no_block_data{false};
5311 bool skipped_l3_checks{false};
5312 LogPrintf("Verification progress: 0%%\n");
5313
5314 const bool is_snapshot_cs{chainstate.m_from_snapshot_blockhash};
5315
5316 for (pindex = chainstate.m_chain.Tip(); pindex && pindex->pprev;
5317 pindex = pindex->pprev) {
5318 const int percentageDone = std::max(
5319 1, std::min(99, (int)(((double)(chainstate.m_chain.Height() -
5320 pindex->nHeight)) /
5321 (double)nCheckDepth *
5322 (nCheckLevel >= 4 ? 50 : 100))));
5323 if (reportDone < percentageDone / 10) {
5324 // report every 10% step
5325 LogPrintf("Verification progress: %d%%\n", percentageDone);
5326 reportDone = percentageDone / 10;
5327 }
5328
5329 m_notifications.progress(_("Verifying blocks…"), percentageDone, false);
5330 if (pindex->nHeight <= chainstate.m_chain.Height() - nCheckDepth) {
5331 break;
5332 }
5333
5334 if ((chainstate.m_blockman.IsPruneMode() || is_snapshot_cs) &&
5335 !pindex->nStatus.hasData()) {
5336 // If pruning or running under an assumeutxo snapshot, only go
5337 // back as far as we have data.
5338 LogPrintf("VerifyDB(): block verification stopping at height %d "
5339 "(no data). This could be due to pruning or use of an "
5340 "assumeutxo snapshot.\n",
5341 pindex->nHeight);
5342 skipped_no_block_data = true;
5343 break;
5344 }
5345
5346 CBlock block;
5347
5348 // check level 0: read from disk
5349 if (!chainstate.m_blockman.ReadBlock(block, *pindex)) {
5350 LogPrintf("Verification error: ReadBlock failed at %d, hash=%s\n",
5351 pindex->nHeight, pindex->GetBlockHash().ToString());
5353 }
5354
5355 // check level 1: verify block validity
5356 if (nCheckLevel >= 1 && !CheckBlock(block, state, consensusParams,
5357 BlockValidationOptions(config))) {
5358 LogPrintf(
5359 "Verification error: found bad block at %d, hash=%s (%s)\n",
5360 pindex->nHeight, pindex->GetBlockHash().ToString(),
5361 state.ToString());
5363 }
5364
5365 // check level 2: verify undo validity
5366 if (nCheckLevel >= 2 && pindex) {
5367 CBlockUndo undo;
5368 if (!pindex->GetUndoPos().IsNull()) {
5369 if (!chainstate.m_blockman.ReadBlockUndo(undo, *pindex)) {
5370 LogPrintf("Verification error: found bad undo data at %d, "
5371 "hash=%s\n",
5372 pindex->nHeight,
5373 pindex->GetBlockHash().ToString());
5375 }
5376 }
5377 }
5378 // check level 3: check for inconsistencies during memory-only
5379 // disconnect of tip blocks
5380 size_t curr_coins_usage = coins.DynamicMemoryUsage() +
5381 chainstate.CoinsTip().DynamicMemoryUsage();
5382
5383 if (nCheckLevel >= 3) {
5384 if (curr_coins_usage <= chainstate.m_coinstip_cache_size_bytes) {
5385 assert(coins.GetBestBlock() == pindex->GetBlockHash());
5386 DisconnectResult res =
5387 chainstate.DisconnectBlock(block, pindex, coins);
5388 if (res == DisconnectResult::FAILED) {
5389 LogPrintf("Verification error: irrecoverable inconsistency "
5390 "in block data at %d, hash=%s\n",
5391 pindex->nHeight,
5392 pindex->GetBlockHash().ToString());
5394 }
5395 if (res == DisconnectResult::UNCLEAN) {
5396 nGoodTransactions = 0;
5397 pindexFailure = pindex;
5398 } else {
5399 nGoodTransactions += block.vtx.size();
5400 }
5401 } else {
5402 skipped_l3_checks = true;
5403 }
5404 }
5405
5406 if (chainstate.m_chainman.m_interrupt) {
5408 }
5409 }
5410
5411 if (pindexFailure) {
5412 LogPrintf("Verification error: coin database inconsistencies found "
5413 "(last %i blocks, %i good transactions before that)\n",
5414 chainstate.m_chain.Height() - pindexFailure->nHeight + 1,
5415 nGoodTransactions);
5417 }
5418 if (skipped_l3_checks) {
5419 LogPrintf("Skipped verification of level >=3 (insufficient database "
5420 "cache size). Consider increasing -dbcache.\n");
5421 }
5422
5423 // store block count as we move pindex at check level >= 4
5424 int block_count = chainstate.m_chain.Height() - pindex->nHeight;
5425
5426 // check level 4: try reconnecting blocks
5427 if (nCheckLevel >= 4 && !skipped_l3_checks) {
5428 while (pindex != chainstate.m_chain.Tip()) {
5429 const int percentageDone = std::max(
5430 1, std::min(99, 100 - int(double(chainstate.m_chain.Height() -
5431 pindex->nHeight) /
5432 double(nCheckDepth) * 50)));
5433 if (reportDone < percentageDone / 10) {
5434 // report every 10% step
5435 LogPrintf("Verification progress: %d%%\n", percentageDone);
5436 reportDone = percentageDone / 10;
5437 }
5438 m_notifications.progress(_("Verifying blocks…"), percentageDone,
5439 false);
5440 pindex = chainstate.m_chain.Next(pindex);
5441 CBlock block;
5442 if (!chainstate.m_blockman.ReadBlock(block, *pindex)) {
5443 LogPrintf("Verification error: ReadBlock failed at %d, "
5444 "hash=%s\n",
5445 pindex->nHeight, pindex->GetBlockHash().ToString());
5447 }
5448 if (!chainstate.ConnectBlock(block, state, pindex, coins,
5449 BlockValidationOptions(config))) {
5450 LogPrintf("Verification error: found unconnectable block at "
5451 "%d, hash=%s (%s)\n",
5452 pindex->nHeight, pindex->GetBlockHash().ToString(),
5453 state.ToString());
5455 }
5456 if (chainstate.m_chainman.m_interrupt) {
5458 }
5459 }
5460 }
5461
5462 LogPrintf("Verification: No coin database inconsistencies in last %i "
5463 "blocks (%i transactions)\n",
5464 block_count, nGoodTransactions);
5465
5466 if (skipped_l3_checks) {
5468 }
5469 if (skipped_no_block_data) {
5471 }
5473}
5474
5480 CCoinsViewCache &view) {
5482 // TODO: merge with ConnectBlock
5483 CBlock block;
5484 if (!m_blockman.ReadBlock(block, *pindex)) {
5485 LogError("ReplayBlock(): ReadBlock failed at %d, hash=%s\n",
5486 pindex->nHeight, pindex->GetBlockHash().ToString());
5487 return false;
5488 }
5489
5490 for (const CTransactionRef &tx : block.vtx) {
5491 // Pass check = true as every addition may be an overwrite.
5492 AddCoins(view, *tx, pindex->nHeight, true);
5493 }
5494
5495 for (const CTransactionRef &tx : block.vtx) {
5496 if (tx->IsCoinBase()) {
5497 continue;
5498 }
5499
5500 for (const CTxIn &txin : tx->vin) {
5501 view.SpendCoin(txin.prevout);
5502 }
5503 }
5504
5505 return true;
5506}
5507
5509 LOCK(cs_main);
5510
5511 CCoinsView &db = this->CoinsDB();
5512 CCoinsViewCache cache(&db);
5513
5514 std::vector<BlockHash> hashHeads = db.GetHeadBlocks();
5515 if (hashHeads.empty()) {
5516 // We're already in a consistent state.
5517 return true;
5518 }
5519 if (hashHeads.size() != 2) {
5520 LogError("ReplayBlocks(): unknown inconsistent state\n");
5521 return false;
5522 }
5523
5524 m_chainman.GetNotifications().progress(_("Replaying blocks…"), 0, false);
5525 LogPrintf("Replaying blocks\n");
5526
5527 // Old tip during the interrupted flush.
5528 const CBlockIndex *pindexOld = nullptr;
5529 // New tip during the interrupted flush.
5530 const CBlockIndex *pindexNew;
5531 // Latest block common to both the old and the new tip.
5532 const CBlockIndex *pindexFork = nullptr;
5533
5534 if (m_blockman.m_block_index.count(hashHeads[0]) == 0) {
5535 LogError("ReplayBlocks(): reorganization to unknown block requested\n");
5536 return false;
5537 }
5538
5539 pindexNew = &(m_blockman.m_block_index[hashHeads[0]]);
5540
5541 if (!hashHeads[1].IsNull()) {
5542 // The old tip is allowed to be 0, indicating it's the first flush.
5543 if (m_blockman.m_block_index.count(hashHeads[1]) == 0) {
5544 LogError("ReplayBlocks(): reorganization from unknown block "
5545 "requested\n");
5546 return false;
5547 }
5548
5549 pindexOld = &(m_blockman.m_block_index[hashHeads[1]]);
5550 pindexFork = LastCommonAncestor(pindexOld, pindexNew);
5551 assert(pindexFork != nullptr);
5552 }
5553
5554 // Rollback along the old branch.
5555 while (pindexOld != pindexFork) {
5556 if (pindexOld->nHeight > 0) {
5557 // Never disconnect the genesis block.
5558 CBlock block;
5559 if (!m_blockman.ReadBlock(block, *pindexOld)) {
5560 LogError("RollbackBlock(): ReadBlock() failed at "
5561 "%d, hash=%s\n",
5562 pindexOld->nHeight,
5563 pindexOld->GetBlockHash().ToString());
5564 return false;
5565 }
5566
5567 LogPrintf("Rolling back %s (%i)\n",
5568 pindexOld->GetBlockHash().ToString(), pindexOld->nHeight);
5569 DisconnectResult res = DisconnectBlock(block, pindexOld, cache);
5570 if (res == DisconnectResult::FAILED) {
5571 LogError(
5572 "RollbackBlock(): DisconnectBlock failed at %d, hash=%s\n",
5573 pindexOld->nHeight, pindexOld->GetBlockHash().ToString());
5574 return false;
5575 }
5576
5577 // If DisconnectResult::UNCLEAN is returned, it means a non-existing
5578 // UTXO was deleted, or an existing UTXO was overwritten. It
5579 // corresponds to cases where the block-to-be-disconnect never had
5580 // all its operations applied to the UTXO set. However, as both
5581 // writing a UTXO and deleting a UTXO are idempotent operations, the
5582 // result is still a version of the UTXO set with the effects of
5583 // that block undone.
5584 }
5585 pindexOld = pindexOld->pprev;
5586 }
5587
5588 // Roll forward from the forking point to the new tip.
5589 int nForkHeight = pindexFork ? pindexFork->nHeight : 0;
5590 for (int nHeight = nForkHeight + 1; nHeight <= pindexNew->nHeight;
5591 ++nHeight) {
5592 const CBlockIndex &pindex{*Assert(pindexNew->GetAncestor(nHeight))};
5593 LogPrintf("Rolling forward %s (%i)\n", pindex.GetBlockHash().ToString(),
5594 nHeight);
5596 _("Replaying blocks…"),
5597 (int)((nHeight - nForkHeight) * 100.0 /
5598 (pindexNew->nHeight - nForkHeight)),
5599 false);
5600 if (!RollforwardBlock(&pindex, cache)) {
5601 return false;
5602 }
5603 }
5604
5605 cache.SetBestBlock(pindexNew->GetBlockHash());
5606 // local CCoinsViewCache goes out of scope
5607 cache.Flush(/*reallocate_cache=*/false);
5609 return true;
5610}
5611
5612// May NOT be used after any connections are up as much of the peer-processing
5613// logic assumes a consistent block index state
5614void Chainstate::ClearBlockIndexCandidates() {
5616 m_best_fork_tip = nullptr;
5617 m_best_fork_base = nullptr;
5619}
5620
5623
5625 return false;
5626 }
5627
5628 // Dump enough headers for RTT computation, with a few extras in case a
5629 // reorg occurs.
5630 const uint64_t numHeaders{20};
5631
5632 try {
5633 const fs::path filePathTmp = filePath + ".new";
5634 FILE *filestr = fsbridge::fopen(filePathTmp, "wb");
5635 if (!filestr) {
5636 return false;
5637 }
5638
5639 AutoFile file{filestr};
5640 file << HEADERS_TIME_VERSION;
5641 file << numHeaders;
5642
5643 const CBlockIndex *index = ActiveTip();
5644 bool missingIndex{false};
5645 for (uint64_t i = 0; i < numHeaders; i++) {
5646 if (!index) {
5647 LogPrintf("Missing block index, stopping the headers time "
5648 "dumping after %d blocks.\n",
5649 i);
5650 missingIndex = true;
5651 break;
5652 }
5653
5654 file << index->GetBlockHash();
5655 file << index->GetHeaderReceivedTime();
5656
5657 index = index->pprev;
5658 }
5659
5660 if (!FileCommit(file.Get())) {
5661 throw std::runtime_error(strprintf("Failed to commit to file %s",
5662 PathToString(filePathTmp)));
5663 }
5664 file.fclose();
5665
5666 if (missingIndex) {
5667 fs::remove(filePathTmp);
5668 return false;
5669 }
5670
5671 if (!RenameOver(filePathTmp, filePath)) {
5672 throw std::runtime_error(strprintf("Rename failed from %s to %s",
5673 PathToString(filePathTmp),
5674 PathToString(filePath)));
5675 }
5676 } catch (const std::exception &e) {
5677 LogPrintf("Failed to dump the headers time: %s.\n", e.what());
5678 return false;
5679 }
5680
5681 LogPrintf("Successfully dumped the last %d headers time to %s.\n",
5682 numHeaders, PathToString(filePath));
5683
5684 return true;
5685}
5686
5689
5691 return false;
5692 }
5693
5694 FILE *filestr = fsbridge::fopen(filePath, "rb");
5695 AutoFile file{filestr};
5696 if (file.IsNull()) {
5697 LogPrintf("Failed to open header times from disk, skipping.\n");
5698 return false;
5699 }
5700
5701 try {
5702 uint64_t version;
5703 file >> version;
5704
5705 if (version != HEADERS_TIME_VERSION) {
5706 LogPrintf("Unsupported header times file version, skipping.\n");
5707 return false;
5708 }
5709
5710 uint64_t numBlocks;
5711 file >> numBlocks;
5712
5713 for (uint64_t i = 0; i < numBlocks; i++) {
5714 BlockHash blockHash;
5715 int64_t receiveTime;
5716
5717 file >> blockHash;
5718 file >> receiveTime;
5719
5720 CBlockIndex *index = m_blockman.LookupBlockIndex(blockHash);
5721 if (!index) {
5722 LogPrintf("Missing index for block %s, stopping the headers "
5723 "time loading after %d blocks.\n",
5724 blockHash.ToString(), i);
5725 return false;
5726 }
5727
5728 index->nTimeReceived = receiveTime;
5729 }
5730 } catch (const std::exception &e) {
5731 LogPrintf("Failed to read the headers time file data on disk: %s.\n",
5732 e.what());
5733 return false;
5734 }
5735
5736 return true;
5737}
5738
5741 // Load block index from databases
5743 bool ret{m_blockman.LoadBlockIndexDB(SnapshotBlockhash())};
5744 if (!ret) {
5745 return false;
5746 }
5747
5748 m_blockman.ScanAndUnlinkAlreadyPrunedFiles();
5749
5750 std::vector<CBlockIndex *> vSortedByHeight{
5751 m_blockman.GetAllBlockIndices()};
5752 std::sort(vSortedByHeight.begin(), vSortedByHeight.end(),
5754
5755 for (CBlockIndex *pindex : vSortedByHeight) {
5756 if (m_interrupt) {
5757 return false;
5758 }
5759 // If we have an assumeutxo-based chainstate, then the snapshot
5760 // block will be a candidate for the tip, but it may not be
5761 // VALID_TRANSACTIONS (eg if we haven't yet downloaded the block),
5762 // so we special-case the snapshot block as a potential candidate
5763 // here.
5764 if (pindex == GetSnapshotBaseBlock() ||
5766 (pindex->HaveNumChainTxs() || pindex->pprev == nullptr))) {
5767 for (Chainstate *chainstate : GetAll()) {
5768 chainstate->TryAddBlockIndexCandidate(pindex);
5769 }
5770 }
5771
5772 if (pindex->nStatus.isInvalid() &&
5773 (!m_best_invalid ||
5774 pindex->nChainWork > m_best_invalid->nChainWork)) {
5775 m_best_invalid = pindex;
5776 }
5777
5778 if (pindex->nStatus.isOnParkedChain() &&
5779 (!m_best_parked ||
5780 pindex->nChainWork > m_best_parked->nChainWork)) {
5781 m_best_parked = pindex;
5782 }
5783
5784 if (pindex->IsValid(BlockValidity::TREE) &&
5785 (m_best_header == nullptr ||
5786 CBlockIndexWorkComparator()(m_best_header, pindex))) {
5787 m_best_header = pindex;
5788 }
5789 }
5790 }
5791 return true;
5792}
5793
5795 LOCK(cs_main);
5796
5797 const CChainParams &params{m_chainman.GetParams()};
5798
5799 // Check whether we're already initialized by checking for genesis in
5800 // m_blockman.m_block_index. Note that we can't use m_chain here, since it
5801 // is set based on the coins db, not the block index db, which is the only
5802 // thing loaded at this point.
5803 if (m_blockman.m_block_index.count(params.GenesisBlock().GetHash())) {
5804 return true;
5805 }
5806
5807 try {
5808 const CBlock &block = params.GenesisBlock();
5809 FlatFilePos blockPos{m_blockman.WriteBlock(block, 0)};
5810 if (blockPos.IsNull()) {
5811 LogError("%s: writing genesis block to disk failed\n", __func__);
5812 return false;
5813 }
5814 CBlockIndex *pindex =
5815 m_blockman.AddToBlockIndex(block, m_chainman.m_best_header);
5816 m_chainman.ReceivedBlockTransactions(block, pindex, blockPos);
5817 } catch (const std::runtime_error &e) {
5818 LogError("%s: failed to write genesis block: %s\n", __func__, e.what());
5819 return false;
5820 }
5821
5822 return true;
5823}
5824
5826 AutoFile &file_in, FlatFilePos *dbp,
5827 std::multimap<BlockHash, FlatFilePos> *blocks_with_unknown_parent,
5829 // Either both should be specified (-reindex), or neither (-loadblock).
5830 assert(!dbp == !blocks_with_unknown_parent);
5831
5832 int64_t nStart = GetTimeMillis();
5833 const CChainParams &params{GetParams()};
5834
5835 int nLoaded = 0;
5836 try {
5837 // Make sure we have at least 2*MAX_TX_SIZE space in the buffer
5838 // so any transaction can fit in there.
5839 BufferedFile blkdat{file_in, 2 * MAX_TX_SIZE, MAX_TX_SIZE + 8};
5840 // nRewind indicates where to resume scanning in case something goes
5841 // wrong, such as a block fails to deserialize.
5842 uint64_t nRewind = blkdat.GetPos();
5843 while (!blkdat.eof()) {
5844 if (m_interrupt) {
5845 return;
5846 }
5847
5848 blkdat.SetPos(nRewind);
5849 // Start one byte further next time, in case of failure.
5850 nRewind++;
5851 // Remove former limit.
5852 blkdat.SetLimit();
5853 unsigned int nSize = 0;
5854 try {
5855 // Locate a header.
5857 blkdat.FindByte(std::byte(params.DiskMagic()[0]));
5858 nRewind = blkdat.GetPos() + 1;
5859 blkdat >> buf;
5860 if (memcmp(buf, params.DiskMagic().data(),
5862 continue;
5863 }
5864
5865 // Read size.
5866 blkdat >> nSize;
5867 if (nSize < 80) {
5868 continue;
5869 }
5870 } catch (const std::exception &) {
5871 // No valid block header found; don't complain.
5872 // (this happens at the end of every blk.dat file)
5873 break;
5874 }
5875
5876 try {
5877 // read block header
5878 const uint64_t nBlockPos{blkdat.GetPos()};
5879 if (dbp) {
5880 dbp->nPos = nBlockPos;
5881 }
5882 blkdat.SetLimit(nBlockPos + nSize);
5883 CBlockHeader header;
5884 blkdat >> header;
5885 const BlockHash hash{header.GetHash()};
5886 // Skip the rest of this block (this may read from disk
5887 // into memory); position to the marker before the next block,
5888 // but it's still possible to rewind to the start of the
5889 // current block (without a disk read).
5890 nRewind = nBlockPos + nSize;
5891 blkdat.SkipTo(nRewind);
5892
5893 // needs to remain available after the cs_main lock is released
5894 // to avoid duplicate reads from disk
5895 std::shared_ptr<CBlock> pblock{};
5896
5897 {
5898 LOCK(cs_main);
5899 // detect out of order blocks, and store them for later
5900 if (hash != params.GetConsensus().hashGenesisBlock &&
5902 LogDebug(
5904 "%s: Out of order block %s, parent %s not known\n",
5905 __func__, hash.ToString(),
5906 header.hashPrevBlock.ToString());
5907 if (dbp && blocks_with_unknown_parent) {
5908 blocks_with_unknown_parent->emplace(
5909 header.hashPrevBlock, *dbp);
5910 }
5911 continue;
5912 }
5913
5914 // process in case the block isn't known yet
5915 const CBlockIndex *pindex =
5917 if (!pindex || !pindex->nStatus.hasData()) {
5918 // This block can be processed immediately; rewind to
5919 // its start, read and deserialize it.
5920 blkdat.SetPos(nBlockPos);
5921 pblock = std::make_shared<CBlock>();
5922 blkdat >> *pblock;
5923 nRewind = blkdat.GetPos();
5924
5926 if (AcceptBlock(pblock, state, true, dbp, nullptr,
5927 true)) {
5928 nLoaded++;
5929 }
5930 if (state.IsError()) {
5931 break;
5932 }
5933 } else if (hash != params.GetConsensus().hashGenesisBlock &&
5934 pindex->nHeight % 1000 == 0) {
5935 LogDebug(
5937 "Block Import: already had block %s at height %d\n",
5938 hash.ToString(), pindex->nHeight);
5939 }
5940 }
5941
5942 // Activate the genesis block so normal node progress can
5943 // continue. During first -reindex, this will only connect
5944 // Genesis since ActivateBestChain only connects blocks which
5945 // are in the block tree db, which only contains blocks whose
5946 // parents are in it.
5947 // But do this only if genesis isn't activated yet, to avoid
5948 // connecting many blocks without assumevalid in the case of a
5949 // continuation of a reindex that was interrupted by the user.
5950 if (hash == params.GetConsensus().hashGenesisBlock &&
5951 WITH_LOCK(::cs_main, return ActiveHeight()) == -1) {
5953 if (!ActiveChainstate().ActivateBestChain(state, nullptr,
5954 avalanche)) {
5955 break;
5956 }
5957 }
5958
5959 if (m_blockman.IsPruneMode() &&
5960 m_blockman.m_blockfiles_indexed && pblock) {
5961 // Must update the tip for pruning to work while importing
5962 // with -loadblock. This is a tradeoff to conserve disk
5963 // space at the expense of time spent updating the tip to be
5964 // able to prune. Otherwise, ActivateBestChain won't be
5965 // called by the import process until after all of the block
5966 // files are loaded. ActivateBestChain can be called by
5967 // concurrent network message processing, but that is not
5968 // reliable for the purpose of pruning while importing.
5969 bool activation_failure = false;
5970 for (auto c : GetAll()) {
5972 if (!c->ActivateBestChain(state, pblock, avalanche)) {
5974 "failed to activate chain (%s)\n",
5975 state.ToString());
5976 activation_failure = true;
5977 break;
5978 }
5979 }
5980 if (activation_failure) {
5981 break;
5982 }
5983 }
5984
5986
5987 if (!blocks_with_unknown_parent) {
5988 continue;
5989 }
5990
5991 // Recursively process earlier encountered successors of this
5992 // block
5993 std::deque<BlockHash> queue;
5994 queue.push_back(hash);
5995 while (!queue.empty()) {
5996 BlockHash head = queue.front();
5997 queue.pop_front();
5998 auto range = blocks_with_unknown_parent->equal_range(head);
5999 while (range.first != range.second) {
6000 std::multimap<BlockHash, FlatFilePos>::iterator it =
6001 range.first;
6002 std::shared_ptr<CBlock> pblockrecursive =
6003 std::make_shared<CBlock>();
6004 if (m_blockman.ReadBlock(*pblockrecursive,
6005 it->second)) {
6006 LogDebug(
6008 "%s: Processing out of order child %s of %s\n",
6009 __func__, pblockrecursive->GetHash().ToString(),
6010 head.ToString());
6011 LOCK(cs_main);
6013 if (AcceptBlock(pblockrecursive, dummy, true,
6014 &it->second, nullptr, true)) {
6015 nLoaded++;
6016 queue.push_back(pblockrecursive->GetHash());
6017 }
6018 }
6019 range.first++;
6020 blocks_with_unknown_parent->erase(it);
6022 }
6023 }
6024 } catch (const std::exception &e) {
6025 // Historical bugs added extra data to the block files that does
6026 // not deserialize cleanly. Commonly this data is between
6027 // readable blocks, but it does not really matter. Such data is
6028 // not fatal to the import process. The code that reads the
6029 // block files deals with invalid data by simply ignoring it. It
6030 // continues to search for the next {4 byte magic message start
6031 // bytes + 4 byte length + block} that does deserialize cleanly
6032 // and passes all of the other block validation checks dealing
6033 // with POW and the merkle root, etc... We merely note with this
6034 // informational log message when unexpected data is
6035 // encountered. We could also be experiencing a storage system
6036 // read error, or a read of a previous bad write. These are
6037 // possible, but less likely scenarios. We don't have enough
6038 // information to tell a difference here. The reindex process is
6039 // not the place to attempt to clean and/or compact the block
6040 // files. If so desired, a studious node operator may use
6041 // knowledge of the fact that the block files are not entirely
6042 // pristine in order to prepare a set of pristine, and perhaps
6043 // ordered, block files for later reindexing.
6045 "%s: unexpected data at file offset 0x%x - %s. "
6046 "continuing\n",
6047 __func__, (nRewind - 1), e.what());
6048 }
6049 }
6050 } catch (const std::runtime_error &e) {
6051 GetNotifications().fatalError(std::string("System error: ") + e.what());
6052 }
6053
6054 LogPrintf("Loaded %i blocks from external file in %dms\n", nLoaded,
6055 GetTimeMillis() - nStart);
6056}
6057
6059 // Assert to verify Flatten() has been called.
6061 return false;
6062 }
6063 if (FastRandomContext().randrange(*m_options.check_block_index) >= 1) {
6064 return false;
6065 }
6066 return true;
6067}
6068
6070 if (!ShouldCheckBlockIndex()) {
6071 return;
6072 }
6073
6074 LOCK(cs_main);
6075
6076 // During a reindex, we read the genesis block and call CheckBlockIndex
6077 // before ActivateBestChain, so we have the genesis block in
6078 // m_blockman.m_block_index but no active chain. (A few of the tests when
6079 // iterating the block tree require that m_chain has been initialized.)
6080 if (ActiveChain().Height() < 0) {
6081 assert(m_blockman.m_block_index.size() <= 1);
6082 return;
6083 }
6084
6085 // Build forward-pointing data structure for the entire block tree.
6086 // For performance reasons, indexes of the best header chain are stored in
6087 // a vector (within CChain).
6088 // All remaining blocks are stored in a multimap.
6089 // The best header chain can differ from the active chain: E.g. its entries
6090 // may belong to blocks that are not yet validated.
6091 CChain best_hdr_chain;
6092 assert(m_best_header);
6093 best_hdr_chain.SetTip(*m_best_header);
6094
6095 std::multimap<CBlockIndex *, CBlockIndex *> forward;
6096 for (auto &[_, block_index] : m_blockman.m_block_index) {
6097 // Only save indexes in forward that are not part of the best header
6098 // chain.
6099 if (!best_hdr_chain.Contains(&block_index)) {
6100 // Only genesis, which must be part of the best header chain,
6101 // can have a nullptr parent.
6102 assert(block_index.pprev);
6103 forward.emplace(block_index.pprev, &block_index);
6104 }
6105 }
6106 assert(forward.size() + best_hdr_chain.Height() + 1 ==
6107 m_blockman.m_block_index.size());
6108
6109 CBlockIndex *pindex = best_hdr_chain[0];
6110 assert(pindex);
6111 // Iterate over the entire block tree, using depth-first search.
6112 // Along the way, remember whether there are blocks on the path from genesis
6113 // block being explored which are the first to have certain properties.
6114 size_t nNodes = 0;
6115 int nHeight = 0;
6116 // Oldest ancestor of pindex which is invalid.
6117 CBlockIndex *pindexFirstInvalid = nullptr;
6118 // Oldest ancestor of pindex which is parked.
6119 CBlockIndex *pindexFirstParked = nullptr;
6120 // Oldest ancestor of pindex which does not have data available, since
6121 // assumeutxo snapshot if used.
6122 CBlockIndex *pindexFirstMissing = nullptr;
6123 // Oldest ancestor of pindex for which nTx == 0, since assumeutxo snapshot
6124 // if used..
6125 CBlockIndex *pindexFirstNeverProcessed = nullptr;
6126 // Oldest ancestor of pindex which does not have BLOCK_VALID_TREE
6127 // (regardless of being valid or not).
6128 CBlockIndex *pindexFirstNotTreeValid = nullptr;
6129 // Oldest ancestor of pindex which does not have BLOCK_VALID_TRANSACTIONS
6130 // (regardless of being valid or not), since assumeutxo snapshot if used.
6131 CBlockIndex *pindexFirstNotTransactionsValid = nullptr;
6132 // Oldest ancestor of pindex which does not have BLOCK_VALID_CHAIN
6133 // (regardless of being valid or not), since assumeutxo snapshot if used.
6134 CBlockIndex *pindexFirstNotChainValid = nullptr;
6135 // Oldest ancestor of pindex which does not have BLOCK_VALID_SCRIPTS
6136 // (regardless of being valid or not), since assumeutxo snapshot if used.
6137 CBlockIndex *pindexFirstNotScriptsValid = nullptr;
6138
6139 // After checking an assumeutxo snapshot block, reset pindexFirst pointers
6140 // to earlier blocks that have not been downloaded or validated yet, so
6141 // checks for later blocks can assume the earlier blocks were validated and
6142 // be stricter, testing for more requirements.
6143 const CBlockIndex *snap_base{GetSnapshotBaseBlock()};
6144 CBlockIndex *snap_first_missing{}, *snap_first_notx{}, *snap_first_notv{},
6145 *snap_first_nocv{}, *snap_first_nosv{};
6146 auto snap_update_firsts = [&] {
6147 if (pindex == snap_base) {
6148 std::swap(snap_first_missing, pindexFirstMissing);
6149 std::swap(snap_first_notx, pindexFirstNeverProcessed);
6150 std::swap(snap_first_notv, pindexFirstNotTransactionsValid);
6151 std::swap(snap_first_nocv, pindexFirstNotChainValid);
6152 std::swap(snap_first_nosv, pindexFirstNotScriptsValid);
6153 }
6154 };
6155
6156 while (pindex != nullptr) {
6157 nNodes++;
6158 if (pindexFirstInvalid == nullptr && pindex->nStatus.hasFailed()) {
6159 pindexFirstInvalid = pindex;
6160 }
6161 if (pindexFirstParked == nullptr && pindex->nStatus.isParked()) {
6162 pindexFirstParked = pindex;
6163 }
6164 if (pindexFirstMissing == nullptr && !pindex->nStatus.hasData()) {
6165 pindexFirstMissing = pindex;
6166 }
6167 if (pindexFirstNeverProcessed == nullptr && pindex->nTx == 0) {
6168 pindexFirstNeverProcessed = pindex;
6169 }
6170 if (pindex->pprev != nullptr && pindexFirstNotTreeValid == nullptr &&
6171 pindex->nStatus.getValidity() < BlockValidity::TREE) {
6172 pindexFirstNotTreeValid = pindex;
6173 }
6174 if (pindex->pprev != nullptr) {
6175 if (pindexFirstNotTransactionsValid == nullptr &&
6176 pindex->nStatus.getValidity() < BlockValidity::TRANSACTIONS) {
6177 pindexFirstNotTransactionsValid = pindex;
6178 }
6179 if (pindexFirstNotChainValid == nullptr &&
6180 pindex->nStatus.getValidity() < BlockValidity::CHAIN) {
6181 pindexFirstNotChainValid = pindex;
6182 }
6183 if (pindexFirstNotScriptsValid == nullptr &&
6184 pindex->nStatus.getValidity() < BlockValidity::SCRIPTS) {
6185 pindexFirstNotScriptsValid = pindex;
6186 }
6187 }
6188
6189 // Begin: actual consistency checks.
6190 if (pindex->pprev == nullptr) {
6191 // Genesis block checks.
6192 // Genesis block's hash must match.
6193 assert(pindex->GetBlockHash() == GetConsensus().hashGenesisBlock);
6194 for (auto c : GetAll()) {
6195 if (c->m_chain.Genesis() != nullptr) {
6196 // The chain's genesis block must be this block.
6197 assert(pindex == c->m_chain.Genesis());
6198 }
6199 }
6200 }
6201 if (!pindex->HaveNumChainTxs()) {
6202 // nSequenceId can't be set positive for blocks that aren't linked
6203 // (negative is used for preciousblock)
6204 assert(pindex->nSequenceId <= 0);
6205 }
6206 // VALID_TRANSACTIONS is equivalent to nTx > 0 for all nodes (whether or
6207 // not pruning has occurred). HAVE_DATA is only equivalent to nTx > 0
6208 // (or VALID_TRANSACTIONS) if no pruning has occurred.
6210 // If we've never pruned, then HAVE_DATA should be equivalent to nTx
6211 // > 0
6212 assert(pindex->nStatus.hasData() == (pindex->nTx > 0));
6213 assert(pindexFirstMissing == pindexFirstNeverProcessed);
6214 } else if (pindex->nStatus.hasData()) {
6215 // If we have pruned, then we can only say that HAVE_DATA implies
6216 // nTx > 0
6217 assert(pindex->nTx > 0);
6218 }
6219 if (pindex->nStatus.hasUndo()) {
6220 assert(pindex->nStatus.hasData());
6221 }
6222 if (snap_base && snap_base->GetAncestor(pindex->nHeight) == pindex) {
6223 // Assumed-valid blocks should connect to the main chain.
6224 assert(pindex->nStatus.getValidity() >= BlockValidity::TREE);
6225 }
6226 // There should only be an nTx value if we have
6227 // actually seen a block's transactions.
6228 // This is pruning-independent.
6229 assert((pindex->nStatus.getValidity() >= BlockValidity::TRANSACTIONS) ==
6230 (pindex->nTx > 0));
6231 // All parents having had data (at some point) is equivalent to all
6232 // parents being VALID_TRANSACTIONS, which is equivalent to
6233 // HaveNumChainTxs().
6234 assert((pindexFirstNeverProcessed == nullptr || pindex == snap_base) ==
6235 (pindex->HaveNumChainTxs()));
6236 assert((pindexFirstNotTransactionsValid == nullptr ||
6237 pindex == snap_base) == (pindex->HaveNumChainTxs()));
6238 // nHeight must be consistent.
6239 assert(pindex->nHeight == nHeight);
6240 // For every block except the genesis block, the chainwork must be
6241 // larger than the parent's.
6242 assert(pindex->pprev == nullptr ||
6243 pindex->nChainWork >= pindex->pprev->nChainWork);
6244 // The pskip pointer must point back for all but the first 2 blocks.
6245 assert(nHeight < 2 ||
6246 (pindex->pskip && (pindex->pskip->nHeight < nHeight)));
6247 // All m_blockman.m_block_index entries must at least be TREE valid
6248 assert(pindexFirstNotTreeValid == nullptr);
6249 if (pindex->nStatus.getValidity() >= BlockValidity::TREE) {
6250 // TREE valid implies all parents are TREE valid
6251 assert(pindexFirstNotTreeValid == nullptr);
6252 }
6253 if (pindex->nStatus.getValidity() >= BlockValidity::CHAIN) {
6254 // CHAIN valid implies all parents are CHAIN valid
6255 assert(pindexFirstNotChainValid == nullptr);
6256 }
6257 if (pindex->nStatus.getValidity() >= BlockValidity::SCRIPTS) {
6258 // SCRIPTS valid implies all parents are SCRIPTS valid
6259 assert(pindexFirstNotScriptsValid == nullptr);
6260 }
6261 if (pindexFirstInvalid == nullptr) {
6262 // Checks for not-invalid blocks.
6263 // The failed mask cannot be set for blocks without invalid parents.
6264 assert(!pindex->nStatus.isInvalid());
6265 }
6266 if (pindexFirstParked == nullptr) {
6267 // Checks for not-parked blocks.
6268 // The parked mask cannot be set for blocks without parked parents.
6269 // (i.e., hasParkedParent only if an ancestor is properly parked).
6270 assert(!pindex->nStatus.isOnParkedChain());
6271 }
6272 // Make sure m_chain_tx_count sum is correctly computed.
6273 if (!pindex->pprev) {
6274 // If no previous block, nTx and m_chain_tx_count must be the same.
6275 assert(pindex->m_chain_tx_count == pindex->nTx);
6276 } else if (pindex->pprev->m_chain_tx_count > 0 && pindex->nTx > 0) {
6277 // If previous m_chain_tx_count is set and number of transactions in
6278 // block is known, sum must be set.
6279 assert(pindex->m_chain_tx_count ==
6280 pindex->nTx + pindex->pprev->m_chain_tx_count);
6281 } else {
6282 // Otherwise m_chain_tx_count should only be set if this is a
6283 // snapshot block, and must be set if it is.
6284 assert((pindex->m_chain_tx_count != 0) == (pindex == snap_base));
6285 }
6286
6287 // Chainstate-specific checks on setBlockIndexCandidates
6288 for (auto c : GetAll()) {
6289 if (c->m_chain.Tip() == nullptr) {
6290 continue;
6291 }
6292 // Two main factors determine whether pindex is a candidate in
6293 // setBlockIndexCandidates:
6294 //
6295 // - If pindex has less work than the chain tip, it should not be a
6296 // candidate, and this will be asserted below. Otherwise it is a
6297 // potential candidate.
6298 //
6299 // - If pindex or one of its parent blocks back to the genesis block
6300 // or an assumeutxo snapshot never downloaded transactions
6301 // (pindexFirstNeverProcessed is non-null), it should not be a
6302 // candidate, and this will be asserted below. The only exception
6303 // is if pindex itself is an assumeutxo snapshot block. Then it is
6304 // also a potential candidate.
6305 if (!CBlockIndexWorkComparator()(pindex, c->m_chain.Tip()) &&
6306 (pindexFirstNeverProcessed == nullptr || pindex == snap_base)) {
6307 // If pindex was detected as invalid (pindexFirstInvalid is
6308 // non-null), it is not required to be in
6309 // setBlockIndexCandidates.
6310 if (pindexFirstInvalid == nullptr) {
6311 // If this chainstate is the active chainstate, pindex
6312 // must be in setBlockIndexCandidates. Otherwise, this
6313 // chainstate is a background validation chainstate, and
6314 // pindex only needs to be added if it is an ancestor of
6315 // the snapshot that is being validated.
6316 if (c == &ActiveChainstate() ||
6317 GetSnapshotBaseBlock()->GetAncestor(pindex->nHeight) ==
6318 pindex) {
6319 // If pindex and all its parents back to the genesis
6320 // block or an assumeutxo snapshot block downloaded
6321 // transactions, transactions, and the transactions were
6322 // not pruned (pindexFirstMissing is null), it is a
6323 // potential candidate or was parked. The check excludes
6324 // pruned blocks, because if any blocks were pruned
6325 // between pindex the current chain tip, pindex will
6326 // only temporarily be added to setBlockIndexCandidates,
6327 // before being moved to m_blocks_unlinked. This check
6328 // could be improved to verify that if all blocks
6329 // between the chain tip and pindex have data, pindex
6330 // must be a candidate.
6331 if (pindexFirstMissing == nullptr) {
6332 assert(pindex->nStatus.isOnParkedChain() ||
6333 c->setBlockIndexCandidates.count(pindex));
6334 }
6335 // If pindex is the chain tip, it also is a potential
6336 // candidate.
6337 //
6338 // If the chainstate was loaded from a snapshot and
6339 // pindex is the base of the snapshot, pindex is also a
6340 // potential candidate.
6341 if (pindex == c->m_chain.Tip() ||
6342 pindex == c->SnapshotBase()) {
6343 assert(c->setBlockIndexCandidates.count(pindex));
6344 }
6345 }
6346 // If some parent is missing, then it could be that this
6347 // block was in setBlockIndexCandidates but had to be
6348 // removed because of the missing data. In this case it must
6349 // be in m_blocks_unlinked -- see test below.
6350 }
6351 } else {
6352 // If this block sorts worse than the current tip or some
6353 // ancestor's block has never been seen, it cannot be in
6354 // setBlockIndexCandidates.
6355 assert(c->setBlockIndexCandidates.count(pindex) == 0);
6356 }
6357 }
6358 // Check whether this block is in m_blocks_unlinked.
6359 std::pair<std::multimap<CBlockIndex *, CBlockIndex *>::iterator,
6360 std::multimap<CBlockIndex *, CBlockIndex *>::iterator>
6361 rangeUnlinked =
6362 m_blockman.m_blocks_unlinked.equal_range(pindex->pprev);
6363 bool foundInUnlinked = false;
6364 while (rangeUnlinked.first != rangeUnlinked.second) {
6365 assert(rangeUnlinked.first->first == pindex->pprev);
6366 if (rangeUnlinked.first->second == pindex) {
6367 foundInUnlinked = true;
6368 break;
6369 }
6370 rangeUnlinked.first++;
6371 }
6372 if (pindex->pprev && pindex->nStatus.hasData() &&
6373 pindexFirstNeverProcessed != nullptr &&
6374 pindexFirstInvalid == nullptr) {
6375 // If this block has block data available, some parent was never
6376 // received, and has no invalid parents, it must be in
6377 // m_blocks_unlinked.
6378 assert(foundInUnlinked);
6379 }
6380 if (!pindex->nStatus.hasData()) {
6381 // Can't be in m_blocks_unlinked if we don't HAVE_DATA
6382 assert(!foundInUnlinked);
6383 }
6384 if (pindexFirstMissing == nullptr) {
6385 // We aren't missing data for any parent -- cannot be in
6386 // m_blocks_unlinked.
6387 assert(!foundInUnlinked);
6388 }
6389 if (pindex->pprev && pindex->nStatus.hasData() &&
6390 pindexFirstNeverProcessed == nullptr &&
6391 pindexFirstMissing != nullptr) {
6392 // We HAVE_DATA for this block, have received data for all parents
6393 // at some point, but we're currently missing data for some parent.
6395 // This block may have entered m_blocks_unlinked if:
6396 // - it has a descendant that at some point had more work than the
6397 // tip, and
6398 // - we tried switching to that descendant but were missing
6399 // data for some intermediate block between m_chain and the
6400 // tip.
6401 // So if this block is itself better than any m_chain.Tip() and it
6402 // wasn't in setBlockIndexCandidates, then it must be in
6403 // m_blocks_unlinked.
6404 for (auto c : GetAll()) {
6405 const bool is_active = c == &ActiveChainstate();
6406 if (!CBlockIndexWorkComparator()(pindex, c->m_chain.Tip()) &&
6407 c->setBlockIndexCandidates.count(pindex) == 0) {
6408 if (pindexFirstInvalid == nullptr) {
6409 if (is_active ||
6410 snap_base->GetAncestor(pindex->nHeight) == pindex) {
6411 assert(foundInUnlinked);
6412 }
6413 }
6414 }
6415 }
6416 }
6417 // Perhaps too slow
6418 // assert(pindex->GetBlockHash() == pindex->GetBlockHeader().GetHash());
6419 // End: actual consistency checks.
6420
6421 // Try descending into the first subnode. Always process forks first and
6422 // the best header chain after.
6423 snap_update_firsts();
6424 std::pair<std::multimap<CBlockIndex *, CBlockIndex *>::iterator,
6425 std::multimap<CBlockIndex *, CBlockIndex *>::iterator>
6426 range = forward.equal_range(pindex);
6427 if (range.first != range.second) {
6428 // A subnode not part of the best header chain was found.
6429 pindex = range.first->second;
6430 nHeight++;
6431 continue;
6432 } else if (best_hdr_chain.Contains(pindex)) {
6433 // Descend further into best header chain.
6434 nHeight++;
6435 pindex = best_hdr_chain[nHeight];
6436 if (!pindex) {
6437 // we are finished, since the best header chain is always
6438 // processed last
6439 break;
6440 }
6441 continue;
6442 }
6443 // This is a leaf node. Move upwards until we reach a node of which we
6444 // have not yet visited the last child.
6445 while (pindex) {
6446 // We are going to either move to a parent or a sibling of pindex.
6447 snap_update_firsts();
6448 // If pindex was the first with a certain property, unset the
6449 // corresponding variable.
6450 if (pindex == pindexFirstInvalid) {
6451 pindexFirstInvalid = nullptr;
6452 }
6453 if (pindex == pindexFirstParked) {
6454 pindexFirstParked = nullptr;
6455 }
6456 if (pindex == pindexFirstMissing) {
6457 pindexFirstMissing = nullptr;
6458 }
6459 if (pindex == pindexFirstNeverProcessed) {
6460 pindexFirstNeverProcessed = nullptr;
6461 }
6462 if (pindex == pindexFirstNotTreeValid) {
6463 pindexFirstNotTreeValid = nullptr;
6464 }
6465 if (pindex == pindexFirstNotTransactionsValid) {
6466 pindexFirstNotTransactionsValid = nullptr;
6467 }
6468 if (pindex == pindexFirstNotChainValid) {
6469 pindexFirstNotChainValid = nullptr;
6470 }
6471 if (pindex == pindexFirstNotScriptsValid) {
6472 pindexFirstNotScriptsValid = nullptr;
6473 }
6474 // Find our parent.
6475 CBlockIndex *pindexPar = pindex->pprev;
6476 // Find which child we just visited.
6477 std::pair<std::multimap<CBlockIndex *, CBlockIndex *>::iterator,
6478 std::multimap<CBlockIndex *, CBlockIndex *>::iterator>
6479 rangePar = forward.equal_range(pindexPar);
6480 while (rangePar.first->second != pindex) {
6481 // Our parent must have at least the node we're coming from as
6482 // child.
6483 assert(rangePar.first != rangePar.second);
6484 rangePar.first++;
6485 }
6486 // Proceed to the next one.
6487 rangePar.first++;
6488 if (rangePar.first != rangePar.second) {
6489 // Move to a sibling not part of the best header chain.
6490 pindex = rangePar.first->second;
6491 break;
6492 } else if (pindexPar == best_hdr_chain[nHeight - 1]) {
6493 // Move to pindex's sibling on the best-chain, if it has one.
6494 pindex = best_hdr_chain[nHeight];
6495 // There will not be a next block if (and only if) parent block
6496 // is the best header.
6497 assert((pindex == nullptr) ==
6498 (pindexPar == best_hdr_chain.Tip()));
6499 break;
6500 } else {
6501 // Move up further.
6502 pindex = pindexPar;
6503 nHeight--;
6504 continue;
6505 }
6506 }
6507 }
6508
6509 // Check that we actually traversed the entire block index.
6510 assert(nNodes == forward.size() + best_hdr_chain.Height() + 1);
6511}
6512
6513std::string Chainstate::ToString() {
6515 CBlockIndex *tip = m_chain.Tip();
6516 return strprintf("Chainstate [%s] @ height %d (%s)",
6517 m_from_snapshot_blockhash ? "snapshot" : "ibd",
6518 tip ? tip->nHeight : -1,
6519 tip ? tip->GetBlockHash().ToString() : "null");
6520}
6521
6522bool Chainstate::ResizeCoinsCaches(size_t coinstip_size, size_t coinsdb_size) {
6524 if (coinstip_size == m_coinstip_cache_size_bytes &&
6525 coinsdb_size == m_coinsdb_cache_size_bytes) {
6526 // Cache sizes are unchanged, no need to continue.
6527 return true;
6528 }
6529 size_t old_coinstip_size = m_coinstip_cache_size_bytes;
6530 m_coinstip_cache_size_bytes = coinstip_size;
6531 m_coinsdb_cache_size_bytes = coinsdb_size;
6532 CoinsDB().ResizeCache(coinsdb_size);
6533
6534 LogPrintf("[%s] resized coinsdb cache to %.1f MiB\n", this->ToString(),
6535 coinsdb_size * (1.0 / 1024 / 1024));
6536 LogPrintf("[%s] resized coinstip cache to %.1f MiB\n", this->ToString(),
6537 coinstip_size * (1.0 / 1024 / 1024));
6538
6540 bool ret;
6541
6542 if (coinstip_size > old_coinstip_size) {
6543 // Likely no need to flush if cache sizes have grown.
6545 } else {
6546 // Otherwise, flush state to disk and deallocate the in-memory coins
6547 // map.
6549 }
6550 return ret;
6551}
6552
6558 const CBlockIndex *pindex) {
6559 if (pindex == nullptr) {
6560 return 0.0;
6561 }
6562 if (pindex->m_chain_tx_count == 0) {
6564 "Block %d has unset m_chain_tx_count. Unable to "
6565 "estimate verification progress.\n",
6566 pindex->nHeight);
6567 return 0.0;
6568 }
6569
6570 int64_t nNow = time(nullptr);
6571
6572 double fTxTotal;
6573 if (pindex->GetChainTxCount() <= data.tx_count) {
6574 fTxTotal = data.tx_count + (nNow - data.nTime) * data.dTxRate;
6575 } else {
6576 fTxTotal = pindex->GetChainTxCount() +
6577 (nNow - pindex->GetBlockTime()) * data.dTxRate;
6578 }
6579
6580 return std::min<double>(pindex->GetChainTxCount() / fTxTotal, 1.0);
6581}
6582
6583std::optional<BlockHash> ChainstateManager::SnapshotBlockhash() const {
6584 LOCK(::cs_main);
6585 if (m_active_chainstate && m_active_chainstate->m_from_snapshot_blockhash) {
6586 // If a snapshot chainstate exists, it will always be our active.
6587 return m_active_chainstate->m_from_snapshot_blockhash;
6588 }
6589 return std::nullopt;
6590}
6591
6592std::vector<Chainstate *> ChainstateManager::GetAll() {
6593 LOCK(::cs_main);
6594 std::vector<Chainstate *> out;
6595
6596 for (Chainstate *pchainstate :
6597 {m_ibd_chainstate.get(), m_snapshot_chainstate.get()}) {
6598 if (this->IsUsable(pchainstate)) {
6599 out.push_back(pchainstate);
6600 }
6601 }
6602
6603 return out;
6604}
6605
6606Chainstate &ChainstateManager::InitializeChainstate(CTxMemPool *mempool) {
6608 assert(!m_ibd_chainstate);
6609 assert(!m_active_chainstate);
6610
6611 m_ibd_chainstate = std::make_unique<Chainstate>(mempool, m_blockman, *this);
6612 m_active_chainstate = m_ibd_chainstate.get();
6613 return *m_active_chainstate;
6614}
6615
6616[[nodiscard]] static bool DeleteCoinsDBFromDisk(const fs::path &db_path,
6617 bool is_snapshot)
6620
6621 if (is_snapshot) {
6622 fs::path base_blockhash_path =
6624
6625 try {
6626 const bool existed{fs::remove(base_blockhash_path)};
6627 if (!existed) {
6628 LogPrintf("[snapshot] snapshot chainstate dir being removed "
6629 "lacks %s file\n",
6631 }
6632 } catch (const fs::filesystem_error &e) {
6633 LogWarning("[snapshot] failed to remove file %s: %s\n",
6634 fs::PathToString(base_blockhash_path),
6635 e.code().message());
6636 }
6637 }
6638
6639 std::string path_str = fs::PathToString(db_path);
6640 LogPrintf("Removing leveldb dir at %s\n", path_str);
6641
6642 // We have to destruct before this call leveldb::DB in order to release the
6643 // db lock, otherwise `DestroyDB` will fail. See `leveldb::~DBImpl()`.
6644 const bool destroyed = DestroyDB(path_str);
6645
6646 if (!destroyed) {
6647 LogPrintf("error: leveldb DestroyDB call failed on %s\n", path_str);
6648 }
6649
6650 // Datadir should be removed from filesystem; otherwise initialization may
6651 // detect it on subsequent statups and get confused.
6652 //
6653 // If the base_blockhash_path removal above fails in the case of snapshot
6654 // chainstates, this will return false since leveldb won't remove a
6655 // non-empty directory.
6656 return destroyed && !fs::exists(db_path);
6657}
6658
6660 AutoFile &coins_file, const SnapshotMetadata &metadata, bool in_memory) {
6661 BlockHash base_blockhash = metadata.m_base_blockhash;
6662
6663 if (this->SnapshotBlockhash()) {
6665 "Can't activate a snapshot-based chainstate more than once")};
6666 }
6667
6668 CBlockIndex *snapshot_start_block{};
6669
6670 {
6671 LOCK(::cs_main);
6672
6673 if (!GetParams().AssumeutxoForBlockhash(base_blockhash).has_value()) {
6674 auto available_heights = GetParams().GetAvailableSnapshotHeights();
6675 std::string heights_formatted =
6676 util::Join(available_heights, ", ",
6677 [&](const auto &i) { return util::ToString(i); });
6678 return util::Error{strprintf(
6679 Untranslated("assumeutxo block hash in snapshot metadata not "
6680 "recognized (hash: %s). The following "
6681 "snapshot heights are available: %s."),
6682 base_blockhash.ToString(), heights_formatted)};
6683 }
6684
6685 snapshot_start_block = m_blockman.LookupBlockIndex(base_blockhash);
6686 if (!snapshot_start_block) {
6687 return util::Error{strprintf(
6688 Untranslated("The base block header (%s) must appear in the "
6689 "headers chain. Make sure all headers are "
6690 "syncing, and call loadtxoutset again."),
6691 base_blockhash.ToString())};
6692 }
6693
6694 if (snapshot_start_block->nStatus.isInvalid()) {
6695 return util::Error{strprintf(
6697 "The base block header (%s) is part of an invalid chain"),
6698 base_blockhash.ToString())};
6699 }
6700
6701 if (!m_best_header ||
6702 m_best_header->GetAncestor(snapshot_start_block->nHeight) !=
6703 snapshot_start_block) {
6705 "A forked headers-chain with more work than the chain with the "
6706 "snapshot base block header exists. Please proceed to sync "
6707 "without AssumeUtxo.")};
6708 }
6709
6710 auto mempool{m_active_chainstate->GetMempool()};
6711 if (mempool && mempool->size() > 0) {
6713 "Can't activate a snapshot when mempool not empty.")};
6714 }
6715 }
6716
6717 int64_t current_coinsdb_cache_size{0};
6718 int64_t current_coinstip_cache_size{0};
6719
6720 // Cache percentages to allocate to each chainstate.
6721 //
6722 // These particular percentages don't matter so much since they will only be
6723 // relevant during snapshot activation; caches are rebalanced at the
6724 // conclusion of this function. We want to give (essentially) all available
6725 // cache capacity to the snapshot to aid the bulk load later in this
6726 // function.
6727 static constexpr double IBD_CACHE_PERC = 0.01;
6728 static constexpr double SNAPSHOT_CACHE_PERC = 0.99;
6729
6730 {
6731 LOCK(::cs_main);
6732 // Resize the coins caches to ensure we're not exceeding memory limits.
6733 //
6734 // Allocate the majority of the cache to the incoming snapshot
6735 // chainstate, since (optimistically) getting to its tip will be the top
6736 // priority. We'll need to call `MaybeRebalanceCaches()` once we're done
6737 // with this function to ensure the right allocation (including the
6738 // possibility that no snapshot was activated and that we should restore
6739 // the active chainstate caches to their original size).
6740 //
6741 current_coinsdb_cache_size =
6742 this->ActiveChainstate().m_coinsdb_cache_size_bytes;
6743 current_coinstip_cache_size =
6744 this->ActiveChainstate().m_coinstip_cache_size_bytes;
6745
6746 // Temporarily resize the active coins cache to make room for the
6747 // newly-created snapshot chain.
6748 this->ActiveChainstate().ResizeCoinsCaches(
6749 static_cast<size_t>(current_coinstip_cache_size * IBD_CACHE_PERC),
6750 static_cast<size_t>(current_coinsdb_cache_size * IBD_CACHE_PERC));
6751 }
6752
6753 auto snapshot_chainstate =
6754 WITH_LOCK(::cs_main, return std::make_unique<Chainstate>(
6755 /* mempool */ nullptr, m_blockman, *this,
6756 base_blockhash));
6757
6758 {
6759 LOCK(::cs_main);
6760 snapshot_chainstate->InitCoinsDB(
6761 static_cast<size_t>(current_coinsdb_cache_size *
6762 SNAPSHOT_CACHE_PERC),
6763 in_memory, false, "chainstate");
6764 snapshot_chainstate->InitCoinsCache(static_cast<size_t>(
6765 current_coinstip_cache_size * SNAPSHOT_CACHE_PERC));
6766 }
6767
6768 auto cleanup_bad_snapshot =
6770 this->MaybeRebalanceCaches();
6771
6772 // PopulateAndValidateSnapshot can return (in error) before the
6773 // leveldb datadir has been created, so only attempt removal if we
6774 // got that far.
6775 if (auto snapshot_datadir =
6777 // We have to destruct leveldb::DB in order to release the db
6778 // lock, otherwise DestroyDB() (in DeleteCoinsDBFromDisk()) will
6779 // fail. See `leveldb::~DBImpl()`. Destructing the chainstate
6780 // (and so resetting the coinsviews object) does this.
6781 snapshot_chainstate.reset();
6782 bool removed = DeleteCoinsDBFromDisk(*snapshot_datadir,
6783 /*is_snapshot=*/true);
6784 if (!removed) {
6786 "Failed to remove snapshot chainstate dir (%s). "
6787 "Manually remove it before restarting.\n",
6788 fs::PathToString(*snapshot_datadir)));
6789 }
6790 }
6791 return util::Error{std::move(reason)};
6792 };
6793
6794 if (!this->PopulateAndValidateSnapshot(*snapshot_chainstate, coins_file,
6795 metadata)) {
6796 LOCK(::cs_main);
6797 return cleanup_bad_snapshot(Untranslated("population failed"));
6798 }
6799
6800 // cs_main required for rest of snapshot activation.
6801 LOCK(::cs_main);
6802
6803 // Do a final check to ensure that the snapshot chainstate is actually a
6804 // more work chain than the active chainstate; a user could have loaded a
6805 // snapshot very late in the IBD process, and we wouldn't want to load a
6806 // useless chainstate.
6808 snapshot_chainstate->m_chain.Tip())) {
6809 return cleanup_bad_snapshot(
6810 Untranslated("work does not exceed active chainstate"));
6811 }
6812 // If not in-memory, persist the base blockhash for use during subsequent
6813 // initialization.
6814 if (!in_memory) {
6815 if (!node::WriteSnapshotBaseBlockhash(*snapshot_chainstate)) {
6816 return cleanup_bad_snapshot(
6817 Untranslated("could not write base blockhash"));
6818 }
6819 }
6820
6821 assert(!m_snapshot_chainstate);
6822 m_snapshot_chainstate.swap(snapshot_chainstate);
6823 const bool chaintip_loaded = m_snapshot_chainstate->LoadChainTip();
6824 assert(chaintip_loaded);
6825
6826 // Transfer possession of the mempool to the snapshot chainstate.
6827 // Mempool is empty at this point because we're still in IBD.
6828 Assert(!m_active_chainstate->m_mempool ||
6829 m_active_chainstate->m_mempool->size() == 0);
6830 Assert(!m_snapshot_chainstate->m_mempool);
6831 m_snapshot_chainstate->m_mempool = m_active_chainstate->m_mempool;
6832 m_active_chainstate->m_mempool = nullptr;
6833 m_active_chainstate = m_snapshot_chainstate.get();
6834 m_blockman.m_snapshot_height = this->GetSnapshotBaseHeight();
6835
6836 LogPrintf("[snapshot] successfully activated snapshot %s\n",
6837 base_blockhash.ToString());
6838 LogPrintf("[snapshot] (%.2f MB)\n",
6839 m_snapshot_chainstate->CoinsTip().DynamicMemoryUsage() /
6840 (1000 * 1000));
6841
6842 this->MaybeRebalanceCaches();
6843 return snapshot_start_block;
6844}
6845
6846static void FlushSnapshotToDisk(CCoinsViewCache &coins_cache,
6847 bool snapshot_loaded) {
6849 strprintf("%s (%.2f MB)",
6850 snapshot_loaded ? "saving snapshot chainstate"
6851 : "flushing coins cache",
6852 coins_cache.DynamicMemoryUsage() / (1000 * 1000)),
6853 BCLog::LogFlags::ALL);
6854
6855 coins_cache.Flush();
6856}
6857
6858struct StopHashingException : public std::exception {
6859 const char *what() const noexcept override {
6860 return "ComputeUTXOStats interrupted by shutdown.";
6861 }
6862};
6863
6865 if (interrupt) {
6866 throw StopHashingException();
6867 }
6868}
6869
6871 Chainstate &snapshot_chainstate, AutoFile &coins_file,
6872 const SnapshotMetadata &metadata) {
6873 // It's okay to release cs_main before we're done using `coins_cache`
6874 // because we know that nothing else will be referencing the newly created
6875 // snapshot_chainstate yet.
6876 CCoinsViewCache &coins_cache =
6877 *WITH_LOCK(::cs_main, return &snapshot_chainstate.CoinsTip());
6878
6879 BlockHash base_blockhash = metadata.m_base_blockhash;
6880
6881 CBlockIndex *snapshot_start_block = WITH_LOCK(
6882 ::cs_main, return m_blockman.LookupBlockIndex(base_blockhash));
6883
6884 if (!snapshot_start_block) {
6885 // Needed for ComputeUTXOStats to determine the
6886 // height and to avoid a crash when base_blockhash.IsNull()
6887 LogPrintf("[snapshot] Did not find snapshot start blockheader %s\n",
6888 base_blockhash.ToString());
6889 return false;
6890 }
6891
6892 int base_height = snapshot_start_block->nHeight;
6893 const auto &maybe_au_data = GetParams().AssumeutxoForHeight(base_height);
6894
6895 if (!maybe_au_data) {
6896 LogPrintf("[snapshot] assumeutxo height in snapshot metadata not "
6897 "recognized (%d) - refusing to load snapshot\n",
6898 base_height);
6899 return false;
6900 }
6901
6902 const AssumeutxoData &au_data = *maybe_au_data;
6903
6904 // This work comparison is a duplicate check with the one performed later in
6905 // ActivateSnapshot(), but is done so that we avoid doing the long work of
6906 // staging a snapshot that isn't actually usable.
6908 ActiveTip(), snapshot_start_block))) {
6909 LogPrintf("[snapshot] activation failed - work does not exceed active "
6910 "chainstate\n");
6911 return false;
6912 }
6913
6914 const uint64_t coins_count = metadata.m_coins_count;
6915 uint64_t coins_left = metadata.m_coins_count;
6916
6917 LogPrintf("[snapshot] loading %d coins from snapshot %s\n", coins_left,
6918 base_blockhash.ToString());
6919 int64_t coins_processed{0};
6920
6921 while (coins_left > 0) {
6922 try {
6923 TxId txid;
6924 coins_file >> txid;
6925 size_t coins_per_txid{0};
6926 coins_per_txid = ReadCompactSize(coins_file);
6927
6928 if (coins_per_txid > coins_left) {
6929 LogPrintf("[snapshot] mismatch in coins count in snapshot "
6930 "metadata and actual snapshot data\n");
6931 return false;
6932 }
6933
6934 for (size_t i = 0; i < coins_per_txid; i++) {
6935 Coin coin;
6936 COutPoint outpoint{
6937 txid, static_cast<uint32_t>(ReadCompactSize(coins_file))};
6938 coins_file >> coin;
6939 // Avoid integer wrap-around in coinstats.cpp:ApplyHash
6940 if (coin.GetHeight() > uint32_t(base_height) ||
6941 outpoint.GetN() >=
6942 std::numeric_limits<decltype(outpoint.GetN())>::max()) {
6943 LogPrintf("[snapshot] bad snapshot data after "
6944 "deserializing %d coins\n",
6945 coins_count - coins_left);
6946 return false;
6947 }
6948 if (!MoneyRange(coin.GetTxOut().nValue)) {
6949 LogPrintf("[snapshot] bad snapshot data after "
6950 "deserializing %d coins - bad tx out value\n",
6951 coins_count - coins_left);
6952 return false;
6953 }
6954 coins_cache.EmplaceCoinInternalDANGER(std::move(outpoint),
6955 std::move(coin));
6956
6957 --coins_left;
6958 ++coins_processed;
6959
6960 if (coins_processed % 1000000 == 0) {
6961 LogPrintf("[snapshot] %d coins loaded (%.2f%%, %.2f MB)\n",
6962 coins_processed,
6963 static_cast<float>(coins_processed) * 100 /
6964 static_cast<float>(coins_count),
6965 coins_cache.DynamicMemoryUsage() / (1000 * 1000));
6966 }
6967
6968 // Batch write and flush (if we need to) every so often.
6969 //
6970 // If our average Coin size is roughly 41 bytes, checking every
6971 // 120,000 coins means <5MB of memory imprecision.
6972 if (coins_processed % 120000 == 0) {
6973 if (m_interrupt) {
6974 return false;
6975 }
6976
6977 const auto snapshot_cache_state = WITH_LOCK(
6978 ::cs_main,
6979 return snapshot_chainstate.GetCoinsCacheSizeState());
6980
6981 if (snapshot_cache_state >= CoinsCacheSizeState::CRITICAL) {
6982 // This is a hack - we don't know what the actual best
6983 // block is, but that doesn't matter for the purposes of
6984 // flushing the cache here. We'll set this to its
6985 // correct value (`base_blockhash`) below after the
6986 // coins are loaded.
6987 coins_cache.SetBestBlock(BlockHash{GetRandHash()});
6988
6989 // No need to acquire cs_main since this chainstate
6990 // isn't being used yet.
6991 FlushSnapshotToDisk(coins_cache,
6992 /*snapshot_loaded=*/false);
6993 }
6994 }
6995 }
6996 } catch (const std::ios_base::failure &) {
6997 LogPrintf("[snapshot] bad snapshot format or truncated snapshot "
6998 "after deserializing %d coins\n",
6999 coins_processed);
7000 return false;
7001 }
7002 }
7003
7004 // Important that we set this. This and the coins_cache accesses above are
7005 // sort of a layer violation, but either we reach into the innards of
7006 // CCoinsViewCache here or we have to invert some of the Chainstate to
7007 // embed them in a snapshot-activation-specific CCoinsViewCache bulk load
7008 // method.
7009 coins_cache.SetBestBlock(base_blockhash);
7010
7011 bool out_of_coins{false};
7012 try {
7013 std::byte left_over_byte;
7014 coins_file >> left_over_byte;
7015 } catch (const std::ios_base::failure &) {
7016 // We expect an exception since we should be out of coins.
7017 out_of_coins = true;
7018 }
7019 if (!out_of_coins) {
7020 LogPrintf("[snapshot] bad snapshot - coins left over after "
7021 "deserializing %d coins\n",
7022 coins_count);
7023 return false;
7024 }
7025
7026 LogPrintf("[snapshot] loaded %d (%.2f MB) coins from snapshot %s\n",
7027 coins_count, coins_cache.DynamicMemoryUsage() / (1000 * 1000),
7028 base_blockhash.ToString());
7029
7030 // No need to acquire cs_main since this chainstate isn't being used yet.
7031 FlushSnapshotToDisk(coins_cache, /*snapshot_loaded=*/true);
7032
7033 assert(coins_cache.GetBestBlock() == base_blockhash);
7034
7035 // As above, okay to immediately release cs_main here since no other context
7036 // knows about the snapshot_chainstate.
7037 CCoinsViewDB *snapshot_coinsdb =
7038 WITH_LOCK(::cs_main, return &snapshot_chainstate.CoinsDB());
7039
7040 std::optional<CCoinsStats> maybe_stats;
7041
7042 try {
7043 maybe_stats = ComputeUTXOStats(
7044 CoinStatsHashType::HASH_SERIALIZED, snapshot_coinsdb, m_blockman,
7045 [&interrupt = m_interrupt] {
7046 SnapshotUTXOHashBreakpoint(interrupt);
7047 });
7048 } catch (StopHashingException const &) {
7049 return false;
7050 }
7051 if (!maybe_stats.has_value()) {
7052 LogPrintf("[snapshot] failed to generate coins stats\n");
7053 return false;
7054 }
7055
7056 // Assert that the deserialized chainstate contents match the expected
7057 // assumeutxo value.
7058 if (AssumeutxoHash{maybe_stats->hashSerialized} !=
7059 au_data.hash_serialized) {
7060 LogPrintf("[snapshot] bad snapshot content hash: expected %s, got %s\n",
7061 au_data.hash_serialized.ToString(),
7062 maybe_stats->hashSerialized.ToString());
7063 return false;
7064 }
7065
7066 snapshot_chainstate.m_chain.SetTip(*snapshot_start_block);
7067
7068 // The remainder of this function requires modifying data protected by
7069 // cs_main.
7070 LOCK(::cs_main);
7071
7072 // Fake various pieces of CBlockIndex state:
7073 CBlockIndex *index = nullptr;
7074
7075 // Don't make any modifications to the genesis block since it shouldn't be
7076 // necessary, and since the genesis block doesn't have normal flags like
7077 // BLOCK_VALID_SCRIPTS set.
7078 constexpr int AFTER_GENESIS_START{1};
7079
7080 for (int i = AFTER_GENESIS_START; i <= snapshot_chainstate.m_chain.Height();
7081 ++i) {
7082 index = snapshot_chainstate.m_chain[i];
7083
7084 m_blockman.m_dirty_blockindex.insert(index);
7085 // Changes to the block index will be flushed to disk after this call
7086 // returns in `ActivateSnapshot()`, when `MaybeRebalanceCaches()` is
7087 // called, since we've added a snapshot chainstate and therefore will
7088 // have to downsize the IBD chainstate, which will result in a call to
7089 // `FlushStateToDisk(ALWAYS)`.
7090 }
7091
7092 assert(index);
7093 assert(index == snapshot_start_block);
7094 index->m_chain_tx_count = au_data.m_chain_tx_count;
7095 snapshot_chainstate.setBlockIndexCandidates.insert(snapshot_start_block);
7096
7097 LogPrintf("[snapshot] validated snapshot (%.2f MB)\n",
7098 coins_cache.DynamicMemoryUsage() / (1000 * 1000));
7099 return true;
7100}
7101
7102// Currently, this function holds cs_main for its duration, which could be for
7103// multiple minutes due to the ComputeUTXOStats call. This hold is necessary
7104// because we need to avoid advancing the background validation chainstate
7105// farther than the snapshot base block - and this function is also invoked
7106// from within ConnectTip, i.e. from within ActivateBestChain, so cs_main is
7107// held anyway.
7108//
7109// Eventually (TODO), we could somehow separate this function's runtime from
7110// maintenance of the active chain, but that will either require
7111//
7112// (i) setting `m_disabled` immediately and ensuring all chainstate accesses go
7113// through IsUsable() checks, or
7114//
7115// (ii) giving each chainstate its own lock instead of using cs_main for
7116// everything.
7117SnapshotCompletionResult ChainstateManager::MaybeCompleteSnapshotValidation() {
7119 if (m_ibd_chainstate.get() == &this->ActiveChainstate() ||
7120 !this->IsUsable(m_snapshot_chainstate.get()) ||
7121 !this->IsUsable(m_ibd_chainstate.get()) ||
7122 !m_ibd_chainstate->m_chain.Tip()) {
7123 // Nothing to do - this function only applies to the background
7124 // validation chainstate.
7126 }
7127 const int snapshot_tip_height = this->ActiveHeight();
7128 const int snapshot_base_height = *Assert(this->GetSnapshotBaseHeight());
7129 const CBlockIndex &index_new = *Assert(m_ibd_chainstate->m_chain.Tip());
7130
7131 if (index_new.nHeight < snapshot_base_height) {
7132 // Background IBD not complete yet.
7134 }
7135
7137 BlockHash snapshot_blockhash = *Assert(SnapshotBlockhash());
7138
7139 auto handle_invalid_snapshot = [&]() EXCLUSIVE_LOCKS_REQUIRED(::cs_main) {
7140 bilingual_str user_error = strprintf(
7141 _("%s failed to validate the -assumeutxo snapshot state. "
7142 "This indicates a hardware problem, or a bug in the software, or "
7143 "a bad software modification that allowed an invalid snapshot to "
7144 "be loaded. As a result of this, the node will shut down and "
7145 "stop using any state that was built on the snapshot, resetting "
7146 "the chain height from %d to %d. On the next restart, the node "
7147 "will resume syncing from %d without using any snapshot data. "
7148 "Please report this incident to %s, including how you obtained "
7149 "the snapshot. The invalid snapshot chainstate will be left on "
7150 "disk in case it is helpful in diagnosing the issue that caused "
7151 "this error."),
7152 PACKAGE_NAME, snapshot_tip_height, snapshot_base_height,
7153 snapshot_base_height, PACKAGE_BUGREPORT);
7154
7155 LogPrintf("[snapshot] !!! %s\n", user_error.original);
7156 LogPrintf("[snapshot] deleting snapshot, reverting to validated chain, "
7157 "and stopping node\n");
7158
7159 m_active_chainstate = m_ibd_chainstate.get();
7160 m_snapshot_chainstate->m_disabled = true;
7161 assert(!this->IsUsable(m_snapshot_chainstate.get()));
7162 assert(this->IsUsable(m_ibd_chainstate.get()));
7163
7164 auto rename_result = m_snapshot_chainstate->InvalidateCoinsDBOnDisk();
7165 if (!rename_result) {
7166 user_error = strprintf(Untranslated("%s\n%s"), user_error,
7167 util::ErrorString(rename_result));
7168 }
7169
7170 GetNotifications().fatalError(user_error.original, user_error);
7171 };
7172
7173 if (index_new.GetBlockHash() != snapshot_blockhash) {
7174 LogPrintf(
7175 "[snapshot] supposed base block %s does not match the "
7176 "snapshot base block %s (height %d). Snapshot is not valid.\n",
7177 index_new.ToString(), snapshot_blockhash.ToString(),
7178 snapshot_base_height);
7179 handle_invalid_snapshot();
7181 }
7182
7183 assert(index_new.nHeight == snapshot_base_height);
7184
7185 int curr_height = m_ibd_chainstate->m_chain.Height();
7186
7187 assert(snapshot_base_height == curr_height);
7188 assert(snapshot_base_height == index_new.nHeight);
7189 assert(this->IsUsable(m_snapshot_chainstate.get()));
7190 assert(this->GetAll().size() == 2);
7191
7192 CCoinsViewDB &ibd_coins_db = m_ibd_chainstate->CoinsDB();
7193 m_ibd_chainstate->ForceFlushStateToDisk();
7194
7195 const auto &maybe_au_data =
7196 this->GetParams().AssumeutxoForHeight(curr_height);
7197 if (!maybe_au_data) {
7198 LogPrintf("[snapshot] assumeutxo data not found for height "
7199 "(%d) - refusing to validate snapshot\n",
7200 curr_height);
7201 handle_invalid_snapshot();
7203 }
7204
7205 const AssumeutxoData &au_data = *maybe_au_data;
7206 std::optional<CCoinsStats> maybe_ibd_stats;
7207 LogPrintf(
7208 "[snapshot] computing UTXO stats for background chainstate to validate "
7209 "snapshot - this could take a few minutes\n");
7210 try {
7211 maybe_ibd_stats =
7212 ComputeUTXOStats(CoinStatsHashType::HASH_SERIALIZED, &ibd_coins_db,
7213 m_blockman, [&interrupt = m_interrupt] {
7214 SnapshotUTXOHashBreakpoint(interrupt);
7215 });
7216 } catch (StopHashingException const &) {
7218 }
7219
7220 if (!maybe_ibd_stats) {
7221 LogPrintf(
7222 "[snapshot] failed to generate stats for validation coins db\n");
7223 // While this isn't a problem with the snapshot per se, this condition
7224 // prevents us from validating the snapshot, so we should shut down and
7225 // let the user handle the issue manually.
7226 handle_invalid_snapshot();
7228 }
7229 const auto &ibd_stats = *maybe_ibd_stats;
7230
7231 // Compare the background validation chainstate's UTXO set hash against the
7232 // hard-coded assumeutxo hash we expect.
7233 //
7234 // TODO: For belt-and-suspenders, we could cache the UTXO set
7235 // hash for the snapshot when it's loaded in its chainstate's leveldb. We
7236 // could then reference that here for an additional check.
7237 if (AssumeutxoHash{ibd_stats.hashSerialized} != au_data.hash_serialized) {
7238 LogPrintf("[snapshot] hash mismatch: actual=%s, expected=%s\n",
7239 ibd_stats.hashSerialized.ToString(),
7240 au_data.hash_serialized.ToString());
7241 handle_invalid_snapshot();
7243 }
7244
7245 LogPrintf("[snapshot] snapshot beginning at %s has been fully validated\n",
7246 snapshot_blockhash.ToString());
7247
7248 m_ibd_chainstate->m_disabled = true;
7249 this->MaybeRebalanceCaches();
7250
7252}
7253
7255 LOCK(::cs_main);
7256 assert(m_active_chainstate);
7257 return *m_active_chainstate;
7258}
7259
7261 auto &active_chainstate = ActiveChainstate();
7262 LOCK(active_chainstate.cs_avalancheFinalizedBlockIndex);
7263 return active_chainstate.m_avalancheFinalizedBlockIndex;
7264}
7265
7267 LOCK(::cs_main);
7268 return m_snapshot_chainstate &&
7269 m_active_chainstate == m_snapshot_chainstate.get();
7270}
7271void ChainstateManager::MaybeRebalanceCaches() {
7273 bool ibd_usable = this->IsUsable(m_ibd_chainstate.get());
7274 bool snapshot_usable = this->IsUsable(m_snapshot_chainstate.get());
7275 assert(ibd_usable || snapshot_usable);
7276
7277 if (ibd_usable && !snapshot_usable) {
7278 // Allocate everything to the IBD chainstate. This will always happen
7279 // when we are not using a snapshot.
7280 m_ibd_chainstate->ResizeCoinsCaches(m_total_coinstip_cache,
7282 } else if (snapshot_usable && !ibd_usable) {
7283 // If background validation has completed and snapshot is our active
7284 // chain...
7285 LogPrintf(
7286 "[snapshot] allocating all cache to the snapshot chainstate\n");
7287 // Allocate everything to the snapshot chainstate.
7288 m_snapshot_chainstate->ResizeCoinsCaches(m_total_coinstip_cache,
7290 } else if (ibd_usable && snapshot_usable) {
7291 // If both chainstates exist, determine who needs more cache based on
7292 // IBD status.
7293 //
7294 // Note: shrink caches first so that we don't inadvertently overwhelm
7295 // available memory.
7296 if (IsInitialBlockDownload()) {
7297 m_ibd_chainstate->ResizeCoinsCaches(m_total_coinstip_cache * 0.05,
7298 m_total_coinsdb_cache * 0.05);
7299 m_snapshot_chainstate->ResizeCoinsCaches(
7301 } else {
7302 m_snapshot_chainstate->ResizeCoinsCaches(
7304 m_ibd_chainstate->ResizeCoinsCaches(m_total_coinstip_cache * 0.95,
7305 m_total_coinsdb_cache * 0.95);
7306 }
7307 }
7308}
7309
7310void ChainstateManager::ResetChainstates() {
7311 m_ibd_chainstate.reset();
7312 m_snapshot_chainstate.reset();
7313 m_active_chainstate = nullptr;
7314}
7315
7322 if (!opts.check_block_index.has_value()) {
7323 opts.check_block_index =
7324 opts.config.GetChainParams().DefaultConsistencyChecks();
7325 }
7326
7327 if (!opts.minimum_chain_work.has_value()) {
7328 opts.minimum_chain_work = UintToArith256(
7329 opts.config.GetChainParams().GetConsensus().nMinimumChainWork);
7330 }
7331 if (!opts.assumed_valid_block.has_value()) {
7332 opts.assumed_valid_block =
7333 opts.config.GetChainParams().GetConsensus().defaultAssumeValid;
7334 }
7335 Assert(opts.adjusted_time_callback);
7336 return std::move(opts);
7337}
7338
7340 const util::SignalInterrupt &interrupt, Options options,
7341 node::BlockManager::Options blockman_options)
7342 : m_script_check_queue{
7343 /*batch_size=*/128,
7344 std::clamp(options.worker_threads_num, 0, MAX_SCRIPTCHECK_THREADS)},
7345 m_interrupt{interrupt}, m_options{Flatten(std::move(options))},
7346 m_blockman{interrupt, std::move(blockman_options)},
7347 m_validation_cache{m_options.script_execution_cache_bytes,
7348 m_options.signature_cache_bytes} {}
7349
7350bool ChainstateManager::DetectSnapshotChainstate(CTxMemPool *mempool) {
7351 assert(!m_snapshot_chainstate);
7352 std::optional<fs::path> path =
7354 if (!path) {
7355 return false;
7356 }
7357 std::optional<BlockHash> base_blockhash =
7359 if (!base_blockhash) {
7360 return false;
7361 }
7362 LogPrintf("[snapshot] detected active snapshot chainstate (%s) - loading\n",
7363 fs::PathToString(*path));
7364
7365 this->ActivateExistingSnapshot(*base_blockhash);
7366 return true;
7367}
7368
7369Chainstate &
7370ChainstateManager::ActivateExistingSnapshot(BlockHash base_blockhash) {
7371 assert(!m_snapshot_chainstate);
7372 m_snapshot_chainstate = std::make_unique<Chainstate>(nullptr, m_blockman,
7373 *this, base_blockhash);
7374 LogPrintf("[snapshot] switching active chainstate to %s\n",
7375 m_snapshot_chainstate->ToString());
7376
7377 // Mempool is empty at this point because we're still in IBD.
7378 Assert(m_active_chainstate->m_mempool->size() == 0);
7379 Assert(!m_snapshot_chainstate->m_mempool);
7380 m_snapshot_chainstate->m_mempool = m_active_chainstate->m_mempool;
7381 m_active_chainstate->m_mempool = nullptr;
7382 m_active_chainstate = m_snapshot_chainstate.get();
7383 return *m_snapshot_chainstate;
7384}
7385
7389 // Should never be called on a non-snapshot chainstate.
7390 assert(cs.m_from_snapshot_blockhash);
7391 auto storage_path_maybe = cs.CoinsDB().StoragePath();
7392 // Should never be called with a non-existent storage path.
7393 assert(storage_path_maybe);
7394 return *storage_path_maybe;
7395}
7396
7397util::Result<void> Chainstate::InvalidateCoinsDBOnDisk() {
7398 fs::path snapshot_datadir = GetSnapshotCoinsDBPath(*this);
7399
7400 // Coins views no longer usable.
7401 m_coins_views.reset();
7402
7403 auto invalid_path = snapshot_datadir + "_INVALID";
7404 std::string dbpath = fs::PathToString(snapshot_datadir);
7405 std::string target = fs::PathToString(invalid_path);
7406 LogPrintf("[snapshot] renaming snapshot datadir %s to %s\n", dbpath,
7407 target);
7408
7409 // The invalid snapshot datadir is simply moved and not deleted because we
7410 // may want to do forensics later during issue investigation. The user is
7411 // instructed accordingly in MaybeCompleteSnapshotValidation().
7412 try {
7413 fs::rename(snapshot_datadir, invalid_path);
7414 } catch (const fs::filesystem_error &e) {
7415 auto src_str = fs::PathToString(snapshot_datadir);
7416 auto dest_str = fs::PathToString(invalid_path);
7417
7418 LogPrintf("%s: error renaming file '%s' -> '%s': %s\n", __func__,
7419 src_str, dest_str, e.what());
7420 return util::Error{strprintf(_("Rename of '%s' -> '%s' failed. "
7421 "You should resolve this by manually "
7422 "moving or deleting the invalid "
7423 "snapshot directory %s, otherwise you "
7424 "will encounter the same error again "
7425 "on the next startup."),
7426 src_str, dest_str, src_str)};
7427 }
7428 return {};
7429}
7430
7431bool ChainstateManager::DeleteSnapshotChainstate() {
7433 Assert(m_snapshot_chainstate);
7434 Assert(m_ibd_chainstate);
7435
7436 fs::path snapshot_datadir =
7438 if (!DeleteCoinsDBFromDisk(snapshot_datadir, /*is_snapshot=*/true)) {
7439 LogPrintf("Deletion of %s failed. Please remove it manually to "
7440 "continue reindexing.\n",
7441 fs::PathToString(snapshot_datadir));
7442 return false;
7443 }
7444 m_active_chainstate = m_ibd_chainstate.get();
7445 m_active_chainstate->m_mempool = m_snapshot_chainstate->m_mempool;
7446 m_snapshot_chainstate.reset();
7447 return true;
7448}
7449
7450ChainstateRole Chainstate::GetRole() const {
7451 if (m_chainman.GetAll().size() <= 1) {
7453 }
7454 return (this != &m_chainman.ActiveChainstate())
7457}
7458const CBlockIndex *ChainstateManager::GetSnapshotBaseBlock() const {
7459 return m_active_chainstate ? m_active_chainstate->SnapshotBase() : nullptr;
7460}
7461
7462std::optional<int> ChainstateManager::GetSnapshotBaseHeight() const {
7463 const CBlockIndex *base = this->GetSnapshotBaseBlock();
7464 return base ? std::make_optional(base->nHeight) : std::nullopt;
7465}
7466
7467void ChainstateManager::RecalculateBestHeader() {
7469 m_best_header = ActiveChain().Tip();
7470 for (auto &entry : m_blockman.m_block_index) {
7471 if (!(entry.second.nStatus.isInvalid()) &&
7472 m_best_header->nChainWork < entry.second.nChainWork) {
7473 m_best_header = &entry.second;
7474 }
7475 }
7476}
7477
7478bool ChainstateManager::ValidatedSnapshotCleanup() {
7480 auto get_storage_path = [](auto &chainstate) EXCLUSIVE_LOCKS_REQUIRED(
7481 ::cs_main) -> std::optional<fs::path> {
7482 if (!(chainstate && chainstate->HasCoinsViews())) {
7483 return {};
7484 }
7485 return chainstate->CoinsDB().StoragePath();
7486 };
7487 std::optional<fs::path> ibd_chainstate_path_maybe =
7488 get_storage_path(m_ibd_chainstate);
7489 std::optional<fs::path> snapshot_chainstate_path_maybe =
7490 get_storage_path(m_snapshot_chainstate);
7491
7492 if (!this->IsSnapshotValidated()) {
7493 // No need to clean up.
7494 return false;
7495 }
7496 // If either path doesn't exist, that means at least one of the chainstates
7497 // is in-memory, in which case we can't do on-disk cleanup. You'd better be
7498 // in a unittest!
7499 if (!ibd_chainstate_path_maybe || !snapshot_chainstate_path_maybe) {
7500 LogPrintf("[snapshot] snapshot chainstate cleanup cannot happen with "
7501 "in-memory chainstates. You are testing, right?\n");
7502 return false;
7503 }
7504
7505 const auto &snapshot_chainstate_path = *snapshot_chainstate_path_maybe;
7506 const auto &ibd_chainstate_path = *ibd_chainstate_path_maybe;
7507
7508 // Since we're going to be moving around the underlying leveldb filesystem
7509 // content for each chainstate, make sure that the chainstates (and their
7510 // constituent CoinsViews members) have been destructed first.
7511 //
7512 // The caller of this method will be responsible for reinitializing
7513 // chainstates if they want to continue operation.
7514 this->ResetChainstates();
7515
7516 // No chainstates should be considered usable.
7517 assert(this->GetAll().size() == 0);
7518
7519 LogPrintf("[snapshot] deleting background chainstate directory (now "
7520 "unnecessary) (%s)\n",
7521 fs::PathToString(ibd_chainstate_path));
7522
7523 fs::path tmp_old{ibd_chainstate_path + "_todelete"};
7524
7525 auto rename_failed_abort = [this](fs::path p_old, fs::path p_new,
7526 const fs::filesystem_error &err) {
7527 LogPrintf("Error renaming path (%s) -> (%s): %s\n",
7528 fs::PathToString(p_old), fs::PathToString(p_new), err.what());
7530 "Rename of '%s' -> '%s' failed. "
7531 "Cannot clean up the background chainstate leveldb directory.",
7532 fs::PathToString(p_old), fs::PathToString(p_new)));
7533 };
7534
7535 try {
7536 fs::rename(ibd_chainstate_path, tmp_old);
7537 } catch (const fs::filesystem_error &e) {
7538 rename_failed_abort(ibd_chainstate_path, tmp_old, e);
7539 throw;
7540 }
7541
7542 LogPrintf("[snapshot] moving snapshot chainstate (%s) to "
7543 "default chainstate directory (%s)\n",
7544 fs::PathToString(snapshot_chainstate_path),
7545 fs::PathToString(ibd_chainstate_path));
7546
7547 try {
7548 fs::rename(snapshot_chainstate_path, ibd_chainstate_path);
7549 } catch (const fs::filesystem_error &e) {
7550 rename_failed_abort(snapshot_chainstate_path, ibd_chainstate_path, e);
7551 throw;
7552 }
7553
7554 if (!DeleteCoinsDBFromDisk(tmp_old, /*is_snapshot=*/false)) {
7555 // No need to FatalError because once the unneeded bg chainstate data is
7556 // moved, it will not interfere with subsequent initialization.
7557 LogPrintf("Deletion of %s failed. Please remove it manually, as the "
7558 "directory is now unnecessary.\n",
7559 fs::PathToString(tmp_old));
7560 } else {
7561 LogPrintf("[snapshot] deleted background chainstate directory (%s)\n",
7562 fs::PathToString(ibd_chainstate_path));
7563 }
7564 return true;
7565}
7566
7567Chainstate &ChainstateManager::GetChainstateForIndexing() {
7568 // We can't always return `m_ibd_chainstate` because after background
7569 // validation has completed,
7570 // `m_snapshot_chainstate == m_active_chainstate`, but it can be indexed.
7571 return (this->GetAll().size() > 1) ? *m_ibd_chainstate
7572 : *m_active_chainstate;
7573}
7574
7575std::pair<int, int>
7576ChainstateManager::GetPruneRange(const Chainstate &chainstate,
7577 int last_height_can_prune) {
7578 if (chainstate.m_chain.Height() <= 0) {
7579 return {0, 0};
7580 }
7581 int prune_start{0};
7582
7583 if (this->GetAll().size() > 1 &&
7584 m_snapshot_chainstate.get() == &chainstate) {
7585 // Leave the blocks in the background IBD chain alone if we're pruning
7586 // the snapshot chain.
7587 prune_start = *Assert(GetSnapshotBaseHeight()) + 1;
7588 }
7589
7590 int max_prune = std::max<int>(0, chainstate.m_chain.Height() -
7591 static_cast<int>(MIN_BLOCKS_TO_KEEP));
7592
7593 // last block to prune is the lesser of (caller-specified height,
7594 // MIN_BLOCKS_TO_KEEP from the tip)
7595 //
7596 // While you might be tempted to prune the background chainstate more
7597 // aggressively (i.e. fewer MIN_BLOCKS_TO_KEEP), this won't work with index
7598 // building - specifically blockfilterindex requires undo data, and if
7599 // we don't maintain this trailing window, we hit indexing failures.
7600 int prune_end = std::min(last_height_can_prune, max_prune);
7601
7602 return {prune_start, prune_end};
7603}
bool IsDAAEnabled(const Consensus::Params &params, int nHeight)
Definition: activation.cpp:24
bool IsUAHFenabled(const Consensus::Params &params, int nHeight)
Definition: activation.cpp:11
static bool IsPhononEnabled(const Consensus::Params &params, int32_t nHeight)
Definition: activation.cpp:65
static bool IsGravitonEnabled(const Consensus::Params &params, int32_t nHeight)
Definition: activation.cpp:51
bool IsMagneticAnomalyEnabled(const Consensus::Params &params, int32_t nHeight)
Check if Nov 15, 2018 HF has activated using block height.
Definition: activation.cpp:37
bool MoneyRange(const Amount nValue)
Definition: amount.h:177
static constexpr Amount SATOSHI
Definition: amount.h:153
static constexpr Amount COIN
Definition: amount.h:154
arith_uint256 UintToArith256(const uint256 &a)
int flags
Definition: bitcoin-tx.cpp:544
@ CHAIN
Outputs do not overspend inputs, no double spends, coinbase output ok, no immature coinbase spends,...
@ TRANSACTIONS
Only first tx is coinbase, 2 <= coinbase input script length <= 100, transactions valid,...
@ SCRIPTS
Scripts & signatures ok.
@ TREE
All parent headers found, difficulty matches, timestamp >= median previous, checkpoint.
arith_uint256 GetBlockProof(const CBlockIndex &block)
Definition: chain.cpp:74
int64_t GetBlockProofEquivalentTime(const CBlockIndex &to, const CBlockIndex &from, const CBlockIndex &tip, const Consensus::Params &params)
Return the time it would take to redo the work difference between from and to, assuming the current h...
Definition: chain.cpp:89
const CBlockIndex * LastCommonAncestor(const CBlockIndex *pa, const CBlockIndex *pb)
Find the last common ancestor two blocks have.
Definition: chain.cpp:112
bool AreOnTheSameFork(const CBlockIndex *pa, const CBlockIndex *pb)
Check if two block index are on the same fork.
Definition: chain.cpp:136
#define Assert(val)
Identity function.
Definition: check.h:87
#define Assume(val)
Assume is the identity function.
Definition: check.h:100
Non-refcounted RAII wrapper for FILE*.
Definition: streams.h:433
std::string ToString() const
Definition: hash_type.h:28
uint64_t getExcessiveBlockSize() const
Definition: validation.h:152
BlockValidationOptions withCheckPoW(bool _checkPoW=true) const
Definition: validation.h:137
BlockValidationOptions withCheckMerkleRoot(bool _checkMerkleRoot=true) const
Definition: validation.h:144
BlockValidationOptions(const Config &config)
Definition: validation.cpp:117
bool shouldValidatePoW() const
Definition: validation.h:150
bool shouldValidateMerkleRoot() const
Definition: validation.h:151
Wrapper around an AutoFile& that implements a ring buffer to deserialize from.
Definition: streams.h:505
Nodes collect new transactions into a block, hash them into a hash tree, and scan through nonce value...
Definition: block.h:23
BlockHash GetHash() const
Definition: block.cpp:11
NodeSeconds Time() const
Definition: block.h:53
uint32_t nBits
Definition: block.h:30
BlockHash hashPrevBlock
Definition: block.h:27
int64_t GetBlockTime() const
Definition: block.h:57
int32_t nVersion
Definition: block.h:26
uint256 hashMerkleRoot
Definition: block.h:28
Definition: block.h:60
bool m_checked_merkle_root
Definition: block.h:69
std::vector< CTransactionRef > vtx
Definition: block.h:63
bool fChecked
Definition: block.h:67
The block chain is a tree shaped structure starting with the genesis block at the root,...
Definition: blockindex.h:25
bool IsValid(enum BlockValidity nUpTo=BlockValidity::TRANSACTIONS) const EXCLUSIVE_LOCKS_REQUIRED(
Check whether this block index entry is valid up to the passed validity level.
Definition: blockindex.h:190
std::string ToString() const
Definition: blockindex.cpp:30
CBlockIndex * pprev
pointer to the index of the predecessor of this block
Definition: blockindex.h:32
uint64_t m_chain_tx_count
(memory only) Number of transactions in the chain up to and including this block.
Definition: blockindex.h:67
int64_t GetHeaderReceivedTime() const
Definition: blockindex.h:163
arith_uint256 nChainWork
(memory only) Total amount of work (expected number of hashes) in the chain up to and including this ...
Definition: blockindex.h:51
const BlockHash * phashBlock
pointer to the hash of the block, if any.
Definition: blockindex.h:29
bool HaveNumChainTxs() const
Check whether this block and all previous blocks back to the genesis block or an assumeutxo snapshot ...
Definition: blockindex.h:153
uint32_t nTime
Definition: blockindex.h:75
int32_t nSequenceId
(memory only) Sequential id assigned to distinguish order in which blocks are received.
Definition: blockindex.h:81
uint64_t GetChainTxCount() const
Get the number of transaction in the chain so far.
Definition: blockindex.h:137
int64_t GetReceivedTimeDiff() const
Definition: blockindex.h:165
int64_t GetBlockTime() const
Definition: blockindex.h:159
int64_t GetMedianTimePast() const
Definition: blockindex.h:171
FlatFilePos GetUndoPos() const EXCLUSIVE_LOCKS_REQUIRED(
Definition: blockindex.h:106
CBlockIndex * pskip
pointer to the index of some further predecessor of this block
Definition: blockindex.h:35
unsigned int nTx
Number of transactions in this block.
Definition: blockindex.h:55
bool RaiseValidity(enum BlockValidity nUpTo) EXCLUSIVE_LOCKS_REQUIRED(
Raise the validity level of this block index entry.
Definition: blockindex.h:198
int32_t nVersion
block header
Definition: blockindex.h:73
int64_t nTimeReceived
(memory only) block header metadata
Definition: blockindex.h:84
CBlockIndex * GetAncestor(int height)
Efficiently find an ancestor of this block.
Definition: blockindex.cpp:62
BlockHash GetBlockHash() const
Definition: blockindex.h:129
unsigned int nSize
Size of this block.
Definition: blockindex.h:60
int nHeight
height of the entry in the chain. The genesis block has height 0
Definition: blockindex.h:38
Undo information for a CBlock.
Definition: undo.h:72
std::vector< CTxUndo > vtxundo
Definition: undo.h:75
An in-memory indexed chain of blocks.
Definition: chain.h:138
CBlockIndex * Tip() const
Returns the index entry for the tip of this chain, or nullptr if none.
Definition: chain.h:154
void SetTip(CBlockIndex &block)
Set/initialize a chain with a given tip.
Definition: chain.cpp:8
CBlockIndex * Genesis() const
Returns the index entry for the genesis block of this chain, or nullptr if none.
Definition: chain.h:147
CBlockIndex * Next(const CBlockIndex *pindex) const
Find the successor of a block in this chain, or nullptr if the given index is not found or is the tip...
Definition: chain.h:178
int Height() const
Return the maximal height in the chain.
Definition: chain.h:190
const CBlockIndex * FindFork(const CBlockIndex *pindex) const
Find the last common block between this chain and a block index entry.
Definition: chain.cpp:49
bool Contains(const CBlockIndex *pindex) const
Efficiently check whether a block is present in this chain.
Definition: chain.h:170
CBlockLocator GetLocator() const
Return a CBlockLocator that refers to the tip of this chain.
Definition: chain.cpp:45
CChainParams defines various tweakable parameters of a given instance of the Bitcoin system.
Definition: chainparams.h:86
const CBlock & GenesisBlock() const
Definition: chainparams.h:112
std::vector< int > GetAvailableSnapshotHeights() const
const CMessageHeader::MessageMagic & DiskMagic() const
Definition: chainparams.h:99
const ChainTxData & TxData() const
Definition: chainparams.h:158
const Consensus::Params & GetConsensus() const
Definition: chainparams.h:98
std::optional< AssumeutxoData > AssumeutxoForHeight(int height) const
Definition: chainparams.h:147
const CCheckpointData & Checkpoints() const
Definition: chainparams.h:145
void SetBackend(CCoinsView &viewIn)
Definition: coins.cpp:48
CCoinsView that adds a memory cache for transactions to another CCoinsView.
Definition: coins.h:357
void Sync()
Push the modifications applied to this cache to its base while retaining the contents of this cache (...
Definition: coins.cpp:319
void AddCoin(const COutPoint &outpoint, Coin coin, bool possible_overwrite)
Add a coin.
Definition: coins.cpp:97
BlockHash GetBestBlock() const override
Retrieve the block hash whose state this CCoinsView currently represents.
Definition: coins.cpp:217
bool SpendCoin(const COutPoint &outpoint, Coin *moveto=nullptr)
Spend a coin.
Definition: coins.cpp:173
ResetGuard CreateResetGuard() noexcept
Create a scoped guard that will call Reset() on this cache when it goes out of scope.
Definition: coins.h:515
void Uncache(const COutPoint &outpoint)
Removes the UTXO with the given outpoint from the cache, if it is not modified.
Definition: coins.cpp:337
void SetBestBlock(const BlockHash &hashBlock)
Definition: coins.cpp:224
void Flush(bool reallocate_cache=true)
Push the modifications applied to this cache to its base and wipe local state.
Definition: coins.cpp:307
unsigned int GetCacheSize() const
Size of the cache (in number of transaction outputs)
Definition: coins.cpp:349
bool HaveCoinInCache(const COutPoint &outpoint) const
Check if we have the given utxo already loaded in this cache.
Definition: coins.cpp:212
size_t DynamicMemoryUsage() const
Calculate the size of the cache (in bytes)
Definition: coins.cpp:69
void EmplaceCoinInternalDANGER(COutPoint &&outpoint, Coin &&coin)
Emplace a coin into cacheCoins without performing any checks, marking the emplaced coin as dirty.
Definition: coins.cpp:145
bool HaveCoin(const COutPoint &outpoint) const override
Just check whether a given outpoint is unspent.
Definition: coins.cpp:207
std::optional< Coin > GetCoin(const COutPoint &outpoint) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
Definition: coins.cpp:89
const Coin & AccessCoin(const COutPoint &output) const
Return a reference to Coin in the cache, or coinEmpty if not found.
Definition: coins.cpp:199
CCoinsView backed by the coin database (chainstate/)
Definition: txdb.h:49
std::optional< fs::path > StoragePath()
Definition: txdb.h:75
void ResizeCache(size_t new_cache_size) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Dynamically alter the underlying leveldb cache size.
Definition: txdb.cpp:89
Abstract view on the open txout dataset.
Definition: coins.h:303
virtual std::optional< Coin > GetCoin(const COutPoint &outpoint) const
Retrieve the Coin (unspent transaction output) for a given outpoint.
Definition: coins.cpp:13
CCoinsView that brings transactions from a mempool into view.
Definition: txmempool.h:643
Fee rate in satoshis per virtualbyte: Amount / vB the feerate is represented internally as FeeFrac.
Definition: feerate.h:24
static constexpr size_t MESSAGE_START_SIZE
Definition: protocol.h:36
void insert(Span< const uint8_t > vKey)
Definition: bloom.cpp:215
bool contains(Span< const uint8_t > vKey) const
Definition: bloom.cpp:249
CSHA256 & Write(const uint8_t *data, size_t len)
Definition: sha256.cpp:819
Closure representing one script verification.
Definition: validation.h:550
SignatureCache * m_signature_cache
Definition: validation.h:559
ScriptExecutionMetrics GetScriptExecutionMetrics() const
Definition: validation.h:583
uint32_t nFlags
Definition: validation.h:555
TxSigCheckLimiter * pTxLimitSigChecks
Definition: validation.h:560
ScriptExecutionMetrics metrics
Definition: validation.h:557
CTxOut m_tx_out
Definition: validation.h:552
bool cacheStore
Definition: validation.h:556
std::optional< std::pair< ScriptError, std::string > > operator()()
PrecomputedTransactionData txdata
Definition: validation.h:558
const CTransaction * ptxTo
Definition: validation.h:553
unsigned int nIn
Definition: validation.h:554
CheckInputsLimiter * pBlockLimitSigChecks
Definition: validation.h:561
CTxMemPoolEntry stores data about the corresponding transaction, as well as data about all in-mempool...
Definition: mempool_entry.h:65
CTxMemPool stores valid-according-to-the-current-best-chain transactions that may be included in the ...
Definition: txmempool.h:222
RecursiveMutex cs
This mutex needs to be locked when accessing mapTx or other members that are guarded by it.
Definition: txmempool.h:316
void AddTransactionsUpdated(unsigned int n)
Definition: txmempool.cpp:121
size_t DynamicMemoryUsage() const
Definition: txmempool.cpp:819
const Options m_opts
Definition: txmempool.h:353
CTransactionRef get(const TxId &txid) const
Definition: txmempool.cpp:681
void clear(bool include_finalized_txs=false)
Definition: txmempool.cpp:359
unsigned long size() const
Definition: txmempool.h:490
CScript scriptPubKey
Definition: transaction.h:131
Amount nValue
Definition: transaction.h:130
Restore the UTXO in a Coin at a given COutPoint.
Definition: undo.h:61
std::vector< Coin > vprevout
Definition: undo.h:64
VerifyDBResult VerifyDB(Chainstate &chainstate, CCoinsView &coinsview, int nCheckLevel, int nCheckDepth) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
kernel::Notifications & m_notifications
Definition: validation.h:645
Chainstate stores and provides an API to update our local knowledge of the current best chain.
Definition: validation.h:727
bool IsBlockAvalancheFinalized(const CBlockIndex *pindex) const EXCLUSIVE_LOCKS_REQUIRED(!cs_avalancheFinalizedBlockIndex)
Checks if a block is finalized by avalanche voting.
const std::optional< BlockHash > m_from_snapshot_blockhash
The blockhash which is the base of the snapshot this chainstate was created from.
Definition: validation.h:834
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:819
void CheckForkWarningConditionsOnNewFork(CBlockIndex *pindexNewForkTip) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
bool ActivateBestChain(BlockValidationState &state, std::shared_ptr< const CBlock > pblock=nullptr, avalanche::Processor *const avalanche=nullptr) EXCLUSIVE_LOCKS_REQUIRED(!m_chainstate_mutex
Find the best known block, and make it the tip of the block chain.
Mutex m_chainstate_mutex
The ChainState Mutex.
Definition: validation.h:733
bool ConnectTip(BlockValidationState &state, BlockPolicyValidationState &blockPolicyState, CBlockIndex *pindexNew, const std::shared_ptr< const CBlock > &pblock, DisconnectedBlockTransactions &disconnectpool, const avalanche::Processor *const avalanche=nullptr, ChainstateRole chainstate_role=ChainstateRole::NORMAL) EXCLUSIVE_LOCKS_REQUIRED(cs_main
Connect a new block to m_chain.
void UpdateFlags(CBlockIndex *pindex, CBlockIndex *&pindexReset, F f, C fChild, AC fAncestorWasChanged) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
CChain m_chain
The current chain of blockheaders we consult and build on.
Definition: validation.h:826
bool HasCoinsViews() const
Does this chainstate have a UTXO set attached?
Definition: validation.h:880
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:1116
CTxMemPool * GetMempool()
Definition: validation.h:866
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:886
CCoinsViewCache & CoinsTip() EXCLUSIVE_LOCKS_REQUIRED(
Definition: validation.h:853
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:883
void SetBlockFailureFlags(CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(voi ResetBlockFailureFlags)(CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Set invalidity status to all descendants of a block.
Definition: validation.h:1003
void UnparkBlockImpl(CBlockIndex *pindex, bool fClearChildren) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
void CheckForkWarningConditions() EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Chainstate(CTxMemPool *mempool, node::BlockManager &blockman, ChainstateManager &chainman, std::optional< BlockHash > from_snapshot_blockhash=std::nullopt)
void InvalidBlockFound(CBlockIndex *pindex, const BlockValidationState &state) EXCLUSIVE_LOCKS_REQUIRED(cs_main
bool ActivateBestChainStep(BlockValidationState &state, CBlockIndex *pindexMostWork, const std::shared_ptr< const CBlock > &pblock, bool &fInvalidFound, const avalanche::Processor *const avalanche=nullptr, ChainstateRole=ChainstateRole::NORMAL) EXCLUSIVE_LOCKS_REQUIRED(cs_main
Try to make some progress towards making pindexMostWork the active block.
Mutex cs_avalancheFinalizedBlockIndex
Definition: validation.h:757
void ForceFlushStateToDisk()
Unconditionally flush all changes to disk.
bool LoadGenesisBlock()
Ensures we have a genesis block in the block tree, possibly writing one to disk.
void UnparkBlockAndChildren(CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Remove parked status from a block and its descendants.
CTxMemPool * m_mempool
Optional mempool that is kept in sync with the chain.
Definition: validation.h:737
CCoinsViewDB & CoinsDB() EXCLUSIVE_LOCKS_REQUIRED(
Definition: validation.h:860
bool DisconnectTip(BlockValidationState &state, DisconnectedBlockTransactions *disconnectpool) EXCLUSIVE_LOCKS_REQUIRED(cs_main
Disconnect m_chain's tip.
bool UnwindBlock(BlockValidationState &state, CBlockIndex *pindex, bool invalidate) EXCLUSIVE_LOCKS_REQUIRED(m_chainstate_mutex
bool InvalidateBlock(BlockValidationState &state, CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(!m_chainstate_mutex
Mark a block as invalid.
ChainstateManager & m_chainman
The chainstate manager that owns this chainstate.
Definition: validation.h:789
std::unique_ptr< CoinsViews > m_coins_views
Manages the UTXO set, which is a reflection of the contents of m_chain.
Definition: validation.h:741
const CBlockIndex *SnapshotBase() EXCLUSIVE_LOCKS_REQUIRED(std::set< CBlockIndex *, CBlockIndexWorkComparator > setBlockIndexCandidates
The base of the snapshot this chainstate was created from.
Definition: validation.h:841
CRollingBloomFilter m_filterParkingPoliciesApplied
Filter to prevent parking a block due to block policies more than once.
Definition: validation.h:772
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.
DisconnectResult DisconnectBlock(const CBlock &block, const CBlockIndex *pindex, CCoinsViewCache &view) EXCLUSIVE_LOCKS_REQUIRED(boo ConnectBlock)(const CBlock &block, BlockValidationState &state, CBlockIndex *pindex, CCoinsViewCache &view, BlockValidationOptions options, Amount *blockFees=nullptr, bool fJustCheck=false) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Apply the effects of this block (with given index) on the UTXO set represented by coins.
Definition: validation.h:946
CBlockIndex const * m_best_fork_tip
Definition: validation.h:775
void TryAddBlockIndexCandidate(CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
bool AvalancheFinalizeBlock(CBlockIndex *pindex, avalanche::Processor &avalanche) EXCLUSIVE_LOCKS_REQUIRED(voi ClearAvalancheFinalizedBlock)() EXCLUSIVE_LOCKS_REQUIRED(!cs_avalancheFinalizedBlockIndex)
Mark a block as finalized by avalanche.
Definition: validation.h:989
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:784
ChainstateRole GetRole() const EXCLUSIVE_LOCKS_REQUIRED(void InitCoinsDB(size_t cache_size_bytes, bool in_memory, bool should_wipe, std::string leveldb_name="chainstate")
Return the current role of the chainstate.
CBlockIndex const * m_best_fork_base
Definition: validation.h:776
void InvalidChainFound(CBlockIndex *pindexNew) EXCLUSIVE_LOCKS_REQUIRED(cs_main
void UnparkBlock(CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Remove parked status from a block.
bool PreciousBlock(BlockValidationState &state, CBlockIndex *pindex, avalanche::Processor *const avalanche=nullptr) EXCLUSIVE_LOCKS_REQUIRED(!m_chainstate_mutex
Mark a block as precious and reorganize.
void ClearBlockIndexCandidates() EXCLUSIVE_LOCKS_REQUIRED(const CBlockIndex * FindForkInGlobalIndex(const CBlockLocator &locator) const EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Find the last common block of this chain and a locator.
Definition: validation.cpp:122
CBlockIndex * FindMostWorkChain(std::vector< const CBlockIndex * > &blocksToReconcile, bool fAutoUnpark) 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...
bool UpdateFlagsForBlock(CBlockIndex *pindexBase, CBlockIndex *pindex, F f) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
bool ParkBlock(BlockValidationState &state, CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(!m_chainstate_mutex
Park a block.
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(RecursiveMutex * MempoolMutex() const LOCK_RETURNED(m_mempool -> cs)
Dictates whether we need to flush the cache to disk or not.
Definition: validation.h:1061
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
Definition: validation.h:1176
SnapshotCompletionResult MaybeCompleteSnapshotValidation() EXCLUSIVE_LOCKS_REQUIRED(const CBlockIndex *GetSnapshotBaseBlock() const EXCLUSIVE_LOCKS_REQUIRED(Chainstate ActiveChainstate)() const
Once the background validation chainstate has reached the height which is the base of the UTXO snapsh...
Definition: validation.h:1446
ValidationCache m_validation_cache
Definition: validation.h:1338
std::atomic< int32_t > nBlockSequenceId
Every received block is assigned a unique and increasing identifier, so we know which one to give pri...
Definition: validation.h:1354
void RecalculateBestHeader() EXCLUSIVE_LOCKS_REQUIRED(bool DumpRecentHeadersTime(const fs::path &filePath) const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
If, due to invalidation / reconsideration of blocks, the previous best header is no longer valid / gu...
bool DetectSnapshotChainstate(CTxMemPool *mempool) EXCLUSIVE_LOCKS_REQUIRED(void ResetChainstates() EXCLUSIVE_LOCKS_REQUIRED(bool DeleteSnapshotChainstate() EXCLUSIVE_LOCKS_REQUIRED(Chainstate &ActivateExistingSnapshot(BlockHash base_blockhash) EXCLUSIVE_LOCKS_REQUIRED(bool ValidatedSnapshotCleanup() EXCLUSIVE_LOCKS_REQUIRED(Chainstate &GetChainstateForIndexing() EXCLUSIVE_LOCKS_REQUIRED(std::pair< int, int > GetPruneRange(const Chainstate &chainstate, int last_height_can_prune) EXCLUSIVE_LOCKS_REQUIRED(std::optional< int > GetSnapshotBaseHeight() const EXCLUSIVE_LOCKS_REQUIRED(CCheckQueue< CScriptCheck > GetCheckQueue)()
When starting up, search the datadir for a chainstate based on a UTXO snapshot that is in the process...
Definition: validation.h:1691
const Config & GetConfig() const
Definition: validation.h:1290
size_t m_total_coinstip_cache
The total number of bytes available for us to use across all in-memory coins caches.
Definition: validation.h:1398
MempoolAcceptResult ProcessTransaction(const CTransactionRef &tx, bool test_accept=false) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Try to add a transaction to the memory pool.
bool AcceptBlockHeader(const CBlockHeader &block, BlockValidationState &state, CBlockIndex **ppindex, bool min_pow_checked, const std::optional< CCheckpointData > &test_checkpoints=std::nullopt) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
If a block header hasn't already been seen, call CheckBlockHeader on it, ensure that it doesn't desce...
kernel::Notifications & GetNotifications() const
Definition: validation.h:1305
bool IsInitialBlockDownload() const
Check whether we are doing an initial block download (synchronizing from disk or network)
void ReceivedBlockTransactions(const CBlock &block, CBlockIndex *pindexNew, const FlatFilePos &pos) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Mark a block as having its data received and checked (up to BLOCK_VALID_TRANSACTIONS).
bool ShouldCheckBlockIndex() const
bool ProcessNewBlock(const std::shared_ptr< const CBlock > &block, bool force_processing, bool min_pow_checked, bool *new_block, avalanche::Processor *const avalanche=nullptr) LOCKS_EXCLUDED(cs_main)
Process an incoming block.
RecursiveMutex & GetMutex() const LOCK_RETURNED(
Alias for cs_main.
Definition: validation.h:1328
bool LoadRecentHeadersTime(const fs::path &filePath) EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Load the recent block headers reception time from a file.
std::optional< BlockHash > SnapshotBlockhash() const
bool IsSnapshotValidated() const EXCLUSIVE_LOCKS_REQUIRED(
Is there a snapshot in use and has it been fully validated?
Definition: validation.h:1484
bool IsUsable(const Chainstate *const pchainstate) const EXCLUSIVE_LOCKS_REQUIRED(
Return true if a chainstate is considered usable.
Definition: validation.h:1253
CBlockIndex * ActiveTip() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Definition: validation.h:1453
bool BackgroundSyncInProgress() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
The state of a background sync (for net processing)
Definition: validation.h:1460
size_t m_total_coinsdb_cache
The total number of bytes available for us to use across all leveldb coins databases.
Definition: validation.h:1402
std::atomic< bool > m_cached_finished_ibd
Whether initial block download has ended and IsInitialBlockDownload should return false from now on.
Definition: validation.h:1347
bool PopulateAndValidateSnapshot(Chainstate &snapshot_chainstate, AutoFile &coins_file, const node::SnapshotMetadata &metadata)
Internal helper for ActivateSnapshot().
const util::SignalInterrupt & m_interrupt
Definition: validation.h:1332
int ActiveHeight() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Definition: validation.h:1450
bool IsSnapshotActive() const
bool AcceptBlock(const std::shared_ptr< const CBlock > &pblock, BlockValidationState &state, bool fRequested, const FlatFilePos *dbp, bool *fNewBlock, bool min_pow_checked) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Sufficiently validate a block for disk storage (and store on disk).
std::function< void()> snapshot_download_completed
Function to restart active indexes; set dynamically to avoid a circular dependency on base/index....
Definition: validation.h:1288
const CChainParams & GetParams() const
Definition: validation.h:1292
bool ProcessNewBlockHeaders(const std::vector< CBlockHeader > &block, bool min_pow_checked, BlockValidationState &state, const CBlockIndex **ppindex=nullptr, const std::optional< CCheckpointData > &test_checkpoints=std::nullopt) LOCKS_EXCLUDED(cs_main)
Process incoming block headers.
const Consensus::Params & GetConsensus() const
Definition: validation.h:1295
ChainstateManager(const util::SignalInterrupt &interrupt, Options options, node::BlockManager::Options blockman_options)
const arith_uint256 & MinimumChainWork() const
Definition: validation.h:1299
void CheckBlockIndex()
Make various assertions about the state of the block index.
const CBlockIndex * GetAvalancheFinalizedTip() const
util::Result< CBlockIndex * > ActivateSnapshot(AutoFile &coins_file, const node::SnapshotMetadata &metadata, bool in_memory)
Construct and activate a Chainstate on the basis of UTXO snapshot data.
const Options m_options
Definition: validation.h:1333
bool LoadBlockIndex() EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Load the block tree and coins database from disk, initializing state if we're running with -reindex.
CChain & ActiveChain() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Definition: validation.h:1447
void MaybeRebalanceCaches() EXCLUSIVE_LOCKS_REQUIRED(void ReportHeadersPresync(const arith_uint256 &work, int64_t height, int64_t timestamp)
Check to see if caches are out of balance and if so, call ResizeCoinsCaches() as needed.
arith_uint256 nLastPreciousChainwork
chainwork for the last block that preciousblock has been applied to.
Definition: validation.h:1359
const BlockHash & AssumedValidBlock() const
Definition: validation.h:1302
bool NotifyHeaderTip() LOCKS_EXCLUDED(GetMutex())
Chainstate &InitializeChainstate(CTxMemPool *mempool) EXCLUSIVE_LOCKS_REQUIRED(std::vector< Chainstate * GetAll)()
Instantiate a new chainstate.
Definition: validation.h:1412
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...
Definition: validation.h:1388
void LoadExternalBlockFile(AutoFile &file_in, FlatFilePos *dbp=nullptr, std::multimap< BlockHash, FlatFilePos > *blocks_with_unknown_parent=nullptr, avalanche::Processor *const avalanche=nullptr)
Import blocks from an external file.
int32_t nBlockReverseSequenceId
Decreasing counter (used by subsequent preciousblock calls).
Definition: validation.h:1357
node::BlockManager m_blockman
A single BlockManager instance is shared across each constructed chainstate to avoid duplicating bloc...
Definition: validation.h:1336
Simple class for regulating resource usage during CheckInputScripts (and CScriptCheck),...
Definition: validation.h:372
bool consume_and_check(int consumed)
Definition: validation.h:379
A UTXO entry.
Definition: coins.h:31
uint32_t GetHeight() const
Definition: coins.h:48
bool IsCoinBase() const
Definition: coins.h:49
CTxOut & GetTxOut()
Definition: coins.h:52
bool IsSpent() const
Definition: coins.h:50
CoinsViews(DBParams db_params, CoinsViewOptions options)
This constructor initializes CCoinsViewDB and CCoinsViewErrorCatcher instances, but it does not creat...
Definition: config.h:19
virtual const CChainParams & GetChainParams() const =0
std::pair< uint32_t, size_t > setup_bytes(size_t bytes)
setup_bytes is a convenience function which accounts for internal memory usage when deciding how many...
Definition: cuckoocache.h:385
bool get(Element &e, const bool erase) const
get is almost identical to contains(), with the difference that it obtains the found element (for Ele...
Definition: cuckoocache.h:522
void insert(Element e, bool replace=false)
insert loops at most depth_limit times trying to insert a hash at various locations in the table via ...
Definition: cuckoocache.h:420
void updateMempoolForReorg(Chainstate &active_chainstate, bool fAddToMempool, CTxMemPool &pool) EXCLUSIVE_LOCKS_REQUIRED(cs_main
Make mempool consistent after a reorg, by re-adding or recursively erasing disconnected block transac...
void addForBlock(const std::vector< CTransactionRef > &vtx, CTxMemPool &pool) EXCLUSIVE_LOCKS_REQUIRED(pool.cs)
void importMempool(CTxMemPool &pool) EXCLUSIVE_LOCKS_REQUIRED(pool.cs)
Fast randomness source.
Definition: random.h:411
Different type to mark Mutex at global scope.
Definition: sync.h:144
static RCUPtr acquire(T *&ptrIn)
Acquire ownership of some pointer.
Definition: rcu.h:103
Tp rand_uniform_delay(const Tp &time, typename Tp::duration range) noexcept
Return the time point advanced by a uniform random duration.
Definition: random.h:339
The script cache is a map using a key/value element, that caches the success of executing a specific ...
Definition: scriptcache.h:26
static TxSigCheckLimiter getDisabled()
Definition: validation.h:400
Convenience class for initializing and passing the script execution cache and signature cache.
Definition: validation.h:413
CuckooCache::cache< ScriptCacheElement, ScriptCacheHasher > m_script_execution_cache
Definition: validation.h:421
ValidationCache(size_t script_execution_cache_bytes, size_t signature_cache_bytes)
CSHA256 ScriptExecutionCacheHasher() const
Return a copy of the pre-initialized hasher.
Definition: validation.h:431
CSHA256 m_script_execution_cache_hasher
Pre-initialized hasher to avoid having to recreate it for every hash calculation.
Definition: validation.h:417
SignatureCache m_signature_cache
Definition: validation.h:422
void BlockFinalized(const CBlockIndex *pindex)
void BlockDisconnected(const std::shared_ptr< const CBlock > &, const CBlockIndex *pindex)
void NewPoWValidBlock(const CBlockIndex *, const std::shared_ptr< const CBlock > &)
void UpdatedBlockTip(const CBlockIndex *, const CBlockIndex *, bool fInitialDownload)
void ChainStateFlushed(ChainstateRole, const CBlockLocator &)
void BlockChecked(const CBlock &, const BlockValidationState &)
bool IsValid() const
Definition: validation.h:119
std::string GetRejectReason() const
Definition: validation.h:123
std::string GetDebugMessage() const
Definition: validation.h:124
bool Error(const std::string &reject_reason)
Definition: validation.h:112
bool Invalid(Result result, const std::string &reject_reason="", const std::string &debug_message="")
Definition: validation.h:101
bool IsError() const
Definition: validation.h:121
Result GetResult() const
Definition: validation.h:122
std::string ToString() const
Definition: validation.h:125
bool IsInvalid() const
Definition: validation.h:120
256-bit unsigned big integer.
constexpr bool IsNull() const
Definition: uint256.h:44
constexpr uint8_t * begin()
Definition: uint256.h:122
std::string ToString() const
Definition: uint256.h:117
double getdouble() const
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
Definition: fs.h:30
A base class defining functions for notifying about certain kernel events.
virtual void headerTip(SynchronizationState state, int64_t height, int64_t timestamp, bool presync)
virtual void fatalError(const std::string &debug_message, const bilingual_str &user_message={})
The fatal error notification is sent to notify the user when an error occurs in kernel code that can'...
virtual void warning(const std::string &warning)
virtual void progress(const bilingual_str &title, int progress_percent, bool resume_possible)
virtual InterruptResult blockTip(SynchronizationState state, CBlockIndex &index)
Maintains a tree of blocks (stored in m_block_index) which is consulted to determine where the most-w...
Definition: blockstorage.h:114
const kernel::BlockManagerOpts m_opts
Definition: blockstorage.h:250
RecursiveMutex cs_LastBlockFile
Definition: blockstorage.h:195
bool CheckBlockDataAvailability(const CBlockIndex &upper_block LIFETIMEBOUND, const CBlockIndex &lower_block LIFETIMEBOUND) EXCLUSIVE_LOCKS_REQUIRED(const CBlockIndex *GetFirstBlock(const CBlockIndex &upper_block LIFETIMEBOUND, std::function< bool(BlockStatus)> status_test, const CBlockIndex *lower_block=nullptr) const EXCLUSIVE_LOCKS_REQUIRED(boo m_have_pruned)
Check if all blocks in the [upper_block, lower_block] range have data available.
Definition: blockstorage.h:416
bool FlushChainstateBlockFile(int tip_height)
void FindFilesToPrune(std::set< int > &setFilesToPrune, int last_prune, const Chainstate &chain, ChainstateManager &chainman)
Prune block and undo files (blk???.dat and undo???.dat) so that the disk space used is less than a us...
void UpdateBlockInfo(const CBlock &block, unsigned int nHeight, const FlatFilePos &pos)
Update blockfile info while processing a block during reindex.
bool ReadBlockUndo(CBlockUndo &blockundo, const CBlockIndex &index) const
std::atomic_bool m_blockfiles_indexed
Whether all blockfiles have been added to the block tree database.
Definition: blockstorage.h:268
CBlockIndex * LookupBlockIndex(const BlockHash &hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
bool LoadingBlocks() const
Definition: blockstorage.h:365
void UnlinkPrunedFiles(const std::set< int > &setFilesToPrune) const
Actually unlink the specified files.
void WriteBlockIndexDB() EXCLUSIVE_LOCKS_REQUIRED(bool LoadBlockIndexDB(const std::optional< BlockHash > &snapshot_blockhash) EXCLUSIVE_LOCKS_REQUIRED(void ScanAndUnlinkAlreadyPrunedFiles() EXCLUSIVE_LOCKS_REQUIRED(CBlockIndex * AddToBlockIndex(const CBlockHeader &block, CBlockIndex *&best_header) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Remove any pruned block & undo files that are still on disk.
Definition: blockstorage.h:309
std::set< CBlockIndex * > m_dirty_blockindex
Dirty block index entries.
Definition: blockstorage.h:233
bool m_check_for_pruning
Global flag to indicate we should check to see if there are block/undo files that should be deleted.
Definition: blockstorage.h:228
bool IsPruneMode() const
Whether running in -prune mode.
Definition: blockstorage.h:356
void FindFilesToPruneManual(std::set< int > &setFilesToPrune, int nManualPruneHeight, const Chainstate &chain, ChainstateManager &chainman)
Calculate the block/rev files to delete based on height specified by user with RPC command pruneblock...
bool WriteBlockUndo(const CBlockUndo &blockundo, BlockValidationState &state, CBlockIndex &block) EXCLUSIVE_LOCKS_REQUIRED(FlatFilePos WriteBlock(const CBlock &block, int nHeight)
Store block on disk and update block file statistics.
Definition: blockstorage.h:342
bool ReadBlock(CBlock &block, const FlatFilePos &pos) const
Functions for disk access for blocks.
std::optional< int > m_snapshot_height
The height of the base block of an assumeutxo snapshot, if one is in use.
Definition: blockstorage.h:284
std::vector< CBlockIndex * > GetAllBlockIndices() EXCLUSIVE_LOCKS_REQUIRED(std::multimap< CBlockIndex *, CBlockIndex * > m_blocks_unlinked
All pairs A->B, where A (or one of its ancestors) misses transactions, but B has transactions.
Definition: blockstorage.h:286
Metadata describing a serialized version of a UTXO set from which an assumeutxo Chainstate can be con...
Definition: utxo_snapshot.h:31
uint64_t m_coins_count
The number of coins in the UTXO set contained in this snapshot.
Definition: utxo_snapshot.h:43
BlockHash m_base_blockhash
The hash of the block that reflects the tip of the chain for the UTXO set contained in this snapshot.
Definition: utxo_snapshot.h:39
256-bit opaque blob.
Definition: uint256.h:199
Helper class that manages an interrupt flag, and allows a thread or signal to interrupt another threa...
const Coin & AccessByTxid(const CCoinsViewCache &view, const TxId &txid)
Utility function to find any unspent output with a given txid.
Definition: coins.cpp:418
void AddCoins(CCoinsViewCache &cache, const CTransaction &tx, int nHeight, bool check_for_overwrite)
Utility function to add all of a transaction's outputs to a cache.
Definition: coins.cpp:157
@ BLOCK_CHECKPOINT
the block failed to meet one of our checkpoints
@ BLOCK_HEADER_LOW_WORK
the block header may be on a too-little-work chain
@ BLOCK_INVALID_HEADER
invalid proof of work or time too old
@ BLOCK_CACHED_INVALID
this block was cached as being invalid and we didn't store the reason why
@ BLOCK_CONSENSUS
invalid by consensus rules (excluding any below reasons)
@ BLOCK_MISSING_PREV
We don't have the previous block the checked one is built on.
@ BLOCK_INVALID_PREV
A block this one builds on is invalid.
@ BLOCK_MUTATED
the block's data didn't match the data committed to by the PoW
@ BLOCK_TIME_FUTURE
block timestamp was > 2 hours in the future (or our clock is bad)
@ TX_MISSING_INPUTS
transaction was missing some of its inputs
@ TX_CHILD_BEFORE_PARENT
This tx outputs are already spent in the mempool.
@ TX_MEMPOOL_POLICY
violated mempool's fee/size/descendant/etc limits
@ TX_PACKAGE_RECONSIDERABLE
fails some policy, but might be acceptable if submitted in a (different) package
@ TX_PREMATURE_SPEND
transaction spends a coinbase too early, or violates locktime/sequence locks
@ TX_DUPLICATE
Tx already in mempool or in the chain.
@ TX_INPUTS_NOT_STANDARD
inputs failed policy rules
@ TX_CONFLICT
Tx conflicts with a finalized tx, i.e.
@ TX_NOT_STANDARD
otherwise didn't meet our local policy rules
@ TX_AVALANCHE_RECONSIDERABLE
fails some policy, but might be reconsidered by avalanche voting
@ TX_NO_MEMPOOL
this node does not have a mempool so can't validate the transaction
@ TX_CONSENSUS
invalid by consensus rules
static constexpr unsigned int LOCKTIME_VERIFY_SEQUENCE
Flags for nSequence and nLockTime locks.
Definition: consensus.h:38
static const uint64_t MAX_TX_SIZE
The maximum allowed size for a transaction, in bytes.
Definition: consensus.h:14
uint64_t GetMaxBlockSigChecksCount(uint64_t maxBlockSize)
Compute the maximum number of sigchecks that can be contained in a block given the MAXIMUM block size...
Definition: consensus.h:47
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
Definition: cs_main.cpp:7
bool DestroyDB(const std::string &path_str)
Definition: dbwrapper.cpp:34
bool DeploymentActiveAfter(const CBlockIndex *pindexPrev, const Consensus::Params &params, Consensus::BuriedDeployment dep)
Determine if a deployment is active for the next block.
bool DeploymentActiveAt(const CBlockIndex &index, const Consensus::Params &params, Consensus::BuriedDeployment dep)
Determine if a deployment is active for this block.
DisconnectResult
volatile double sum
Definition: examples.cpp:10
bool RenameOver(fs::path src, fs::path dest)
Rename src to dest.
Definition: fs_helpers.cpp:258
bool CheckDiskSpace(const fs::path &dir, uint64_t additional_bytes)
Definition: fs_helpers.cpp:97
bool FileCommit(FILE *file)
Ensure file contents are fully committed to disk, using a platform-specific feature analogous to fsyn...
Definition: fs_helpers.cpp:111
bool VerifyScript(const CScript &scriptSig, const CScript &scriptPubKey, uint32_t flags, const BaseSignatureChecker &checker, ScriptExecutionMetrics &metricsOut, ScriptError *serror)
Execute an unlocking and locking script together.
ChainstateRole
This enum describes the various roles a specific Chainstate instance can take.
Definition: chain.h:14
#define LogPrintLevel(category, level,...)
Definition: logging.h:437
#define LogPrintLevel_(category, level, should_ratelimit,...)
Definition: logging.h:407
#define LogWarning(...)
Definition: logging.h:416
#define LogInfo(...)
Definition: logging.h:413
#define LogError(...)
Definition: logging.h:419
#define LogDebug(category,...)
Definition: logging.h:446
#define LogPrintf(...)
Definition: logging.h:424
unsigned int nHeight
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
Compute the Merkle root of the transactions in a block.
Definition: merkle.cpp:69
@ AVALANCHE
Definition: logging.h:91
@ REINDEX
Definition: logging.h:80
@ VALIDATION
Definition: logging.h:90
@ PRUNE
Definition: logging.h:83
@ MEMPOOL
Definition: logging.h:71
@ BENCH
Definition: logging.h:73
bool CheckBlock(const CCheckpointData &data, int nHeight, const BlockHash &hash)
Returns true if block passes checkpoint checks.
Definition: checkpoints.cpp:11
@ DEPLOYMENT_DERSIG
Definition: params.h:23
@ DEPLOYMENT_P2SH
Definition: params.h:20
@ DEPLOYMENT_CSV
Definition: params.h:24
@ DEPLOYMENT_HEIGHTINCB
Definition: params.h:21
@ DEPLOYMENT_CLTV
Definition: params.h:22
bool CheckTxInputs(const CTransaction &tx, TxValidationState &state, const CCoinsViewCache &inputs, int nSpendHeight, Amount &txfee)
Check whether all inputs of this transaction are valid (no double spends and amounts).
Definition: tx_verify.cpp:190
static bool exists(const path &p)
Definition: fs.h:107
static std::string PathToString(const path &path)
Convert path object to byte string.
Definition: fs.h:147
FILE * fopen(const fs::path &p, const char *mode)
Definition: fs.cpp:30
std::function< FILE *(const fs::path &, const char *)> FopenFn
Definition: fs.h:204
Definition: common.cpp:26
bool IsInterrupted(const T &result)
static bool ComputeUTXOStats(CCoinsView *view, CCoinsStats &stats, T hash_obj, const std::function< void()> &interruption_point)
Calculate statistics about the unspent transaction output set.
Definition: coinstats.cpp:95
CoinStatsHashType
Definition: coinstats.h:24
const fs::path SNAPSHOT_BLOCKHASH_FILENAME
The file in the snapshot chainstate dir which stores the base blockhash.
bool WriteSnapshotBaseBlockhash(Chainstate &snapshot_chainstate)
std::unordered_map< BlockHash, CBlockIndex, BlockHasher > BlockMap
Definition: blockstorage.h:72
std::optional< BlockHash > ReadSnapshotBaseBlockhash(const fs::path &chaindir)
bool WriteSnapshotBaseBlockhash(Chainstate &snapshot_chainstate) EXCLUSIVE_LOCKS_REQUIRED(std::optional< BlockHash > ReadSnapshotBaseBlockhash(const fs::path &chaindir) EXCLUSIVE_LOCKS_REQUIRED(constexpr std::string_view SNAPSHOT_CHAINSTATE_SUFFIX
Write out the blockhash of the snapshot base block that was used to construct this chainstate.
std::optional< fs::path > FindSnapshotChainstateDir(const fs::path &data_dir)
Return a path to the snapshot-based chainstate dir, if one exists.
bool Func(const std::string &str, Span< const char > &sp)
Parse a function call.
Definition: parsing.cpp:23
Implement std::hash so RCUPtr can be used as a key for maps or sets.
Definition: rcu.h:259
bilingual_str ErrorString(const Result< T > &result)
Definition: result.h:90
auto Join(const std::vector< T > &list, const BaseType &separator, UnaryOp unary_op) -> decltype(unary_op(list.at(0)))
Join a list of items.
Definition: string.h:109
std::string ToString(const T &t)
Locale-independent version of std::to_string.
Definition: string.h:156
std::shared_ptr< Chain::Notifications > m_notifications
Definition: interfaces.cpp:475
bool IsChildWithParents(const Package &package)
Context-free check that a package is exactly one child and its parents; not all parents need to be pr...
Definition: packages.cpp:86
bool CheckPackage(const Package &txns, PackageValidationState &state)
Context-free package policy checks:
Definition: packages.cpp:14
std::vector< CTransactionRef > Package
A package is an ordered list of transactions.
Definition: packages.h:40
@ PCKG_POLICY
The package itself is invalid (e.g. too many transactions).
@ PCKG_MEMPOOL_ERROR
Mempool logic error.
@ PCKG_TX
At least one tx is invalid.
bool AreInputsStandard(const CTransaction &tx, const CCoinsViewCache &mapInputs, uint32_t flags)
Check transaction inputs to mitigate two potential denial-of-service attacks:
Definition: policy.cpp:147
bool IsStandardTx(const CTransaction &tx, const std::optional< unsigned > &max_datacarrier_bytes, bool permit_bare_multisig, const CFeeRate &dust_relay_fee, std::string &reason)
Check for standard transaction types.
Definition: policy.cpp:68
static constexpr uint32_t STANDARD_SCRIPT_VERIFY_FLAGS
Standard script verification flags that standard transactions will comply with.
Definition: policy.h:101
static constexpr uint32_t STANDARD_LOCKTIME_VERIFY_FLAGS
Used as the flags parameter to sequence and nLocktime checks in non-consensus code.
Definition: policy.h:118
bool CheckProofOfWork(const BlockHash &hash, uint32_t nBits, const Consensus::Params &params)
Check whether a block hash satisfies the proof-of-work requirement specified by nBits.
Definition: pow.cpp:87
uint32_t GetNextWorkRequired(const CBlockIndex *pindexPrev, const CBlockHeader *pblock, const CChainParams &chainParams)
Definition: pow.cpp:21
std::shared_ptr< const CTransaction > CTransactionRef
Definition: transaction.h:315
uint256 GetRandHash() noexcept
========== CONVENIENCE FUNCTIONS FOR COMMONLY USED RANDOMNESS ==========
Definition: random.h:494
const char * prefix
Definition: rest.cpp:1078
reverse_range< T > reverse_iterate(T &x)
std::string ScriptErrorString(const ScriptError serror)
ScriptError
Definition: script_error.h:11
@ SIGCHECKS_LIMIT_EXCEEDED
@ SCRIPT_VERIFY_P2SH
Definition: script_flags.h:16
@ SCRIPT_VERIFY_SIGPUSHONLY
Definition: script_flags.h:35
@ SCRIPT_VERIFY_LOW_S
Definition: script_flags.h:31
@ SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY
Definition: script_flags.h:68
@ SCRIPT_ENABLE_REPLAY_PROTECTION
Definition: script_flags.h:89
@ SCRIPT_ENABLE_SCHNORR_MULTISIG
Definition: script_flags.h:97
@ SCRIPT_VERIFY_STRICTENC
Definition: script_flags.h:22
@ SCRIPT_VERIFY_NULLFAIL
Definition: script_flags.h:81
@ SCRIPT_VERIFY_DERSIG
Definition: script_flags.h:26
@ SCRIPT_ENFORCE_SIGCHECKS
Definition: script_flags.h:106
@ SCRIPT_VERIFY_CLEANSTACK
Definition: script_flags.h:63
@ SCRIPT_VERIFY_NONE
Definition: script_flags.h:12
@ SCRIPT_VERIFY_MINIMALDATA
Definition: script_flags.h:43
@ SCRIPT_VERIFY_CHECKSEQUENCEVERIFY
Definition: script_flags.h:73
@ SCRIPT_ENABLE_SIGHASH_FORKID
Definition: script_flags.h:85
static std::string ToString(const CService &ip)
Definition: db.h:36
CAddrDb db
Definition: main.cpp:35
size_t GetSerializeSize(const T &t)
Definition: serialize.h:1264
uint64_t ReadCompactSize(Stream &is, bool range_check=true)
Decode a CompactSize-encoded variable-length integer.
Definition: serialize.h:469
Definition: amount.h:23
static constexpr Amount zero() noexcept
Definition: amount.h:36
Holds configuration for use during UTXO snapshot load and validation.
Definition: chainparams.h:48
AssumeutxoHash hash_serialized
The expected hash of the deserialized UTXO set.
Definition: chainparams.h:52
uint64_t m_chain_tx_count
Used to populate the m_chain_tx_count value, which is used during BlockManager::LoadBlockIndex().
Definition: chainparams.h:60
A BlockHash is a unqiue identifier for a block.
Definition: blockhash.h:13
bool isValid(enum BlockValidity nUpTo=BlockValidity::TRANSACTIONS) const
Check whether this block index entry is valid up to the passed validity level.
Definition: blockstatus.h:99
Describes a place in the block chain to another node such that if the other node doesn't have the sam...
Definition: block.h:108
std::vector< BlockHash > vHave
Definition: block.h:120
Holds various statistics on transactions within a chain.
Definition: chainparams.h:73
uint64_t tx_count
Definition: chainparams.h:75
double dTxRate
Definition: chainparams.h:76
int64_t nTime
Definition: chainparams.h:74
User-controlled performance and debug options.
Definition: txdb.h:40
Parameters that influence chain consensus.
Definition: params.h:34
BlockHash BIP34Hash
Definition: params.h:41
int BIP34Height
Block height and hash at which BIP34 becomes active.
Definition: params.h:40
int nSubsidyHalvingInterval
Definition: params.h:36
BlockHash hashGenesisBlock
Definition: params.h:35
int sandersActivationTime
Unix time used for MTP activation of 15 May 2027 12:00:00 UTC upgrade.
Definition: params.h:70
int64_t nPowTargetSpacing
Definition: params.h:83
std::chrono::seconds PowTargetSpacing() const
Definition: params.h:85
bool fPowAllowMinDifficultyBlocks
Definition: params.h:80
Application-specific storage settings.
Definition: dbwrapper.h:34
fs::path path
Location in the filesystem where leveldb data will be stored.
Definition: dbwrapper.h:36
int nFile
Definition: flatfile.h:15
unsigned int nPos
Definition: flatfile.h:16
bool IsNull() const
Definition: flatfile.h:40
int64_t time
Definition: mempool_entry.h:27
Validation result for a transaction evaluated by MemPoolAccept (single or package).
Definition: validation.h:196
const ResultType m_result_type
Result type.
Definition: validation.h:207
@ VALID
Fully validated, valid.
static MempoolAcceptResult Failure(TxValidationState state)
Definition: validation.h:235
static MempoolAcceptResult FeeFailure(TxValidationState state, CFeeRate effective_feerate, const std::vector< TxId > &txids_fee_calculations)
Definition: validation.h:240
static MempoolAcceptResult Success(int64_t vsize, Amount fees, CFeeRate effective_feerate, const std::vector< TxId > &txids_fee_calculations)
Constructor for success case.
Definition: validation.h:248
static MempoolAcceptResult MempoolTx(int64_t vsize, Amount fees)
Constructor for already-in-mempool case.
Definition: validation.h:258
static time_point now() noexcept
Return current system time or mocked time, if set.
Definition: time.cpp:29
std::chrono::time_point< NodeClock > time_point
Definition: time.h:21
Validation result for package mempool acceptance.
Definition: validation.h:299
Precompute sighash midstate to avoid quadratic hashing.
Definition: transaction.h:325
In future if many more values are added, it should be considered to expand the element size to 64 byt...
Definition: scriptcache.h:52
const char * what() const noexcept override
A TxId is the identifier of a transaction.
Definition: txid.h:14
Bilingual messages:
Definition: translation.h:17
std::string original
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...
const std::function< NodeClock::time_point()> adjusted_time_callback
std::optional< int32_t > check_block_index
std::chrono::seconds max_tip_age
If the tip is older than this, the node is considered to be in initial block download.
bool store_recent_headers_time
If set, store and load the last few block headers reception time to speed up RTT bootstraping.
std::optional< int64_t > replay_protection_activation_time
If set, this overwrites the timestamp at which replay protection activates.
#define AssertLockNotHeld(cs)
Definition: sync.h:163
#define LOCK(cs)
Definition: sync.h:295
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
Definition: sync.h:343
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:56
#define LOCKS_EXCLUDED(...)
Definition: threadsafety.h:55
#define NO_THREAD_SAFETY_ANALYSIS
Definition: threadsafety.h:58
int64_t GetTimeMillis()
Returns the system time (not mockable)
Definition: time.cpp:76
int64_t GetTime()
DEPRECATED Use either ClockType::now() or Now<TimePointType>() if a cast is needed.
Definition: time.cpp:80
std::string FormatISO8601DateTime(int64_t nTime)
ISO 8601 formatting is preferred.
Definition: time.cpp:96
std::chrono::time_point< NodeClock, std::chrono::seconds > NodeSeconds
Definition: time.h:27
#define LOG_TIME_MILLIS_WITH_CATEGORY(end_msg, log_category)
Definition: timer.h:97
#define LOG_TIME_MILLIS_WITH_CATEGORY_MSG_ONCE(end_msg, log_category)
Definition: timer.h:100
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
Definition: tinyformat.h:1203
#define TRACE6(context, event, a, b, c, d, e, f)
Definition: trace.h:45
#define TRACE5(context, event, a, b, c, d, e)
Definition: trace.h:44
bilingual_str _(const char *psz)
Translation function.
Definition: translation.h:68
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
Definition: translation.h:36
bool CheckRegularTransaction(const CTransaction &tx, TxValidationState &state)
Context-independent validity checks for coinbase and non-coinbase transactions.
Definition: tx_check.cpp:74
bool CheckCoinbase(const CTransaction &tx, TxValidationState &state)
Definition: tx_check.cpp:55
bool ContextualCheckTransactionForCurrentBlock(const CBlockIndex &active_chain_tip, const Consensus::Params &params, const CTransaction &tx, TxValidationState &state)
Definition: tx_verify.cpp:72
bool EvaluateSequenceLocks(const CBlockIndex &block, std::pair< int, int64_t > lockPair)
Definition: tx_verify.cpp:172
bool SequenceLocks(const CTransaction &tx, int flags, std::vector< int > &prevHeights, const CBlockIndex &block)
Check if transaction is final per BIP 68 sequence numbers and can be included in a block.
Definition: tx_verify.cpp:183
bool ContextualCheckTransaction(const Consensus::Params &params, const CTransaction &tx, TxValidationState &state, int nHeight, int64_t nMedianTimePast)
Context dependent validity checks for non coinbase transactions.
Definition: tx_verify.cpp:41
bool ContextualCheckTransactionForCurrentBlock(const CBlockIndex &active_chain_tip, const Consensus::Params &params, const CTransaction &tx, TxValidationState &state) EXCLUSIVE_LOCKS_REQUIRED(std::pair< int, int64_t > CalculateSequenceLocks(const CTransaction &tx, int flags, std::vector< int > &prevHeights, const CBlockIndex &block)
This is a variant of ContextualCheckTransaction which computes the contextual check for a transaction...
Definition: tx_verify.h:62
static const uint32_t MEMPOOL_HEIGHT
Fake height value used in Coins to signify they are only in the memory pool(since 0....
Definition: txmempool.h:56
uint256 uint256S(std::string_view str)
DEPRECATED.
Definition: uint256.h:221
#define expect(bit)
static bool DeleteCoinsDBFromDisk(const fs::path &db_path, bool is_snapshot) EXCLUSIVE_LOCKS_REQUIRED(
bool FatalError(Notifications &notifications, BlockValidationState &state, const std::string &strMessage, const bilingual_str &userMessage)
GlobalMutex g_best_block_mutex
Definition: validation.cpp:113
Amount GetBlockSubsidy(int nHeight, const Consensus::Params &consensusParams)
std::condition_variable g_best_block_cv
Definition: validation.cpp:114
std::optional< LockPoints > CalculateLockPointsAtTip(CBlockIndex *tip, const CCoinsView &coins_view, const CTransaction &tx)
Calculate LockPoints required to check if transaction will be BIP68 final in the next block to be cre...
Definition: validation.cpp:177
static bool pool cs
Definition: validation.cpp:242
return CheckInputScripts(tx, state, view, flags, true, true, txdata, validation_cache, nSigChecksOut)
DisconnectResult ApplyBlockUndo(CBlockUndo &&blockUndo, const CBlock &block, const CBlockIndex *pindex, CCoinsViewCache &view)
Undo a block from the block and the undoblock data.
double GuessVerificationProgress(const ChainTxData &data, const CBlockIndex *pindex)
Guess how far we are in the verification process at the given block index require cs_main if pindex h...
MempoolAcceptResult AcceptToMemoryPool(Chainstate &active_chainstate, const CTransactionRef &tx, int64_t accept_time, bool bypass_limits, bool test_accept, unsigned int heightOverride)
Try to add a transaction to the mempool.
static bool CheckBlockHeader(const CBlockHeader &block, BlockValidationState &state, const Consensus::Params &params, BlockValidationOptions validationOptions)
Return true if the provided block header is valid.
static bool ContextualCheckBlock(const CBlock &block, BlockValidationState &state, const ChainstateManager &chainman, const CBlockIndex *pindexPrev)
NOTE: This function is not currently invoked by ConnectBlock(), so we should consider upgrade issues ...
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:201
static uint32_t GetNextBlockScriptFlags(const CBlockIndex *pindex, const ChainstateManager &chainman)
const CBlockIndex * g_best_block
Used to notify getblocktemplate RPC of new tips.
Definition: validation.cpp:115
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.
PackageMempoolAcceptResult ProcessNewPackage(Chainstate &active_chainstate, CTxMemPool &pool, const Package &package, bool test_accept)
Validate (and maybe submit) a package to the mempool.
static ChainstateManager::Options && Flatten(ChainstateManager::Options &&opts)
Apply default chain params to nullopt members.
static constexpr auto DATABASE_WRITE_INTERVAL_MAX
Definition: validation.cpp:94
static bool CheckMerkleRoot(const CBlock &block, BlockValidationState &state)
static constexpr int PRUNE_LOCK_BUFFER
The number of blocks to keep below the deepest prune lock.
Definition: validation.cpp:109
void SpendCoins(CCoinsViewCache &view, const CTransaction &tx, CTxUndo &txundo, int nHeight)
Mark all the coins corresponding to a given transaction inputs as spent.
bool CheckBlock(const CBlock &block, BlockValidationState &state, const Consensus::Params &params, BlockValidationOptions validationOptions)
Functions for validating blocks and updating the block tree.
const std::vector< std::string > CHECKLEVEL_DOC
Documentation for argument 'checklevel'.
Definition: validation.cpp:95
DisconnectResult UndoCoinSpend(Coin &&undo, CCoinsViewCache &view, const COutPoint &out)
Restore the UTXO in a Coin at a given COutPoint.
bool TestBlockValidity(BlockValidationState &state, const CChainParams &params, Chainstate &chainstate, const CBlock &block, CBlockIndex *pindexPrev, const std::function< NodeClock::time_point()> &adjusted_time_callback, BlockValidationOptions validationOptions)
Check a block is completely valid from start to finish (only works on top of our current best block)
void PruneBlockFilesManual(Chainstate &active_chainstate, int nManualPruneHeight)
Prune block files up to a given height.
static void FlushSnapshotToDisk(CCoinsViewCache &coins_cache, bool snapshot_loaded)
bool IsBlockMutated(const CBlock &block)
Check if a block has been mutated (with respect to its merkle root).
static constexpr auto DATABASE_WRITE_INTERVAL_MIN
Time window to wait between writing blocks/block index and chainstate to disk.
Definition: validation.cpp:93
AssertLockHeld(pool.cs)
static bool CheckInputsFromMempoolAndCache(const CTransaction &tx, TxValidationState &state, const CCoinsViewCache &view, const CTxMemPool &pool, const uint32_t flags, PrecomputedTransactionData &txdata, ValidationCache &validation_cache, int &nSigChecksOut, CCoinsViewCache &coins_tip) EXCLUSIVE_LOCKS_REQUIRED(cs_main
Checks to avoid mempool polluting consensus critical paths since cached signature and script validity...
std::optional< std::vector< Coin > > GetSpentCoins(const CTransactionRef &ptx, const CCoinsViewCache &coins_view)
Get the coins spent by ptx from the coins_view.
void UpdateCoins(CCoinsViewCache &view, const CTransaction &tx, CTxUndo &txundo, int nHeight)
Apply the effects of this transaction on the UTXO set represented by view.
static bool ContextualCheckBlockHeader(const CBlockHeader &block, BlockValidationState &state, BlockManager &blockman, ChainstateManager &chainman, const CBlockIndex *pindexPrev, NodeClock::time_point now, const std::optional< CCheckpointData > &test_checkpoints=std::nullopt) EXCLUSIVE_LOCKS_REQUIRED(
Context-dependent validity checks.
arith_uint256 CalculateClaimedHeadersWork(const std::vector< CBlockHeader > &headers)
Return the sum of the claimed work on a given set of headers.
static void SnapshotUTXOHashBreakpoint(const util::SignalInterrupt &interrupt)
static constexpr uint64_t HEADERS_TIME_VERSION
Definition: validation.cpp:111
static fs::path GetSnapshotCoinsDBPath(Chainstate &cs) EXCLUSIVE_LOCKS_REQUIRED(
static bool IsReplayProtectionEnabled(const Consensus::Params &params, const CBlockIndex *pindexPrev, const std::optional< int64_t > activation_time)
Definition: validation.cpp:221
static SynchronizationState GetSynchronizationState(bool init, bool blockfiles_indexed)
static void UpdateTipLog(const CCoinsViewCache &coins_tip, const CBlockIndex *tip, const CChainParams &params, const std::string &func_name, const std::string &prefix) EXCLUSIVE_LOCKS_REQUIRED(
static void LimitValidationInterfaceQueue(ValidationSignals &signals) LOCKS_EXCLUDED(cs_main)
assert(!tx.IsCoinBase())
static constexpr int MAX_SCRIPTCHECK_THREADS
Maximum number of dedicated script-checking threads allowed.
Definition: validation.h:109
#define MIN_TRANSACTION_SIZE
Definition: validation.h:82
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:90
SnapshotCompletionResult
Definition: validation.h:1128
SynchronizationState
Current sync state passed to tip changed callbacks.
Definition: validation.h:112
VerifyDBResult
Definition: validation.h:631
CoinsCacheSizeState
Definition: validation.h:705
@ LARGE
The cache is at >= 90% capacity.
@ CRITICAL
The coins cache is in immediate need of a flush.
FlushStateMode
Definition: validation.h:661
void SetfLargeWorkInvalidChainFound(bool flag)
Definition: warnings.cpp:38
void SetfLargeWorkForkFound(bool flag)
Definition: warnings.cpp:28
bool GetfLargeWorkForkFound()
Definition: warnings.cpp:33