Bitcoin Core 32.99.0
P2P Digital Currency
Loading...
Searching...
No Matches
validation.cpp
Go to the documentation of this file.
1// Copyright (c) 2009-2010 Satoshi Nakamoto
2// Copyright (c) 2009-present The Bitcoin Core developers
3// Distributed under the MIT software license, see the accompanying
4// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6#include <bitcoin-build-config.h> // IWYU pragma: keep
7
8#include <validation.h>
9
10#include <arith_uint256.h>
11#include <chain.h>
12#include <checkqueue.h>
13#include <clientversion.h>
14#include <consensus/amount.h>
15#include <consensus/consensus.h>
16#include <consensus/merkle.h>
17#include <consensus/tx_check.h>
18#include <consensus/tx_verify.h>
20#include <cuckoocache.h>
21#include <flatfile.h>
22#include <hash.h>
23#include <kernel/chainparams.h>
24#include <kernel/coinstats.h>
29#include <kernel/types.h>
30#include <kernel/warning.h>
31#include <logging/timer.h>
32#include <node/blockstorage.h>
33#include <node/utxo_snapshot.h>
35#include <policy/policy.h>
36#include <policy/rbf.h>
37#include <policy/settings.h>
38#include <policy/truc_policy.h>
39#include <pow.h>
40#include <primitives/block.h>
42#include <random.h>
43#include <script/script.h>
44#include <script/sigcache.h>
45#include <signet.h>
46#include <tinyformat.h>
47#include <txdb.h>
48#include <txmempool.h>
49#include <uint256.h>
50#include <undo.h>
51#include <util/byte_units.h>
52#include <util/check.h>
53#include <util/fs.h>
54#include <util/fs_helpers.h>
55#include <util/hasher.h>
56#include <util/log.h>
57#include <util/moneystr.h>
58#include <util/rbf.h>
59#include <util/result.h>
61#include <util/strencodings.h>
62#include <util/string.h>
63#include <util/threadpool.h>
64#include <util/time.h>
65#include <util/trace.h>
66#include <util/translation.h>
67#include <validationinterface.h>
68
69#include <algorithm>
70#include <cassert>
71#include <chrono>
72#include <deque>
73#include <numeric>
74#include <optional>
75#include <ranges>
76#include <span>
77#include <string>
78#include <tuple>
79#include <utility>
80
86
89using node::BlockMap;
93
98static constexpr auto DATABASE_WRITE_INTERVAL_MIN{50min};
99static constexpr auto DATABASE_WRITE_INTERVAL_MAX{70min};
101static constexpr std::chrono::hours MAX_FEE_ESTIMATION_TIP_AGE{3};
102const std::vector<std::string> CHECKLEVEL_DOC {
103 "level 0 reads the blocks from disk",
104 "level 1 verifies block validity",
105 "level 2 verifies undo data",
106 "level 3 checks disconnection of tip blocks",
107 "level 4 tries to reconnect the blocks",
108 "each level includes the checks of the previous levels",
109};
115static constexpr int PRUNE_LOCK_BUFFER{10};
116
117// Return whether the completed full flush should compact chainstate
119{
120 static constexpr uint32_t flush_ratio{320}; // Roughly every 2 weeks with hourly flushes
122}
123
128
130{
132
133 // Find the latest block common to locator and chain - we expect that
134 // locator.vHave is sorted descending by height.
135 for (const uint256& hash : locator.vHave) {
136 const CBlockIndex* pindex{m_blockman.LookupBlockIndex(hash)};
137 if (pindex) {
138 if (m_chain.Contains(*pindex)) {
139 return pindex;
140 }
141 if (pindex->GetAncestor(m_chain.Height()) == m_chain.Tip()) {
142 return m_chain.Tip();
143 }
144 }
145 }
146 return m_chain.Genesis();
147}
148
150{
152
153 // CheckFinalTxAtTip() uses active_chain_tip.Height()+1 to evaluate
154 // nLockTime because when IsFinalTx() is called within
155 // AcceptBlock(), the height of the block *being*
156 // evaluated is what is used. Thus if we want to know if a
157 // transaction can be part of the *next* block, we need to call
158 // IsFinalTx() with one more than active_chain_tip.Height().
159 const int nBlockHeight = active_chain_tip.nHeight + 1;
160
161 // BIP113 requires that time-locked transactions have nLockTime set to
162 // less than the median time of the previous block they're contained in.
163 // When the next block is created its previous block will be the current
164 // chain tip, so we use that to calculate the median time passed to
165 // IsFinalTx().
166 const int64_t nBlockTime{active_chain_tip.GetMedianTimePast()};
167
168 return IsFinalTx(tx, nBlockHeight, nBlockTime);
169}
170
171namespace {
182std::optional<std::vector<int>> CalculatePrevHeights(
183 const CBlockIndex& tip,
184 const CCoinsView& coins,
185 const CTransaction& tx)
186{
187 std::vector<int> prev_heights;
188 prev_heights.resize(tx.vin.size());
189 for (size_t i = 0; i < tx.vin.size(); ++i) {
190 if (auto coin{coins.GetCoin(tx.vin[i].prevout)}) {
191 prev_heights[i] = coin->nHeight == MEMPOOL_HEIGHT
192 ? tip.nHeight + 1 // Assume all mempool transaction confirm in the next block.
193 : coin->nHeight;
194 } else {
195 LogWarning("%s: Missing input %d in transaction \'%s\'", __func__, i, tx.GetHash().GetHex());
196 return std::nullopt;
197 }
198 }
199 return prev_heights;
200}
201} // namespace
202
203std::optional<LockPoints> CalculateLockPointsAtTip(
205 const CCoinsView& coins_view,
206 const CTransaction& tx)
207{
208 assert(tip);
209
210 auto prev_heights{CalculatePrevHeights(*tip, coins_view, tx)};
211 if (!prev_heights.has_value()) return std::nullopt;
212
215 // When SequenceLocks() is called within ConnectBlock(), the height
216 // of the block *being* evaluated is what is used.
217 // Thus if we want to know if a transaction can be part of the
218 // *next* block, we need to use one more than active_chainstate.m_chain.Height()
219 next_tip.nHeight = tip->nHeight + 1;
221
222 // Also store the hash of the block with the highest height of
223 // all the blocks which have sequence locked prevouts.
224 // This hash needs to still be on the chain
225 // for these LockPoint calculations to be valid
226 // Note: It is impossible to correctly calculate a maxInputBlock
227 // if any of the sequence locked inputs depend on unconfirmed txs,
228 // except in the special case where the relative lock time/height
229 // is 0, which is equivalent to no sequence lock. Since we assume
230 // input height of tip+1 for mempool txs and test the resulting
231 // min_height and min_time from CalculateSequenceLocks against tip+1.
232 int max_input_height{0};
233 for (const int height : prev_heights.value()) {
234 // Can ignore mempool inputs since we'll fail if they had non-zero locks
235 if (height != next_tip.nHeight) {
236 max_input_height = std::max(max_input_height, height);
237 }
238 }
239
240 // tip->GetAncestor(max_input_height) should never return a nullptr
241 // because max_input_height is always less than the tip height.
242 // It would, however, be a bad bug to continue execution, since a
243 // LockPoints object with the maxInputBlock member set to nullptr
244 // signifies no relative lock time.
245 return LockPoints{min_height, min_time, Assert(tip->GetAncestor(max_input_height))};
246}
247
249 const LockPoints& lock_points)
250{
251 assert(tip != nullptr);
252
253 CBlockIndex index;
254 index.pprev = tip;
255 // CheckSequenceLocksAtTip() uses active_chainstate.m_chain.Height()+1 to evaluate
256 // height based locks because when SequenceLocks() is called within
257 // ConnectBlock(), the height of the block *being*
258 // evaluated is what is used.
259 // Thus if we want to know if a transaction can be part of the
260 // *next* block, we need to use one more than active_chainstate.m_chain.Height()
261 index.nHeight = tip->nHeight + 1;
262
263 return EvaluateSequenceLocks(index, {lock_points.height, lock_points.time});
264}
265
268{
270 AssertLockHeld(pool.cs);
271 int expired = pool.Expire(GetTime<std::chrono::seconds>() - pool.m_opts.expiry);
272 if (expired != 0) {
273 LogDebug(BCLog::MEMPOOL, "Expired %i transactions from the memory pool\n", expired);
274 }
275
276 std::vector<COutPoint> vNoSpendsRemaining;
277 pool.TrimToSize(pool.m_opts.max_size_bytes, &vNoSpendsRemaining);
278 for (const COutPoint& removed : vNoSpendsRemaining)
279 coins_cache.Uncache(removed);
280}
281
283{
285 if (active_chainstate.m_chainman.IsInitialBlockDownload()) {
286 return false;
287 }
289 return false;
290 if (active_chainstate.m_chain.Height() < active_chainstate.m_chainman.m_best_header->nHeight - 1) {
291 return false;
292 }
293 return true;
294}
295
298 bool fAddToMempool)
299{
300 if (!m_mempool) return;
301
304 std::vector<Txid> vHashUpdate;
305 {
306 // disconnectpool is ordered so that the front is the most recently-confirmed
307 // transaction (the last tx of the block at the tip) in the disconnected chain.
308 // Iterate disconnectpool in reverse, so that we add transactions
309 // back to the mempool starting with the earliest transaction that had
310 // been previously seen in a block.
311 const auto queuedTx = disconnectpool.take();
312 auto it = queuedTx.rbegin();
313 while (it != queuedTx.rend()) {
314 // ignore validation errors in resurrected transactions
315 if (!fAddToMempool || (*it)->IsCoinBase() ||
316 AcceptToMemoryPool(*this, *it, GetTime(),
317 /*bypass_limits=*/true, /*test_accept=*/false).m_result_type !=
319 // If the transaction doesn't make it in to the mempool, remove any
320 // transactions that depend on it (which would now be orphans).
322 } else if (m_mempool->exists((*it)->GetHash())) {
323 vHashUpdate.push_back((*it)->GetHash());
324 }
325 ++it;
326 }
327 }
328
329 // AcceptToMemoryPool/addNewTransaction all assume that new mempool entries have
330 // no in-mempool children, which is generally not true when adding
331 // previously-confirmed transactions back to the mempool.
332 // UpdateTransactionsFromBlock finds descendants of any transactions in
333 // the disconnectpool that were added back and cleans up the mempool state.
335
336 // Predicate to use for filtering transactions in removeForReorg.
337 // Checks whether the transaction is still final and, if it spends a coinbase output, mature.
338 // Also updates valid entries' cached LockPoints if needed.
339 // If false, the tx is still valid and its lockpoints are updated.
340 // If true, the tx would be invalid in the next block; remove this entry and all of its descendants.
341 // Note that TRUC rules are not applied here, so reorgs may cause violations of TRUC inheritance or
342 // topology restrictions.
347 const CTransaction& tx = it->GetTx();
348
349 // The transaction must be final.
350 if (!CheckFinalTxAtTip(*Assert(m_chain.Tip()), tx)) return true;
351
352 const LockPoints& lp = it->GetLockPoints();
353 // CheckSequenceLocksAtTip checks if the transaction will be final in the next block to be
354 // created on top of the new chain.
357 return true;
358 }
359 } else {
361 const std::optional<LockPoints> new_lock_points{CalculateLockPointsAtTip(m_chain.Tip(), view_mempool, tx)};
363 // Now update the mempool entry lockpoints as well.
364 it->UpdateLockPoints(*new_lock_points);
365 } else {
366 return true;
367 }
368 }
369
370 // If the transaction spends any coinbase outputs, it must be mature.
371 if (it->GetSpendsCoinbase()) {
372 for (const CTxIn& txin : tx.vin) {
373 if (m_mempool->exists(txin.prevout.hash)) continue;
374 const Coin& coin{CoinsTip().AccessCoin(txin.prevout)};
375 assert(!coin.IsSpent());
376 const auto mempool_spend_height{m_chain.Tip()->nHeight + 1};
377 if (coin.IsCoinBase() && mempool_spend_height - coin.nHeight < COINBASE_MATURITY) {
378 return true;
379 }
380 }
381 }
382 // Transaction is still valid and cached LockPoints are updated.
383 return false;
384 };
385
386 // We also need to remove any now-immature transactions
388 // Re-limit mempool size, in case we added any transactions
390}
391
398 const CCoinsViewCache& view, const CTxMemPool& pool,
402{
405
407 for (const CTxIn& txin : tx.vin) {
408 const Coin& coin = view.AccessCoin(txin.prevout);
409
410 // This coin was checked in PreChecks and MemPoolAccept
411 // has been holding cs_main since then.
412 Assume(!coin.IsSpent());
413 if (coin.IsSpent()) return false;
414
415 // If the Coin is available, there are 2 possibilities:
416 // it is available in our current ChainstateActive UTXO set,
417 // or it's a UTXO provided by a transaction in our mempool.
418 // Ensure the scriptPubKeys in Coins from CoinsView are correct.
419 const CTransactionRef& txFrom = pool.get(txin.prevout.hash);
420 if (txFrom) {
421 assert(txFrom->GetHash() == txin.prevout.hash);
422 assert(txFrom->vout.size() > txin.prevout.n);
423 assert(txFrom->vout[txin.prevout.n] == coin.out);
424 } else {
425 const Coin& coinFromUTXOSet = coins_tip.AccessCoin(txin.prevout);
426 assert(!coinFromUTXOSet.IsSpent());
427 assert(coinFromUTXOSet.out == coin.out);
428 }
429 }
430
431 // Call CheckInputScripts() to cache signature and script validity against current tip consensus rules.
432 return CheckInputScripts(tx, state, view, flags, CheckInputScriptsFor::Mempool, /* cacheSigStore= */ true, /* cacheFullScriptStore= */ true, txdata, validation_cache);
433}
434
435namespace {
436
437class MemPoolAccept
438{
439public:
440 explicit MemPoolAccept(CTxMemPool& mempool, Chainstate& active_chainstate) :
441 m_pool(mempool),
442 m_view(&CoinsViewEmpty::Get()),
443 m_viewmempool(&active_chainstate.CoinsTip(), m_pool),
444 m_active_chainstate(active_chainstate)
445 {
446 }
447
448 // We put the arguments we're handed into a struct, so we can pass them
449 // around easier.
450 struct ATMPArgs {
451 const int64_t m_accept_time;
452 const bool m_bypass_limits;
453 /*
454 * Return any outpoints which were not previously present in the coins
455 * cache, but were added as a result of validating the tx for mempool
456 * acceptance. This allows the caller to optionally remove the cache
457 * additions if the associated transaction ends up being rejected by
458 * the mempool.
459 */
460 std::vector<COutPoint>& m_coins_to_uncache;
462 const bool m_test_accept;
466 const bool m_allow_replacement;
468 const bool m_allow_sibling_eviction;
471 const bool m_package_submission;
475 const bool m_package_feerates;
480 const std::optional<CFeeRate> m_client_maxfeerate;
481
483 static ATMPArgs SingleAccept(int64_t accept_time,
484 bool bypass_limits, std::vector<COutPoint>& coins_to_uncache,
485 bool test_accept) {
486 return ATMPArgs{/*accept_time=*/ accept_time,
487 /*bypass_limits=*/ bypass_limits,
488 /*coins_to_uncache=*/ coins_to_uncache,
489 /*test_accept=*/ test_accept,
490 /*allow_replacement=*/ true,
491 /*allow_sibling_eviction=*/ true,
492 /*package_submission=*/ false,
493 /*package_feerates=*/ false,
494 /*client_maxfeerate=*/ {}, // checked by caller
495 };
496 }
497
499 static ATMPArgs PackageTestAccept(int64_t accept_time,
500 std::vector<COutPoint>& coins_to_uncache) {
501 return ATMPArgs{/*accept_time=*/ accept_time,
502 /*bypass_limits=*/ false,
503 /*coins_to_uncache=*/ coins_to_uncache,
504 /*test_accept=*/ true,
505 /*allow_replacement=*/ false,
506 /*allow_sibling_eviction=*/ false,
507 /*package_submission=*/ false, // not submitting to mempool
508 /*package_feerates=*/ false,
509 /*client_maxfeerate=*/ {}, // checked by caller
510 };
511 }
512
515 std::vector<COutPoint>& coins_to_uncache, const std::optional<CFeeRate>& client_maxfeerate) {
516 return ATMPArgs{/*accept_time=*/ accept_time,
517 /*bypass_limits=*/ false,
518 /*coins_to_uncache=*/ coins_to_uncache,
519 /*test_accept=*/ false,
520 /*allow_replacement=*/ true,
521 /*allow_sibling_eviction=*/ false,
522 /*package_submission=*/ true,
523 /*package_feerates=*/ true,
524 /*client_maxfeerate=*/ client_maxfeerate,
525 };
526 }
527
529 static ATMPArgs SingleInPackageAccept(const ATMPArgs& package_args) {
530 return ATMPArgs{/*accept_time=*/ package_args.m_accept_time,
531 /*bypass_limits=*/ false,
532 /*coins_to_uncache=*/ package_args.m_coins_to_uncache,
533 /*test_accept=*/ package_args.m_test_accept,
534 /*allow_replacement=*/ true,
535 /*allow_sibling_eviction=*/ true,
536 /*package_submission=*/ true, // trim at the end of AcceptPackage()
537 /*package_feerates=*/ false, // only 1 transaction
538 /*client_maxfeerate=*/ package_args.m_client_maxfeerate,
539 };
540 }
541
542 private:
543 // Private ctor to avoid exposing details to clients and allowing the possibility of
544 // mixing up the order of the arguments. Use static functions above instead.
545 ATMPArgs(int64_t accept_time,
546 bool bypass_limits,
547 std::vector<COutPoint>& coins_to_uncache,
548 bool test_accept,
552 bool package_feerates,
553 std::optional<CFeeRate> client_maxfeerate)
554 : m_accept_time{accept_time},
555 m_bypass_limits{bypass_limits},
556 m_coins_to_uncache{coins_to_uncache},
557 m_test_accept{test_accept},
558 m_allow_replacement{allow_replacement},
559 m_allow_sibling_eviction{allow_sibling_eviction},
560 m_package_submission{package_submission},
561 m_package_feerates{package_feerates},
562 m_client_maxfeerate{client_maxfeerate}
563 {
564 // If we are using package feerates, we must be doing package submission.
565 // It also means sibling eviction is not permitted.
566 if (m_package_feerates) {
567 Assume(m_package_submission);
568 Assume(!m_allow_sibling_eviction);
569 }
570 if (m_allow_sibling_eviction) Assume(m_allow_replacement);
571 }
572 };
573
576
577 // Single transaction acceptance
579 LOCK(m_pool.cs);
582 return result;
583 }
585
592 LOCK(m_pool.cs);
595 return result;
596 }
597 PackageMempoolAcceptResult AcceptMultipleTransactionsInternal(const std::vector<CTransactionRef>& txns, ATMPArgs& args) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_pool.cs);
598
609 PackageMempoolAcceptResult AcceptSubPackage(const std::vector<CTransactionRef>& subpackage, ATMPArgs& args)
611
617
618private:
619 // All the intermediate state that gets passed between the various levels
620 // of checking a given transaction.
621 struct Workspace {
622 explicit Workspace(const CTransactionRef& ptx) : m_ptx(ptx), m_hash(ptx->GetHash()) {}
625 std::set<Txid> m_conflicts;
628 CTxMemPool::setEntries m_iters_conflicting;
630 std::vector<CTxMemPoolEntry::CTxMemPoolEntryRef> m_parents;
631 /* Handle to the tx in the changeset */
635 bool m_sibling_eviction{false};
636
639 int64_t m_vsize;
641 CAmount m_base_fees;
643 CAmount m_modified_fees;
644
648 CFeeRate m_package_feerate{0};
649
650 const CTransactionRef& m_ptx;
652 const Txid& m_hash;
653 TxValidationState m_state;
656 PrecomputedTransactionData m_precomputed_txdata;
657 };
658
659 // Run the policy checks on a given transaction, excluding any script checks.
660 // Looks up inputs, calculates feerate, considers replacement, evaluates
661 // package limits, etc. As this function can be invoked for "free" by a peer,
662 // only tests that are fast should be done here (to avoid CPU DoS).
663 bool PreChecks(ATMPArgs& args, Workspace& ws) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_pool.cs);
664
665 // Run checks for mempool replace-by-fee, only used in AcceptSingleTransaction.
666 bool ReplacementChecks(Workspace& ws) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_pool.cs);
667
668 bool PackageRBFChecks(const std::vector<CTransactionRef>& txns,
669 std::vector<Workspace>& workspaces,
671
672 // Run the script checks using our policy flags. As this can be slow, we should
673 // only invoke this on transactions that have otherwise passed policy checks.
674 bool PolicyScriptChecks(Workspace& ws) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_pool.cs);
675
676 // Re-run the script checks, using consensus flags, and try to cache the
677 // result in the scriptcache. This should be done after
678 // PolicyScriptChecks(). This requires that all inputs either be in our
679 // utxo set or in the mempool.
680 bool ConsensusScriptChecks(Workspace& ws) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_pool.cs);
681
682 // Try to add the transaction to the mempool, removing any conflicts first.
683 void FinalizeSubpackage(const ATMPArgs& args) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_pool.cs);
684
685 // Submit all transactions to the mempool and call ConsensusScriptChecks to add to the script
686 // cache - should only be called after successful validation of all transactions in the package.
687 // Does not call LimitMempoolSize(), so mempool max_size_bytes may be temporarily exceeded.
688 bool SubmitPackage(const ATMPArgs& args, std::vector<Workspace>& workspaces, PackageValidationState& package_state,
689 std::map<Wtxid, MempoolAcceptResult>& results)
691
692 // Compare a package's feerate against minimum allowed.
693 bool CheckFeeRate(size_t package_size, CAmount package_fee, TxValidationState& state) EXCLUSIVE_LOCKS_REQUIRED(::cs_main, m_pool.cs)
694 {
696 AssertLockHeld(m_pool.cs);
697 CAmount mempoolRejectFee = m_pool.GetMinFee().GetFee(package_size);
699 return state.Invalid(TxValidationResult::TX_RECONSIDERABLE, "mempool min fee not met", strprintf("%d < %d", package_fee, mempoolRejectFee));
700 }
701
702 if (package_fee < m_pool.m_opts.min_relay_feerate.GetFee(package_size)) {
703 return state.Invalid(TxValidationResult::TX_RECONSIDERABLE, "min relay fee not met",
704 strprintf("%d < %d", package_fee, m_pool.m_opts.min_relay_feerate.GetFee(package_size)));
705 }
706 return true;
707 }
708
710 {
711 return m_active_chainstate.m_chainman.m_validation_cache;
712 }
713
714private:
715 CTxMemPool& m_pool;
716
728 CCoinsViewCache m_view;
729
730 // These are the two possible backends for m_view.
733 CCoinsViewMemPool m_viewmempool;
734
735 Chainstate& m_active_chainstate;
736
737 // Fields below are per *sub*package state and must be reset prior to subsequent
738 // AcceptSingleTransaction and AcceptMultipleTransactions invocations
739 struct SubPackageState {
741 CAmount m_total_modified_fees{0};
743 int64_t m_total_vsize{0};
744
745 // RBF-related members
748 bool m_rbf{false};
750 std::list<CTransactionRef> m_replaced_transactions;
751 /* Changeset representing adding transactions and removing their conflicts. */
752 std::unique_ptr<CTxMemPool::ChangeSet> m_changeset;
753
755 CAmount m_conflicting_fees{0};
757 size_t m_conflicting_size{0};
758 };
759
760 struct SubPackageState m_subpackage;
761
764 {
765 m_subpackage = SubPackageState{};
766
767 // And clean coins while at it
769 }
770};
771
772bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
773{
775 AssertLockHeld(m_pool.cs);
776 const CTransactionRef& ptx = ws.m_ptx;
777 const CTransaction& tx = *ws.m_ptx;
778 const Txid& hash = ws.m_hash;
779
780 // Copy/alias what we need out of args
781 const int64_t nAcceptTime = args.m_accept_time;
782 const bool bypass_limits = args.m_bypass_limits;
783 std::vector<COutPoint>& coins_to_uncache = args.m_coins_to_uncache;
784
785 // Alias what we need out of ws
786 TxValidationState& state = ws.m_state;
787
788 if (!CheckTransaction(tx, state)) {
789 return false; // state filled in by CheckTransaction
790 }
791
792 // Coinbase is only valid in a block, not as a loose transaction
793 if (tx.IsCoinBase())
794 return state.Invalid(TxValidationResult::TX_CONSENSUS, "coinbase");
795
796 // Rather not work on nonstandard transactions (unless -testnet/-regtest)
797 std::string reason;
798 if (m_pool.m_opts.require_standard && !IsStandardTx(tx, m_pool.m_opts.max_datacarrier_bytes, m_pool.m_opts.permit_bare_multisig, m_pool.m_opts.dust_relay_feerate, reason)) {
799 return state.Invalid(TxValidationResult::TX_NOT_STANDARD, reason);
800 }
801
802 // Transactions smaller than 65 non-witness bytes are not relayed to mitigate CVE-2017-12842.
804 return state.Invalid(TxValidationResult::TX_NOT_STANDARD, "tx-size-small");
805
806 // Only accept nLockTime-using transactions that can be mined in the next
807 // block; we don't want our mempool filled up with transactions that can't
808 // be mined yet.
809 if (!CheckFinalTxAtTip(*Assert(m_active_chainstate.m_chain.Tip()), tx)) {
810 return state.Invalid(TxValidationResult::TX_PREMATURE_SPEND, "non-final");
811 }
812
813 if (m_pool.exists(tx.GetWitnessHash())) {
814 // Exact transaction already exists in the mempool.
815 return state.Invalid(TxValidationResult::TX_CONFLICT, "txn-already-in-mempool");
816 } else if (m_pool.exists(tx.GetHash())) {
817 // Transaction with the same non-witness data but different witness (same txid, different
818 // wtxid) already exists in the mempool.
819 return state.Invalid(TxValidationResult::TX_CONFLICT, "txn-same-nonwitness-data-in-mempool");
820 }
821
822 // Check for conflicts with in-memory transactions
823 for (const CTxIn &txin : tx.vin)
824 {
825 const CTransaction* ptxConflicting = m_pool.GetConflictTx(txin.prevout);
826 if (ptxConflicting) {
827 if (!args.m_allow_replacement) {
828 // Transaction conflicts with a mempool tx, but we're not allowing replacements in this context.
829 return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "bip125-replacement-disallowed");
830 }
831 ws.m_conflicts.insert(ptxConflicting->GetHash());
832 }
833 }
834
835 m_view.SetBackend(m_viewmempool);
836
837 const CCoinsViewCache& coins_cache = m_active_chainstate.CoinsTip();
838 // do all inputs exist?
839 for (const CTxIn& txin : tx.vin) {
840 if (!coins_cache.HaveCoinInCache(txin.prevout)) {
841 coins_to_uncache.push_back(txin.prevout);
842 }
843
844 // Note: this call may add txin.prevout to the coins cache
845 // (coins_cache.cacheCoins) by way of FetchCoin(). It should be removed
846 // later (via coins_to_uncache) if this tx turns out to be invalid.
847 if (!m_view.HaveCoin(txin.prevout)) {
848 // Are inputs missing because we already have the tx?
849 for (size_t out = 0; out < tx.vout.size(); out++) {
850 // Optimistically just do efficient check of cache for outputs
851 if (coins_cache.HaveCoinInCache(COutPoint(hash, out))) {
852 return state.Invalid(TxValidationResult::TX_CONFLICT, "txn-already-known");
853 }
854 }
855 // Otherwise assume this might be an orphan tx for which we just haven't seen parents yet
856 return state.Invalid(TxValidationResult::TX_MISSING_INPUTS, "bad-txns-inputs-missingorspent");
857 }
858 }
859
860 // This is const, but calls into `CCoinsViewCache::GetBestBlock()` to refresh
861 // the cached best block through `m_viewmempool` after caching inputs.
862 (void)m_view.GetBestBlock();
863
864 // All required inputs are cached now, so switch m_view to the empty backend.
865 // This keeps already-fetched cache entries for later checks and prevents new
866 // backend lookups (which would avoid coins_to_uncache tracking).
867 m_view.SetBackend(CoinsViewEmpty::Get());
868
869 assert(m_active_chainstate.m_blockman.LookupBlockIndex(m_view.GetBestBlock()) == m_active_chainstate.m_chain.Tip());
870
871 // Only accept BIP68 sequence locked transactions that can be mined in the next
872 // block; we don't want our mempool filled up with transactions that can't
873 // be mined yet.
874 // Pass in m_view which has all of the relevant inputs cached. Note that, since m_view's
875 // backend was removed, it no longer pulls coins from the mempool.
876 const std::optional<LockPoints> lock_points{CalculateLockPointsAtTip(m_active_chainstate.m_chain.Tip(), m_view, tx)};
877 if (!lock_points.has_value() || !CheckSequenceLocksAtTip(m_active_chainstate.m_chain.Tip(), *lock_points)) {
878 return state.Invalid(TxValidationResult::TX_PREMATURE_SPEND, "non-BIP68-final");
879 }
880
881 // The mempool holds txs for the next block, so pass height+1 to CheckTxInputs
882 if (!Consensus::CheckTxInputs(tx, state, m_view, m_active_chainstate.m_chain.Height() + 1, ws.m_base_fees)) {
883 return false; // state filled in by CheckTxInputs
884 }
885
886 if (m_pool.m_opts.require_standard) {
887 state = ValidateInputsStandardness(tx, m_view);
888 if (state.IsInvalid()) {
889 return false;
890 }
891 }
892
893 // Check for non-standard witnesses.
894 if (tx.HasWitness() && m_pool.m_opts.require_standard && !IsWitnessStandard(tx, m_view)) {
895 return state.Invalid(TxValidationResult::TX_WITNESS_MUTATED, "bad-witness-nonstandard");
896 }
897
899
900 // Keep track of transactions that spend a coinbase, which we re-scan
901 // during reorgs to ensure COINBASE_MATURITY is still met.
902 bool fSpendsCoinbase = false;
903 for (const CTxIn &txin : tx.vin) {
904 const Coin &coin = m_view.AccessCoin(txin.prevout);
905 if (coin.IsCoinBase()) {
906 fSpendsCoinbase = true;
907 break;
908 }
909 }
910
911 // Set entry_sequence to 0 when bypass_limits is used; this allows txs from a block
912 // reorg to be marked earlier than any child txs that were already in the mempool.
913 const uint64_t entry_sequence = bypass_limits ? 0 : m_pool.GetSequence();
914 if (!m_subpackage.m_changeset) {
915 m_subpackage.m_changeset = m_pool.GetChangeSet();
916 }
917 ws.m_tx_handle = m_subpackage.m_changeset->StageAddition(ptx, ws.m_base_fees, nAcceptTime, m_active_chainstate.m_chain.Height(), entry_sequence, fSpendsCoinbase, nSigOpsCost, lock_points.value());
918
919 // ws.m_modified_fees includes any fee deltas from PrioritiseTransaction
920 ws.m_modified_fees = ws.m_tx_handle->GetModifiedFee();
921
922 ws.m_vsize = ws.m_tx_handle->GetTxSize();
923
924 // Enforces 0-fee for dust transactions, no incentive to be mined alone
925 if (m_pool.m_opts.require_standard) {
926 if (!PreCheckEphemeralTx(*ptx, m_pool.m_opts.dust_relay_feerate, ws.m_base_fees, ws.m_modified_fees, state)) {
927 return false; // state filled in by PreCheckEphemeralTx
928 }
929 }
930
932 return state.Invalid(TxValidationResult::TX_NOT_STANDARD, "bad-txns-too-many-sigops",
933 strprintf("%d", nSigOpsCost));
934
935 // No individual transactions are allowed below the mempool min feerate except from disconnected
936 // blocks and transactions in a package. Package transactions will be checked using package
937 // feerate later.
938 if (!bypass_limits && !args.m_package_feerates && !CheckFeeRate(ws.m_vsize, ws.m_modified_fees, state)) return false;
939
940 ws.m_iters_conflicting = m_pool.GetIterSet(ws.m_conflicts);
941
942 ws.m_parents = m_pool.GetParents(*ws.m_tx_handle);
943
944 if (!args.m_bypass_limits) {
945 // Perform the TRUC checks, using the in-mempool parents.
946 if (const auto err{SingleTRUCChecks(m_pool, ws.m_ptx, ws.m_parents, ws.m_conflicts, ws.m_vsize)}) {
947 // Single transaction contexts only.
948 if (args.m_allow_sibling_eviction && err->second != nullptr) {
949 // We should only be considering where replacement is considered valid as well.
950 Assume(args.m_allow_replacement);
951 // Potential sibling eviction. Add the sibling to our list of mempool conflicts to be
952 // included in RBF checks.
953 ws.m_conflicts.insert(err->second->GetHash());
954 // Adding the sibling to m_iters_conflicting here means that it doesn't count towards
955 // RBF Carve Out above. This is correct, since removing to-be-replaced transactions from
956 // the descendant count is done separately in SingleTRUCChecks for TRUC transactions.
957 ws.m_iters_conflicting.insert(m_pool.GetIter(err->second->GetHash()).value());
958 ws.m_sibling_eviction = true;
959 // The sibling will be treated as part of the to-be-replaced set in ReplacementChecks.
960 // Note that we are not checking whether it opts in to replaceability via BIP125 or TRUC
961 // (which is normally done in PreChecks). However, the only way a TRUC transaction can
962 // have a non-TRUC and non-BIP125 descendant is due to a reorg.
963 } else {
964 return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "TRUC-violation", err->first);
965 }
966 }
967 }
968
969 // We want to detect conflicts in any tx in a package to trigger package RBF logic
970 m_subpackage.m_rbf |= !ws.m_conflicts.empty();
971 return true;
972}
973
974bool MemPoolAccept::ReplacementChecks(Workspace& ws)
975{
977 AssertLockHeld(m_pool.cs);
978
979 const CTransaction& tx = *ws.m_ptx;
980 const Txid& hash = ws.m_hash;
981 TxValidationState& state = ws.m_state;
982
984
985 // Calculate all conflicting entries and enforce Rule #5.
986 if (const auto err_string{GetEntriesForConflicts(tx, m_pool, ws.m_iters_conflicting, all_conflicts)}) {
988 strprintf("too many potential replacements%s", ws.m_sibling_eviction ? " (including sibling eviction)" : ""), *err_string);
989 }
990
991 // Check if it's economically rational to mine this transaction rather than the ones it
992 // replaces and pays for its own relay fees. Enforce Rules #3 and #4.
994 m_subpackage.m_conflicting_fees += it->GetModifiedFee();
995 m_subpackage.m_conflicting_size += it->GetTxSize();
996 }
997
998 if (const auto err_string{PaysForRBF(m_subpackage.m_conflicting_fees, ws.m_modified_fees, ws.m_vsize,
999 m_pool.m_opts.incremental_relay_feerate, hash)}) {
1000 // Result may change in a package context
1002 strprintf("insufficient fee%s", ws.m_sibling_eviction ? " (including sibling eviction)" : ""), *err_string);
1003 }
1004
1005 // Add all the to-be-removed transactions to the changeset.
1006 for (auto it : all_conflicts) {
1007 m_subpackage.m_changeset->StageRemoval(it);
1008 }
1009
1010 // Run cluster size limit checks and fail if we exceed them.
1011 if (!m_subpackage.m_changeset->CheckMemPoolPolicyLimits()) {
1012 return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "too-large-cluster", "");
1013 }
1014
1015 if (const auto err_string{ImprovesFeerateDiagram(*m_subpackage.m_changeset)}) {
1016 // We checked above for the cluster size limits being respected, so a
1017 // failure here can only be due to an insufficient fee.
1019 return state.Invalid(TxValidationResult::TX_RECONSIDERABLE, "replacement-failed", err_string->second);
1020 }
1021
1022 return true;
1023}
1024
1025bool MemPoolAccept::PackageRBFChecks(const std::vector<CTransactionRef>& txns,
1026 std::vector<Workspace>& workspaces,
1028{
1030 AssertLockHeld(m_pool.cs);
1031
1032 assert(std::all_of(txns.cbegin(), txns.cend(), [this](const auto& tx)
1033 { return !m_pool.exists(tx->GetHash());}));
1034
1035 assert(txns.size() == workspaces.size());
1036
1037 // We're in package RBF context; replacement proposal must be size 2
1038 if (workspaces.size() != 2 || !Assume(IsChildWithParents(txns))) {
1039 return package_state.Invalid(PackageValidationResult::PCKG_POLICY, "package RBF failed: package must be 1-parent-1-child");
1040 }
1041
1042 // If the package has in-mempool parents, we won't consider a package RBF
1043 // since it would result in a cluster larger than 2.
1044 // N.B. To relax this constraint we will need to revisit how CCoinsViewMemPool::PackageAddTransaction
1045 // is being used inside AcceptMultipleTransactions to track available inputs while processing a package.
1046 // Specifically we would need to check that the ancestors of the new
1047 // transactions don't intersect with the set of transactions to be removed
1048 // due to RBF, which is not checked at all in the package acceptance
1049 // context.
1050 for (const auto& ws : workspaces) {
1051 if (!ws.m_parents.empty()) {
1052 return package_state.Invalid(PackageValidationResult::PCKG_POLICY, "package RBF failed: new transaction cannot have mempool ancestors");
1053 }
1054 }
1055
1056 // Aggregate all conflicts into one set.
1058 for (Workspace& ws : workspaces) {
1059 // Aggregate all conflicts into one set.
1060 direct_conflict_iters.merge(ws.m_iters_conflicting);
1061 }
1062
1063 const auto& parent_ws = workspaces[0];
1064 const auto& child_ws = workspaces[1];
1065
1066 // Don't consider replacements that would cause us to remove a large number of mempool entries.
1067 // This limit is not increased in a package RBF. Use the aggregate number of transactions.
1069 if (const auto err_string{GetEntriesForConflicts(*child_ws.m_ptx, m_pool, direct_conflict_iters,
1070 all_conflicts)}) {
1072 "package RBF failed: too many potential replacements", *err_string);
1073 }
1074
1076 m_subpackage.m_changeset->StageRemoval(it);
1077 m_subpackage.m_conflicting_fees += it->GetModifiedFee();
1078 m_subpackage.m_conflicting_size += it->GetTxSize();
1079 }
1080
1081 // Use the child as the transaction for attributing errors to.
1082 const Txid& child_hash = child_ws.m_ptx->GetHash();
1083 if (const auto err_string{PaysForRBF(/*original_fees=*/m_subpackage.m_conflicting_fees,
1084 /*replacement_fees=*/m_subpackage.m_total_modified_fees,
1085 /*replacement_vsize=*/m_subpackage.m_total_vsize,
1086 m_pool.m_opts.incremental_relay_feerate, child_hash)}) {
1088 "package RBF failed: insufficient anti-DoS fees", *err_string);
1089 }
1090
1091 // Ensure this two transaction package is a "chunk" on its own; we don't want the child
1092 // to be only paying anti-DoS fees
1093 const CFeeRate parent_feerate(parent_ws.m_modified_fees, parent_ws.m_vsize);
1094 const CFeeRate package_feerate(m_subpackage.m_total_modified_fees, m_subpackage.m_total_vsize);
1097 "package RBF failed: package feerate is less than or equal to parent feerate",
1098 strprintf("package feerate %s <= parent feerate is %s", package_feerate.ToString(), parent_feerate.ToString()));
1099 }
1100
1101 // Run cluster size limit checks and fail if we exceed them.
1102 if (!m_subpackage.m_changeset->CheckMemPoolPolicyLimits()) {
1103 return package_state.Invalid(PackageValidationResult::PCKG_POLICY, "too-large-cluster", "");
1104 }
1105
1106 // Check if it's economically rational to mine this package rather than the ones it replaces.
1107 if (const auto err_tup{ImprovesFeerateDiagram(*m_subpackage.m_changeset)}) {
1110 "package RBF failed: " + err_tup.value().second, "");
1111 }
1112
1113 LogDebug(BCLog::TXPACKAGES, "package RBF checks passed: parent %s (wtxid=%s), child %s (wtxid=%s), package hash (%s)\n",
1114 txns.front()->GetHash().ToString(), txns.front()->GetWitnessHash().ToString(),
1115 txns.back()->GetHash().ToString(), txns.back()->GetWitnessHash().ToString(),
1117
1118
1119 return true;
1120}
1121
1122bool MemPoolAccept::PolicyScriptChecks(Workspace& ws)
1123{
1125 AssertLockHeld(m_pool.cs);
1126 const CTransaction& tx = *ws.m_ptx;
1127 TxValidationState& state = ws.m_state;
1128
1129 const script_verify_flags scriptVerifyFlags = (m_pool.m_opts.require_standard ? STANDARD_SCRIPT_VERIFY_FLAGS : m_active_chainstate.m_chainman.m_all_consensus_script_flags);
1130
1131 // Check input scripts and signatures.
1132 // This is done last to help prevent CPU exhaustion denial-of-service attacks.
1133 if (!CheckInputScripts(tx, state, m_view, scriptVerifyFlags, CheckInputScriptsFor::Mempool, true, false, ws.m_precomputed_txdata, GetValidationCache())) {
1134 // Detect a failure due to a missing witness so that p2p code can handle rejection caching appropriately.
1135 if (!tx.HasWitness() && SpendsNonAnchorWitnessProg(tx, m_view)) {
1137 state.GetRejectReason(), state.GetDebugMessage());
1138 }
1139 return false; // state filled in by CheckInputScripts
1140 }
1141
1142 return true;
1143}
1144
1145bool MemPoolAccept::ConsensusScriptChecks(Workspace& ws)
1146{
1148 AssertLockHeld(m_pool.cs);
1149 const CTransaction& tx = *ws.m_ptx;
1150 const Txid& hash = ws.m_hash;
1151 TxValidationState& state = ws.m_state;
1152
1153 // Check again against the current block tip's script verification
1154 // flags to cache our script execution flags. This is, of course,
1155 // useless if the next block has different script flags from the
1156 // previous one, but because the cache tracks script flags for us it
1157 // will auto-invalidate and we'll just have a few blocks of extra
1158 // misses on soft-fork activation.
1159 //
1160 // This is also useful in case of bugs in the standard flags that cause
1161 // transactions to pass as valid when they're actually invalid. For
1162 // instance the STRICTENC flag was incorrectly allowing certain
1163 // CHECKSIG NOT scripts to pass, even though they were invalid.
1164 //
1165 // There is a similar check in CreateNewBlock() to prevent creating
1166 // invalid blocks (using TestBlockValidity), however allowing such
1167 // transactions into the mempool can be exploited as a DoS attack.
1168 script_verify_flags currentBlockScriptVerifyFlags{GetBlockScriptFlags(*m_active_chainstate.m_chain.Tip(), m_active_chainstate.m_chainman)};
1169
1170 if (!CheckInputsFromMempoolAndCache(tx, state, m_view, m_pool, currentBlockScriptVerifyFlags,
1171 ws.m_precomputed_txdata, m_active_chainstate.CoinsTip(), GetValidationCache())) {
1172 LogError("BUG! PLEASE REPORT THIS! CheckInputScripts failed against latest-block but not mempool flags %s, %s", hash.ToString(), state.ToString());
1173 return Assume(false);
1174 }
1175
1176 return true;
1177}
1178
1179void MemPoolAccept::FinalizeSubpackage(const ATMPArgs& args)
1180{
1182 AssertLockHeld(m_pool.cs);
1183
1184 if (!m_subpackage.m_changeset->GetRemovals().empty()) Assume(args.m_allow_replacement);
1185 // Remove conflicting transactions from the mempool
1186 for (CTxMemPool::txiter it : m_subpackage.m_changeset->GetRemovals())
1187 {
1188 std::string log_string = strprintf("replacing mempool tx %s (wtxid=%s, fees=%s, vsize=%s). ",
1189 it->GetTx().GetHash().ToString(),
1190 it->GetTx().GetWitnessHash().ToString(),
1191 it->GetFee(),
1192 it->GetTxSize());
1193 FeeFrac feerate{m_subpackage.m_total_modified_fees, int32_t(m_subpackage.m_total_vsize)};
1195 const bool replaced_with_tx{m_subpackage.m_changeset->GetTxCount() == 1};
1196 if (replaced_with_tx) {
1197 const CTransaction& tx = m_subpackage.m_changeset->GetAddedTxn(0);
1199 log_string += strprintf("New tx %s (wtxid=%s, fees=%s, vsize=%s)",
1200 tx.GetHash().ToString(),
1201 tx.GetWitnessHash().ToString(),
1202 feerate.fee,
1203 feerate.size);
1204 } else {
1205 tx_or_package_hash = GetPackageHash(m_subpackage.m_changeset->GetAddedTxns());
1206 log_string += strprintf("New package %s with %lu txs, fees=%s, vsize=%s",
1207 tx_or_package_hash.ToString(),
1208 m_subpackage.m_changeset->GetTxCount(),
1209 feerate.fee,
1210 feerate.size);
1211
1212 }
1214 TRACEPOINT(mempool, replaced,
1215 it->GetTx().GetHash().data(),
1216 it->GetTxSize(),
1217 it->GetFee(),
1218 std::chrono::duration_cast<std::chrono::duration<std::uint64_t>>(it->GetTime()).count(),
1219 tx_or_package_hash.data(),
1220 feerate.size,
1221 feerate.fee,
1223 );
1224 m_subpackage.m_replaced_transactions.push_back(it->GetSharedTx());
1225 }
1226 m_subpackage.m_changeset->Apply();
1227 m_subpackage.m_changeset.reset();
1228}
1229
1230bool MemPoolAccept::SubmitPackage(const ATMPArgs& args, std::vector<Workspace>& workspaces,
1232 std::map<Wtxid, MempoolAcceptResult>& results)
1233{
1235 AssertLockHeld(m_pool.cs);
1236 // Sanity check: none of the transactions should be in the mempool, and none of the transactions
1237 // should have a same-txid-different-witness equivalent in the mempool.
1238 assert(std::all_of(workspaces.cbegin(), workspaces.cend(), [this](const auto& ws) { return !m_pool.exists(ws.m_ptx->GetHash()); }));
1239
1240 bool all_submitted = true;
1242 // ConsensusScriptChecks adds to the script cache and is therefore consensus-critical;
1243 // CheckInputsFromMempoolAndCache asserts that transactions only spend coins available from the
1244 // mempool or UTXO set. Submit each transaction to the mempool immediately after calling
1245 // ConsensusScriptChecks to make the outputs available for subsequent transactions.
1246 for (Workspace& ws : workspaces) {
1247 if (!ConsensusScriptChecks(ws)) {
1248 results.emplace(ws.m_ptx->GetWitnessHash(), MempoolAcceptResult::Failure(ws.m_state));
1249 // Since PolicyScriptChecks() passed, this should never fail.
1250 Assume(false);
1251 all_submitted = false;
1253 strprintf("BUG! PolicyScriptChecks succeeded but ConsensusScriptChecks failed: %s",
1254 ws.m_ptx->GetHash().ToString()));
1255 }
1256 // Remove first failing tx and all subsequent in package
1257 if (!all_submitted) {
1258 if (!m_subpackage.m_changeset) m_subpackage.m_changeset = m_pool.GetChangeSet();
1259 m_subpackage.m_changeset->StageRemoval(m_pool.GetIter(ws.m_ptx->GetHash()).value());
1260 }
1261 }
1262 if (!all_submitted) {
1263 Assume(m_subpackage.m_changeset);
1264 // This code should be unreachable; it's here as belt-and-suspenders
1265 // to try to ensure we have no consensus-invalid transactions in the
1266 // mempool.
1267 m_subpackage.m_changeset->Apply();
1268 m_subpackage.m_changeset.reset();
1269 return false;
1270 }
1271
1272 std::vector<Wtxid> all_package_wtxids;
1273 all_package_wtxids.reserve(workspaces.size());
1274 std::transform(workspaces.cbegin(), workspaces.cend(), std::back_inserter(all_package_wtxids),
1275 [](const auto& ws) { return ws.m_ptx->GetWitnessHash(); });
1276
1277 if (!m_subpackage.m_replaced_transactions.empty()) {
1278 LogDebug(BCLog::MEMPOOL, "replaced %u mempool transactions with %u new one(s) for %s additional fees, %d delta bytes\n",
1279 m_subpackage.m_replaced_transactions.size(), workspaces.size(),
1280 m_subpackage.m_total_modified_fees - m_subpackage.m_conflicting_fees,
1281 m_subpackage.m_total_vsize - static_cast<int>(m_subpackage.m_conflicting_size));
1282 }
1283
1284 // Add successful results. The returned results may change later if LimitMempoolSize() evicts them.
1285 for (Workspace& ws : workspaces) {
1286 auto iter = m_pool.GetIter(ws.m_ptx->GetHash());
1287 Assume(iter.has_value());
1288 const auto effective_feerate = args.m_package_feerates ? ws.m_package_feerate :
1289 CFeeRate{ws.m_modified_fees, static_cast<int32_t>(ws.m_vsize)};
1290 const auto effective_feerate_wtxids = args.m_package_feerates ? all_package_wtxids :
1291 std::vector<Wtxid>{ws.m_ptx->GetWitnessHash()};
1292 results.emplace(ws.m_ptx->GetWitnessHash(),
1293 MempoolAcceptResult::Success(std::move(m_subpackage.m_replaced_transactions), ws.m_vsize,
1295 if (!m_pool.m_opts.signals) continue;
1296 const CTransaction& tx = *ws.m_ptx;
1297 const auto tx_info = NewMempoolTransactionInfo(ws.m_ptx, ws.m_base_fees,
1298 ws.m_vsize, (*iter)->GetHeight(),
1299 args.m_bypass_limits, args.m_package_submission,
1300 IsCurrentForFeeEstimation(m_active_chainstate),
1301 m_pool.HasNoInputsOf(tx));
1302 m_pool.m_opts.signals->TransactionAddedToMempool(tx_info, m_pool.GetAndIncrementSequence());
1303 }
1304 return all_submitted;
1305}
1306
1307MempoolAcceptResult MemPoolAccept::AcceptSingleTransactionInternal(const CTransactionRef& ptx, ATMPArgs& args)
1308{
1310 AssertLockHeld(m_pool.cs);
1311
1312 Workspace ws(ptx);
1313 const std::vector<Wtxid> single_wtxid{ws.m_ptx->GetWitnessHash()};
1314
1315 if (!PreChecks(args, ws)) {
1316 if (ws.m_state.GetResult() == TxValidationResult::TX_RECONSIDERABLE) {
1317 // Failed for fee reasons. Provide the effective feerate and which tx was included.
1318 return MempoolAcceptResult::FeeFailure(ws.m_state, CFeeRate(ws.m_modified_fees, ws.m_vsize), single_wtxid);
1319 }
1320 return MempoolAcceptResult::Failure(ws.m_state);
1321 }
1322
1323 if (m_subpackage.m_rbf && !ReplacementChecks(ws)) {
1324 if (ws.m_state.GetResult() == TxValidationResult::TX_RECONSIDERABLE) {
1325 // Failed for incentives-based fee reasons. Provide the effective feerate and which tx was included.
1326 return MempoolAcceptResult::FeeFailure(ws.m_state, CFeeRate(ws.m_modified_fees, ws.m_vsize), single_wtxid);
1327 }
1328 return MempoolAcceptResult::Failure(ws.m_state);
1329 }
1330
1331 // Check if the transaction would exceed the cluster size limit.
1332 if (!m_subpackage.m_changeset->CheckMemPoolPolicyLimits()) {
1333 ws.m_state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "too-large-cluster", "");
1334 return MempoolAcceptResult::Failure(ws.m_state);
1335 }
1336
1337 // Now that we've verified the cluster limit is respected, we can perform
1338 // calculations involving the full ancestors of the tx.
1339 if (ws.m_conflicts.size()) {
1340 auto ancestors = m_subpackage.m_changeset->CalculateMemPoolAncestors(ws.m_tx_handle);
1341
1342 // A transaction that spends outputs that would be replaced by it is invalid. Now
1343 // that we have the set of all ancestors we can detect this
1344 // pathological case by making sure ws.m_conflicts and this tx's ancestors don't
1345 // intersect.
1346 if (const auto err_string{EntriesAndTxidsDisjoint(ancestors, ws.m_conflicts, ptx->GetHash())}) {
1347 // We classify this as a consensus error because a transaction depending on something it
1348 // conflicts with would be inconsistent.
1349 ws.m_state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-txns-spends-conflicting-tx", *err_string);
1350 return MempoolAcceptResult::Failure(ws.m_state);
1351 }
1352 }
1353
1354 m_subpackage.m_total_vsize = ws.m_vsize;
1355 m_subpackage.m_total_modified_fees = ws.m_modified_fees;
1356
1357 // Individual modified feerate exceeded caller-defined max; abort
1358 if (args.m_client_maxfeerate && CFeeRate(ws.m_modified_fees, ws.m_vsize) > args.m_client_maxfeerate.value()) {
1359 ws.m_state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "max feerate exceeded", "");
1360 return MempoolAcceptResult::Failure(ws.m_state);
1361 }
1362
1363 if (!args.m_bypass_limits && m_pool.m_opts.require_standard) {
1365 if (!CheckEphemeralSpends(/*package=*/{ptx}, m_pool.m_opts.dust_relay_feerate, m_pool, ws.m_state, dummy_wtxid)) {
1366 return MempoolAcceptResult::Failure(ws.m_state);
1367 }
1368 }
1369
1370 // Perform the inexpensive checks first and avoid hashing and signature verification unless
1371 // those checks pass, to mitigate CPU exhaustion denial-of-service attacks.
1372 if (!PolicyScriptChecks(ws)) return MempoolAcceptResult::Failure(ws.m_state);
1373
1374 if (!ConsensusScriptChecks(ws)) return MempoolAcceptResult::Failure(ws.m_state);
1375
1376 const CFeeRate effective_feerate{ws.m_modified_fees, static_cast<int32_t>(ws.m_vsize)};
1377 // Tx was accepted, but not added
1378 if (args.m_test_accept) {
1379 return MempoolAcceptResult::Success(std::move(m_subpackage.m_replaced_transactions), ws.m_vsize,
1380 ws.m_base_fees, effective_feerate, single_wtxid);
1381 }
1382
1384
1385 // Limit the mempool, if appropriate.
1386 if (!args.m_package_submission && !args.m_bypass_limits) {
1387 LimitMempoolSize(m_pool, m_active_chainstate.CoinsTip());
1388 // If mempool contents change, then the m_view cache is dirty. Given this isn't a package
1389 // submission, we won't be using the cache anymore, but clear it anyway for clarity.
1391
1392 if (!m_pool.exists(ws.m_hash)) {
1393 // The tx no longer meets our (new) mempool minimum feerate but could be reconsidered in a package.
1394 ws.m_state.Invalid(TxValidationResult::TX_RECONSIDERABLE, "mempool full");
1395 return MempoolAcceptResult::FeeFailure(ws.m_state, CFeeRate(ws.m_modified_fees, ws.m_vsize), {ws.m_ptx->GetWitnessHash()});
1396 }
1397 }
1398
1399 if (m_pool.m_opts.signals) {
1400 const CTransaction& tx = *ws.m_ptx;
1401 auto iter = m_pool.GetIter(tx.GetHash());
1402 Assume(iter.has_value());
1403 const auto tx_info = NewMempoolTransactionInfo(ws.m_ptx, ws.m_base_fees,
1404 ws.m_vsize, (*iter)->GetHeight(),
1405 args.m_bypass_limits, args.m_package_submission,
1406 IsCurrentForFeeEstimation(m_active_chainstate),
1407 m_pool.HasNoInputsOf(tx));
1408 m_pool.m_opts.signals->TransactionAddedToMempool(tx_info, m_pool.GetAndIncrementSequence());
1409 }
1410
1411 if (!m_subpackage.m_replaced_transactions.empty()) {
1412 LogDebug(BCLog::MEMPOOL, "replaced %u mempool transactions with 1 new transaction for %s additional fees, %d delta bytes\n",
1413 m_subpackage.m_replaced_transactions.size(),
1414 ws.m_modified_fees - m_subpackage.m_conflicting_fees,
1415 ws.m_vsize - static_cast<int>(m_subpackage.m_conflicting_size));
1416 }
1417
1418 return MempoolAcceptResult::Success(std::move(m_subpackage.m_replaced_transactions), ws.m_vsize, ws.m_base_fees,
1420}
1421
1422PackageMempoolAcceptResult MemPoolAccept::AcceptMultipleTransactionsInternal(const std::vector<CTransactionRef>& txns, ATMPArgs& args)
1423{
1425 AssertLockHeld(m_pool.cs);
1426
1427 // These context-free package limits can be done before taking the mempool lock.
1430
1431 std::vector<Workspace> workspaces{};
1432 workspaces.reserve(txns.size());
1433 std::transform(txns.cbegin(), txns.cend(), std::back_inserter(workspaces),
1434 [](const auto& tx) { return Workspace(tx); });
1435 std::map<Wtxid, MempoolAcceptResult> results;
1436
1437 // Do all PreChecks first and fail fast to avoid running expensive script checks when unnecessary.
1438 for (Workspace& ws : workspaces) {
1439 if (!PreChecks(args, ws)) {
1440 package_state.Invalid(PackageValidationResult::PCKG_TX, "transaction failed");
1441 // Exit early to avoid doing pointless work. Update the failed tx result; the rest are unfinished.
1442 results.emplace(ws.m_ptx->GetWitnessHash(), MempoolAcceptResult::Failure(ws.m_state));
1444 }
1445
1446 // Individual modified feerate exceeded caller-defined max; abort
1447 // N.B. this doesn't take into account CPFPs. Chunk-aware validation may be more robust.
1448 if (args.m_client_maxfeerate && CFeeRate(ws.m_modified_fees, ws.m_vsize) > args.m_client_maxfeerate.value()) {
1449 // Need to set failure here both individually and at package level
1450 ws.m_state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "max feerate exceeded", "");
1451 package_state.Invalid(PackageValidationResult::PCKG_TX, "transaction failed");
1452 // Exit early to avoid doing pointless work. Update the failed tx result; the rest are unfinished.
1453 results.emplace(ws.m_ptx->GetWitnessHash(), MempoolAcceptResult::Failure(ws.m_state));
1455 }
1456
1457 // Make the coins created by this transaction available for subsequent transactions in the
1458 // package to spend. If there are no conflicts within the package, no transaction can spend a coin
1459 // needed by another transaction in the package. We also need to make sure that no package
1460 // tx replaces (or replaces the ancestor of) the parent of another package tx. As long as we
1461 // check these two things, we don't need to track the coins spent.
1462 // If a package tx conflicts with a mempool tx, PackageRBFChecks() ensures later that any package RBF attempt
1463 // has *no* in-mempool ancestors, so we don't have to worry about subsequent transactions in
1464 // same package spending the same in-mempool outpoints. This needs to be revisited for general
1465 // package RBF.
1466 m_viewmempool.PackageAddTransaction(ws.m_ptx);
1467 }
1468
1469 // At this point we have all in-mempool parents, and we know every transaction's vsize.
1470 // Run the TRUC checks on the package.
1471 for (Workspace& ws : workspaces) {
1472 if (auto err{PackageTRUCChecks(m_pool, ws.m_ptx, ws.m_vsize, txns, ws.m_parents)}) {
1473 package_state.Invalid(PackageValidationResult::PCKG_POLICY, "TRUC-violation", err.value());
1475 }
1476 }
1477
1478 // Transactions must meet two minimum feerates: the mempool minimum fee and min relay fee.
1479 // For transactions consisting of exactly one child and its parents, it suffices to use the
1480 // package feerate (total modified fees / total virtual size) to check this requirement.
1481 // Note that this is an aggregate feerate; this function has not checked that there are transactions
1482 // too low feerate to pay for themselves, or that the child transactions are higher feerate than
1483 // their parents. Using aggregate feerate may allow "parents pay for child" behavior and permit
1484 // a child that is below mempool minimum feerate. To avoid these behaviors, callers of
1485 // AcceptMultipleTransactions need to restrict txns topology (e.g. to ancestor sets) and check
1486 // the feerates of individuals and subsets.
1487 m_subpackage.m_total_vsize = std::accumulate(workspaces.cbegin(), workspaces.cend(), int64_t{0},
1488 [](int64_t sum, auto& ws) { return sum + ws.m_vsize; });
1489 m_subpackage.m_total_modified_fees = std::accumulate(workspaces.cbegin(), workspaces.cend(), CAmount{0},
1490 [](CAmount sum, auto& ws) { return sum + ws.m_modified_fees; });
1491 const CFeeRate package_feerate(m_subpackage.m_total_modified_fees, m_subpackage.m_total_vsize);
1492 std::vector<Wtxid> all_package_wtxids;
1493 all_package_wtxids.reserve(workspaces.size());
1494 std::transform(workspaces.cbegin(), workspaces.cend(), std::back_inserter(all_package_wtxids),
1495 [](const auto& ws) { return ws.m_ptx->GetWitnessHash(); });
1497 if (args.m_package_feerates &&
1498 !CheckFeeRate(m_subpackage.m_total_vsize, m_subpackage.m_total_modified_fees, placeholder_state)) {
1500 return PackageMempoolAcceptResult(package_state, {{workspaces.back().m_ptx->GetWitnessHash(),
1501 MempoolAcceptResult::FeeFailure(placeholder_state, CFeeRate(m_subpackage.m_total_modified_fees, m_subpackage.m_total_vsize), all_package_wtxids)}});
1502 }
1503
1504 // Apply package mempool RBF checks.
1505 if (m_subpackage.m_rbf && !PackageRBFChecks(txns, workspaces, package_state)) {
1507 }
1508
1509 // Check if the transactions would exceed the cluster size limit.
1510 if (!m_subpackage.m_changeset->CheckMemPoolPolicyLimits()) {
1511 package_state.Invalid(PackageValidationResult::PCKG_POLICY, "too-large-cluster", "");
1513 }
1514
1515 // Now that we've bounded the resulting possible ancestry count, check package for dust spends
1516 if (m_pool.m_opts.require_standard) {
1519 if (!CheckEphemeralSpends(txns, m_pool.m_opts.dust_relay_feerate, m_pool, child_state, child_wtxid)) {
1520 package_state.Invalid(PackageValidationResult::PCKG_TX, "unspent-dust");
1523 }
1524 }
1525
1526 for (Workspace& ws : workspaces) {
1527 ws.m_package_feerate = package_feerate;
1528 if (!PolicyScriptChecks(ws)) {
1529 // Exit early to avoid doing pointless work. Update the failed tx result; the rest are unfinished.
1530 package_state.Invalid(PackageValidationResult::PCKG_TX, "transaction failed");
1531 results.emplace(ws.m_ptx->GetWitnessHash(), MempoolAcceptResult::Failure(ws.m_state));
1533 }
1534 if (args.m_test_accept) {
1535 const auto effective_feerate = args.m_package_feerates ? ws.m_package_feerate :
1536 CFeeRate{ws.m_modified_fees, static_cast<int32_t>(ws.m_vsize)};
1537 const auto effective_feerate_wtxids = args.m_package_feerates ? all_package_wtxids :
1538 std::vector<Wtxid>{ws.m_ptx->GetWitnessHash()};
1539 results.emplace(ws.m_ptx->GetWitnessHash(),
1540 MempoolAcceptResult::Success(std::move(m_subpackage.m_replaced_transactions),
1541 ws.m_vsize, ws.m_base_fees, effective_feerate,
1543 }
1544 }
1545
1546 if (args.m_test_accept) return PackageMempoolAcceptResult(package_state, std::move(results));
1547
1549 // PackageValidationState filled in by SubmitPackage().
1551 }
1552
1554}
1555
1556void MemPoolAccept::CleanupTemporaryCoins()
1557{
1558 // There are 3 kinds of coins in m_view:
1559 // (1) Temporary coins from the transactions in subpackage, constructed by m_viewmempool.
1560 // (2) Mempool coins from transactions in the mempool, constructed by m_viewmempool.
1561 // (3) Confirmed coins fetched from our current UTXO set.
1562 //
1563 // (1) Temporary coins need to be removed, regardless of whether the transaction was submitted.
1564 // If the transaction was submitted to the mempool, m_viewmempool will be able to fetch them from
1565 // there. If it wasn't submitted to mempool, it is incorrect to keep them - future calls may try
1566 // to spend those coins that don't actually exist.
1567 // (2) Mempool coins also need to be removed. If the mempool contents have changed as a result
1568 // of submitting or replacing transactions, coins previously fetched from mempool may now be
1569 // spent or nonexistent. Those coins need to be deleted from m_view.
1570 // (3) Confirmed coins don't need to be removed. The chainstate has not changed (we are
1571 // holding cs_main and no blocks have been processed) so the confirmed tx cannot disappear like
1572 // a mempool tx can. The coin may now be spent after we submitted a tx to mempool, but
1573 // we have already checked that the package does not have 2 transactions spending the same coin
1574 // and we check whether a mempool transaction spends conflicting coins (CTxMemPool::GetConflictTx).
1575 // Keeping them in m_view is an optimization to not re-fetch confirmed coins if we later look up
1576 // inputs for this transaction again.
1577 for (const auto& outpoint : m_viewmempool.GetNonBaseCoins()) {
1578 // In addition to resetting m_viewmempool, we also need to manually delete these coins from
1579 // m_view because it caches copies of the coins it fetched from m_viewmempool previously.
1580 m_view.Uncache(outpoint);
1581 }
1582 // This deletes the temporary and mempool coins.
1583 m_viewmempool.Reset();
1584}
1585
1586PackageMempoolAcceptResult MemPoolAccept::AcceptSubPackage(const std::vector<CTransactionRef>& subpackage, ATMPArgs& args)
1587{
1589 AssertLockHeld(m_pool.cs);
1590 auto result = [&]() EXCLUSIVE_LOCKS_REQUIRED(::cs_main, m_pool.cs) {
1591 if (subpackage.size() > 1) {
1593 }
1594 const auto& tx = subpackage.front();
1595 ATMPArgs single_args = ATMPArgs::SingleInPackageAccept(args);
1600 }
1602 }();
1603
1604 // Clean up m_view and m_viewmempool so that other subpackage evaluations don't have access to
1605 // coins they shouldn't. Keep some coins in order to minimize re-fetching coins from the UTXO set.
1606 // Clean up package feerate and rbf calculations
1608
1609 return result;
1610}
1611
1612PackageMempoolAcceptResult MemPoolAccept::AcceptPackage(const Package& package, ATMPArgs& args)
1613{
1614 Assert(!package.empty());
1616 // Used if returning a PackageMempoolAcceptResult directly from this function.
1618
1619 // There are two topologies we are able to handle through this function:
1620 // (1) A single transaction
1621 // (2) A child-with-parents package.
1622 // Check that the package is well-formed. If it isn't, we won't try to validate any of the
1623 // transactions and thus won't return any MempoolAcceptResults, just a package-wide error.
1624
1625 // Context-free package checks.
1628 }
1629
1630 if (package.size() > 1 && !IsChildWithParents(package)) {
1631 // All transactions in the package must be a parent of the last transaction. This is just an
1632 // opportunity for us to fail fast on a context-free check without taking the mempool lock.
1633 package_state_quit_early.Invalid(PackageValidationResult::PCKG_POLICY, "package-not-child-with-parents");
1635 }
1636
1637 LOCK(m_pool.cs);
1638 // Stores results from which we will create the returned PackageMempoolAcceptResult.
1639 // A result may be changed if a mempool transaction is evicted later due to LimitMempoolSize().
1640 std::map<Wtxid, MempoolAcceptResult> results_final;
1641 // Results from individual validation which will be returned if no other result is available for
1642 // this transaction. "Nonfinal" because if a transaction fails by itself but succeeds later
1643 // (i.e. when evaluated with a fee-bumping child), the result in this map may be discarded.
1644 std::map<Wtxid, MempoolAcceptResult> individual_results_nonfinal;
1645 // Tracks whether we think package submission could result in successful entry to the mempool
1646 bool quit_early{false};
1647 std::vector<CTransactionRef> txns_package_eval;
1648 for (const auto& tx : package) {
1649 const auto& wtxid = tx->GetWitnessHash();
1650 const auto& txid = tx->GetHash();
1651 // There are 3 possibilities: already in mempool, same-txid-diff-wtxid already in mempool,
1652 // or not in mempool. An already confirmed tx is treated as one not in mempool, because all
1653 // we know is that the inputs aren't available.
1654 if (m_pool.exists(wtxid)) {
1655 // Exact transaction already exists in the mempool.
1656 // Node operators are free to set their mempool policies however they please, nodes may receive
1657 // transactions in different orders, and malicious counterparties may try to take advantage of
1658 // policy differences to pin or delay propagation of transactions. As such, it's possible for
1659 // some package transaction(s) to already be in the mempool, and we don't want to reject the
1660 // entire package in that case (as that could be a censorship vector). De-duplicate the
1661 // transactions that are already in the mempool, and only call AcceptMultipleTransactions() with
1662 // the new transactions. This ensures we don't double-count transaction counts and sizes when
1663 // checking ancestor/descendant limits, or double-count transaction fees for fee-related policy.
1664 const auto& entry{*Assert(m_pool.GetEntry(txid))};
1665 results_final.emplace(wtxid, MempoolAcceptResult::MempoolTx(entry.GetTxSize(), entry.GetFee()));
1666 } else if (m_pool.exists(txid)) {
1667 // Transaction with the same non-witness data but different witness (same txid,
1668 // different wtxid) already exists in the mempool.
1669 //
1670 // We don't allow replacement transactions right now, so just swap the package
1671 // transaction for the mempool one. Note that we are ignoring the validity of the
1672 // package transaction passed in.
1673 // TODO: allow witness replacement in packages.
1674 const auto& entry{*Assert(m_pool.GetEntry(txid))};
1675 // Provide the wtxid of the mempool tx so that the caller can look it up in the mempool.
1676 results_final.emplace(wtxid, MempoolAcceptResult::MempoolTxDifferentWitness(entry.GetTx().GetWitnessHash()));
1677 } else {
1678 // Transaction does not already exist in the mempool.
1679 // Try submitting the transaction on its own.
1680 const auto single_package_res = AcceptSubPackage({tx}, args);
1681 const auto& single_res = single_package_res.m_tx_results.at(wtxid);
1683 // The transaction succeeded on its own and is now in the mempool. Don't include it
1684 // in package validation, because its fees should only be "used" once.
1685 assert(m_pool.exists(wtxid));
1686 results_final.emplace(wtxid, single_res);
1687 } else if (package.size() == 1 || // If there is only one transaction, no need to retry it "as a package"
1688 (single_res.m_state.GetResult() != TxValidationResult::TX_RECONSIDERABLE &&
1689 single_res.m_state.GetResult() != TxValidationResult::TX_MISSING_INPUTS)) {
1690 // Package validation policy only differs from individual policy in its evaluation
1691 // of feerate. For example, if a transaction fails here due to violation of a
1692 // consensus rule, the result will not change when it is submitted as part of a
1693 // package. To minimize the amount of repeated work, unless the transaction fails
1694 // due to feerate or missing inputs (its parent is a previous transaction in the
1695 // package that failed due to feerate), don't run package validation. Note that this
1696 // decision might not make sense if different types of packages are allowed in the
1697 // future. Continue individually validating the rest of the transactions, because
1698 // some of them may still be valid.
1699 quit_early = true;
1700 package_state_quit_early.Invalid(PackageValidationResult::PCKG_TX, "transaction failed");
1702 } else {
1704 txns_package_eval.push_back(tx);
1705 }
1706 }
1707 }
1708
1712
1713 // This is invoked by AcceptSubPackage() already, so this is just here for
1714 // clarity (since it's not permitted to invoke LimitMempoolSize() while a
1715 // changeset is outstanding).
1717
1718 // Make sure we haven't exceeded max mempool size.
1719 // Package transactions that were submitted to mempool or already in mempool may be evicted.
1720 // If mempool contents change, then the m_view cache is dirty. It has already been cleared above.
1721 LimitMempoolSize(m_pool, m_active_chainstate.CoinsTip());
1722
1723 for (const auto& tx : package) {
1724 const auto& wtxid = tx->GetWitnessHash();
1725 if (multi_submission_result.m_tx_results.contains(wtxid)) {
1726 // We shouldn't have re-submitted if the tx result was already in results_final.
1727 Assume(!results_final.contains(wtxid));
1728 // If it was submitted, check to see if the tx is still in the mempool. It could have
1729 // been evicted due to LimitMempoolSize() above.
1730 const auto& txresult = multi_submission_result.m_tx_results.at(wtxid);
1731 if (txresult.m_result_type == MempoolAcceptResult::ResultType::VALID && !m_pool.exists(wtxid)) {
1732 package_state_final.Invalid(PackageValidationResult::PCKG_TX, "transaction failed");
1736 } else {
1737 results_final.emplace(wtxid, txresult);
1738 }
1739 } else if (const auto it{results_final.find(wtxid)}; it != results_final.end()) {
1740 // Already-in-mempool transaction. Check to see if it's still there, as it could have
1741 // been evicted when LimitMempoolSize() was called.
1742 Assume(it->second.m_result_type != MempoolAcceptResult::ResultType::INVALID);
1744 // Query by txid to include the same-txid-different-witness ones.
1745 if (!m_pool.exists(tx->GetHash())) {
1746 package_state_final.Invalid(PackageValidationResult::PCKG_TX, "transaction failed");
1749 // Replace the previous result.
1750 results_final.erase(wtxid);
1752 }
1753 } else if (const auto it{individual_results_nonfinal.find(wtxid)}; it != individual_results_nonfinal.end()) {
1754 Assume(it->second.m_result_type == MempoolAcceptResult::ResultType::INVALID);
1755 // Interesting result from previous processing.
1756 results_final.emplace(wtxid, it->second);
1757 }
1758 }
1759 Assume(results_final.size() == package.size());
1761}
1762
1763} // anon namespace
1764
1767{
1769 assert(active_chainstate.GetMempool() != nullptr);
1770 CTxMemPool& pool{*active_chainstate.GetMempool()};
1771
1772 std::vector<COutPoint> coins_to_uncache;
1773
1774 auto args = MemPoolAccept::ATMPArgs::SingleAccept(accept_time, bypass_limits, coins_to_uncache, test_accept);
1775 MempoolAcceptResult result = MemPoolAccept(pool, active_chainstate).AcceptSingleTransactionAndCleanup(tx, args);
1776
1778 // Remove coins that were not present in the coins cache before calling
1779 // AcceptSingleTransaction(); this is to prevent memory DoS in case we receive a large
1780 // number of invalid transactions that attempt to overrun the in-memory coins cache
1781 // (`CCoinsViewCache::cacheCoins`).
1782
1783 for (const COutPoint& hashTx : coins_to_uncache)
1784 active_chainstate.CoinsTip().Uncache(hashTx);
1785 TRACEPOINT(mempool, rejected,
1786 tx->GetHash().data(),
1787 result.m_state.GetRejectReason().c_str()
1788 );
1789 }
1790 // After we've (potentially) uncached entries, ensure our coins cache is still within its size limits
1793 return result;
1794}
1795
1797 const Package& package, bool test_accept, const std::optional<CFeeRate>& client_maxfeerate)
1798{
1800 assert(!package.empty());
1801 assert(std::all_of(package.cbegin(), package.cend(), [](const auto& tx){return tx != nullptr;}));
1802
1803 std::vector<COutPoint> coins_to_uncache;
1804 auto result = [&]() EXCLUSIVE_LOCKS_REQUIRED(cs_main) {
1806 if (test_accept) {
1807 auto args = MemPoolAccept::ATMPArgs::PackageTestAccept(GetTime(), coins_to_uncache);
1808 return MemPoolAccept(pool, active_chainstate).AcceptMultipleTransactionsAndCleanup(package, args);
1809 } else {
1810 auto args = MemPoolAccept::ATMPArgs::PackageChildWithParents(GetTime(), coins_to_uncache, client_maxfeerate);
1811 return MemPoolAccept(pool, active_chainstate).AcceptPackage(package, args);
1812 }
1813 }();
1814
1815 // Uncache coins pertaining to transactions that were not submitted to the mempool.
1816 if (test_accept || result.m_state.IsInvalid()) {
1817 for (const COutPoint& hashTx : coins_to_uncache) {
1818 active_chainstate.CoinsTip().Uncache(hashTx);
1819 }
1820 }
1821 // Ensure the coins cache is still within limits.
1824 return result;
1825}
1826
1828{
1829 int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
1830 // Force block reward to zero when right shift is undefined.
1831 if (halvings >= 64)
1832 return 0;
1833
1834 CAmount nSubsidy = 50 * COIN;
1835 // Subsidy is cut in half every 210,000 blocks which will occur approximately every 4 years.
1836 nSubsidy >>= halvings;
1837 return nSubsidy;
1838}
1839
1843
1844void CoinsViews::InitCache(int32_t prevoutfetch_threads)
1845{
1847 m_cacheview = std::make_unique<CCoinsViewCache>(&m_catcherview);
1848 util::NotNull thread_pool{std::make_shared<ThreadPool>("prevout")};
1849 if (prevoutfetch_threads > 0) {
1851 LogInfo("Block input prevout fetching uses %d additional threads", prevoutfetch_threads);
1852 }
1853 m_connect_block_view = std::make_unique<CoinsViewOverlay>(&*m_cacheview, std::move(thread_pool));
1854}
1855
1857 CTxMemPool* mempool,
1859 ChainstateManager& chainman,
1860 std::optional<uint256> from_snapshot_blockhash)
1861 : m_mempool(mempool),
1862 m_blockman(blockman),
1863 m_chainman(chainman),
1865 m_from_snapshot_blockhash(from_snapshot_blockhash) {}
1866
1868{
1869 fs::path path{m_chainman.m_options.datadir / "chainstate"};
1872 }
1873 return path;
1874}
1875
1876const CBlockIndex* Chainstate::SnapshotBase() const
1877{
1878 if (!m_from_snapshot_blockhash) return nullptr;
1881}
1882
1883const CBlockIndex* Chainstate::TargetBlock() const
1884{
1885 if (!m_target_blockhash) return nullptr;
1887 return m_cached_target_block;
1888}
1889
1890void Chainstate::SetTargetBlock(CBlockIndex* block)
1891{
1892 if (block) {
1894 } else {
1895 m_target_blockhash.reset();
1896 }
1897 m_cached_target_block = block;
1898}
1899
1900void Chainstate::SetTargetBlockHash(uint256 block_hash)
1901{
1902 m_target_blockhash = block_hash;
1903 m_cached_target_block = nullptr;
1904}
1905
1907 size_t cache_size_bytes,
1908 bool in_memory,
1909 bool should_wipe)
1910{
1911 m_coins_views = std::make_unique<CoinsViews>(
1912 DBParams{
1913 .path = StoragePath(),
1914 .cache_bytes = cache_size_bytes,
1915 .memory_only = in_memory,
1916 .wipe_data = should_wipe,
1917 .obfuscate = true,
1918 .options = m_chainman.m_options.coins_db},
1920
1922}
1923
1924void Chainstate::InitCoinsCache(size_t cache_size_bytes)
1925{
1927 assert(m_coins_views != nullptr);
1930}
1931
1932// Lock-free: depends on `m_cached_is_ibd`, which is latched by `UpdateIBDStatus()`.
1934{
1935 return m_cached_is_ibd.load(std::memory_order_relaxed);
1936}
1937
1939{
1941
1942 if (this->GetRole().historical) {
1943 return;
1944 }
1945
1946 if (m_chainman.m_best_invalid && m_chainman.m_best_invalid->nChainWork > m_chain.Tip()->nChainWork + (GetBlockProof(*m_chain.Tip()) * 6)) {
1947 LogWarning("Found invalid chain more than 6 blocks longer than our best chain. This could be due to database corruption or consensus incompatibility with peers.");
1950 _("Warning: Found invalid chain more than 6 blocks longer than our best chain. This could be due to database corruption or consensus incompatibility with peers."));
1951 } else {
1953 }
1954}
1955
1956// Called both upon regular invalid block discovery *and* InvalidateBlock
1958{
1960 if (!m_chainman.m_best_invalid || pindexNew->nChainWork > m_chainman.m_best_invalid->nChainWork) {
1961 m_chainman.m_best_invalid = pindexNew;
1962 }
1964 if (m_chainman.m_best_header != nullptr && m_chainman.m_best_header->GetAncestor(pindexNew->nHeight) == pindexNew) {
1965 m_chainman.RecalculateBestHeader();
1966 }
1967
1968 LogInfo("%s: invalid block=%s height=%d log2_work=%f date=%s", __func__,
1969 pindexNew->GetBlockHash().ToString(), pindexNew->nHeight,
1970 log(pindexNew->nChainWork.getdouble())/log(2.0), FormatISO8601DateTime(pindexNew->GetBlockTime()));
1972 assert (tip);
1973 LogInfo("%s: current best=%s height=%d log2_work=%f date=%s", __func__,
1974 tip->GetBlockHash().ToString(), m_chain.Height(), log(tip->nChainWork.getdouble())/log(2.0),
1975 FormatISO8601DateTime(tip->GetBlockTime()));
1977}
1978
1979// Same as InvalidChainFound, above, except not called directly from InvalidateBlock,
1980// which does its own setBlockIndexCandidates management.
1982{
1985 pindex->nStatus |= BLOCK_FAILED_VALID;
1986 m_blockman.m_dirty_blockindex.insert(pindex);
1987 setBlockIndexCandidates.erase(pindex);
1988 InvalidChainFound(pindex);
1989 }
1990}
1991
1993{
1994 // mark inputs spent
1995 if (!tx.IsCoinBase()) {
1996 txundo.vprevout.reserve(tx.vin.size());
1997 for (const CTxIn &txin : tx.vin) {
1998 txundo.vprevout.emplace_back();
1999 bool is_spent = inputs.SpendCoin(txin.prevout, &txundo.vprevout.back());
2000 assert(is_spent);
2001 }
2002 }
2003 // add outputs
2004 AddCoins(inputs, tx, nHeight);
2005}
2006
2007std::optional<std::pair<ScriptError, std::string>> CScriptCheck::operator()() {
2008 const CScript &scriptSig = ptxTo->vin[nIn].scriptSig;
2009 const CScriptWitness *witness = &ptxTo->vin[nIn].scriptWitness;
2012 return std::nullopt;
2013 } else {
2014 auto debug_str = strprintf("input %i of %s (wtxid %s), spending %s:%i", nIn, ptxTo->GetHash().ToString(), ptxTo->GetWitnessHash().ToString(), ptxTo->vin[nIn].prevout.hash.ToString(), ptxTo->vin[nIn].prevout.n);
2015 return std::make_pair(error, std::move(debug_str));
2016 }
2017}
2018
2019ValidationCache::ValidationCache(const size_t script_execution_cache_bytes, const size_t signature_cache_bytes)
2020 : m_signature_cache{signature_cache_bytes}
2021{
2022 // Setup the salted hasher
2024 // We want the nonce to be 64 bytes long to force the hasher to process
2025 // this chunk, which makes later hash computations more efficient. We
2026 // just write our 32-byte entropy twice to fill the 64 bytes.
2029
2030 const auto [num_elems, approx_size_bytes] = m_script_execution_cache.setup_bytes(script_execution_cache_bytes);
2031 LogInfo("Using %zu MiB out of %zu MiB requested for script execution cache, able to store %zu elements",
2032 approx_size_bytes >> 20, script_execution_cache_bytes >> 20, num_elems);
2033}
2034
2051 bool cacheSigStore,
2054 std::vector<CScriptCheck>* pvChecks)
2055{
2056 if (tx.IsCoinBase()) return true;
2057
2058 if (pvChecks) {
2059 pvChecks->reserve(tx.vin.size());
2060 }
2061
2062 // First check if script executions have been cached with the same
2063 // flags. Note that this assumes that the inputs provided are
2064 // correct (ie that the transaction hash which is in tx's prevouts
2065 // properly commits to the scriptPubKey in the inputs view of that
2066 // transaction).
2068 CSHA256 hasher = validation_cache.ScriptExecutionCacheHasher();
2069 hasher.Write(UCharCast(tx.GetWitnessHash().begin()), 32).Write((unsigned char*)&flags, sizeof(flags)).Finalize(hashCacheEntry.begin());
2070 AssertLockHeld(cs_main); //TODO: Remove this requirement by making CuckooCache not require external locks
2071 if (validation_cache.m_script_execution_cache.contains(hashCacheEntry, !cacheFullScriptStore)) {
2072 return true;
2073 }
2074
2075 if (!txdata.m_spent_outputs_ready) {
2076 std::vector<CTxOut> spent_outputs;
2077 spent_outputs.reserve(tx.vin.size());
2078
2079 for (const auto& txin : tx.vin) {
2080 const COutPoint& prevout = txin.prevout;
2081 const Coin& coin = inputs.AccessCoin(prevout);
2082 assert(!coin.IsSpent());
2083 spent_outputs.emplace_back(coin.out);
2084 }
2085 txdata.Init(tx, std::move(spent_outputs));
2086 }
2087 assert(txdata.m_spent_outputs.size() == tx.vin.size());
2088
2089 for (unsigned int i = 0; i < tx.vin.size(); i++) {
2090
2091 // We very carefully only pass in things to CScriptCheck which
2092 // are clearly committed to by tx' witness hash. This provides
2093 // a sanity check that our caching is not introducing consensus
2094 // failures through additional data in, eg, the coins being
2095 // spent being checked as a part of CScriptCheck.
2096
2097 // Verify signature
2098 CScriptCheck check(txdata.m_spent_outputs[i], tx, validation_cache.m_signature_cache, i, flags, cacheSigStore, &txdata);
2099 if (pvChecks) {
2100 pvChecks->emplace_back(std::move(check));
2101 } else if (auto result = check(); result.has_value()) {
2102 // Tx failures never trigger disconnections/bans.
2103 // This is so that network splits aren't triggered
2104 // either due to non-consensus relay policies (such as
2105 // non-standard DER encodings or non-null dummy
2106 // arguments) or due to new consensus rules introduced in
2107 // soft forks.
2108 switch (check_for) {
2110 return state.Invalid(TxValidationResult::TX_NOT_STANDARD, strprintf("mempool-script-verify-flag-failed (%s)", ScriptErrorString(result->first)), result->second);
2112 return state.Invalid(TxValidationResult::TX_CONSENSUS, strprintf("block-script-verify-flag-failed (%s)", ScriptErrorString(result->first)), result->second);
2113 }
2114 assert(false); // unreachable
2115 }
2116 }
2117
2119 // We executed all of the provided scripts, and were told to
2120 // cache the result. Do so now.
2121 validation_cache.m_script_execution_cache.insert(hashCacheEntry);
2122 }
2123
2124 return true;
2125}
2126
2127bool FatalError(Notifications& notifications, BlockValidationState& state, const bilingual_str& message)
2128{
2129 notifications.fatalError(message);
2130 return state.Error(message.original);
2131}
2132
2141{
2142 bool fClean = true;
2143
2144 if (view.HaveCoin(out)) fClean = false; // overwriting transaction output
2145
2146 if (undo.nHeight == 0) {
2147 // Missing undo metadata (height and coinbase). Older versions included this
2148 // information only in undo records for the last spend of a transactions'
2149 // outputs. This implies that it must be present for some other output of the same tx.
2150 const Coin& alternate = AccessByTxid(view, out.hash);
2151 if (!alternate.IsSpent()) {
2152 undo.nHeight = alternate.nHeight;
2153 undo.fCoinBase = alternate.fCoinBase;
2154 } else {
2155 return DISCONNECT_FAILED; // adding output for transaction without known metadata
2156 }
2157 }
2158 // If the coin already exists as an unspent coin in the cache, then the
2159 // possible_overwrite parameter to AddCoin must be set to true. We have
2160 // already checked whether an unspent coin exists above using HaveCoin, so
2161 // we don't need to guess. When fClean is false, an unspent coin already
2162 // existed and it is an overwrite.
2163 view.AddCoin(out, std::move(undo), !fClean);
2164
2166}
2167
2170DisconnectResult Chainstate::DisconnectBlock(const CBlock& block, const CBlockIndex* pindex, CCoinsViewCache& view)
2171{
2173 bool fClean = true;
2174
2176 if (!m_blockman.ReadBlockUndo(blockUndo, *pindex)) {
2177 LogError("DisconnectBlock(): failure reading undo data\n");
2178 return DISCONNECT_FAILED;
2179 }
2180
2181 if (blockUndo.vtxundo.size() + 1 != block.vtx.size()) {
2182 LogError("DisconnectBlock(): block and undo data inconsistent\n");
2183 return DISCONNECT_FAILED;
2184 }
2185
2186 // Ignore blocks that contain transactions which are 'overwritten' by later transactions,
2187 // unless those are already completely spent.
2188 // See https://github.com/bitcoin/bitcoin/issues/22596 for additional information.
2189 // Note: the blocks specified here are different than the ones used in ConnectBlock because DisconnectBlock
2190 // unwinds the blocks in reverse. As a result, the inconsistency is not discovered until the earlier
2191 // blocks with the duplicate coinbase transactions are disconnected.
2192 bool fEnforceBIP30 = !((pindex->nHeight==91722 && pindex->GetBlockHash() == uint256{"00000000000271a2dc26e7667f8419f2e15416dc6955e5a6c6cdf3f2574dd08e"}) ||
2193 (pindex->nHeight==91812 && pindex->GetBlockHash() == uint256{"00000000000af0aed4792b1acee3d966af36cf5def14935db8de83d6f9306f2f"}));
2194
2195 // undo transactions in reverse order
2196 for (int i = block.vtx.size() - 1; i >= 0; i--) {
2197 const CTransaction &tx = *(block.vtx[i]);
2198 Txid hash = tx.GetHash();
2199 bool is_coinbase = tx.IsCoinBase();
2200 bool is_bip30_exception = (is_coinbase && !fEnforceBIP30);
2201
2202 // Check that all outputs are available and match the outputs in the block itself
2203 // exactly.
2204 for (size_t o = 0; o < tx.vout.size(); o++) {
2205 if (!tx.vout[o].scriptPubKey.IsUnspendable()) {
2206 COutPoint out(hash, o);
2207 Coin coin;
2208 bool is_spent = view.SpendCoin(out, &coin);
2209 if (!is_spent || tx.vout[o] != coin.out || pindex->nHeight != coin.nHeight || is_coinbase != coin.IsCoinBase()) {
2210 if (!is_bip30_exception) {
2211 fClean = false; // transaction output mismatch
2212 }
2213 }
2214 }
2215 }
2216
2217 // restore inputs
2218 if (i > 0) { // not coinbases
2219 CTxUndo &txundo = blockUndo.vtxundo[i-1];
2220 if (txundo.vprevout.size() != tx.vin.size()) {
2221 LogError("DisconnectBlock(): transaction and undo data inconsistent\n");
2222 return DISCONNECT_FAILED;
2223 }
2224 for (unsigned int j = tx.vin.size(); j > 0;) {
2225 --j;
2226 const COutPoint& out = tx.vin[j].prevout;
2227 int res = ApplyTxInUndo(std::move(txundo.vprevout[j]), view, out);
2230 }
2231 // At this point, all of txundo.vprevout should have been moved out.
2232 }
2233 }
2234
2235 // move best block pointer to prevout block
2236 view.SetBestBlock(pindex->pprev->GetBlockHash());
2237
2239}
2240
2241namespace {
2242/* If STANDARD_SCRIPT_VERIFY_FLAGS doesn't cover a consensus flag,
2243 * MemPoolAccept::PolicyScriptChecks may accept txs that violate the
2244 * corresponding consensus rule, which would cause us to create invalid
2245 * block templates.
2246 */
2247static_assert((CONSENSUS_SCRIPT_VERIFY_FLAGS & STANDARD_SCRIPT_VERIFY_FLAGS) == CONSENSUS_SCRIPT_VERIFY_FLAGS, "standard flags must be a superset of consensus flags");
2248
2249/* Check that there's no inconsistency with the policy/policy.h value */
2251
2261class ConsensusScriptVerifyFlags
2262{
2263public:
2264 using value_type = script_verify_flags::value_type;
2265
2266 consteval ConsensusScriptVerifyFlags(script_verify_flags flags)
2267 {
2268 if ((flags & CONSENSUS_SCRIPT_VERIFY_FLAGS) != flags) throw;
2269 m_value = flags.as_int();
2270 }
2271
2272 consteval ConsensusScriptVerifyFlags(script_verify_flag_name flag) : ConsensusScriptVerifyFlags{script_verify_flags{flag}} { }
2273
2274 /* Merging two sets of consensus script verify flags is fine */
2275 ConsensusScriptVerifyFlags& operator|=(const ConsensusScriptVerifyFlags& flags)
2276 {
2277 m_value |= flags.m_value;
2278 return *this;
2279 }
2280
2281 /* Allow masking with generic script_verify_flags, since that
2282 * cannot add non-consensus flags */
2283 ConsensusScriptVerifyFlags& operator&=(const script_verify_flags& flags)
2284 {
2285 m_value &= flags.as_int();
2286 return *this;
2287 }
2288
2289 operator script_verify_flags() const
2290 {
2291 return script_verify_flags::from_int(m_value);
2292 }
2293
2294private:
2295 value_type m_value{0};
2296};
2297
2298template<script_verify_flag_name VFN>
2299ConsensusScriptVerifyFlags add_pending_flag(const Consensus::Params& params, auto dep)
2300{
2301 if (DeploymentEnabled(params, dep)) return VFN;
2302 return SCRIPT_VERIFY_NONE;
2303}
2304} // namespace
2305
2316
2318{
2320
2321 // BIP16 didn't become active until Apr 1 2012 (on mainnet, and
2322 // retroactively applied to testnet)
2323 // However, only one historical block violated the P2SH rules (on both
2324 // mainnet and testnet).
2325 // Similarly, only one historical block violated the TAPROOT rules on
2326 // mainnet.
2327 // For simplicity, always leave P2SH+WITNESS+TAPROOT on except for the two
2328 // violating blocks.
2330 const auto it{consensusparams.script_flag_exceptions.find(*Assert(block_index.phashBlock))};
2331 if (it != consensusparams.script_flag_exceptions.end()) {
2332 // only trimming flags, not trying to enable new ones
2333 flags &= it->second;
2334 Assume(flags == it->second);
2335 }
2336
2337 // Enforce the DERSIG (BIP66) rule
2340 }
2341
2342 // Enforce CHECKLOCKTIMEVERIFY (BIP65)
2345 }
2346
2347 // Enforce CHECKSEQUENCEVERIFY (BIP112)
2350 }
2351
2352 // Enforce BIP147 NULLDUMMY (activated simultaneously with segwit)
2355 }
2356
2357 // Note: flags returned from this function must also be included in
2358 // GetAllConsensusScriptFlags() above.
2360
2361 return flags;
2362}
2363
2364
2368bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state, CBlockIndex* pindex,
2370{
2372 assert(pindex);
2373
2374 uint256 block_hash{block.GetHash()};
2375 assert(*pindex->phashBlock == block_hash);
2376
2377 const auto time_start{SteadyClock::now()};
2378 const CChainParams& params{m_chainman.GetParams()};
2379
2380 // Check it again in case a previous version let a bad block in
2381 // NOTE: We don't currently (re-)invoke ContextualCheckBlock() or
2382 // ContextualCheckBlockHeader() here. This means that if we add a new
2383 // consensus rule that is enforced in one of those two functions, then we
2384 // may have let in a block that violates the rule prior to updating the
2385 // software, and we would NOT be enforcing the rule here. Fully solving
2386 // upgrade from one software version to the next after a consensus rule
2387 // change is potentially tricky and issue-specific (see NeedsRedownload()
2388 // for one approach that was used for BIP 141 deployment).
2389 // Also, currently the rule against blocks more than 2 hours in the future
2390 // is enforced in ContextualCheckBlockHeader(); we wouldn't want to
2391 // re-enforce that rule here (at least until we make it impossible for
2392 // the clock to go backward).
2393 if (!CheckBlock(block, state, params.GetConsensus(), !fJustCheck, !fJustCheck)) {
2395 // We don't write down blocks to disk if they may have been
2396 // corrupted, so this should be impossible unless we're having hardware
2397 // problems.
2398 return FatalError(m_chainman.GetNotifications(), state, _("Corrupt block found indicating potential hardware failure."));
2399 }
2400 LogError("%s: Consensus::CheckBlock: %s\n", __func__, state.ToString());
2401 return false;
2402 }
2403
2404 // verify that the view's current state corresponds to the previous block
2405 uint256 hashPrevBlock = pindex->pprev == nullptr ? uint256() : pindex->pprev->GetBlockHash();
2406 assert(hashPrevBlock == view.GetBestBlock());
2407
2408 m_chainman.num_blocks_total++;
2409
2410 // Special case for the genesis block, skipping connection of its transactions
2411 // (its coinbase is unspendable)
2412 if (block_hash == params.GetConsensus().hashGenesisBlock) {
2413 if (!fJustCheck)
2414 view.SetBestBlock(pindex->GetBlockHash());
2415 return true;
2416 }
2417
2418 const char* script_check_reason;
2420 script_check_reason = "assumevalid=0 (always verify)";
2421 } else {
2422 constexpr int64_t TWO_WEEKS_IN_SECONDS{60 * 60 * 24 * 7 * 2};
2423 // We've been configured with the hash of a block which has been externally verified to have a valid history.
2424 // A suitable default value is included with the software and updated from time to time. Because validity
2425 // relative to a piece of software is an objective fact these defaults can be easily reviewed.
2426 // This setting doesn't force the selection of any particular chain but makes validating some faster by
2427 // effectively caching the result of part of the verification.
2428 BlockMap::const_iterator it{m_blockman.m_block_index.find(m_chainman.AssumedValidBlock())};
2429 if (it == m_blockman.m_block_index.end()) {
2430 script_check_reason = "assumevalid hash not in headers";
2431 } else if (it->second.GetAncestor(pindex->nHeight) != pindex) {
2432 script_check_reason = (pindex->nHeight > it->second.nHeight) ? "block height above assumevalid height" : "block not in assumevalid chain";
2433 } else if (m_chainman.m_best_header->GetAncestor(pindex->nHeight) != pindex) {
2434 script_check_reason = "block not in best header chain";
2435 } else if (m_chainman.m_best_header->nChainWork < m_chainman.MinimumChainWork()) {
2436 script_check_reason = "best header chainwork below minimumchainwork";
2437 } else if (GetBlockProofEquivalentTime(*m_chainman.m_best_header, *pindex, *m_chainman.m_best_header, params.GetConsensus()) <= TWO_WEEKS_IN_SECONDS) {
2438 script_check_reason = "block too recent relative to best header";
2439 } else {
2440 // This block is a member of the assumed verified chain and an ancestor of the best header.
2441 // Script verification is skipped when connecting blocks under the
2442 // assumevalid block. Assuming the assumevalid block is valid this
2443 // is safe because block merkle hashes are still computed and checked,
2444 // Of course, if an assumed valid block is invalid due to false scriptSigs
2445 // this optimization would allow an invalid chain to be accepted.
2446 // The equivalent time check discourages hash power from extorting the network via DOS attack
2447 // into accepting an invalid block through telling users they must manually set assumevalid.
2448 // Requiring a software change or burying the invalid block, regardless of the setting, makes
2449 // it hard to hide the implication of the demand. This also avoids having release candidates
2450 // that are hardly doing any signature verification at all in testing without having to
2451 // artificially set the default assumed verified block further back.
2452 // The test against the minimum chain work prevents the skipping when denied access to any chain at
2453 // least as good as the expected chain.
2454 script_check_reason = nullptr;
2455 }
2456 }
2457
2458 const auto time_1{SteadyClock::now()};
2459 m_chainman.time_check += time_1 - time_start;
2460 LogDebug(BCLog::BENCH, " - Sanity checks: %.2fms [%.2fs (%.2fms/blk)]\n",
2462 Ticks<SecondsDouble>(m_chainman.time_check),
2463 Ticks<MillisecondsDouble>(m_chainman.time_check) / m_chainman.num_blocks_total);
2464
2465 // Do not allow blocks that contain transactions which 'overwrite' older transactions,
2466 // unless those are already completely spent.
2467 // If such overwrites are allowed, coinbases and transactions depending upon those
2468 // can be duplicated to remove the ability to spend the first instance -- even after
2469 // being sent to another address.
2470 // See BIP30, CVE-2012-1909, and https://r6.ca/blog/20120206T005236Z.html for more information.
2471 // This rule was originally applied to all blocks with a timestamp after March 15, 2012, 0:00 UTC.
2472 // Now that the whole chain is irreversibly beyond that time it is applied to all blocks except the
2473 // two in the chain that violate it. This prevents exploiting the issue against nodes during their
2474 // initial block download.
2475 bool fEnforceBIP30 = !IsBIP30Repeat(*pindex);
2476
2477 // Once BIP34 activated it was not possible to create new duplicate coinbases and thus other than starting
2478 // with the 2 existing duplicate coinbase pairs, not possible to create overwriting txs. But by the
2479 // time BIP34 activated, in each of the existing pairs the duplicate coinbase had overwritten the first
2480 // before the first had been spent. Since those coinbases are sufficiently buried it's no longer possible to create further
2481 // duplicate transactions descending from the known pairs either.
2482 // If we're on the known chain at height greater than where BIP34 activated, we can save the db accesses needed for the BIP30 check.
2483
2484 // BIP34 requires that a block at height X (block X) has its coinbase
2485 // scriptSig start with a CScriptNum of X (indicated height X). The above
2486 // logic of no longer requiring BIP30 once BIP34 activates is flawed in the
2487 // case that there is a block X before the BIP34 height of 227,931 which has
2488 // an indicated height Y where Y is greater than X. The coinbase for block
2489 // X would also be a valid coinbase for block Y, which could be a BIP30
2490 // violation. An exhaustive search of all mainnet coinbases before the
2491 // BIP34 height which have an indicated height greater than the block height
2492 // reveals many occurrences. The 3 lowest indicated heights found are
2493 // 209,921, 490,897, and 1,983,702 and thus coinbases for blocks at these 3
2494 // heights would be the first opportunity for BIP30 to be violated.
2495
2496 // The search reveals a great many blocks which have an indicated height
2497 // greater than 1,983,702, so we simply remove the optimization to skip
2498 // BIP30 checking for blocks at height 1,983,702 or higher. Before we reach
2499 // that block in another 25 years or so, we should take advantage of a
2500 // future consensus change to do a new and improved version of BIP34 that
2501 // will actually prevent ever creating any duplicate coinbases in the
2502 // future.
2503 static constexpr int BIP34_IMPLIES_BIP30_LIMIT = 1983702;
2504
2505 // There is no potential to create a duplicate coinbase at block 209,921
2506 // because this is still before the BIP34 height and so explicit BIP30
2507 // checking is still active.
2508
2509 // The final case is block 176,684 which has an indicated height of
2510 // 490,897. Unfortunately, this issue was not discovered until about 2 weeks
2511 // before block 490,897 so there was not much opportunity to address this
2512 // case other than to carefully analyze it and determine it would not be a
2513 // problem. Block 490,897 was, in fact, mined with a different coinbase than
2514 // block 176,684, but it is important to note that even if it hadn't been or
2515 // is remined on an alternate fork with a duplicate coinbase, we would still
2516 // not run into a BIP30 violation. This is because the coinbase for 176,684
2517 // is spent in block 185,956 in transaction
2518 // d4f7fbbf92f4a3014a230b2dc70b8058d02eb36ac06b4a0736d9d60eaa9e8781. This
2519 // spending transaction can't be duplicated because it also spends coinbase
2520 // 0328dd85c331237f18e781d692c92de57649529bd5edf1d01036daea32ffde29. This
2521 // coinbase has an indicated height of over 4.2 billion, and wouldn't be
2522 // duplicatable until that height, and it's currently impossible to create a
2523 // chain that long. Nevertheless we may wish to consider a future soft fork
2524 // which retroactively prevents block 490,897 from creating a duplicate
2525 // coinbase. The two historical BIP30 violations often provide a confusing
2526 // edge case when manipulating the UTXO and it would be simpler not to have
2527 // another edge case to deal with.
2528
2529 // testnet3 has no blocks before the BIP34 height with indicated heights
2530 // post BIP34 before approximately height 486,000,000. After block
2531 // 1,983,702 testnet3 starts doing unnecessary BIP30 checking again.
2532 assert(pindex->pprev);
2533 CBlockIndex* pindexBIP34height = pindex->pprev->GetAncestor(params.GetConsensus().BIP34Height);
2534 //Only continue to enforce if we're below BIP34 activation height or the block hash at that height doesn't correspond.
2535 fEnforceBIP30 = fEnforceBIP30 && (!pindexBIP34height || !(pindexBIP34height->GetBlockHash() == params.GetConsensus().BIP34Hash));
2536
2537 // TODO: Remove BIP30 checking from block height 1,983,702 on, once we have a
2538 // consensus change that ensures coinbases at those heights cannot
2539 // duplicate earlier coinbases.
2541 for (const auto& tx : block.vtx) {
2542 for (size_t o = 0; o < tx->vout.size(); o++) {
2543 if (view.HaveCoin(COutPoint(tx->GetHash(), o))) {
2544 state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-txns-BIP30",
2545 "tried to overwrite transaction");
2546 }
2547 }
2548 }
2549 }
2550
2551 // Enforce BIP68 (sequence locks)
2552 int nLockTimeFlags = 0;
2555 }
2556
2557 // Get the script flags for this block
2559
2560 const auto time_2{SteadyClock::now()};
2561 m_chainman.time_forks += time_2 - time_1;
2562 LogDebug(BCLog::BENCH, " - Fork checks: %.2fms [%.2fs (%.2fms/blk)]\n",
2564 Ticks<SecondsDouble>(m_chainman.time_forks),
2565 Ticks<MillisecondsDouble>(m_chainman.time_forks) / m_chainman.num_blocks_total);
2566
2567 const bool fScriptChecks{!!script_check_reason};
2568 const kernel::ChainstateRole role{GetRole()};
2569 if (script_check_reason != m_last_script_check_reason_logged && role.validated && !role.historical) {
2570 if (fScriptChecks) {
2571 LogInfo("Enabling script verification at block #%d (%s): %s.",
2572 pindex->nHeight, block_hash.ToString(), script_check_reason);
2573 } else {
2574 LogInfo("Disabling script verification at block #%d (%s).",
2575 pindex->nHeight, block_hash.ToString());
2576 }
2578 }
2579
2581
2582 // Precomputed transaction data pointers must not be invalidated
2583 // until after `control` has run the script checks (potentially
2584 // in multiple threads). Preallocate the vector size so a new allocation
2585 // doesn't invalidate pointers into the vector, and keep txsdata in scope
2586 // for as long as `control`.
2587 std::vector<PrecomputedTransactionData> txsdata(block.vtx.size());
2588 std::optional<CCheckQueueControl<CScriptCheck>> control;
2589 if (auto& queue = m_chainman.GetCheckQueue(); queue.HasThreads() && fScriptChecks) control.emplace(queue);
2590
2591 std::vector<int> prevheights;
2592 CAmount nFees = 0;
2593 int nInputs = 0;
2594 int64_t nSigOpsCost = 0;
2595 blockundo.vtxundo.reserve(block.vtx.size() - 1);
2596 for (unsigned int i = 0; i < block.vtx.size(); i++)
2597 {
2598 if (!state.IsValid()) break;
2599 const CTransaction &tx = *(block.vtx[i]);
2600
2601 nInputs += tx.vin.size();
2602
2603 if (!tx.IsCoinBase())
2604 {
2605 CAmount txfee = 0;
2607 if (!Consensus::CheckTxInputs(tx, tx_state, view, pindex->nHeight, txfee)) {
2608 // Any transaction validation failure in ConnectBlock is a block consensus failure
2610 tx_state.GetRejectReason(),
2611 tx_state.GetDebugMessage() + " in transaction " + tx.GetHash().ToString());
2612 break;
2613 }
2614 nFees += txfee;
2615 if (!MoneyRange(nFees)) {
2616 state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-txns-accumulated-fee-outofrange",
2617 "accumulated fee in the block out of range");
2618 break;
2619 }
2620
2621 // Check that transaction is BIP68 final
2622 // BIP68 lock checks (as opposed to nLockTime checks) must
2623 // be in ConnectBlock because they require the UTXO set
2624 prevheights.resize(tx.vin.size());
2625 for (size_t j = 0; j < tx.vin.size(); j++) {
2626 prevheights[j] = view.AccessCoin(tx.vin[j].prevout).nHeight;
2627 }
2628
2629 if (!SequenceLocks(tx, nLockTimeFlags, prevheights, *pindex)) {
2630 state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-txns-nonfinal",
2631 "contains a non-BIP68-final transaction " + tx.GetHash().ToString());
2632 break;
2633 }
2634 }
2635
2636 // GetTransactionSigOpCost counts 3 types of sigops:
2637 // * legacy (always)
2638 // * p2sh (when P2SH enabled in flags and excludes coinbase)
2639 // * witness (when witness enabled in flags and excludes coinbase)
2642 state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-blk-sigops", "too many sigops");
2643 break;
2644 }
2645
2646 if (!tx.IsCoinBase() && fScriptChecks)
2647 {
2648 bool fCacheResults = fJustCheck; /* Don't cache results if we're actually connecting blocks (still consult the cache, though) */
2649 bool tx_ok;
2651 // If CheckInputScripts is called with a pointer to a checks vector, the resulting checks are appended to it. In that case
2652 // they need to be added to control which runs them asynchronously. Otherwise, CheckInputScripts runs the checks before returning.
2653 if (control) {
2654 std::vector<CScriptCheck> vChecks;
2656 if (tx_ok) control->Add(std::move(vChecks));
2657 } else {
2659 }
2660 if (!tx_ok) {
2661 // Any transaction validation failure in ConnectBlock is a block consensus failure
2663 tx_state.GetRejectReason(), tx_state.GetDebugMessage());
2664 break;
2665 }
2666 }
2667
2669 if (i > 0) {
2670 blockundo.vtxundo.emplace_back();
2671 }
2672 UpdateCoins(tx, view, i == 0 ? undoDummy : blockundo.vtxundo.back(), pindex->nHeight);
2673 }
2674 const auto time_3{SteadyClock::now()};
2675 m_chainman.time_connect += time_3 - time_2;
2676 LogDebug(BCLog::BENCH, " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs (%.2fms/blk)]\n", (unsigned)block.vtx.size(),
2678 nInputs <= 1 ? 0 : Ticks<MillisecondsDouble>(time_3 - time_2) / (nInputs - 1),
2681
2682 CAmount blockReward = nFees + GetBlockSubsidy(pindex->nHeight, params.GetConsensus());
2683 if (block.vtx[0]->GetValueOut() > blockReward && state.IsValid()) {
2684 state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-cb-amount",
2685 strprintf("coinbase pays too much (actual=%d vs limit=%d)", block.vtx[0]->GetValueOut(), blockReward));
2686 }
2687 if (control) {
2688 auto parallel_result = control->Complete();
2689 if (parallel_result.has_value() && state.IsValid()) {
2690 state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, strprintf("block-script-verify-flag-failed (%s)", ScriptErrorString(parallel_result->first)), parallel_result->second);
2691 }
2692 }
2693 if (!state.IsValid()) {
2694 LogWarning("Block validation error: %s", state.ToString());
2695 return false;
2696 }
2697 const auto time_4{SteadyClock::now()};
2698 m_chainman.time_verify += time_4 - time_2;
2699 LogDebug(BCLog::BENCH, " - Verify %u txins: %.2fms (%.3fms/txin) [%.2fs (%.2fms/blk)]\n", nInputs - 1,
2701 nInputs <= 1 ? 0 : Ticks<MillisecondsDouble>(time_4 - time_2) / (nInputs - 1),
2704
2705 if (fJustCheck) {
2706 return true;
2707 }
2708
2709 if (!m_blockman.WriteBlockUndo(blockundo, state, *pindex)) {
2710 return false;
2711 }
2712
2713 const auto time_5{SteadyClock::now()};
2714 m_chainman.time_undo += time_5 - time_4;
2715 LogDebug(BCLog::BENCH, " - Write undo data: %.2fms [%.2fs (%.2fms/blk)]\n",
2718 Ticks<MillisecondsDouble>(m_chainman.time_undo) / m_chainman.num_blocks_total);
2719
2720 if (!pindex->IsValid(BLOCK_VALID_SCRIPTS)) {
2722 m_blockman.m_dirty_blockindex.insert(pindex);
2723 }
2724
2725 // add this block to the view's block chain
2726 view.SetBestBlock(pindex->GetBlockHash());
2727
2728 const auto time_6{SteadyClock::now()};
2729 m_chainman.time_index += time_6 - time_5;
2730 LogDebug(BCLog::BENCH, " - Index writing: %.2fms [%.2fs (%.2fms/blk)]\n",
2732 Ticks<SecondsDouble>(m_chainman.time_index),
2733 Ticks<MillisecondsDouble>(m_chainman.time_index) / m_chainman.num_blocks_total);
2734
2735 TRACEPOINT(validation, block_connected,
2736 block_hash.data(),
2737 pindex->nHeight,
2738 block.vtx.size(),
2739 nInputs,
2742 );
2743
2744 return true;
2745}
2746
2747CoinsCacheSizeState Chainstate::GetCoinsCacheSizeState()
2748{
2750 return this->GetCoinsCacheSizeState(
2753}
2754
2755CoinsCacheSizeState Chainstate::GetCoinsCacheSizeState(
2758{
2764
2765 if (cacheSize > nTotalSpace) {
2766 LogInfo("Cache size (%s) exceeds total space (%s)\n", cacheSize, nTotalSpace);
2770 }
2772}
2773
2775 BlockValidationState &state,
2776 FlushStateMode mode,
2778{
2779 LOCK(cs_main);
2780 assert(this->CanFlushToDisk());
2781 std::set<int> setFilesToPrune;
2782 bool full_flush_completed = false;
2783
2784 [[maybe_unused]] const size_t coins_count{CoinsTip().GetCacheSize()};
2786
2787 try {
2788 {
2789 bool fFlushForPrune = false;
2790
2793 // make sure we don't prune above any of the prune locks bestblocks
2794 // pruning is height-based
2795 int last_prune{m_chain.Height()}; // last height we can prune
2796 std::optional<std::string> limiting_lock; // prune lock that actually was the limiting factor, only used for logging
2797
2798 for (const auto& prune_lock : m_blockman.m_prune_locks) {
2799 if (prune_lock.second.height_first == std::numeric_limits<int>::max()) continue;
2800 // Remove the buffer and one additional block here to get actual height that is outside of the buffer
2801 const int lock_height{prune_lock.second.height_first - PRUNE_LOCK_BUFFER - 1};
2802 last_prune = std::max(1, std::min(last_prune, lock_height));
2803 if (last_prune == lock_height) {
2804 limiting_lock = prune_lock.first;
2805 }
2806 }
2807
2808 if (limiting_lock) {
2809 LogDebug(BCLog::PRUNE, "%s limited pruning to height %d\n", limiting_lock.value(), last_prune);
2810 }
2811
2812 if (nManualPruneHeight > 0) {
2813 LOG_TIME_MILLIS_WITH_CATEGORY("find files to prune (manual)", BCLog::BENCH);
2814
2817 std::min(last_prune, nManualPruneHeight),
2818 *this);
2819 } else {
2820 LOG_TIME_MILLIS_WITH_CATEGORY("find files to prune", BCLog::BENCH);
2821
2824 }
2825 if (!setFilesToPrune.empty()) {
2826 fFlushForPrune = true;
2828 m_blockman.m_block_tree_db->WriteFlag("prunedblockfiles", true);
2830 }
2831 }
2832 }
2833 const auto nNow{NodeClock::now()};
2834 // The cache is large and we're within 10% and 10 MiB of the limit, but we have time now (not in the middle of a block processing).
2836 // The cache is over the limit, we have to write now.
2838 // It's been a while since we wrote the block index and chain state to disk. Do this frequently, so we don't need to redownload or reindex after a crash.
2841 // Combine all conditions that result in a write to disk.
2843 // Write blocks, block index and best chain related state to disk.
2844 if (should_write) {
2845 LogDebug(BCLog::COINDB, "Writing chainstate to disk: flush mode=%s, prune=%d, large=%d, critical=%d, periodic=%d",
2847
2848 // Ensure we can write block index
2850 return FatalError(m_chainman.GetNotifications(), state, _("Disk space is too low!"));
2851 }
2852 {
2853 LOG_TIME_MILLIS_WITH_CATEGORY("write block and undo data to disk", BCLog::BENCH);
2854
2855 // First make sure all block and undo data is flushed to disk.
2856 if (!m_blockman.FlushChainstateBlockFile(m_chain.Height())) {
2857 // FlushChainstateBlockFile() already reported the specific error through flushError()
2858 return state.Error("Failed to flush block or undo file");
2859 }
2860 }
2861
2862 // Then update all block file information (which may refer to block and undo files).
2863 {
2864 LOG_TIME_MILLIS_WITH_CATEGORY("write block index to disk", BCLog::BENCH);
2865
2866 m_blockman.WriteBlockIndexDB();
2867 }
2868 // Finally remove any pruned files
2869 if (fFlushForPrune) {
2870 LOG_TIME_MILLIS_WITH_CATEGORY("unlink pruned files", BCLog::BENCH);
2871
2873 }
2874
2875 if (!CoinsTip().GetBestBlock().IsNull()) {
2876 // Typical Coin structures on disk are around 48 bytes in size.
2877 // Pushing a new one to the database can cause it to be written
2878 // twice (once in the log, and once in the tables). This is already
2879 // an overestimation, as most will delete an existing entry or
2880 // overwrite one. Still, use a conservative safety factor of 2.
2881 if (!CheckDiskSpace(m_chainman.m_options.datadir, 48 * 2 * 2 * CoinsTip().GetDirtyCount())) {
2882 return FatalError(m_chainman.GetNotifications(), state, _("Disk space is too low!"));
2883 }
2884 // Flush the chainstate (which may refer to block index entries).
2887 full_flush_completed = true;
2890 (uint32_t)mode,
2891 (uint64_t)coins_count,
2893 (bool)fFlushForPrune);
2894 }
2895 }
2896
2897 if (should_write || m_next_write == NodeClock::time_point::max()) {
2900 }
2901 }
2905 }
2906
2908 try {
2910 } catch (const std::exception& e) {
2911 LogWarning("Failed to start chainstate compaction (%s)", e.what());
2912 }
2913 }
2914 }
2915 } catch (const std::runtime_error& e) {
2916 return FatalError(m_chainman.GetNotifications(), state, strprintf(_("System error while flushing: %s"), e.what()));
2917 }
2918 return true;
2919}
2920
2922{
2925 LogWarning("Failed to force flush state (%s)", state.ToString());
2926 }
2927}
2928
2930{
2933 if (!this->FlushStateToDisk(state, FlushStateMode::NONE)) {
2934 LogWarning("Failed to flush state (%s)", state.ToString());
2935 }
2936}
2937
2938static void UpdateTipLog(
2939 const ChainstateManager& chainman,
2941 const CBlockIndex* tip,
2942 const std::string& func_name,
2943 const std::string& prefix,
2944 const std::string& warning_messages,
2946{
2947
2949
2950 // Disable rate limiting as this may log frequently during IBD.
2951 LogInfo(util::log::NO_RATE_LIMIT, "%s%s: new best=%s height=%d version=0x%08x log2_work=%f tx=%lu date='%s' progress=%f cache=%.1fMiB(%utxo)%s\n",
2953 tip->GetBlockHash().ToString(), tip->nHeight, tip->nVersion,
2954 log(tip->nChainWork.getdouble()) / log(2.0), tip->m_chain_tx_count,
2955 FormatISO8601DateTime(tip->GetBlockTime()),
2956 background_validation ? chainman.GetBackgroundVerificationProgress(*tip) : chainman.GuessVerificationProgress(tip),
2957 coins_tip.DynamicMemoryUsage() / double(1_MiB),
2958 coins_tip.GetCacheSize(),
2959 !warning_messages.empty() ? strprintf(" warning='%s'", warning_messages) : "");
2960}
2961
2962void Chainstate::UpdateTip(const CBlockIndex* pindexNew)
2963{
2965 const auto& coins_tip = this->CoinsTip();
2966
2967 // The remainder of the function isn't relevant if we are not acting on
2968 // the active chainstate, so return if need be.
2969 if (this != &m_chainman.ActiveChainstate()) {
2970 // Only log every so often so that we don't bury log messages at the tip.
2971 constexpr int BACKGROUND_LOG_INTERVAL = 2000;
2972 if (pindexNew->nHeight % BACKGROUND_LOG_INTERVAL == 0) {
2973 UpdateTipLog(m_chainman, coins_tip, pindexNew, __func__, "[background validation] ", "", /*background_validation=*/true);
2974 }
2975 return;
2976 }
2977
2978 // New best block
2979 if (m_mempool) {
2981 }
2982
2983 std::vector<bilingual_str> warning_messages;
2986 for (auto [bit, active] : bits) {
2987 const bilingual_str warning = strprintf(_("Unknown new rules activated (versionbit %i)"), bit);
2988 if (active) {
2990 } else {
2991 warning_messages.push_back(warning);
2992 }
2993 }
2994 }
2996 util::Join(warning_messages, Untranslated(", ")).original, /*background_validation=*/false);
2997}
2998
3010{
3013
3016 assert(pindexDelete->pprev);
3017 // Read block from disk.
3018 std::shared_ptr<CBlock> pblock = std::make_shared<CBlock>();
3019 CBlock& block = *pblock;
3020 if (!m_blockman.ReadBlock(block, *pindexDelete)) {
3021 LogError("DisconnectTip(): Failed to read block\n");
3022 return false;
3023 }
3024 // Apply the block atomically to the chain state.
3025 const auto time_start{SteadyClock::now()};
3026 {
3028 assert(view.GetBestBlock() == pindexDelete->GetBlockHash());
3030 LogError("DisconnectTip(): DisconnectBlock %s failed\n", pindexDelete->GetBlockHash().ToString());
3031 return false;
3032 }
3033 view.Flush(/*reallocate_cache=*/false); // local CCoinsViewCache goes out of scope
3034 }
3035 LogDebug(BCLog::BENCH, "- Disconnect block: %.2fms\n",
3036 Ticks<MillisecondsDouble>(SteadyClock::now() - time_start));
3037
3038 {
3039 // Prune locks that began at or after the tip should be moved backward so they get a chance to reorg
3040 const int max_height_first{pindexDelete->nHeight - 1};
3041 for (auto& prune_lock : m_blockman.m_prune_locks) {
3042 if (prune_lock.second.height_first <= max_height_first) continue;
3043
3044 prune_lock.second.height_first = max_height_first;
3045 LogDebug(BCLog::PRUNE, "%s prune lock moved back to %d\n", prune_lock.first, max_height_first);
3046 }
3047 }
3048
3049 // Write the chain state to disk, if necessary.
3051 return false;
3052 }
3053
3054 if (disconnectpool && m_mempool) {
3055 // Save transactions to re-add to mempool at end of reorg. If any entries are evicted for
3056 // exceeding memory limits, remove them and their descendants from the mempool.
3057 for (auto&& evicted_tx : disconnectpool->AddTransactionsFromBlock(block.vtx)) {
3059 }
3060 }
3061
3062 m_chain.SetTip(*pindexDelete->pprev);
3064
3065 UpdateTip(pindexDelete->pprev);
3066 // Let wallets know transactions went from 1-confirmed to
3067 // 0-confirmed or conflicted:
3070 }
3071 return true;
3072}
3073
3076 std::shared_ptr<const CBlock> pblock;
3077};
3078
3086 BlockValidationState& state,
3088 std::shared_ptr<const CBlock> block_to_connect,
3089 std::vector<ConnectedBlock>& connected_blocks,
3091{
3094
3095 assert(pindexNew->pprev == m_chain.Tip());
3096 // Read block from disk.
3097 const auto time_1{SteadyClock::now()};
3098 if (!block_to_connect) {
3099 std::shared_ptr<CBlock> pblockNew = std::make_shared<CBlock>();
3101 return FatalError(m_chainman.GetNotifications(), state, _("Failed to read block."));
3102 }
3103 block_to_connect = std::move(pblockNew);
3104 } else {
3105 LogDebug(BCLog::BENCH, " - Using cached block\n");
3106 }
3107 // Apply the block atomically to the chain state.
3108 const auto time_2{SteadyClock::now()};
3109 SteadyClock::time_point time_3;
3110 // When adding aggregate statistics in the future, keep in mind that
3111 // num_blocks_total may be zero until the ConnectBlock() call below.
3112 LogDebug(BCLog::BENCH, " - Load block from disk: %.2fms\n",
3114 {
3115 CoinsViewOverlay& view{*m_coins_views->m_connect_block_view};
3117 bool rv = ConnectBlock(*block_to_connect, state, pindexNew, view);
3120 }
3121 if (!rv) {
3122 if (state.IsInvalid())
3124 LogError("%s: ConnectBlock %s failed, %s\n", __func__, pindexNew->GetBlockHash().ToString(), state.ToString());
3125 return false;
3126 }
3127 time_3 = SteadyClock::now();
3128 m_chainman.time_connect_total += time_3 - time_2;
3129 assert(m_chainman.num_blocks_total > 0);
3130 LogDebug(BCLog::BENCH, " - Connect total: %.2fms [%.2fs (%.2fms/blk)]\n",
3132 Ticks<SecondsDouble>(m_chainman.time_connect_total),
3133 Ticks<MillisecondsDouble>(m_chainman.time_connect_total) / m_chainman.num_blocks_total);
3134 view.Flush(/*reallocate_cache=*/false); // No need to reallocate since it only has capacity for 1 block
3135 }
3136 const auto time_4{SteadyClock::now()};
3137 m_chainman.time_flush += time_4 - time_3;
3138 LogDebug(BCLog::BENCH, " - Flush: %.2fms [%.2fs (%.2fms/blk)]\n",
3140 Ticks<SecondsDouble>(m_chainman.time_flush),
3141 Ticks<MillisecondsDouble>(m_chainman.time_flush) / m_chainman.num_blocks_total);
3142 // Write the chain state to disk, if necessary.
3144 return false;
3145 }
3146 const auto time_5{SteadyClock::now()};
3147 m_chainman.time_chainstate += time_5 - time_4;
3148 LogDebug(BCLog::BENCH, " - Writing chainstate: %.2fms [%.2fs (%.2fms/blk)]\n",
3150 Ticks<SecondsDouble>(m_chainman.time_chainstate),
3151 Ticks<MillisecondsDouble>(m_chainman.time_chainstate) / m_chainman.num_blocks_total);
3152 // Remove conflicting transactions from the mempool.
3153 std::vector<RemovedMempoolTransactionInfo> txs_removed_for_block;
3154 if (m_mempool) {
3156 disconnectpool.removeForBlock(block_to_connect->vtx);
3157 }
3158 // Update m_chain & related variables.
3161 // Not fired while IBD is active. removeForBlock() above still runs.
3164 }
3166
3167 const auto time_6{SteadyClock::now()};
3168 m_chainman.time_post_connect += time_6 - time_5;
3169 m_chainman.time_total += time_6 - time_1;
3170 LogDebug(BCLog::BENCH, " - Connect postprocess: %.2fms [%.2fs (%.2fms/blk)]\n",
3172 Ticks<SecondsDouble>(m_chainman.time_post_connect),
3173 Ticks<MillisecondsDouble>(m_chainman.time_post_connect) / m_chainman.num_blocks_total);
3174 LogDebug(BCLog::BENCH, "- Connect block: %.2fms [%.2fs (%.2fms/blk)]\n",
3176 Ticks<SecondsDouble>(m_chainman.time_total),
3177 Ticks<MillisecondsDouble>(m_chainman.time_total) / m_chainman.num_blocks_total);
3178
3179 // See if this chainstate has reached a target block and can be used to
3180 // validate an assumeutxo snapshot. If it can, hashing the UTXO database
3181 // will be slow, and cs_main could remain locked here for several minutes.
3182 // If the snapshot is validated, the UTXO hash will be saved to
3183 // this->m_target_utxohash, causing HistoricalChainstate() to return null
3184 // and this chainstate to no longer be used. ActivateBestChain() will also
3185 // stop connecting blocks to this chainstate because this->ReachedTarget()
3186 // will be true and this->setBlockIndexCandidates will not have additional
3187 // blocks.
3189 m_chainman.MaybeValidateSnapshot(*this, current_cs);
3190
3191 connected_blocks.emplace_back(pindexNew, std::move(block_to_connect));
3192 return true;
3193}
3194
3200{
3202 do {
3203 CBlockIndex *pindexNew = nullptr;
3204
3205 // Find the best candidate header.
3206 {
3207 std::set<CBlockIndex*, CBlockIndexWorkComparator>::reverse_iterator it = setBlockIndexCandidates.rbegin();
3208 if (it == setBlockIndexCandidates.rend())
3209 return nullptr;
3210 pindexNew = *it;
3211 }
3212
3213 // Check whether all blocks on the path between the currently active chain and the candidate are valid.
3214 // Just going until the active chain is an optimization, as we know all blocks in it are valid already.
3215 bool fInvalidAncestor = false;
3217 assert(pindexTest->HaveNumChainTxs() || pindexTest->nHeight == 0);
3218
3219 // Pruned nodes may have entries in setBlockIndexCandidates for
3220 // which block files have been deleted. Remove those as candidates
3221 // for the most work chain if we come across them; we can't switch
3222 // to a chain unless we have all the non-active-chain parent blocks.
3223 bool fFailedChain = pindexTest->nStatus & BLOCK_FAILED_VALID;
3224 bool fMissingData = !(pindexTest->nStatus & BLOCK_HAVE_DATA);
3225 if (fFailedChain || fMissingData) {
3226 // Candidate chain is not usable (either invalid or missing data)
3227 if (fFailedChain && (m_chainman.m_best_invalid == nullptr || pindexNew->nChainWork > m_chainman.m_best_invalid->nChainWork)) {
3228 m_chainman.m_best_invalid = pindexNew;
3229 }
3230 // Remove the entire chain from the set.
3232 // If we're missing data and not a descendant of an invalid block,
3233 // then add back to m_blocks_unlinked, so that if the block arrives in the future
3234 // we can try adding to setBlockIndexCandidates again.
3235 if (fMissingData && !fFailedChain) {
3236 // Avoid duplicate entries in m_blocks_unlinked. If the same entry is
3237 // processed twice in ReceivedBlockTransactions(), it may be re-added to
3238 // setBlockIndexCandidates with a modified nSequenceId, breaking ordering
3239 // guarantees and leading to undefined behavior.
3241 }
3243 }
3245 fInvalidAncestor = true;
3246 break;
3247 }
3248 }
3249 if (!fInvalidAncestor)
3250 return pindexNew;
3251 } while(true);
3252}
3253
3256 // Note that we can't delete the current block itself, as we may need to return to it later in case a
3257 // reorganization to a better block fails.
3258 std::set<CBlockIndex*, CBlockIndexWorkComparator>::iterator it = setBlockIndexCandidates.begin();
3259 while (it != setBlockIndexCandidates.end() && setBlockIndexCandidates.value_comp()(*it, m_chain.Tip())) {
3260 setBlockIndexCandidates.erase(it++);
3261 }
3262 // Either the current tip or a successor of it we're working towards is left in setBlockIndexCandidates.
3264}
3265
3272bool Chainstate::ActivateBestChainStep(BlockValidationState& state, CBlockIndex& index_most_work, const std::shared_ptr<const CBlock>& pblock, bool& fInvalidFound, std::vector<ConnectedBlock>& connected_blocks)
3273{
3276
3279
3280 // Disconnect active blocks which are no longer in the best chain.
3281 bool fBlocksDisconnected = false;
3283 while (m_chain.Tip() && m_chain.Tip() != pindexFork) {
3284 if (!DisconnectTip(state, &disconnectpool)) {
3285 // This is likely a fatal error, but keep the mempool consistent,
3286 // just in case. Only remove from the mempool in this case.
3288
3289 // If we're unable to disconnect a block during normal operation,
3290 // then that is a failure of our local system -- we should abort
3291 // rather than stay on a less work chain.
3292 FatalError(m_chainman.GetNotifications(), state, _("Failed to disconnect block."));
3293 return false;
3294 }
3295 fBlocksDisconnected = true;
3296 }
3297
3298 // Build list of new blocks to connect (in descending height order).
3299 std::vector<CBlockIndex*> vpindexToConnect;
3300 bool fContinue = true;
3301 int nHeight = pindexFork ? pindexFork->nHeight : -1;
3302 while (fContinue && nHeight != index_most_work.nHeight) {
3303 // Don't iterate the entire list of potential improvements toward the best tip, as we likely only need
3304 // a few blocks along the way.
3305 int nTargetHeight = std::min(nHeight + 32, index_most_work.nHeight);
3306 vpindexToConnect.clear();
3309 while (pindexIter && pindexIter->nHeight != nHeight) {
3310 vpindexToConnect.push_back(pindexIter);
3312 }
3314
3315 // Connect new blocks.
3316 for (CBlockIndex* pindexConnect : vpindexToConnect | std::views::reverse) {
3317 if (!ConnectTip(state, pindexConnect, pindexConnect == &index_most_work ? pblock : std::shared_ptr<const CBlock>(), connected_blocks, disconnectpool)) {
3318 if (state.IsInvalid()) {
3319 // The block violates a consensus rule.
3322 }
3323 state = BlockValidationState();
3324 fInvalidFound = true;
3325 fContinue = false;
3326 break;
3327 } else {
3328 // A system error occurred (disk space, database error, ...).
3329 // Make the mempool consistent with the current tip, just in case
3330 // any observers try to use it before shutdown.
3332 return false;
3333 }
3334 } else {
3336 if (!pindexOldTip || m_chain.Tip()->nChainWork > pindexOldTip->nChainWork) {
3337 // We're in a better position than we were. Return temporarily to release the lock.
3338 fContinue = false;
3339 break;
3340 }
3341 }
3342 }
3343 }
3344
3345 if (fBlocksDisconnected) {
3346 // If any blocks were disconnected, disconnectpool may be non empty. Add
3347 // any disconnected transactions back to the mempool.
3349 }
3350 if (m_mempool) m_mempool->check(this->CoinsTip(), this->m_chain.Height() + 1);
3351
3353
3354 return true;
3355}
3356
3363
3365{
3367 if (!m_cached_is_ibd.load(std::memory_order_relaxed)) return;
3368 if (m_blockman.LoadingBlocks()) return;
3369 if (!CurrentChainstate().m_chain.IsTipRecent(MinimumChainWork(), m_options.max_tip_age)) return;
3370 LogInfo("Leaving InitialBlockDownload (latching to false)");
3371 m_cached_is_ibd.store(false, std::memory_order_relaxed);
3372}
3373
3375{
3376 bool fNotify = false;
3377 bool fInitialBlockDownload = false;
3378 CBlockIndex* pindexHeader = nullptr;
3379 {
3380 LOCK(GetMutex());
3382
3384 fNotify = true;
3387 }
3388 }
3389 // Send block tip changed notifications without the lock held
3390 if (fNotify) {
3392 }
3393 return fNotify;
3394}
3395
3398
3399 if (signals.CallbacksPending() > 10) {
3400 signals.SyncWithValidationInterfaceQueue();
3401 }
3402}
3403
3404bool Chainstate::ActivateBestChain(BlockValidationState& state, std::shared_ptr<const CBlock> pblock)
3405{
3407
3408 // Note that while we're often called here from ProcessNewBlock, this is
3409 // far from a guarantee. Things in the P2P/RPC will often end up calling
3410 // us in the middle of ProcessNewBlock - do not assume pblock is set
3411 // sanely for performance or correctness!
3413
3414 // ABC maintains a fair degree of expensive-to-calculate internal state
3415 // because this function periodically releases cs_main so that it does not lock up other threads for too long
3416 // during large connects - and to allow for e.g. the callback queue to drain
3417 // we use m_chainstate_mutex to enforce mutual exclusion so that only one caller may execute this function at a time
3419
3420 // Belt-and-suspenders check that we aren't attempting to advance the
3421 // chainstate past the target block.
3422 if (WITH_LOCK(::cs_main, return m_target_utxohash)) {
3423 LogError("%s", STR_INTERNAL_BUG("m_target_utxohash is set - this chainstate should not be in operation."));
3424 return Assume(false);
3425 }
3426
3427 CBlockIndex *pindexMostWork = nullptr;
3428 CBlockIndex *pindexNewTip = nullptr;
3429 bool exited_ibd{false};
3430 do {
3431 // Block until the validation queue drains. This should largely
3432 // never happen in normal operation, however may happen during
3433 // reindex, causing memory blowup if we run too far ahead.
3434 // Note that if a validationinterface callback ends up calling
3435 // ActivateBestChain this may lead to a deadlock! We should
3436 // probably have a DEBUG_LOCKORDER test for this in the future.
3438
3439 {
3440 LOCK(cs_main);
3441 {
3442 // Lock transaction pool for at least as long as it takes for connected_blocks to be consumed
3443 LOCK(MempoolMutex());
3446 bool blocks_connected = false;
3447 do {
3448 // We absolutely may not unlock cs_main until we've made forward progress
3449 // (with the exception of shutdown due to hardware issues, low disk space, etc).
3450 std::vector<ConnectedBlock> connected_blocks; // Destructed before cs_main is unlocked
3451
3452 if (pindexMostWork == nullptr) {
3454 }
3455
3456 // Whether we have anything to do at all.
3457 if (pindexMostWork == nullptr || pindexMostWork == m_chain.Tip()) {
3458 break;
3459 }
3460
3461 bool fInvalidFound = false;
3462 std::shared_ptr<const CBlock> nullBlockPtr;
3463 // BlockConnected signals must be sent for the original role;
3464 // in case snapshot validation is completed during ActivateBestChainStep, the
3465 // result of GetRole() changes from BACKGROUND to NORMAL.
3466 const ChainstateRole chainstate_role{this->GetRole()};
3467 if (!ActivateBestChainStep(state, *pindexMostWork, pblock && pblock->GetHash() == pindexMostWork->GetBlockHash() ? pblock : nullBlockPtr, fInvalidFound, connected_blocks)) {
3468 // A system error occurred
3469 return false;
3470 }
3471 blocks_connected = true;
3472
3473 if (fInvalidFound) {
3474 // Wipe cache, we may need another branch now.
3475 pindexMostWork = nullptr;
3476 }
3478
3479 for (auto& [index, block] : std::move(connected_blocks)) {
3482 }
3483 }
3484
3485 // Break this do-while to ensure we don't advance past the target block.
3486 if (ReachedTarget()) {
3487 break;
3488 }
3490 if (!blocks_connected) return true;
3491
3494
3495 if (was_in_ibd && !still_in_ibd) {
3496 // Active chainstate has exited IBD.
3497 exited_ibd = true;
3498 }
3499
3500 // Notify external listeners about the new tip.
3501 // Enqueue while holding cs_main to ensure that UpdatedBlockTip is called in the order in which blocks are connected
3502 if (this == &m_chainman.ActiveChainstate() && pindexFork != pindexNewTip) {
3503 // Notify ValidationInterface subscribers
3506 }
3507
3510 /*index=*/*pindexNewTip,
3511 /*verification_progress=*/m_chainman.GuessVerificationProgress(pindexNewTip))))
3512 {
3513 // Just breaking and returning success for now. This could
3514 // be changed to bubble up the kernel::Interrupted value to
3515 // the caller so the caller could distinguish between
3516 // completed and interrupted operations.
3517 break;
3518 }
3519 }
3520 } // release MempoolMutex
3521 // Notify external listeners about the new tip, even if pindexFork == pindexNewTip.
3524 }
3525 } // release cs_main
3526 // When we reach this point, we switched to a new tip (stored in pindexNewTip).
3527
3528 bool reached_target;
3529 {
3531 if (exited_ibd) {
3532 // If a background chainstate is in use, we may need to rebalance our
3533 // allocation of caches once a chainstate exits initial block download.
3534 m_chainman.MaybeRebalanceCaches();
3535 }
3536
3537 // Write changes periodically to disk, after relay.
3539 return false;
3540 }
3541
3543 }
3544
3545 if (reached_target) {
3546 // Chainstate has reached the target block, so exit.
3547 //
3548 // Restart indexes so indexes can resync and index new blocks after
3549 // the target block.
3550 //
3551 // This cannot be done while holding cs_main (within
3552 // MaybeValidateSnapshot) or a cs_main deadlock will occur.
3555 }
3556 break;
3557 }
3558
3559 // We check interrupt only after giving ActivateBestChainStep a chance to run once so that we
3560 // never interrupt before connecting the genesis block during LoadChainTip(). Previously this
3561 // caused an assert() failure during interrupt in such cases as the UTXO DB flushing checks
3562 // that the best block hash is non-null.
3563 if (m_chainman.m_interrupt) break;
3564 } while (pindexNewTip != pindexMostWork);
3565
3567
3568 return true;
3569}
3570
3571bool Chainstate::PreciousBlock(BlockValidationState& state, CBlockIndex* pindex)
3572{
3575 {
3576 LOCK(cs_main);
3577 if (pindex->nChainWork < m_chain.Tip()->nChainWork) {
3578 // Nothing to do, this block is not at the tip.
3579 return true;
3580 }
3582 // The chain has been extended since the last call, reset the counter.
3584 }
3586 setBlockIndexCandidates.erase(pindex);
3588 if (m_chainman.nBlockReverseSequenceId > std::numeric_limits<int32_t>::min()) {
3589 // We can't keep reducing the counter if somebody really wants to
3590 // call preciousblock 2**31-1 times on the same set of tips...
3592 }
3593 if (pindex->IsValid(BLOCK_VALID_TRANSACTIONS) && pindex->HaveNumChainTxs()) {
3594 setBlockIndexCandidates.insert(pindex);
3596 }
3597 }
3598
3599 return ActivateBestChain(state, std::shared_ptr<const CBlock>());
3600}
3601
3602bool Chainstate::InvalidateBlock(BlockValidationState& state, CBlockIndex* const pindex)
3603{
3606
3607 // Genesis block can't be invalidated
3608 assert(pindex);
3609 if (pindex->nHeight == 0) return false;
3610
3611 // We do not allow ActivateBestChain() to run while InvalidateBlock() is
3612 // running, as that could cause the tip to change while we disconnect
3613 // blocks.
3615
3616 // We'll be acquiring and releasing cs_main below, to allow the validation
3617 // callbacks to run. However, we should keep the block index in a
3618 // consistent state as we disconnect blocks -- in particular we need to
3619 // add equal-work blocks to setBlockIndexCandidates as we disconnect.
3620 // To avoid walking the block index repeatedly in search of candidates,
3621 // build a map once so that we can look up candidate blocks by chain
3622 // work as we go.
3623 std::multimap<const arith_uint256, CBlockIndex*> highpow_outofchain_headers;
3624
3625 {
3626 LOCK(cs_main);
3627 for (auto& entry : m_blockman.m_block_index) {
3628 CBlockIndex& candidate = entry.second;
3629 // We don't need to put anything in our active chain into the
3630 // multimap, because those candidates will be found and considered
3631 // as we disconnect.
3632 // Instead, consider only non-active-chain blocks that score
3633 // at least as good with CBlockIndexWorkComparator as the new tip.
3634 if (!m_chain.Contains(candidate) &&
3636 !(candidate.nStatus & BLOCK_FAILED_VALID)) {
3637 highpow_outofchain_headers.insert({candidate.nChainWork, &candidate});
3638 }
3639 }
3640 }
3641
3642 CBlockIndex* to_mark_failed = pindex;
3643 bool pindex_was_in_chain = false;
3644 int disconnected = 0;
3645
3646 // Disconnect (descendants of) pindex, and mark them invalid.
3647 while (true) {
3648 if (m_chainman.m_interrupt) break;
3649
3650 // Make sure the queue of validation callbacks doesn't grow unboundedly.
3652
3653 LOCK(cs_main);
3654 // Lock for as long as disconnectpool is in scope to make sure MaybeUpdateMempoolForReorg is
3655 // called after DisconnectTip without unlocking in between
3656 LOCK(MempoolMutex());
3657 if (!m_chain.Contains(*pindex)) break;
3658 pindex_was_in_chain = true;
3660
3661 // ActivateBestChain considers blocks already in m_chain
3662 // unconditionally valid already, so force disconnect away from it.
3664 bool ret = DisconnectTip(state, &disconnectpool);
3665 // DisconnectTip will add transactions to disconnectpool.
3666 // Adjust the mempool to be consistent with the new tip, adding
3667 // transactions back to the mempool if disconnecting was successful,
3668 // and we're not doing a very deep invalidation (in which case
3669 // keeping the mempool up to date is probably futile anyway).
3670 MaybeUpdateMempoolForReorg(disconnectpool, /* fAddToMempool = */ (++disconnected <= 10) && ret);
3671 if (!ret) return false;
3673 assert(disconnected_tip->pprev == new_tip);
3674
3675 // We immediately mark the disconnected blocks as invalid.
3676 // This prevents a case where pruned nodes may fail to invalidateblock
3677 // and be left unable to start as they have no tip candidates (as there
3678 // are no blocks that meet the "have data and are not invalid per
3679 // nStatus" criteria for inclusion in setBlockIndexCandidates).
3684
3685 // Mark out-of-chain descendants of the invalidated block as invalid
3686 // Add any equal or more work headers that are not invalidated to setBlockIndexCandidates
3687 // Recalculate m_best_header if it became invalid.
3688 auto candidate_it = highpow_outofchain_headers.lower_bound(new_tip->nChainWork);
3689
3690 const bool best_header_needs_update{m_chainman.m_best_header->GetAncestor(disconnected_tip->nHeight) == disconnected_tip};
3692 // new_tip is definitely still valid at this point, but there may be better ones
3693 m_chainman.m_best_header = new_tip;
3694 }
3695
3696 while (candidate_it != highpow_outofchain_headers.end()) {
3698 if (candidate->GetAncestor(disconnected_tip->nHeight) == disconnected_tip) {
3699 // Children of failed blocks are marked as BLOCK_FAILED_VALID.
3700 candidate->nStatus |= BLOCK_FAILED_VALID;
3702 // If invalidated, the block is irrelevant for setBlockIndexCandidates
3703 // and for m_best_header and can be removed from the cache.
3705 continue;
3706 }
3709 candidate->HaveNumChainTxs()) {
3711 // Do not remove candidate from the highpow_outofchain_headers cache, because it might be a descendant of the block being invalidated
3712 // which needs to be marked failed later.
3713 }
3715 m_chainman.m_best_header->nChainWork < candidate->nChainWork) {
3716 m_chainman.m_best_header = candidate;
3717 }
3718 ++candidate_it;
3719 }
3720
3721 // Track the last disconnected block to call InvalidChainFound on it.
3723 }
3724
3726
3727 {
3728 LOCK(cs_main);
3730 // If the to-be-marked invalid block is in the active chain, something is interfering and we can't proceed.
3731 return false;
3732 }
3733
3734 // Mark pindex as invalid if it never was in the main chain
3735 if (!pindex_was_in_chain && !(pindex->nStatus & BLOCK_FAILED_VALID)) {
3736 pindex->nStatus |= BLOCK_FAILED_VALID;
3737 m_blockman.m_dirty_blockindex.insert(pindex);
3738 setBlockIndexCandidates.erase(pindex);
3739 }
3740
3741 // If any new blocks somehow arrived while we were disconnecting
3742 // (above), then the pre-calculation of what should go into
3743 // setBlockIndexCandidates may have missed entries. This would
3744 // technically be an inconsistency in the block index, but if we clean
3745 // it up here, this should be an essentially unobservable error.
3746 // Loop back over all block index entries and add any missing entries
3747 // to setBlockIndexCandidates.
3748 for (auto& [_, block_index] : m_blockman.m_block_index) {
3749 if (block_index.IsValid(BLOCK_VALID_TRANSACTIONS) && block_index.HaveNumChainTxs() && !setBlockIndexCandidates.value_comp()(&block_index, m_chain.Tip())) {
3751 }
3752 }
3753
3755 }
3756
3757 // Only notify about a new block tip if the active chain was modified.
3758 if (pindex_was_in_chain) {
3759 // Ignoring return value for now, this could be changed to bubble up
3760 // kernel::Interrupted value to the caller so the caller could
3761 // distinguish between completed and interrupted operations. It might
3762 // also make sense for the blockTip notification to have an enum
3763 // parameter indicating the source of the tip change so hooks can
3764 // distinguish user-initiated invalidateblock changes from other
3765 // changes.
3768 /*index=*/*to_mark_failed->pprev,
3769 /*verification_progress=*/WITH_LOCK(m_chainman.GetMutex(), return m_chainman.GuessVerificationProgress(to_mark_failed->pprev)));
3770
3771 // Fire ActiveTipChange now for the current chain tip to make sure clients are notified.
3772 // ActivateBestChain may call this as well, but not necessarily.
3775 }
3776 }
3777 return true;
3778}
3779
3780void Chainstate::SetBlockFailureFlags(CBlockIndex* invalid_block)
3781{
3783
3784 for (auto& [_, block_index] : m_blockman.m_block_index) {
3785 if (invalid_block != &block_index && block_index.GetAncestor(invalid_block->nHeight) == invalid_block) {
3788 }
3789 }
3790}
3791
3794
3795 int nHeight = pindex->nHeight;
3796
3797 // Remove the invalidity flag from this block and all its descendants and ancestors.
3798 for (auto& [_, block_index] : m_blockman.m_block_index) {
3799 if ((block_index.nStatus & BLOCK_FAILED_VALID) && (block_index.GetAncestor(nHeight) == pindex || pindex->GetAncestor(block_index.nHeight) == &block_index)) {
3802 if (block_index.IsValid(BLOCK_VALID_TRANSACTIONS) && block_index.HaveNumChainTxs() && setBlockIndexCandidates.value_comp()(m_chain.Tip(), &block_index)) {
3804 }
3805 if (&block_index == m_chainman.m_best_invalid) {
3806 // Reset invalid block marker if it was pointing to one of those.
3807 m_chainman.m_best_invalid = nullptr;
3808 }
3809 }
3810 }
3811}
3812
3814{
3816
3817 // Do not continue building a chainstate that is based on an invalid
3818 // snapshot. This is a belt-and-suspenders type of check because if an
3819 // invalid snapshot is loaded, the node will shut down to force a manual
3820 // intervention. But it is good to handle this case correctly regardless.
3822 return;
3823 }
3824
3825 // The block only is a candidate for the most-work-chain if it has the same
3826 // or more work than our current tip.
3827 if (m_chain.Tip() != nullptr && setBlockIndexCandidates.value_comp()(pindex, m_chain.Tip())) {
3828 return;
3829 }
3830
3832 if (!target_block) {
3833 // If no specific target block, add all entries that have more
3834 // work than the tip.
3835 setBlockIndexCandidates.insert(pindex);
3836 } else {
3837 // If there is a target block, only consider connecting blocks
3838 // towards the target block.
3839 if (target_block->GetAncestor(pindex->nHeight) == pindex) {
3840 setBlockIndexCandidates.insert(pindex);
3841 }
3842 }
3843}
3844
3847{
3849 pindexNew->nTx = block.vtx.size();
3850 // Typically m_chain_tx_count will be 0 at this point, but it can be nonzero if this
3851 // is a pruned block which is being downloaded again, or if this is an
3852 // assumeutxo snapshot block which has a hardcoded m_chain_tx_count value from the
3853 // snapshot metadata. If the pindex is not the snapshot block and the
3854 // m_chain_tx_count value is not zero, assert that value is actually correct.
3855 auto prev_tx_sum = [](CBlockIndex& block) { return block.nTx + (block.pprev ? block.pprev->m_chain_tx_count : 0); };
3856 if (!Assume(pindexNew->m_chain_tx_count == 0 || pindexNew->m_chain_tx_count == prev_tx_sum(*pindexNew) ||
3857 std::ranges::any_of(m_chainstates, [&](const auto& cs) EXCLUSIVE_LOCKS_REQUIRED(cs_main) { return cs->SnapshotBase() == pindexNew; }))) {
3858 LogWarning("Internal bug detected: block %d has unexpected m_chain_tx_count %i that should be %i (%s %s). Please report this issue here: %s\n",
3860 pindexNew->m_chain_tx_count = 0;
3861 }
3862 pindexNew->nFile = pos.nFile;
3863 pindexNew->nDataPos = pos.nPos;
3864 pindexNew->nUndoPos = 0;
3865 pindexNew->nStatus |= BLOCK_HAVE_DATA;
3867 pindexNew->nStatus |= BLOCK_OPT_WITNESS;
3868 }
3869 pindexNew->RaiseValidity(BLOCK_VALID_TRANSACTIONS);
3871
3872 if (pindexNew->pprev == nullptr || pindexNew->pprev->HaveNumChainTxs()) {
3873 // If pindexNew is the genesis block or all parents are BLOCK_VALID_TRANSACTIONS.
3874 std::deque<CBlockIndex*> queue;
3875 queue.push_back(pindexNew);
3876
3877 // Recursively process any descendant blocks that now may be eligible to be connected.
3878 while (!queue.empty()) {
3879 CBlockIndex *pindex = queue.front();
3880 queue.pop_front();
3881 // Before setting m_chain_tx_count, assert that it is 0 or already set to
3882 // the correct value. This assert will fail after receiving the
3883 // assumeutxo snapshot block if assumeutxo snapshot metadata has an
3884 // incorrect hardcoded AssumeutxoData::m_chain_tx_count value.
3885 if (!Assume(pindex->m_chain_tx_count == 0 || pindex->m_chain_tx_count == prev_tx_sum(*pindex))) {
3886 LogWarning("Internal bug detected: block %d has unexpected m_chain_tx_count %i that should be %i (%s %s). Please report this issue here: %s\n",
3888 }
3889 pindex->m_chain_tx_count = prev_tx_sum(*pindex);
3890 pindex->nSequenceId = nBlockSequenceId++;
3891 for (const auto& c : m_chainstates) {
3892 c->TryAddBlockIndexCandidate(pindex);
3893 }
3894 std::pair<std::multimap<CBlockIndex*, CBlockIndex*>::iterator, std::multimap<CBlockIndex*, CBlockIndex*>::iterator> range = m_blockman.m_blocks_unlinked.equal_range(pindex);
3895 while (range.first != range.second) {
3896 std::multimap<CBlockIndex*, CBlockIndex*>::iterator it = range.first;
3897 queue.push_back(it->second);
3898 range.first++;
3899 m_blockman.m_blocks_unlinked.erase(it);
3900 }
3901 }
3902 } else {
3903 if (pindexNew->pprev && pindexNew->pprev->IsValid(BLOCK_VALID_TREE)) {
3905 }
3906 }
3907}
3908
3910{
3911 // Check proof of work matches claimed amount
3912 if (fCheckPOW && !CheckProofOfWork(block.GetHash(), block.nBits, consensusParams))
3913 return state.Invalid(BlockValidationResult::BLOCK_INVALID_HEADER, "high-hash", "proof of work failed");
3914
3915 return true;
3916}
3917
3918static bool CheckMerkleRoot(const CBlock& block, BlockValidationState& state)
3919{
3920 if (block.m_checked_merkle_root) return true;
3921
3922 bool mutated;
3923 uint256 merkle_root = BlockMerkleRoot(block, &mutated);
3924 if (block.hashMerkleRoot != merkle_root) {
3925 return state.Invalid(
3927 /*reject_reason=*/"bad-txnmrklroot",
3928 /*debug_message=*/"hashMerkleRoot mismatch");
3929 }
3930
3931 // Check for merkle tree malleability (CVE-2012-2459): repeating sequences
3932 // of transactions in a block without affecting the merkle root of a block,
3933 // while still invalidating it.
3934 if (mutated) {
3935 return state.Invalid(
3937 /*reject_reason=*/"bad-txns-duplicate",
3938 /*debug_message=*/"duplicate transaction");
3939 }
3940
3941 block.m_checked_merkle_root = true;
3942 return true;
3943}
3944
3952{
3954 if (block.m_checked_witness_commitment) return true;
3955
3958 assert(!block.vtx.empty() && !block.vtx[0]->vin.empty());
3959 const auto& witness_stack{block.vtx[0]->vin[0].scriptWitness.stack};
3960
3961 if (witness_stack.size() != 1 || witness_stack[0].size() != 32) {
3962 return state.Invalid(
3964 /*reject_reason=*/"bad-witness-nonce-size",
3965 /*debug_message=*/strprintf("%s : invalid witness reserved value size", __func__));
3966 }
3967
3968 // The malleation check is ignored; as the transaction tree itself
3969 // already does not permit it, it is impossible to trigger in the
3970 // witness tree.
3972
3974 if (memcmp(hash_witness.begin(), &block.vtx[0]->vout[commitpos].scriptPubKey[6], 32)) {
3975 return state.Invalid(
3977 /*reject_reason=*/"bad-witness-merkle-match",
3978 /*debug_message=*/strprintf("%s : witness merkle commitment mismatch", __func__));
3979 }
3980
3981 block.m_checked_witness_commitment = true;
3982 return true;
3983 }
3984 }
3985
3986 // No witness data is allowed in blocks that don't commit to witness data, as this would otherwise leave room for spam
3987 for (const auto& tx : block.vtx) {
3988 if (tx->HasWitness()) {
3989 return state.Invalid(
3991 /*reject_reason=*/"unexpected-witness",
3992 /*debug_message=*/strprintf("%s : unexpected witness data found", __func__));
3993 }
3994 }
3995
3996 return true;
3997}
3998
4000{
4001 // These are checks that are independent of context.
4002
4003 if (block.fChecked)
4004 return true;
4005
4006 // Check that the header is valid (particularly PoW). This is mostly
4007 // redundant with the call in AcceptBlockHeader.
4008 if (!CheckBlockHeader(block, state, consensusParams, fCheckPOW))
4009 return false;
4010
4011 // Signet only: check block solution
4012 if (consensusParams.signet_blocks && fCheckPOW && !CheckSignetBlockSolution(block, consensusParams)) {
4013 return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-signet-blksig", "signet block signature validation failure");
4014 }
4015
4016 // Check the merkle root.
4017 if (fCheckMerkleRoot && !CheckMerkleRoot(block, state)) {
4018 return false;
4019 }
4020
4021 // All potential-corruption validation must be done before we do any
4022 // transaction validation, as otherwise we may mark the header as invalid
4023 // because we receive the wrong transactions for it.
4024 // Note that witness malleability is checked in ContextualCheckBlock, so no
4025 // checks that use witness data may be performed here.
4026
4027 // Size limits
4029 return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-blk-length", "size limits failed");
4030
4031 // First transaction must be coinbase, the rest must not be
4032 if (block.vtx.empty() || !block.vtx[0]->IsCoinBase())
4033 return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-cb-missing", "first tx is not coinbase");
4034 for (unsigned int i = 1; i < block.vtx.size(); i++)
4035 if (block.vtx[i]->IsCoinBase())
4036 return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-cb-multiple", "more than one coinbase");
4037
4038 // Check transactions
4039 // Must check for duplicate inputs (see CVE-2018-17144)
4040 for (const auto& tx : block.vtx) {
4042 if (!CheckTransaction(*tx, tx_state)) {
4043 // CheckBlock() does context-free validation checks. The only
4044 // possible failures are consensus failures.
4046 return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, tx_state.GetRejectReason(),
4047 strprintf("Transaction check failed (tx hash %s) %s", tx->GetHash().ToString(), tx_state.GetDebugMessage()));
4048 }
4049 }
4050 // This underestimates the number of sigops, because unlike ConnectBlock it
4051 // does not count witness and p2sh sigops.
4052 unsigned int nSigOps = 0;
4053 for (const auto& tx : block.vtx)
4054 {
4056 }
4058 return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-blk-sigops", "out-of-bounds SigOpCount");
4059
4061 block.fChecked = true;
4062
4063 return true;
4064}
4065
4067{
4069 static const std::vector<unsigned char> nonce(32, 0x00);
4071 CMutableTransaction tx(*block.vtx[0]);
4072 tx.vin[0].scriptWitness.stack.resize(1);
4073 tx.vin[0].scriptWitness.stack[0] = nonce;
4074 block.vtx[0] = MakeTransactionRef(std::move(tx));
4075 }
4076}
4077
4079{
4081 std::vector<unsigned char> ret(32, 0x00);
4085 CTxOut out;
4086 out.nValue = 0;
4087 out.scriptPubKey.resize(MINIMUM_WITNESS_COMMITMENT);
4088 out.scriptPubKey[0] = OP_RETURN;
4089 out.scriptPubKey[1] = 0x24;
4090 out.scriptPubKey[2] = 0xaa;
4091 out.scriptPubKey[3] = 0x21;
4092 out.scriptPubKey[4] = 0xa9;
4093 out.scriptPubKey[5] = 0xed;
4094 memcpy(&out.scriptPubKey[6], witnessroot.begin(), 32);
4095 CMutableTransaction tx(*block.vtx[0]);
4096 tx.vout.push_back(out);
4097 block.vtx[0] = MakeTransactionRef(std::move(tx));
4098 }
4100}
4101
4102bool HasValidProofOfWork(std::span<const CBlockHeader> headers, const Consensus::Params& consensusParams)
4103{
4104 return std::ranges::all_of(headers,
4105 [&](const auto& header) { return CheckProofOfWork(header.GetHash(), header.nBits, consensusParams); });
4106}
4107
4109{
4111 if (!CheckMerkleRoot(block, state)) {
4112 LogDebug(BCLog::VALIDATION, "Block mutated: %s\n", state.ToString());
4113 return true;
4114 }
4115
4116 if (block.vtx.empty() || !block.vtx[0]->IsCoinBase()) {
4117 // Consider the block mutated if any transaction is 64 bytes in size (see 3.1
4118 // in "Weaknesses in Bitcoin’s Merkle Root Construction":
4119 // https://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20190225/a27d8837/attachment-0001.pdf).
4120 //
4121 // Note: This is not a consensus change as this only applies to blocks that
4122 // don't have a coinbase transaction and would therefore already be invalid.
4123 return std::any_of(block.vtx.begin(), block.vtx.end(),
4124 [](auto& tx) { return GetSerializeSize(TX_NO_WITNESS(tx)) == 64; });
4125 } else {
4126 // Theoretically it is still possible for a block with a 64 byte
4127 // coinbase transaction to be mutated but we neglect that possibility
4128 // here as it requires at least 224 bits of work.
4129 }
4130
4131 if (!CheckWitnessMalleation(block, check_witness_root, state)) {
4132 LogDebug(BCLog::VALIDATION, "Block mutated: %s\n", state.ToString());
4133 return true;
4134 }
4135
4136 return false;
4137}
4138
4140{
4142 for (const CBlockHeader& header : headers) {
4143 total_work += GetBlockProof(header);
4144 }
4145 return total_work;
4146}
4147
4162{
4164 assert(pindexPrev != nullptr);
4165 const int nHeight = pindexPrev->nHeight + 1;
4166
4167 // Check proof of work
4168 const Consensus::Params& consensusParams = chainman.GetConsensus();
4169 if (block.nBits != GetNextWorkRequired(pindexPrev, &block, consensusParams))
4170 return state.Invalid(BlockValidationResult::BLOCK_INVALID_HEADER, "bad-diffbits", "incorrect proof of work");
4171
4172 // Check timestamp against prev
4173 if (block.GetBlockTime() <= pindexPrev->GetMedianTimePast())
4174 return state.Invalid(BlockValidationResult::BLOCK_INVALID_HEADER, "time-too-old", "block's timestamp is too early");
4175
4176 // Testnet4 and regtest only: Check timestamp against prev for difficulty-adjustment
4177 // blocks to prevent timewarp attacks (see https://github.com/bitcoin/bitcoin/pull/15482).
4178 if (consensusParams.enforce_BIP94) {
4179 // Check timestamp for the first block of each difficulty adjustment
4180 // interval, except the genesis block.
4181 if (nHeight % consensusParams.DifficultyAdjustmentInterval() == 0) {
4182 if (block.GetBlockTime() < pindexPrev->GetBlockTime() - MAX_TIMEWARP) {
4183 return state.Invalid(BlockValidationResult::BLOCK_INVALID_HEADER, "time-timewarp-attack", "block's timestamp is too early on diff adjustment block");
4184 }
4185 }
4186 }
4187
4188 // Check timestamp
4189 if (block.Time() > NodeClock::now() + std::chrono::seconds{MAX_FUTURE_BLOCK_TIME}) {
4190 return state.Invalid(BlockValidationResult::BLOCK_TIME_FUTURE, "time-too-new", "block timestamp too far in the future");
4191 }
4192
4193 // Reject blocks with outdated version
4197 return state.Invalid(BlockValidationResult::BLOCK_INVALID_HEADER, strprintf("bad-version(0x%08x)", block.nVersion),
4198 strprintf("rejected nVersion=0x%08x block", block.nVersion));
4199 }
4200
4201 return true;
4202}
4203
4210static bool ContextualCheckBlock(const CBlock& block, BlockValidationState& state, const ChainstateManager& chainman, const CBlockIndex* pindexPrev)
4211{
4212 const int nHeight = pindexPrev == nullptr ? 0 : pindexPrev->nHeight + 1;
4213
4214 // Enforce BIP113 (Median Time Past).
4217 assert(pindexPrev != nullptr);
4219 }
4220
4222 pindexPrev->GetMedianTimePast() :
4223 block.GetBlockTime()};
4224
4225 // Check that all transactions are finalized
4226 for (const auto& tx : block.vtx) {
4227 if (!IsFinalTx(*tx, nHeight, nLockTimeCutoff)) {
4228 return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-txns-nonfinal", "non-final transaction");
4229 }
4230 }
4231
4232 // Enforce rule that the coinbase starts with serialized block height
4234 {
4236 if (block.vtx[0]->vin[0].scriptSig.size() < expect.size() ||
4237 !std::equal(expect.begin(), expect.end(), block.vtx[0]->vin[0].scriptSig.begin())) {
4238 return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-cb-height", "block height mismatch in coinbase");
4239 }
4240 }
4241
4242 // Validation for witness commitments.
4243 // * We compute the witness hash (which is the hash including witnesses) of all the block's transactions, except the
4244 // coinbase (where 0x0000....0000 is used instead).
4245 // * The coinbase scriptWitness is a stack of a single 32-byte vector, containing a witness reserved value (unconstrained).
4246 // * We build a merkle tree with all those witness hashes as leaves (similar to the hashMerkleRoot in the block header).
4247 // * There must be at least one output whose scriptPubKey is a single 36-byte push, the first 4 bytes of which are
4248 // {0xaa, 0x21, 0xa9, 0xed}, and the following 32 bytes are SHA256^2(witness root, witness reserved value). In case there are
4249 // multiple, the last one is used.
4251 return false;
4252 }
4253
4254 // After the coinbase witness reserved value and commitment are verified,
4255 // we can check if the block weight passes (before we've checked the
4256 // coinbase witness, it would be possible for the weight to be too
4257 // large by filling up the coinbase witness, which doesn't change
4258 // the block hash, so we couldn't mark the block as permanently
4259 // failed).
4260 if (GetBlockWeight(block) > MAX_BLOCK_WEIGHT) {
4261 return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-blk-weight", strprintf("%s : weight limit failed", __func__));
4262 }
4263
4264 return true;
4265}
4266
4268{
4270
4271 // Check for duplicate
4272 uint256 hash = block.GetHash();
4273 BlockMap::iterator miSelf{m_blockman.m_block_index.find(hash)};
4274 if (hash != GetConsensus().hashGenesisBlock) {
4275 if (miSelf != m_blockman.m_block_index.end()) {
4276 // Block header is already known.
4277 CBlockIndex* pindex = &(miSelf->second);
4278 if (ppindex)
4279 *ppindex = pindex;
4280 if (pindex->nStatus & BLOCK_FAILED_VALID) {
4281 LogDebug(BCLog::VALIDATION, "%s: block %s is marked invalid\n", __func__, hash.ToString());
4282 return state.Invalid(BlockValidationResult::BLOCK_CACHED_INVALID, "duplicate-invalid",
4283 strprintf("block %s was previously marked invalid", hash.ToString()));
4284 }
4285 return true;
4286 }
4287
4288 if (!CheckBlockHeader(block, state, GetConsensus())) {
4289 LogDebug(BCLog::VALIDATION, "%s: Consensus::CheckBlockHeader: %s, %s\n", __func__, hash.ToString(), state.ToString());
4290 return false;
4291 }
4292
4293 // Get prev block index
4294 CBlockIndex* pindexPrev = nullptr;
4295 BlockMap::iterator mi{m_blockman.m_block_index.find(block.hashPrevBlock)};
4296 if (mi == m_blockman.m_block_index.end()) {
4297 LogDebug(BCLog::VALIDATION, "header %s has prev block not found: %s\n", hash.ToString(), block.hashPrevBlock.ToString());
4298 return state.Invalid(BlockValidationResult::BLOCK_MISSING_PREV, "prev-blk-not-found");
4299 }
4300 pindexPrev = &((*mi).second);
4301 if (pindexPrev->nStatus & BLOCK_FAILED_VALID) {
4302 LogDebug(BCLog::VALIDATION, "header %s has prev block invalid: %s\n", hash.ToString(), block.hashPrevBlock.ToString());
4303 return state.Invalid(BlockValidationResult::BLOCK_INVALID_PREV, "bad-prevblk");
4304 }
4305 if (!ContextualCheckBlockHeader(block, state, *this, pindexPrev)) {
4306 LogDebug(BCLog::VALIDATION, "%s: Consensus::ContextualCheckBlockHeader: %s, %s\n", __func__, hash.ToString(), state.ToString());
4307 return false;
4308 }
4309 }
4310 if (!min_pow_checked) {
4311 LogDebug(BCLog::VALIDATION, "%s: not adding new block header %s, missing anti-dos proof-of-work validation\n", __func__, hash.ToString());
4312 return state.Invalid(BlockValidationResult::BLOCK_HEADER_LOW_WORK, "too-little-chainwork");
4313 }
4315
4316 if (ppindex)
4317 *ppindex = pindex;
4318
4319 return true;
4320}
4321
4322// Exposed wrapper for AcceptBlockHeader
4324{
4326 {
4327 LOCK(cs_main);
4328 for (const CBlockHeader& header : headers) {
4329 CBlockIndex *pindex = nullptr; // Use a temp pindex instead of ppindex to avoid a const_cast
4330 bool accepted{AcceptBlockHeader(header, state, &pindex, min_pow_checked)};
4332
4333 if (!accepted) {
4334 return false;
4335 }
4336 if (ppindex) {
4337 *ppindex = pindex;
4338 }
4339 }
4340 }
4341 if (NotifyHeaderTip()) {
4342 if (IsInitialBlockDownload() && ppindex && *ppindex) {
4345 blocks_left = std::max<int64_t>(0, blocks_left);
4346 const double progress{100.0 * last_accepted.nHeight / (last_accepted.nHeight + blocks_left)};
4347 LogInfo("Synchronizing blockheaders, height: %d (~%.2f%%)\n", last_accepted.nHeight, progress);
4348 }
4349 }
4350 return true;
4351}
4352
4354{
4356 {
4357 LOCK(GetMutex());
4358 // Don't report headers presync progress if we already have a post-minchainwork header chain.
4359 // This means we lose reporting for potentially legitimate, but unlikely, deep reorgs, but
4360 // prevent attackers that spam low-work headers from filling our logs.
4361 if (m_best_header->nChainWork >= UintToArith256(GetConsensus().nMinimumChainWork)) return;
4362 // Rate limit headers presync updates to 4 per second, as these are not subject to DoS
4363 // protection.
4364 auto now = MockableSteadyClock::now();
4365 if (now < m_last_presync_update + std::chrono::milliseconds{250}) return;
4367 }
4370 if (initial_download) {
4371 int64_t blocks_left{(NodeClock::now() - NodeSeconds{std::chrono::seconds{timestamp}}) / GetConsensus().PowTargetSpacing()};
4372 blocks_left = std::max<int64_t>(0, blocks_left);
4373 const double progress{100.0 * height / (height + blocks_left)};
4374 LogInfo("Pre-synchronizing blockheaders, height: %d (~%.2f%%)\n", height, progress);
4375 }
4376}
4377
4379bool ChainstateManager::AcceptBlock(const std::shared_ptr<const CBlock>& pblock, BlockValidationState& state, CBlockIndex** ppindex, bool fRequested, const FlatFilePos* dbp, bool* fNewBlock, bool min_pow_checked)
4380{
4381 const CBlock& block = *pblock;
4382
4383 if (fNewBlock) *fNewBlock = false;
4385
4386 CBlockIndex *pindexDummy = nullptr;
4387 CBlockIndex *&pindex = ppindex ? *ppindex : pindexDummy;
4388
4389 bool accepted_header{AcceptBlockHeader(block, state, &pindex, min_pow_checked)};
4391
4392 if (!accepted_header)
4393 return false;
4394
4395 // Check all requested blocks that we do not already have for validity and
4396 // save them to disk. Skip processing of unrequested blocks as an anti-DoS
4397 // measure, unless the blocks have more work than the active chain tip, and
4398 // aren't too far ahead of it, so are likely to be attached soon.
4399 bool fAlreadyHave = pindex->nStatus & BLOCK_HAVE_DATA;
4400 bool fHasMoreOrSameWork = (ActiveTip() ? pindex->nChainWork >= ActiveTip()->nChainWork : true);
4401 // Blocks that are too out-of-order needlessly limit the effectiveness of
4402 // pruning, because pruning will not delete block files that contain any
4403 // blocks which are too close in height to the tip. Apply this test
4404 // regardless of whether pruning is enabled; it should generally be safe to
4405 // not process unrequested blocks.
4407
4408 // TODO: Decouple this function from the block download logic by removing fRequested
4409 // This requires some new chain data structure to efficiently look up if a
4410 // block is in a chain leading to a candidate for best tip, despite not
4411 // being such a candidate itself.
4412 // Note that this would break the getblockfrompeer RPC
4413
4414 // TODO: deal better with return value and error conditions for duplicate
4415 // and unrequested blocks.
4416 if (fAlreadyHave) return true;
4417 if (!fRequested) { // If we didn't ask for it:
4418 if (pindex->nTx != 0) return true; // This is a previously-processed block that was pruned
4419 if (!fHasMoreOrSameWork) return true; // Don't process less-work chains
4420 if (fTooFarAhead) return true; // Block height is too high
4421
4422 // Protect against DoS attacks from low-work chains.
4423 // If our tip is behind, a peer could try to send us
4424 // low-work blocks on a fake chain that we would never
4425 // request; don't process these.
4426 if (pindex->nChainWork < MinimumChainWork()) return true;
4427 }
4428
4429 const CChainParams& params{GetParams()};
4430
4431 if (!CheckBlock(block, state, params.GetConsensus()) ||
4432 !ContextualCheckBlock(block, state, *this, pindex->pprev)) {
4433 if (Assume(state.IsInvalid())) {
4434 ActiveChainstate().InvalidBlockFound(pindex, state);
4435 }
4436 LogError("%s: %s\n", __func__, state.ToString());
4437 return false;
4438 }
4439
4440 // Header is valid/has work, merkle tree and segwit merkle tree are good...RELAY NOW
4441 // (but if it does not build on our best tip, let the SendMessages loop relay it)
4442 if (!IsInitialBlockDownload() && ActiveTip() == pindex->pprev && m_options.signals) {
4443 m_options.signals->NewPoWValidBlock(pindex, pblock);
4444 }
4445
4446 // Write block to history file
4447 if (fNewBlock) *fNewBlock = true;
4448 try {
4450 if (dbp) {
4451 blockPos = *dbp;
4452 m_blockman.UpdateBlockInfo(block, pindex->nHeight, blockPos);
4453 } else {
4454 blockPos = m_blockman.WriteBlock(block, pindex->nHeight);
4455 if (blockPos.IsNull()) {
4456 state.Error(strprintf("%s: Failed to find position to write new block to disk", __func__));
4457 return false;
4458 }
4459 }
4460 ReceivedBlockTransactions(block, pindex, blockPos);
4461 } catch (const std::runtime_error& e) {
4462 return FatalError(GetNotifications(), state, strprintf(_("System error while saving block to disk: %s"), e.what()));
4463 }
4464
4465 // TODO: FlushStateToDisk() handles flushing of both block and chainstate
4466 // data, so we should move this to ChainstateManager so that we can be more
4467 // intelligent about how we flush.
4468 // For now, since FlushStateMode::NONE is used, all that can happen is that
4469 // the block files may be pruned, so we can just call this on one
4470 // chainstate (particularly if we haven't implemented pruning with
4471 // background validation yet).
4472 //
4473 // Flush errors (e.g. low disk space during pruning) are ignored, so that
4474 // callers can't mistreat a flush failure as a block validation failure.
4475 // The fatal error notification inside FlushStateToDisk still fires,
4476 // so the node will shut down on unrecoverable flush errors regardless.
4477 // For state a dummy value is used, and the return value is ignored.
4480
4482
4483 return true;
4484}
4485
4486bool ChainstateManager::ProcessNewBlock(const std::shared_ptr<const CBlock>& block, bool force_processing, bool min_pow_checked, bool* new_block)
4487{
4489
4490 {
4491 CBlockIndex *pindex = nullptr;
4492 if (new_block) *new_block = false;
4494
4495 // CheckBlock() does not support multi-threaded block validation because CBlock::fChecked can cause data race.
4496 // Therefore, the following critical section must include the CheckBlock() call as well.
4497 LOCK(cs_main);
4498
4499 // Skipping AcceptBlock() for CheckBlock() failures means that we will never mark a block as invalid if
4500 // CheckBlock() fails. This is protective against consensus failure if there are any unknown forms of block
4501 // malleability that cause CheckBlock() to fail; see e.g. CVE-2012-2459 and
4502 // https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2019-February/016697.html. Because CheckBlock() is
4503 // not very expensive, the anti-DoS benefits of caching failure (of a definitely-invalid block) are not substantial.
4504 bool ret = CheckBlock(*block, state, GetConsensus());
4505 if (ret) {
4506 // Store to disk
4507 ret = AcceptBlock(block, state, &pindex, force_processing, nullptr, new_block, min_pow_checked);
4508 }
4509 if (!ret) {
4510 if (m_options.signals) {
4511 m_options.signals->BlockChecked(block, state);
4512 }
4513 LogError("%s: AcceptBlock FAILED (%s)\n", __func__, state.ToString());
4514 return false;
4515 }
4516 }
4517
4519
4520 BlockValidationState state; // Only used to report errors, not invalidity - ignore it
4521 if (!ActiveChainstate().ActivateBestChain(state, block)) {
4522 LogError("%s: ActivateBestChain failed (%s)\n", __func__, state.ToString());
4523 return false;
4524 }
4525
4528 if (bg_chain && !bg_chain->ActivateBestChain(bg_state, block)) {
4529 LogError("%s: [background] ActivateBestChain failed (%s)\n", __func__, bg_state.ToString());
4530 return false;
4531 }
4532
4533 return true;
4534}
4535
4537{
4540 if (!active_chainstate.GetMempool()) {
4541 TxValidationState state;
4542 state.Invalid(TxValidationResult::TX_NO_MEMPOOL, "no-mempool");
4543 return MempoolAcceptResult::Failure(state);
4544 }
4545 auto result = AcceptToMemoryPool(active_chainstate, tx, GetTime(), /*bypass_limits=*/ false, test_accept);
4546 active_chainstate.GetMempool()->check(active_chainstate.CoinsTip(), active_chainstate.m_chain.Height() + 1);
4547 return result;
4548}
4549
4550
4553 const CBlock& block,
4554 const bool check_pow,
4555 const bool check_merkle_root)
4556{
4557 // Lock must be held throughout this function for two reasons:
4558 // 1. We don't want the tip to change during several of the validation steps
4559 // 2. To prevent a CheckBlock() race condition for fChecked, see ProcessNewBlock()
4560 AssertLockHeld(chainstate.m_chainman.GetMutex());
4561
4563 CBlockIndex* tip{Assert(chainstate.m_chain.Tip())};
4564
4565 if (block.hashPrevBlock != *Assert(tip->phashBlock)) {
4566 state.Invalid({}, "inconclusive-not-best-prevblk");
4567 return state;
4568 }
4569
4570 // For signets CheckBlock() verifies the challenge iff fCheckPow is set.
4571 if (!CheckBlock(block, state, chainstate.m_chainman.GetConsensus(), /*fCheckPow=*/check_pow, /*fCheckMerkleRoot=*/check_merkle_root)) {
4572 // This should never happen, but belt-and-suspenders don't approve the
4573 // block if it does.
4574 if (state.IsValid()) NONFATAL_UNREACHABLE();
4575 return state;
4576 }
4577
4593 if (!ContextualCheckBlockHeader(block, state, chainstate.m_chainman, tip)) {
4594 if (state.IsValid()) NONFATAL_UNREACHABLE();
4595 return state;
4596 }
4597
4598 if (!ContextualCheckBlock(block, state, chainstate.m_chainman, tip)) {
4599 if (state.IsValid()) NONFATAL_UNREACHABLE();
4600 return state;
4601 }
4602
4603 // We don't want ConnectBlock to update the actual chainstate, so create
4604 // a cache on top of it, along with a dummy block index.
4605 CBlockIndex index_dummy{block};
4606 uint256 block_hash(block.GetHash());
4607 index_dummy.pprev = tip;
4608 index_dummy.nHeight = tip->nHeight + 1;
4609 index_dummy.phashBlock = &block_hash;
4611
4612 // Set fJustCheck to true in order to update, and not clear, validation caches.
4613 if(!chainstate.ConnectBlock(block, state, &index_dummy, view_dummy, /*fJustCheck=*/true)) {
4614 if (state.IsValid()) NONFATAL_UNREACHABLE();
4615 return state;
4616 }
4617
4618 // Ensure no check returned successfully while also setting an invalid state.
4619 if (!state.IsValid()) NONFATAL_UNREACHABLE();
4620
4621 return state;
4622}
4623
4624/* This function is called from the RPC code for pruneblockchain */
4626{
4628 if (!active_chainstate.FlushStateToDisk(
4630 LogWarning("Failed to flush state after manual prune (%s)", state.ToString());
4631 }
4632}
4633
4635{
4638 assert(!coins_cache.GetBestBlock().IsNull()); // Never called when the coins view is empty
4640
4641 if (tip && tip->GetBlockHash() == coins_cache.GetBestBlock()) {
4642 return true;
4643 }
4644
4645 // Load pointer to end of best chain
4646 CBlockIndex* pindex = m_blockman.LookupBlockIndex(coins_cache.GetBestBlock());
4647 if (!pindex) {
4648 return false;
4649 }
4650 m_chain.SetTip(*pindex);
4652 m_last_flushed_block = pindex;
4653 tip = m_chain.Tip();
4654
4655 // nSequenceId is one of the keys used to sort setBlockIndexCandidates. Ensure all
4656 // candidate sets are empty to avoid UB, as nSequenceId is about to be modified.
4657 for (const auto& cs : m_chainman.m_chainstates) {
4658 assert(cs->setBlockIndexCandidates.empty());
4659 }
4660
4661 // Make sure our chain tip before shutting down scores better than any other candidate
4662 // to maintain a consistent best tip over reboots in case of a tie.
4663 auto target = tip;
4664 while (target) {
4665 target->nSequenceId = SEQ_ID_BEST_CHAIN_FROM_DISK;
4666 target = target->pprev;
4667 }
4668
4669 LogInfo("Loaded best chain: hashBestChain=%s height=%d date=%s progress=%f",
4670 tip->GetBlockHash().ToString(),
4671 m_chain.Height(),
4672 FormatISO8601DateTime(tip->GetBlockTime()),
4674
4675 // Ensure KernelNotifications m_tip_block is set even if no new block arrives.
4676 if (!this->GetRole().historical) {
4677 // Ignoring return value for now.
4680 /*index=*/*pindex,
4681 /*verification_progress=*/m_chainman.GuessVerificationProgress(tip));
4682 }
4683
4685
4686 return true;
4687}
4688
4690 : m_notifications{notifications}
4691{
4692 m_notifications.progress(_("Verifying blocks…"), 0, false);
4693}
4694
4699
4704 int nCheckLevel, int nCheckDepth)
4705{
4707
4708 if (chainstate.m_chain.Tip() == nullptr || chainstate.m_chain.Tip()->pprev == nullptr) {
4710 }
4711
4712 // Verify blocks in the best chain
4713 if (nCheckDepth <= 0 || nCheckDepth > chainstate.m_chain.Height()) {
4714 nCheckDepth = chainstate.m_chain.Height();
4715 }
4716 nCheckLevel = std::max(0, std::min(4, nCheckLevel));
4717 LogInfo("Verifying last %i blocks at level %i", nCheckDepth, nCheckLevel);
4718 CCoinsViewCache coins(&coinsview);
4719 CBlockIndex* pindex;
4720 CBlockIndex* pindexFailure = nullptr;
4721 int nGoodTransactions = 0;
4723 int reportDone = 0;
4724 bool skipped_no_block_data{false};
4725 bool skipped_l3_checks{false};
4726 LogInfo("Verification progress: 0%%");
4727
4728 const bool is_snapshot_cs{chainstate.m_from_snapshot_blockhash};
4729
4730 for (pindex = chainstate.m_chain.Tip(); pindex && pindex->pprev; pindex = pindex->pprev) {
4731 const int percentageDone = std::max(1, std::min(99, (int)(((double)(chainstate.m_chain.Height() - pindex->nHeight)) / (double)nCheckDepth * (nCheckLevel >= 4 ? 50 : 100))));
4732 if (reportDone < percentageDone / 10) {
4733 // report every 10% step
4734 LogInfo("Verification progress: %d%%", percentageDone);
4736 }
4737 m_notifications.progress(_("Verifying blocks…"), percentageDone, false);
4738 if (pindex->nHeight <= chainstate.m_chain.Height() - nCheckDepth) {
4739 break;
4740 }
4741 if ((chainstate.m_blockman.IsPruneMode() || is_snapshot_cs) && !(pindex->nStatus & BLOCK_HAVE_DATA)) {
4742 // If pruning or running under an assumeutxo snapshot, only go
4743 // back as far as we have data.
4744 LogInfo("Block verification stopping at height %d (no data). This could be due to pruning or use of an assumeutxo snapshot.", pindex->nHeight);
4745 skipped_no_block_data = true;
4746 break;
4747 }
4748 CBlock block;
4749 // check level 0: read from disk
4750 if (!chainstate.m_blockman.ReadBlock(block, *pindex)) {
4751 LogError("Verification error: ReadBlock failed at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
4753 }
4754 // check level 1: verify block validity
4755 if (nCheckLevel >= 1 && !CheckBlock(block, state, consensus_params)) {
4756 LogError("Verification error: found bad block at %d, hash=%s (%s)",
4757 pindex->nHeight, pindex->GetBlockHash().ToString(), state.ToString());
4759 }
4760 // check level 2: verify undo validity
4761 if (nCheckLevel >= 2 && pindex) {
4763 if (!pindex->GetUndoPos().IsNull()) {
4764 if (!chainstate.m_blockman.ReadBlockUndo(undo, *pindex)) {
4765 LogError("Verification error: found bad undo data at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
4767 }
4768 }
4769 }
4770 // check level 3: check for inconsistencies during memory-only disconnect of tip blocks
4771 size_t curr_coins_usage = coins.DynamicMemoryUsage() + chainstate.CoinsTip().DynamicMemoryUsage();
4772
4773 if (nCheckLevel >= 3) {
4774 if (curr_coins_usage <= chainstate.m_coinstip_cache_size_bytes) {
4775 assert(coins.GetBestBlock() == pindex->GetBlockHash());
4776 DisconnectResult res = chainstate.DisconnectBlock(block, pindex, coins);
4777 if (res == DISCONNECT_FAILED) {
4778 LogError("Verification error: irrecoverable inconsistency in block data at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
4780 }
4781 if (res == DISCONNECT_UNCLEAN) {
4783 pindexFailure = pindex;
4784 } else {
4785 nGoodTransactions += block.vtx.size();
4786 }
4787 } else {
4788 skipped_l3_checks = true;
4789 }
4790 }
4791 if (chainstate.m_chainman.m_interrupt) return VerifyDBResult::INTERRUPTED;
4792 }
4793 if (pindexFailure) {
4794 LogError("Verification error: coin database inconsistencies found (last %i blocks, %i good transactions before that)", chainstate.m_chain.Height() - pindexFailure->nHeight + 1, nGoodTransactions);
4796 }
4797 if (skipped_l3_checks) {
4798 LogWarning("Skipped verification of level >=3 (insufficient database cache size). Consider increasing -dbcache.");
4799 }
4800
4801 // store block count as we move pindex at check level >= 4
4802 int block_count = chainstate.m_chain.Height() - pindex->nHeight;
4803
4804 // check level 4: try reconnecting blocks
4805 if (nCheckLevel >= 4 && !skipped_l3_checks) {
4806 while (pindex != chainstate.m_chain.Tip()) {
4807 const int percentageDone = std::max(1, std::min(99, 100 - (int)(((double)(chainstate.m_chain.Height() - pindex->nHeight)) / (double)nCheckDepth * 50)));
4808 if (reportDone < percentageDone / 10) {
4809 // report every 10% step
4810 LogInfo("Verification progress: %d%%", percentageDone);
4812 }
4813 m_notifications.progress(_("Verifying blocks…"), percentageDone, false);
4814 pindex = chainstate.m_chain.Next(*pindex);
4815 CBlock block;
4816 if (!chainstate.m_blockman.ReadBlock(block, *pindex)) {
4817 LogError("Verification error: ReadBlock failed at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
4819 }
4820 if (!chainstate.ConnectBlock(block, state, pindex, coins)) {
4821 LogError("Verification error: found unconnectable block at %d, hash=%s (%s)", pindex->nHeight, pindex->GetBlockHash().ToString(), state.ToString());
4823 }
4824 if (chainstate.m_chainman.m_interrupt) return VerifyDBResult::INTERRUPTED;
4825 }
4826 }
4827
4828 LogInfo("Verification: checked last %i blocks at level %i", block_count, nCheckLevel);
4829 if (nCheckLevel >= 3 && !skipped_l3_checks) {
4830 LogInfo("Verification: no coin database inconsistencies (%i transactions)", nGoodTransactions);
4831 }
4832
4833 if (skipped_l3_checks) {
4835 }
4838 }
4840}
4841
4844{
4846 // TODO: merge with ConnectBlock
4847 CBlock block;
4848 if (!m_blockman.ReadBlock(block, *pindex)) {
4849 LogError("ReplayBlock(): ReadBlock failed at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
4850 return false;
4851 }
4852
4853 for (const CTransactionRef& tx : block.vtx) {
4854 if (!tx->IsCoinBase()) {
4855 for (const CTxIn &txin : tx->vin) {
4856 inputs.SpendCoin(txin.prevout);
4857 }
4858 }
4859 // Pass check = true as every addition may be an overwrite.
4860 AddCoins(inputs, *tx, pindex->nHeight, true);
4861 }
4862 return true;
4863}
4864
4866{
4867 LOCK(cs_main);
4868
4869 CCoinsView& db = this->CoinsDB();
4870 CCoinsViewCache cache(&db);
4871
4872 std::vector<uint256> hashHeads = db.GetHeadBlocks();
4873 if (hashHeads.empty()) return true; // We're already in a consistent state.
4874 if (hashHeads.size() != 2) {
4875 LogError("ReplayBlocks(): unknown inconsistent state\n");
4876 return false;
4877 }
4878
4879 m_chainman.GetNotifications().progress(_("Replaying blocks…"), 0, false);
4880 LogInfo("Replaying blocks");
4881
4882 const CBlockIndex* pindexOld = nullptr; // Old tip during the interrupted flush.
4883 const CBlockIndex* pindexNew; // New tip during the interrupted flush.
4884 const CBlockIndex* pindexFork = nullptr; // Latest block common to both the old and the new tip.
4885
4886 if (!m_blockman.m_block_index.contains(hashHeads[0])) {
4887 LogError("ReplayBlocks(): reorganization to unknown block requested\n");
4888 return false;
4889 }
4890 pindexNew = &(m_blockman.m_block_index[hashHeads[0]]);
4891
4892 if (!hashHeads[1].IsNull()) { // The old tip is allowed to be 0, indicating it's the first flush.
4893 if (!m_blockman.m_block_index.contains(hashHeads[1])) {
4894 LogError("ReplayBlocks(): reorganization from unknown block requested\n");
4895 return false;
4896 }
4897 pindexOld = &(m_blockman.m_block_index[hashHeads[1]]);
4899 assert(pindexFork != nullptr);
4900 }
4901
4902 // Rollback along the old branch.
4903 const int nForkHeight{pindexFork ? pindexFork->nHeight : 0};
4904 if (pindexOld != pindexFork) {
4905 LogInfo("Rolling back from %s (%i to %i)", pindexOld->GetBlockHash().ToString(), pindexOld->nHeight, nForkHeight);
4906 while (pindexOld != pindexFork) {
4907 if (pindexOld->nHeight > 0) { // Never disconnect the genesis block.
4908 CBlock block;
4909 if (!m_blockman.ReadBlock(block, *pindexOld)) {
4910 LogError("RollbackBlock(): ReadBlock() failed at %d, hash=%s\n", pindexOld->nHeight, pindexOld->GetBlockHash().ToString());
4911 return false;
4912 }
4913 if (pindexOld->nHeight % 10'000 == 0) {
4914 LogInfo("Rolling back %s (%i)", pindexOld->GetBlockHash().ToString(), pindexOld->nHeight);
4915 }
4917 if (res == DISCONNECT_FAILED) {
4918 LogError("RollbackBlock(): DisconnectBlock failed at %d, hash=%s\n", pindexOld->nHeight, pindexOld->GetBlockHash().ToString());
4919 return false;
4920 }
4921 // If DISCONNECT_UNCLEAN is returned, it means a non-existing UTXO was deleted, or an existing UTXO was
4922 // overwritten. It corresponds to cases where the block-to-be-disconnect never had all its operations
4923 // applied to the UTXO set. However, as both writing a UTXO and deleting a UTXO are idempotent operations,
4924 // the result is still a version of the UTXO set with the effects of that block undone.
4925 }
4926 pindexOld = pindexOld->pprev;
4927 }
4928 LogInfo("Rolled back to %s", pindexFork->GetBlockHash().ToString());
4929 }
4930
4931 // Roll forward from the forking point to the new tip.
4933 LogInfo("Rolling forward to %s (%i to %i)", pindexNew->GetBlockHash().ToString(), nForkHeight, pindexNew->nHeight);
4934 for (int nHeight = nForkHeight + 1; nHeight <= pindexNew->nHeight; ++nHeight) {
4935 const CBlockIndex& pindex{*Assert(pindexNew->GetAncestor(nHeight))};
4936
4937 if (nHeight % 10'000 == 0) {
4938 LogInfo("Rolling forward %s (%i)", pindex.GetBlockHash().ToString(), nHeight);
4939 }
4940 m_chainman.GetNotifications().progress(_("Replaying blocks…"), (int)((nHeight - nForkHeight) * 100.0 / (pindexNew->nHeight - nForkHeight)), false);
4941 if (!RollforwardBlock(&pindex, cache)) return false;
4942 }
4943 LogInfo("Rolled forward to %s", pindexNew->GetBlockHash().ToString());
4944 }
4945
4946 cache.SetBestBlock(pindexNew->GetBlockHash());
4947 cache.Flush(/*reallocate_cache=*/false); // local CCoinsViewCache goes out of scope
4949 return true;
4950}
4951
4953{
4955
4956 // At and above m_params.SegwitHeight, segwit consensus rules must be validated
4957 CBlockIndex* block{m_chain.Tip()};
4958
4959 while (block != nullptr && DeploymentActiveAt(*block, m_chainman, Consensus::DEPLOYMENT_SEGWIT)) {
4960 if (!(block->nStatus & BLOCK_OPT_WITNESS)) {
4961 // block is insufficiently validated for a segwit client
4962 return true;
4963 }
4964 block = block->pprev;
4965 }
4966
4967 return false;
4968}
4969
4970void Chainstate::ClearBlockIndexCandidates()
4971{
4974}
4975
4976void Chainstate::PopulateBlockIndexCandidates()
4977{
4979
4980 for (CBlockIndex* pindex : m_blockman.GetAllBlockIndices()) {
4981 // With assumeutxo, the snapshot block is a candidate for the tip, but it
4982 // may not have BLOCK_VALID_TRANSACTIONS (e.g. if we haven't yet downloaded
4983 // the block), so we special-case it here.
4984 if (pindex == SnapshotBase() ||
4986 (pindex->HaveNumChainTxs() || pindex->pprev == nullptr))) {
4988 }
4989 }
4990}
4991
4993{
4995 // Load block index from databases
4997 bool ret{m_blockman.LoadBlockIndexDB(CurrentChainstate().m_from_snapshot_blockhash)};
4998 if (!ret) return false;
4999
5000 m_blockman.ScanAndUnlinkAlreadyPrunedFiles();
5001
5002 std::vector<CBlockIndex*> vSortedByHeight{m_blockman.GetAllBlockIndices()};
5003 std::sort(vSortedByHeight.begin(), vSortedByHeight.end(),
5005
5006 for (CBlockIndex* pindex : vSortedByHeight) {
5007 if (m_interrupt) return false;
5008 if (pindex->nStatus & BLOCK_FAILED_VALID && (!m_best_invalid || pindex->nChainWork > m_best_invalid->nChainWork)) {
5009 m_best_invalid = pindex;
5010 }
5011 if (pindex->IsValid(BLOCK_VALID_TREE) && (m_best_header == nullptr || CBlockIndexWorkComparator()(m_best_header, pindex)))
5012 m_best_header = pindex;
5013 }
5014 }
5015 return true;
5016}
5017
5019{
5020 LOCK(cs_main);
5021
5023
5024 // Check whether we're already initialized by checking for genesis in
5025 // m_blockman.m_block_index. Note that we can't use a chainstate's m_chain here, since it is
5026 // set based on the coins db, not the block index db, which is the only
5027 // thing loaded at this point.
5028 if (m_blockman.m_block_index.contains(genesis_block.GetHash())) {
5029 return true;
5030 }
5031
5032 try {
5034 if (blockPos.IsNull()) {
5035 LogError("Writing genesis block to disk failed");
5036 return false;
5037 }
5040 } catch (const std::runtime_error& e) {
5041 LogError("Failed to write genesis block: %s", e.what());
5042 return false;
5043 }
5044
5045 return true;
5046}
5047
5051 std::multimap<uint256, FlatFilePos>* blocks_with_unknown_parent)
5052{
5053 // Either both should be specified (-reindex), or neither (-loadblock).
5055
5056 const auto start{SteadyClock::now()};
5057 const CChainParams& params{GetParams()};
5058
5059 int nLoaded = 0;
5060 try {
5062 // nRewind indicates where to resume scanning in case something goes wrong,
5063 // such as a block fails to deserialize.
5064 uint64_t nRewind = blkdat.GetPos();
5065 while (!blkdat.eof()) {
5066 if (m_interrupt) return;
5067
5068 blkdat.SetPos(nRewind);
5069 nRewind++; // start one byte further next time, in case of failure
5070 blkdat.SetLimit(); // remove former limit
5071 unsigned int nSize = 0;
5072 try {
5073 // locate a header
5075 blkdat.FindByte(std::byte(params.MessageStart()[0]));
5076 nRewind = blkdat.GetPos() + 1;
5077 blkdat >> buf;
5078 if (buf != params.MessageStart()) {
5079 continue;
5080 }
5081 // read size
5082 blkdat >> nSize;
5084 continue;
5085 } catch (const std::exception&) {
5086 // no valid block header found; don't complain
5087 // (this happens at the end of every blk.dat file)
5088 break;
5089 }
5090 try {
5091 // read block header
5092 const uint64_t nBlockPos{blkdat.GetPos()};
5093 if (dbp)
5094 dbp->nPos = nBlockPos;
5095 blkdat.SetLimit(nBlockPos + nSize);
5096 CBlockHeader header;
5097 blkdat >> header;
5098 const uint256 hash{header.GetHash()};
5099 // Skip the rest of this block (this may read from disk into memory); position to the marker before the
5100 // next block, but it's still possible to rewind to the start of the current block (without a disk read).
5101 nRewind = nBlockPos + nSize;
5102 blkdat.SkipTo(nRewind);
5103
5104 std::shared_ptr<CBlock> pblock{}; // needs to remain available after the cs_main lock is released to avoid duplicate reads from disk
5105
5106 {
5107 LOCK(cs_main);
5108 // detect out of order blocks, and store them for later
5109 if (hash != params.GetConsensus().hashGenesisBlock && !m_blockman.LookupBlockIndex(header.hashPrevBlock)) {
5110 LogDebug(BCLog::REINDEX, "%s: Out of order block %s, parent %s not known\n", __func__, hash.ToString(),
5111 header.hashPrevBlock.ToString());
5113 blocks_with_unknown_parent->emplace(header.hashPrevBlock, *dbp);
5114 }
5115 continue;
5116 }
5117
5118 // process in case the block isn't known yet
5119 const CBlockIndex* pindex = m_blockman.LookupBlockIndex(hash);
5120 if (!pindex || (pindex->nStatus & BLOCK_HAVE_DATA) == 0) {
5121 // This block can be processed immediately; rewind to its start, read and deserialize it.
5122 blkdat.SetPos(nBlockPos);
5123 pblock = std::make_shared<CBlock>();
5124 blkdat >> TX_WITH_WITNESS(*pblock);
5125 nRewind = blkdat.GetPos();
5126
5128 if (AcceptBlock(pblock, state, nullptr, true, dbp, nullptr, true)) {
5129 nLoaded++;
5130 }
5131 if (state.IsError()) {
5132 break;
5133 }
5134 } else if (hash != params.GetConsensus().hashGenesisBlock && pindex->nHeight % 1000 == 0) {
5135 LogDebug(BCLog::REINDEX, "Block Import: already had block %s at height %d\n", hash.ToString(), pindex->nHeight);
5136 }
5137 }
5138
5139 // Activate the genesis block so normal node progress can continue
5140 // During first -reindex, this will only connect Genesis since
5141 // ActivateBestChain only connects blocks which are in the block tree db,
5142 // which only contains blocks whose parents are in it.
5143 // But do this only if genesis isn't activated yet, to avoid connecting many blocks
5144 // without assumevalid in the case of a continuation of a reindex that
5145 // was interrupted by the user.
5146 if (hash == params.GetConsensus().hashGenesisBlock && WITH_LOCK(::cs_main, return ActiveHeight()) == -1) {
5148 if (!ActiveChainstate().ActivateBestChain(state, nullptr)) {
5149 break;
5150 }
5151 }
5152
5154 // must update the tip for pruning to work while importing with -loadblock.
5155 // this is a tradeoff to conserve disk space at the expense of time
5156 // spent updating the tip to be able to prune.
5157 // otherwise, ActivateBestChain won't be called by the import process
5158 // until after all of the block files are loaded. ActivateBestChain can be
5159 // called by concurrent network message processing. but, that is not
5160 // reliable for the purpose of pruning while importing.
5161 if (auto result{ActivateBestChains()}; !result) {
5162 LogDebug(BCLog::REINDEX, "%s\n", util::ErrorString(result).original);
5163 break;
5164 }
5165 }
5166
5168
5169 if (!blocks_with_unknown_parent) continue;
5170
5171 // Recursively process earlier encountered successors of this block
5172 std::deque<uint256> queue;
5173 queue.push_back(hash);
5174 while (!queue.empty()) {
5175 uint256 head = queue.front();
5176 queue.pop_front();
5177 auto range = blocks_with_unknown_parent->equal_range(head);
5178 while (range.first != range.second) {
5179 std::multimap<uint256, FlatFilePos>::iterator it = range.first;
5180 std::shared_ptr<CBlock> pblockrecursive = std::make_shared<CBlock>();
5181 if (m_blockman.ReadBlock(*pblockrecursive, it->second, {})) {
5182 const auto& block_hash{pblockrecursive->GetHash()};
5183 LogDebug(BCLog::REINDEX, "%s: Processing out of order child %s of %s", __func__, block_hash.ToString(), head.ToString());
5184 LOCK(cs_main);
5186 if (AcceptBlock(pblockrecursive, dummy, nullptr, true, &it->second, nullptr, true)) {
5187 nLoaded++;
5188 queue.push_back(block_hash);
5189 }
5190 }
5191 range.first++;
5192 blocks_with_unknown_parent->erase(it);
5194 }
5195 }
5196 } catch (const std::exception& e) {
5197 // historical bugs added extra data to the block files that does not deserialize cleanly.
5198 // commonly this data is between readable blocks, but it does not really matter. such data is not fatal to the import process.
5199 // the code that reads the block files deals with invalid data by simply ignoring it.
5200 // it continues to search for the next {4 byte magic message start bytes + 4 byte length + block} that does deserialize cleanly
5201 // and passes all of the other block validation checks dealing with POW and the merkle root, etc...
5202 // we merely note with this informational log message when unexpected data is encountered.
5203 // we could also be experiencing a storage system read error, or a read of a previous bad write. these are possible, but
5204 // less likely scenarios. we don't have enough information to tell a difference here.
5205 // the reindex process is not the place to attempt to clean and/or compact the block files. if so desired, a studious node operator
5206 // may use knowledge of the fact that the block files are not entirely pristine in order to prepare a set of pristine, and
5207 // perhaps ordered, block files for later reindexing.
5208 LogDebug(BCLog::REINDEX, "%s: unexpected data at file offset 0x%x - %s. continuing\n", __func__, (nRewind - 1), e.what());
5209 }
5210 }
5211 } catch (const std::runtime_error& e) {
5212 GetNotifications().fatalError(strprintf(_("System error while loading external block file: %s"), e.what()));
5213 }
5214 LogInfo("Loaded %i blocks from external file in %dms", nLoaded, Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
5215}
5216
5218{
5219 // Assert to verify Flatten() has been called.
5220 if (!*Assert(m_options.check_block_index)) return false;
5221 if (FastRandomContext().randrange(*m_options.check_block_index) >= 1) return false;
5222 return true;
5223}
5224
5226{
5227 if (!ShouldCheckBlockIndex()) {
5228 return;
5229 }
5230
5231 LOCK(cs_main);
5232
5233 // During a reindex, we read the genesis block and call CheckBlockIndex before ActivateBestChain,
5234 // so we have the genesis block in m_blockman.m_block_index but no active chain. (A few of the
5235 // tests when iterating the block tree require that m_chain has been initialized.)
5236 if (ActiveChain().Height() < 0) {
5237 assert(m_blockman.m_block_index.size() <= 1);
5238 return;
5239 }
5240
5241 // Build forward-pointing data structure for the entire block tree.
5242 // For performance reasons, indexes of the best header chain are stored in a vector (within CChain).
5243 // All remaining blocks are stored in a multimap.
5244 // The best header chain can differ from the active chain: E.g. its entries may belong to blocks that
5245 // are not yet validated.
5250
5251 std::multimap<const CBlockIndex*, const CBlockIndex*> forward;
5252 for (auto& [_, block_index] : m_blockman.m_block_index) {
5253 // Only save indexes in forward that are not part of the best header chain.
5254 if (!best_hdr_chain.Contains(block_index)) {
5255 // Only genesis, which must be part of the best header chain, can have a nullptr parent.
5256 assert(block_index.pprev);
5257 forward.emplace(block_index.pprev, &block_index);
5258 }
5259 }
5260 assert(forward.size() + best_hdr_chain.Height() + 1 == m_blockman.m_block_index.size());
5261
5262 const CBlockIndex* pindex = best_hdr_chain[0];
5263 assert(pindex);
5264 // Iterate over the entire block tree, using depth-first search.
5265 // Along the way, remember whether there are blocks on the path from genesis
5266 // block being explored which are the first to have certain properties.
5267 size_t nNodes = 0;
5268 int nHeight = 0;
5269 const CBlockIndex* pindexFirstInvalid = nullptr; // Oldest ancestor of pindex which is invalid.
5270 const CBlockIndex* pindexFirstMissing = nullptr; // Oldest ancestor of pindex which does not have BLOCK_HAVE_DATA, since assumeutxo snapshot if used.
5271 const CBlockIndex* pindexFirstNeverProcessed = nullptr; // Oldest ancestor of pindex for which nTx == 0, since assumeutxo snapshot if used.
5272 const CBlockIndex* pindexFirstNotTreeValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_TREE (regardless of being valid or not).
5273 const CBlockIndex* pindexFirstNotTransactionsValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_TRANSACTIONS (regardless of being valid or not), since assumeutxo snapshot if used.
5274 const CBlockIndex* pindexFirstNotChainValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_CHAIN (regardless of being valid or not), since assumeutxo snapshot if used.
5275 const CBlockIndex* pindexFirstNotScriptsValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_SCRIPTS (regardless of being valid or not), since assumeutxo snapshot if used.
5276
5277 // After checking an assumeutxo snapshot block, reset pindexFirst pointers
5278 // to earlier blocks that have not been downloaded or validated yet, so
5279 // checks for later blocks can assume the earlier blocks were validated and
5280 // be stricter, testing for more requirements.
5281 const CBlockIndex* snap_base{CurrentChainstate().SnapshotBase()};
5283 auto snap_update_firsts = [&] {
5284 if (pindex == snap_base) {
5290 }
5291 };
5292
5293 while (pindex != nullptr) {
5294 nNodes++;
5295 if (pindexFirstInvalid == nullptr && pindex->nStatus & BLOCK_FAILED_VALID) pindexFirstInvalid = pindex;
5296 if (pindexFirstMissing == nullptr && !(pindex->nStatus & BLOCK_HAVE_DATA)) {
5297 pindexFirstMissing = pindex;
5298 }
5299 if (pindexFirstNeverProcessed == nullptr && pindex->nTx == 0) pindexFirstNeverProcessed = pindex;
5300 if (pindex->pprev != nullptr && pindexFirstNotTreeValid == nullptr && (pindex->nStatus & BLOCK_VALID_MASK) < BLOCK_VALID_TREE) pindexFirstNotTreeValid = pindex;
5301
5302 if (pindex->pprev != nullptr) {
5303 if (pindexFirstNotTransactionsValid == nullptr &&
5304 (pindex->nStatus & BLOCK_VALID_MASK) < BLOCK_VALID_TRANSACTIONS) {
5306 }
5307
5308 if (pindexFirstNotChainValid == nullptr &&
5309 (pindex->nStatus & BLOCK_VALID_MASK) < BLOCK_VALID_CHAIN) {
5310 pindexFirstNotChainValid = pindex;
5311 }
5312
5313 if (pindexFirstNotScriptsValid == nullptr &&
5314 (pindex->nStatus & BLOCK_VALID_MASK) < BLOCK_VALID_SCRIPTS) {
5316 }
5317 }
5318
5319 // Begin: actual consistency checks.
5320 if (pindex->pprev == nullptr) {
5321 // Genesis block checks.
5322 assert(pindex->GetBlockHash() == GetConsensus().hashGenesisBlock); // Genesis block's hash must match.
5323 for (const auto& c : m_chainstates) {
5324 if (c->m_chain.Genesis() != nullptr) {
5325 assert(pindex == c->m_chain.Genesis()); // The chain's genesis block must be this block.
5326 }
5327 }
5328 }
5329 // nSequenceId can't be set higher than SEQ_ID_INIT_FROM_DISK{1} for blocks that aren't linked
5330 // (negative is used for preciousblock, SEQ_ID_BEST_CHAIN_FROM_DISK{0} for active chain when loaded from disk)
5331 if (!pindex->HaveNumChainTxs()) assert(pindex->nSequenceId <= SEQ_ID_INIT_FROM_DISK);
5332 // VALID_TRANSACTIONS is equivalent to nTx > 0 for all nodes (whether or not pruning has occurred).
5333 // HAVE_DATA is only equivalent to nTx > 0 (or VALID_TRANSACTIONS) if no pruning has occurred.
5335 // If we've never pruned, then HAVE_DATA should be equivalent to nTx > 0
5336 assert(!(pindex->nStatus & BLOCK_HAVE_DATA) == (pindex->nTx == 0));
5338 } else {
5339 // If we have pruned, then we can only say that HAVE_DATA implies nTx > 0
5340 if (pindex->nStatus & BLOCK_HAVE_DATA) assert(pindex->nTx > 0);
5341 }
5342 if (pindex->nStatus & BLOCK_HAVE_UNDO) assert(pindex->nStatus & BLOCK_HAVE_DATA);
5343 if (snap_base && snap_base->GetAncestor(pindex->nHeight) == pindex) {
5344 // Assumed-valid blocks should connect to the main chain.
5345 assert((pindex->nStatus & BLOCK_VALID_MASK) >= BLOCK_VALID_TREE);
5346 }
5347 // There should only be an nTx value if we have
5348 // actually seen a block's transactions.
5349 assert(((pindex->nStatus & BLOCK_VALID_MASK) >= BLOCK_VALID_TRANSACTIONS) == (pindex->nTx > 0)); // This is pruning-independent.
5350 // All parents having had data (at some point) is equivalent to all parents being VALID_TRANSACTIONS, which is equivalent to HaveNumChainTxs().
5351 // HaveNumChainTxs will also be set in the assumeutxo snapshot block from snapshot metadata.
5352 assert((pindexFirstNeverProcessed == nullptr || pindex == snap_base) == pindex->HaveNumChainTxs());
5353 assert((pindexFirstNotTransactionsValid == nullptr || pindex == snap_base) == pindex->HaveNumChainTxs());
5354 assert(pindex->nHeight == nHeight); // nHeight must be consistent.
5355 assert(pindex->pprev == nullptr || pindex->nChainWork >= pindex->pprev->nChainWork); // For every block except the genesis block, the chainwork must be larger than the parent's.
5356 assert(nHeight < 2 || (pindex->pskip && (pindex->pskip->nHeight < nHeight))); // The pskip pointer must point back for all but the first 2 blocks.
5357 assert(pindexFirstNotTreeValid == nullptr); // All m_blockman.m_block_index entries must at least be TREE valid
5358 if ((pindex->nStatus & BLOCK_VALID_MASK) >= BLOCK_VALID_TREE) assert(pindexFirstNotTreeValid == nullptr); // TREE valid implies all parents are TREE valid
5359 if ((pindex->nStatus & BLOCK_VALID_MASK) >= BLOCK_VALID_CHAIN) assert(pindexFirstNotChainValid == nullptr); // CHAIN valid implies all parents are CHAIN valid
5360 if ((pindex->nStatus & BLOCK_VALID_MASK) >= BLOCK_VALID_SCRIPTS) assert(pindexFirstNotScriptsValid == nullptr); // SCRIPTS valid implies all parents are SCRIPTS valid
5361 if (pindexFirstInvalid == nullptr) {
5362 // Checks for not-invalid blocks.
5363 assert((pindex->nStatus & BLOCK_FAILED_VALID) == 0); // The failed flag cannot be set for blocks without invalid parents.
5364 } else {
5365 assert(pindex->nStatus & BLOCK_FAILED_VALID); // Invalid blocks and their descendants must be marked as invalid
5366 }
5367 // Make sure m_chain_tx_count sum is correctly computed.
5368 if (!pindex->pprev) {
5369 // If no previous block, nTx and m_chain_tx_count must be the same.
5370 assert(pindex->m_chain_tx_count == pindex->nTx);
5371 } else if (pindex->pprev->m_chain_tx_count > 0 && pindex->nTx > 0) {
5372 // If previous m_chain_tx_count is set and number of transactions in block is known, sum must be set.
5373 assert(pindex->m_chain_tx_count == pindex->nTx + pindex->pprev->m_chain_tx_count);
5374 } else {
5375 // Otherwise m_chain_tx_count should only be set if this is a snapshot
5376 // block, and must be set if it is.
5377 assert((pindex->m_chain_tx_count != 0) == (pindex == snap_base));
5378 }
5379 // There should be no block with more work than m_best_header, unless it's known to be invalid
5380 assert((pindex->nStatus & BLOCK_FAILED_VALID) || pindex->nChainWork <= m_best_header->nChainWork);
5381
5382 // Chainstate-specific checks on setBlockIndexCandidates
5383 for (const auto& c : m_chainstates) {
5384 if (c->m_chain.Tip() == nullptr) continue;
5385 // Two main factors determine whether pindex is a candidate in
5386 // setBlockIndexCandidates:
5387 //
5388 // - If pindex has less work than the chain tip, it should not be a
5389 // candidate, and this will be asserted below. Otherwise it is a
5390 // potential candidate.
5391 //
5392 // - If pindex or one of its parent blocks back to the genesis block
5393 // or an assumeutxo snapshot never downloaded transactions
5394 // (pindexFirstNeverProcessed is non-null), it should not be a
5395 // candidate, and this will be asserted below. The only exception
5396 // is if pindex itself is an assumeutxo snapshot block. Then it is
5397 // also a potential candidate.
5398 if (!CBlockIndexWorkComparator()(pindex, c->m_chain.Tip()) && (pindexFirstNeverProcessed == nullptr || pindex == snap_base)) {
5399 // If pindex was detected as invalid (pindexFirstInvalid is
5400 // non-null), it is not required to be in
5401 // setBlockIndexCandidates.
5402 if (pindexFirstInvalid == nullptr) {
5403 // If pindex and all its parents back to the genesis block
5404 // or an assumeutxo snapshot block downloaded transactions,
5405 // and the transactions were not pruned (pindexFirstMissing
5406 // is null), it is a potential candidate. The check
5407 // excludes pruned blocks, because if any blocks were
5408 // pruned between pindex and the current chain tip, pindex will
5409 // only temporarily be added to setBlockIndexCandidates,
5410 // before being moved to m_blocks_unlinked. This check
5411 // could be improved to verify that if all blocks between
5412 // the chain tip and pindex have data, pindex must be a
5413 // candidate.
5414 //
5415 // If pindex is the chain tip, it also is a potential
5416 // candidate.
5417 //
5418 // If the chainstate was loaded from a snapshot and pindex
5419 // is the base of the snapshot, pindex is also a potential
5420 // candidate.
5421 if (pindexFirstMissing == nullptr || pindex == c->m_chain.Tip() || pindex == c->SnapshotBase()) {
5422 // If this chainstate is not a historical chainstate
5423 // targeting a specific block, pindex must be in
5424 // setBlockIndexCandidates. Otherwise, pindex only
5425 // needs to be added if it is an ancestor of the target
5426 // block.
5427 if (!c->TargetBlock() || c->TargetBlock()->GetAncestor(pindex->nHeight) == pindex) {
5428 assert(c->setBlockIndexCandidates.contains(pindex));
5429 }
5430 }
5431 // If some parent is missing, then it could be that this block was in
5432 // setBlockIndexCandidates but had to be removed because of the missing data.
5433 // In this case it must be in m_blocks_unlinked -- see test below.
5434 }
5435 } else { // If this block sorts worse than the current tip or some ancestor's block has never been seen, it cannot be in setBlockIndexCandidates.
5436 assert(!c->setBlockIndexCandidates.contains(pindex));
5437 }
5438 }
5439 // Check whether this block is in m_blocks_unlinked.
5440 auto rangeUnlinked{m_blockman.m_blocks_unlinked.equal_range(pindex->pprev)};
5441 bool foundInUnlinked = false;
5442 for (auto it = rangeUnlinked.first; it != rangeUnlinked.second; ++it) {
5443 assert(it->first == pindex->pprev);
5444 if (it->second == pindex) {
5445 assert(!foundInUnlinked); // No duplicates in m_blocks_unlinked
5446 foundInUnlinked = true;
5447 }
5448 }
5449 if (pindex->pprev && (pindex->nStatus & BLOCK_HAVE_DATA) && pindexFirstNeverProcessed != nullptr && pindexFirstInvalid == nullptr) {
5450 // If this block has block data available, some parent was never received, and has no invalid parents, it must be in m_blocks_unlinked.
5452 }
5453 if (!(pindex->nStatus & BLOCK_HAVE_DATA)) assert(!foundInUnlinked); // Can't be in m_blocks_unlinked if we don't HAVE_DATA
5454 if (pindexFirstMissing == nullptr) assert(!foundInUnlinked); // We aren't missing data for any parent -- cannot be in m_blocks_unlinked.
5455 if (pindex->pprev && (pindex->nStatus & BLOCK_HAVE_DATA) && pindexFirstNeverProcessed == nullptr && pindexFirstMissing != nullptr) {
5456 // We HAVE_DATA for this block, have received data for all parents at some point, but we're currently missing data for some parent.
5458 // This block may have entered m_blocks_unlinked if:
5459 // - it has a descendant that at some point had more work than the
5460 // tip, and
5461 // - we tried switching to that descendant but were missing
5462 // data for some intermediate block between m_chain and the
5463 // tip.
5464 // So if this block is itself better than any m_chain.Tip() and it wasn't in
5465 // setBlockIndexCandidates, then it must be in m_blocks_unlinked.
5466 for (const auto& c : m_chainstates) {
5467 if (!CBlockIndexWorkComparator()(pindex, c->m_chain.Tip()) && !c->setBlockIndexCandidates.contains(pindex)) {
5468 if (pindexFirstInvalid == nullptr) {
5469 if (!c->TargetBlock() || c->TargetBlock()->GetAncestor(pindex->nHeight) == pindex) {
5471 }
5472 }
5473 }
5474 }
5475 }
5476 // assert(pindex->GetBlockHash() == pindex->GetBlockHeader().GetHash()); // Perhaps too slow
5477 // End: actual consistency checks.
5478
5479
5480 // Try descending into the first subnode. Always process forks first and the best header chain after.
5482 auto range{forward.equal_range(pindex)};
5483 if (range.first != range.second) {
5484 // A subnode not part of the best header chain was found.
5485 pindex = range.first->second;
5486 nHeight++;
5487 continue;
5488 } else if (best_hdr_chain.Contains(*pindex)) {
5489 // Descend further into best header chain.
5490 nHeight++;
5491 pindex = best_hdr_chain[nHeight];
5492 if (!pindex) break; // we are finished, since the best header chain is always processed last
5493 continue;
5494 }
5495 // This is a leaf node.
5496 // Move upwards until we reach a node of which we have not yet visited the last child.
5497 while (pindex) {
5498 // We are going to either move to a parent or a sibling of pindex.
5500 // If pindex was the first with a certain property, unset the corresponding variable.
5501 if (pindex == pindexFirstInvalid) pindexFirstInvalid = nullptr;
5502 if (pindex == pindexFirstMissing) pindexFirstMissing = nullptr;
5504 if (pindex == pindexFirstNotTreeValid) pindexFirstNotTreeValid = nullptr;
5506 if (pindex == pindexFirstNotChainValid) pindexFirstNotChainValid = nullptr;
5508 // Find our parent.
5509 CBlockIndex* pindexPar = pindex->pprev;
5510 // Find which child we just visited.
5511 auto rangePar{forward.equal_range(pindexPar)};
5512 while (rangePar.first->second != pindex) {
5513 assert(rangePar.first != rangePar.second); // Our parent must have at least the node we're coming from as child.
5514 rangePar.first++;
5515 }
5516 // Proceed to the next one.
5517 rangePar.first++;
5518 if (rangePar.first != rangePar.second) {
5519 // Move to a sibling not part of the best header chain.
5520 pindex = rangePar.first->second;
5521 break;
5522 } else if (pindexPar == best_hdr_chain[nHeight - 1]) {
5523 // Move to pindex's sibling on the best-chain, if it has one.
5524 pindex = best_hdr_chain[nHeight];
5525 // There will not be a next block if (and only if) parent block is the best header.
5526 assert((pindex == nullptr) == (pindexPar == best_hdr_chain.Tip()));
5527 break;
5528 } else {
5529 // Move up further.
5530 pindex = pindexPar;
5531 nHeight--;
5532 continue;
5533 }
5534 }
5535 }
5536
5537 // Check that we actually traversed the entire block index.
5538 assert(nNodes == forward.size() + best_hdr_chain.Height() + 1);
5539}
5540
5541std::string Chainstate::ToString()
5542{
5545 return strprintf("Chainstate [%s] @ height %d (%s)",
5546 m_from_snapshot_blockhash ? "snapshot" : "ibd",
5547 tip ? tip->nHeight : -1, tip ? tip->GetBlockHash().ToString() : "null");
5548}
5549
5550bool Chainstate::ResizeCoinsCaches(size_t coinstip_size, size_t coinsdb_size)
5551{
5555 // Cache sizes are unchanged, no need to continue.
5556 return true;
5557 }
5562
5563 LogInfo("[%s] resized coinsdb cache to %.1f MiB",
5564 this->ToString(), coinsdb_size / double(1_MiB));
5565 LogInfo("[%s] resized coinstip cache to %.1f MiB",
5566 this->ToString(), coinstip_size / double(1_MiB));
5567
5569 bool ret;
5570
5572 // Likely no need to flush if cache sizes have grown.
5574 } else {
5575 // Otherwise, flush state to disk and deallocate the in-memory coins map.
5577 }
5578 return ret;
5579}
5580
5582{
5584 const ChainTxData& data{GetParams().TxData()};
5585 if (pindex == nullptr) {
5586 return 0.0;
5587 }
5588
5589 if (pindex->m_chain_tx_count == 0) {
5590 LogDebug(BCLog::VALIDATION, "Block %d has unset m_chain_tx_count. Unable to estimate verification progress.\n", pindex->nHeight);
5591 return 0.0;
5592 }
5593
5595 const auto block_time{
5596 (Assume(m_best_header) && std::abs(nNow - pindex->GetBlockTime()) <= Ticks<std::chrono::seconds>(2h) &&
5597 Assume(m_best_header->nHeight >= pindex->nHeight)) ?
5598 // When the header is known to be recent, switch to a height-based
5599 // approach. This ensures the returned value is quantized when
5600 // close to "1.0", because some users expect it to be. This also
5601 // avoids relying too much on the exact miner-set timestamp, which
5602 // may be off.
5603 nNow - (m_best_header->nHeight - pindex->nHeight) * GetConsensus().nPowTargetSpacing :
5604 pindex->GetBlockTime(),
5605 };
5606
5607 double fTxTotal;
5608
5609 if (pindex->m_chain_tx_count <= data.tx_count) {
5610 fTxTotal = data.tx_count + (nNow - data.nTime) * data.dTxRate;
5611 } else {
5612 fTxTotal = pindex->m_chain_tx_count + (nNow - block_time) * data.dTxRate;
5613 }
5614
5615 return std::min<double>(pindex->m_chain_tx_count / fTxTotal, 1.0);
5616}
5617
5619{
5622 auto target_block = HistoricalChainstate()->TargetBlock();
5623
5624 if (pindex.m_chain_tx_count == 0 || target_block->m_chain_tx_count == 0) {
5625 LogDebug(BCLog::VALIDATION, "[background validation] Block %d has unset m_chain_tx_count. Unable to estimate verification progress.", pindex.nHeight);
5626 return 0.0;
5627 }
5628 return static_cast<double>(pindex.m_chain_tx_count) / static_cast<double>(target_block->m_chain_tx_count);
5629}
5630
5631Chainstate& ChainstateManager::InitializeChainstate(CTxMemPool* mempool)
5632{
5634 assert(m_chainstates.empty());
5635 m_chainstates.emplace_back(std::make_unique<Chainstate>(mempool, m_blockman, *this));
5636 return *m_chainstates.back();
5637}
5638
5639[[nodiscard]] static bool DeleteCoinsDBFromDisk(const fs::path db_path, bool is_snapshot)
5641{
5643
5644 if (is_snapshot) {
5646
5647 try {
5648 bool existed = fs::remove(base_blockhash_path);
5649 if (!existed) {
5650 LogWarning("[snapshot] snapshot chainstate dir being removed lacks %s file",
5652 }
5653 } catch (const fs::filesystem_error& e) {
5654 LogWarning("[snapshot] failed to remove file %s: %s\n",
5655 fs::PathToString(base_blockhash_path), e.code().message());
5656 }
5657 }
5658
5659 std::string path_str = fs::PathToString(db_path);
5660 LogInfo("Removing leveldb dir at %s\n", path_str);
5661
5662 // We have to destruct before this call leveldb::DB in order to release the db
5663 // lock, otherwise `DestroyDB` will fail. See `leveldb::~DBImpl()`.
5664 const bool destroyed = DestroyDB(path_str);
5665
5666 if (!destroyed) {
5667 LogError("leveldb DestroyDB call failed on %s", path_str);
5668 }
5669
5670 // Datadir should be removed from filesystem; otherwise initialization may detect
5671 // it on subsequent statups and get confused.
5672 //
5673 // If the base_blockhash_path removal above fails in the case of snapshot
5674 // chainstates, this will return false since leveldb won't remove a non-empty
5675 // directory.
5676 return destroyed && !fs::exists(db_path);
5677}
5678
5682 bool in_memory)
5683{
5684 uint256 base_blockhash = metadata.m_base_blockhash;
5685
5687
5688 {
5689 LOCK(::cs_main);
5690
5691 if (this->CurrentChainstate().m_from_snapshot_blockhash) {
5692 return util::Error{Untranslated("Can't activate a snapshot-based chainstate more than once")};
5693 }
5694 if (!GetParams().AssumeutxoForBlockhash(base_blockhash).has_value()) {
5696 std::string heights_formatted = util::Join(available_heights, ", ", [&](const auto& i) { return util::ToString(i); });
5697 return util::Error{Untranslated(strprintf("assumeutxo block hash in snapshot metadata not recognized (hash: %s). The following snapshot heights are available: %s",
5698 base_blockhash.ToString(),
5700 }
5701
5703 if (!snapshot_start_block) {
5704 return util::Error{Untranslated(strprintf("The base block header (%s) must appear in the headers chain. Make sure all headers are syncing, and call loadtxoutset again",
5705 base_blockhash.ToString()))};
5706 }
5707
5709 if (start_block_invalid) {
5710 return util::Error{Untranslated(strprintf("The base block header (%s) is part of an invalid chain", base_blockhash.ToString()))};
5711 }
5712
5713 if (!m_best_header || m_best_header->GetAncestor(snapshot_start_block->nHeight) != snapshot_start_block) {
5714 return util::Error{Untranslated("A forked headers-chain with more work than the chain with the snapshot base block header exists. Please proceed to sync without AssumeUtxo.")};
5715 }
5716
5717 auto mempool{CurrentChainstate().GetMempool()};
5718 if (mempool && mempool->size() > 0) {
5719 return util::Error{Untranslated("Can't activate a snapshot when mempool not empty")};
5720 }
5721 }
5722
5725
5726 // Cache percentages to allocate to each chainstate.
5727 //
5728 // These particular percentages don't matter so much since they will only be
5729 // relevant during snapshot activation; caches are rebalanced at the conclusion of
5730 // this function. We want to give (essentially) all available cache capacity to the
5731 // snapshot to aid the bulk load later in this function.
5732 static constexpr double IBD_CACHE_PERC = 0.01;
5733 static constexpr double SNAPSHOT_CACHE_PERC = 0.99;
5734
5735 {
5736 LOCK(::cs_main);
5737 // Resize the coins caches to ensure we're not exceeding memory limits.
5738 //
5739 // Allocate the majority of the cache to the incoming snapshot chainstate, since
5740 // (optimistically) getting to its tip will be the top priority. We'll need to call
5741 // `MaybeRebalanceCaches()` once we're done with this function to ensure
5742 // the right allocation (including the possibility that no snapshot was activated
5743 // and that we should restore the active chainstate caches to their original size).
5744 //
5747
5748 // Temporarily resize the active coins cache to make room for the newly-created
5749 // snapshot chain.
5750 this->ActiveChainstate().ResizeCoinsCaches(
5751 static_cast<size_t>(current_coinstip_cache_size * IBD_CACHE_PERC),
5752 static_cast<size_t>(current_coinsdb_cache_size * IBD_CACHE_PERC));
5753 }
5754
5756 return std::make_unique<Chainstate>(
5757 /*mempool=*/nullptr, m_blockman, *this, base_blockhash));
5758
5759 {
5760 LOCK(::cs_main);
5761 snapshot_chainstate->InitCoinsDB(
5762 static_cast<size_t>(current_coinsdb_cache_size * SNAPSHOT_CACHE_PERC),
5763 in_memory, /*should_wipe=*/false);
5764 snapshot_chainstate->InitCoinsCache(
5765 static_cast<size_t>(current_coinstip_cache_size * SNAPSHOT_CACHE_PERC));
5766 }
5767
5769 this->MaybeRebalanceCaches();
5770
5771 // PopulateAndValidateSnapshot can return (in error) before the leveldb datadir
5772 // has been created, so only attempt removal if we got that far.
5774 // We have to destruct leveldb::DB in order to release the db lock, otherwise
5775 // DestroyDB() (in DeleteCoinsDBFromDisk()) will fail. See `leveldb::~DBImpl()`.
5776 // Destructing the chainstate (and so resetting the coinsviews object) does this.
5777 snapshot_chainstate.reset();
5778 bool removed = DeleteCoinsDBFromDisk(*snapshot_datadir, /*is_snapshot=*/true);
5779 if (!removed) {
5780 GetNotifications().fatalError(strprintf(_("Failed to remove snapshot chainstate dir (%s). "
5781 "Manually remove it before restarting.\n"), fs::PathToString(*snapshot_datadir)));
5782 }
5783 }
5784 return util::Error{std::move(reason)};
5785 };
5786
5787 if (auto res{this->PopulateAndValidateSnapshot(*snapshot_chainstate, coins_file, metadata)}; !res) {
5788 LOCK(::cs_main);
5789 return cleanup_bad_snapshot(Untranslated(strprintf("Population failed: %s", util::ErrorString(res).original)));
5790 }
5791
5792 LOCK(::cs_main); // cs_main required for rest of snapshot activation.
5793
5794 // Do a final check to ensure that the snapshot chainstate is actually a more
5795 // work chain than the active chainstate; a user could have loaded a snapshot
5796 // very late in the IBD process, and we wouldn't want to load a useless chainstate.
5797 if (!CBlockIndexWorkComparator()(ActiveTip(), snapshot_chainstate->m_chain.Tip())) {
5798 return cleanup_bad_snapshot(Untranslated("work does not exceed active chainstate"));
5799 }
5800 // If not in-memory, persist the base blockhash for use during subsequent
5801 // initialization.
5802 if (!in_memory) {
5804 return cleanup_bad_snapshot(Untranslated("could not write base blockhash"));
5805 }
5806 }
5807
5809 m_blockman.m_snapshot_height = Assert(chainstate.SnapshotBase())->nHeight;
5810
5811 chainstate.PopulateBlockIndexCandidates();
5812
5813 LogInfo("[snapshot] successfully activated snapshot %s", base_blockhash.ToString());
5814 LogInfo("[snapshot] (%.2f MB)",
5815 chainstate.CoinsTip().DynamicMemoryUsage() / (1000 * 1000));
5816
5817 this->MaybeRebalanceCaches();
5818 return snapshot_start_block;
5819}
5820
5822{
5824 strprintf("%s (%.2f MB)",
5825 snapshot_loaded ? "saving snapshot chainstate" : "flushing coins cache",
5826 coins_cache.DynamicMemoryUsage() / (1000 * 1000)),
5828
5829 coins_cache.Flush();
5830}
5831
5832struct StopHashingException : public std::exception
5833{
5834 const char* what() const noexcept override
5835 {
5836 return "ComputeUTXOStats interrupted.";
5837 }
5838};
5839
5841{
5842 if (interrupt) throw StopHashingException();
5843}
5844
5849{
5850 // It's okay to release cs_main before we're done using `coins_cache` because we know
5851 // that nothing else will be referencing the newly created snapshot_chainstate yet.
5853
5854 uint256 base_blockhash = metadata.m_base_blockhash;
5855
5857
5858 if (!snapshot_start_block) {
5859 // Needed for ComputeUTXOStats to determine the
5860 // height and to avoid a crash when base_blockhash.IsNull()
5861 return util::Error{Untranslated(strprintf("Did not find snapshot start blockheader %s",
5862 base_blockhash.ToString()))};
5863 }
5864
5865 int base_height = snapshot_start_block->nHeight;
5867
5868 if (!maybe_au_data) {
5869 return util::Error{Untranslated(strprintf("Assumeutxo height in snapshot metadata not recognized "
5870 "(%d) - refusing to load snapshot", base_height))};
5871 }
5872
5874
5875 // This work comparison is a duplicate check with the one performed later in
5876 // ActivateSnapshot(), but is done so that we avoid doing the long work of staging
5877 // a snapshot that isn't actually usable.
5879 return util::Error{Untranslated("Work does not exceed active chainstate")};
5880 }
5881
5882 const uint64_t coins_count = metadata.m_coins_count;
5883 uint64_t coins_left = metadata.m_coins_count;
5884
5885 LogInfo("[snapshot] loading %d coins from snapshot %s", coins_left, base_blockhash.ToString());
5887
5888 while (coins_left > 0) {
5889 try {
5890 Txid txid;
5891 coins_file >> txid;
5892 size_t coins_per_txid{0};
5894
5895 if (coins_per_txid > coins_left) {
5896 return util::Error{Untranslated("Mismatch in coins count in snapshot metadata and actual snapshot data")};
5897 }
5898
5899 for (size_t i = 0; i < coins_per_txid; i++) {
5900 COutPoint outpoint;
5901 Coin coin;
5902 outpoint.n = static_cast<uint32_t>(ReadCompactSize(coins_file));
5903 outpoint.hash = txid;
5904 coins_file >> coin;
5905 if (coin.nHeight > base_height ||
5906 outpoint.n >= std::numeric_limits<decltype(outpoint.n)>::max() // Avoid integer wrap-around in coinstats.cpp:ApplyHash
5907 ) {
5908 return util::Error{Untranslated(strprintf("Bad snapshot data after deserializing %d coins",
5909 coins_count - coins_left))};
5910 }
5911 if (!MoneyRange(coin.out.nValue)) {
5912 return util::Error{Untranslated(strprintf("Bad snapshot data after deserializing %d coins - bad tx out value",
5913 coins_count - coins_left))};
5914 }
5915 coins_cache.EmplaceCoinInternalDANGER(outpoint, std::move(coin));
5916
5917 --coins_left;
5919
5920 if (coins_processed % 1000000 == 0) {
5921 LogInfo("[snapshot] %d coins loaded (%.2f%%, %.2f MB)",
5923 static_cast<float>(coins_processed) * 100 / static_cast<float>(coins_count),
5924 coins_cache.DynamicMemoryUsage() / (1000 * 1000));
5925 }
5926
5927 // Batch write and flush (if we need to) every so often.
5928 //
5929 // If our average Coin size is roughly 41 bytes, checking every 120,000 coins
5930 // means <5MB of memory imprecision.
5931 if (coins_processed % 120000 == 0) {
5932 if (m_interrupt) {
5933 return util::Error{Untranslated("Aborting after an interrupt was requested")};
5934 }
5935
5937 return snapshot_chainstate.GetCoinsCacheSizeState());
5938
5940 // This is a hack - we don't know what the actual best block is, but that
5941 // doesn't matter for the purposes of flushing the cache here. We'll set this
5942 // to its correct value (`base_blockhash`) below after the coins are loaded.
5943 coins_cache.SetBestBlock(GetRandHash());
5944
5945 // No need to acquire cs_main since this chainstate isn't being used yet.
5946 FlushSnapshotToDisk(coins_cache, /*snapshot_loaded=*/false);
5947 }
5948 }
5949 }
5950 } catch (const std::ios_base::failure&) {
5951 return util::Error{Untranslated(strprintf("Bad snapshot format or truncated snapshot after deserializing %d coins",
5952 coins_processed))};
5953 }
5954 }
5955
5956 // Important that we set this. This and the coins_cache accesses above are
5957 // sort of a layer violation, but either we reach into the innards of
5958 // CCoinsViewCache here or we have to invert some of the Chainstate to
5959 // embed them in a snapshot-activation-specific CCoinsViewCache bulk load
5960 // method.
5961 coins_cache.SetBestBlock(base_blockhash);
5962
5963 bool out_of_coins{false};
5964 try {
5965 std::byte left_over_byte;
5967 } catch (const std::ios_base::failure&) {
5968 // We expect an exception since we should be out of coins.
5969 out_of_coins = true;
5970 }
5971 if (!out_of_coins) {
5972 return util::Error{Untranslated(strprintf("Bad snapshot - coins left over after deserializing %d coins",
5973 coins_count))};
5974 }
5975
5976 LogInfo("[snapshot] loaded %d (%.2f MB) coins from snapshot %s",
5977 coins_count,
5978 coins_cache.DynamicMemoryUsage() / (1000 * 1000),
5979 base_blockhash.ToString());
5980
5981 // No need to acquire cs_main since this chainstate isn't being used yet.
5982 FlushSnapshotToDisk(coins_cache, /*snapshot_loaded=*/true);
5983
5984 assert(coins_cache.GetBestBlock() == base_blockhash);
5985
5986 // As above, okay to immediately release cs_main here since no other context knows
5987 // about the snapshot_chainstate.
5989
5990 std::optional<CCoinsStats> maybe_stats;
5991
5992 try {
5993 maybe_stats = ComputeUTXOStats(
5994 CoinStatsHashType::HASH_SERIALIZED, snapshot_coinsdb, m_blockman, [&interrupt = m_interrupt] { SnapshotUTXOHashBreakpoint(interrupt); });
5995 } catch (StopHashingException const&) {
5996 return util::Error{Untranslated("Aborting after an interrupt was requested")};
5997 }
5998 if (!maybe_stats.has_value()) {
5999 return util::Error{Untranslated("Failed to generate coins stats")};
6000 }
6001
6002 // Assert that the deserialized chainstate contents match the expected assumeutxo value.
6003 if (AssumeutxoHash{maybe_stats->hashSerialized} != au_data.hash_serialized) {
6004 return util::Error{Untranslated(strprintf("Bad snapshot content hash: expected %s, got %s",
6005 au_data.hash_serialized.ToString(), maybe_stats->hashSerialized.ToString()))};
6006 }
6007
6009
6010 // The remainder of this function requires modifying data protected by cs_main.
6011 LOCK(::cs_main);
6012
6013 // Fake various pieces of CBlockIndex state:
6014 CBlockIndex* index = nullptr;
6015
6016 // Don't make any modifications to the genesis block since it shouldn't be
6017 // necessary, and since the genesis block doesn't have normal flags like
6018 // BLOCK_VALID_SCRIPTS set.
6019 constexpr int AFTER_GENESIS_START{1};
6020
6021 for (int i = AFTER_GENESIS_START; i <= snapshot_chainstate.m_chain.Height(); ++i) {
6022 index = snapshot_chainstate.m_chain[i];
6023
6024 // Fake BLOCK_OPT_WITNESS so that Chainstate::NeedsRedownload()
6025 // won't ask for -reindex on startup.
6027 index->nStatus |= BLOCK_OPT_WITNESS;
6028 }
6029
6030 m_blockman.m_dirty_blockindex.insert(index);
6031 // Changes to the block index will be flushed to disk after this call
6032 // returns in `ActivateSnapshot()`, when `MaybeRebalanceCaches()` is
6033 // called, since we've added a snapshot chainstate and therefore will
6034 // have to downsize the IBD chainstate, which will result in a call to
6035 // `FlushStateToDisk(FORCE_FLUSH)`.
6036 }
6037
6038 assert(index);
6039 assert(index == snapshot_start_block);
6040 index->m_chain_tx_count = au_data.m_chain_tx_count;
6041
6042 LogInfo("[snapshot] validated snapshot (%.2f MB)",
6043 coins_cache.DynamicMemoryUsage() / (1000 * 1000));
6044 return {};
6045}
6046
6047// Currently, this function holds cs_main for its duration, which could be for
6048// multiple minutes due to the ComputeUTXOStats call. Holding cs_main used to be
6049// necessary (before d43a1f1a2fa3) to avoid advancing validated_cs farther than
6050// its target block. Now it should be possible to avoid this, but simply
6051// releasing cs_main here would not be possible because this function is invoked
6052// by ConnectTip within ActivateBestChain.
6053//
6054// Eventually (TODO) it would be better to call this function outside of
6055// ActivateBestChain, on a separate thread that should not require cs_main to
6056// hash, because the UTXO set is only hashed after the historical chainstate
6057// reaches its target block and is no longer changing.
6058SnapshotCompletionResult ChainstateManager::MaybeValidateSnapshot(Chainstate& validated_cs, Chainstate& unvalidated_cs)
6059{
6061
6062 // If the snapshot does not need to be validated...
6063 if (unvalidated_cs.m_assumeutxo != Assumeutxo::UNVALIDATED ||
6064 // Or if either chainstate is unusable...
6065 !unvalidated_cs.m_from_snapshot_blockhash ||
6066 validated_cs.m_assumeutxo != Assumeutxo::VALIDATED ||
6067 !validated_cs.m_chain.Tip() ||
6068 // Or the validated chainstate is not targeting the snapshot block...
6069 !validated_cs.TargetBlockHash() ||
6070 *validated_cs.TargetBlockHash() != *unvalidated_cs.m_from_snapshot_blockhash ||
6071 // Or the validated chainstate has not reached the snapshot block yet...
6072 !validated_cs.ReachedTarget()) {
6073 // Then the snapshot cannot be validated and there is nothing to do.
6075 }
6076 assert(validated_cs.TargetBlock() == validated_cs.m_chain.Tip());
6077
6080 "%s failed to validate the -assumeutxo snapshot state. "
6081 "This indicates a hardware problem, or a bug in the software, or a "
6082 "bad software modification that allowed an invalid snapshot to be "
6083 "loaded. As a result of this, the node will shut down and stop using any "
6084 "state that was built on the snapshot, resetting the chain height "
6085 "from %d to %d. On the next "
6086 "restart, the node will resume syncing from %d "
6087 "without using any snapshot data. "
6088 "Please report this incident to %s, including how you obtained the snapshot. "
6089 "The invalid snapshot chainstate will be left on disk in case it is "
6090 "helpful in diagnosing the issue that caused this error."),
6091 CLIENT_NAME, unvalidated_cs.m_chain.Height(),
6092 validated_cs.m_chain.Height(),
6093 validated_cs.m_chain.Height(), CLIENT_BUGREPORT);
6094
6095 LogError("[snapshot] !!! %s\n", user_error.original);
6096 LogError("[snapshot] deleting snapshot, reverting to validated chain, and stopping node\n");
6097
6098 // Reset chainstate target to network tip instead of snapshot block.
6099 validated_cs.SetTargetBlock(nullptr);
6100
6101 unvalidated_cs.m_assumeutxo = Assumeutxo::INVALID;
6102
6103 auto rename_result = unvalidated_cs.InvalidateCoinsDBOnDisk();
6104 if (!rename_result) {
6106 }
6107
6109 };
6110
6112 validated_cs.ForceFlushStateToDisk();
6113
6114 const auto& maybe_au_data = m_options.chainparams.AssumeutxoForHeight(validated_cs.m_chain.Height());
6115 if (!maybe_au_data) {
6116 LogWarning("[snapshot] assumeutxo data not found for height "
6117 "(%d) - refusing to validate snapshot", validated_cs.m_chain.Height());
6120 }
6121
6123 std::optional<CCoinsStats> validated_cs_stats;
6124 LogInfo("[snapshot] computing UTXO stats for background chainstate to validate "
6125 "snapshot - this could take a few minutes");
6126 try {
6128 CoinStatsHashType::HASH_SERIALIZED,
6130 m_blockman,
6131 [&interrupt = m_interrupt] { SnapshotUTXOHashBreakpoint(interrupt); });
6132 } catch (StopHashingException const&) {
6134 }
6135
6136 // XXX note that this function is slow and will hold cs_main for potentially minutes.
6137 if (!validated_cs_stats) {
6138 LogWarning("[snapshot] failed to generate stats for validation coins db");
6139 // While this isn't a problem with the snapshot per se, this condition
6140 // prevents us from validating the snapshot, so we should shut down and let the
6141 // user handle the issue manually.
6144 }
6145
6146 // Compare the validated chainstate's UTXO set hash against the hard-coded
6147 // assumeutxo hash we expect.
6148 //
6149 // TODO: For belt-and-suspenders, we could cache the UTXO set
6150 // hash for the snapshot when it's loaded in its chainstate's leveldb. We could then
6151 // reference that here for an additional check.
6152 if (AssumeutxoHash{validated_cs_stats->hashSerialized} != au_data.hash_serialized) {
6153 LogWarning("[snapshot] hash mismatch: actual=%s, expected=%s",
6154 validated_cs_stats->hashSerialized.ToString(),
6155 au_data.hash_serialized.ToString());
6158 }
6159
6160 LogInfo("[snapshot] snapshot beginning at %s has been fully validated",
6161 unvalidated_cs.m_from_snapshot_blockhash->ToString());
6162
6164 validated_cs.m_target_utxohash = AssumeutxoHash{validated_cs_stats->hashSerialized};
6165 this->MaybeRebalanceCaches();
6166
6168}
6169
6175
6176void ChainstateManager::MaybeRebalanceCaches()
6177{
6181 if (!historical_cs && !current_cs.m_from_snapshot_blockhash) {
6182 // Allocate everything to the IBD chainstate. This will always happen
6183 // when we are not using a snapshot.
6185 } else if (!historical_cs) {
6186 // If background validation has completed and snapshot is our active chain...
6187 LogInfo("[snapshot] allocating all cache to the snapshot chainstate");
6188 // Allocate everything to the snapshot chainstate.
6190 } else {
6191 // If both chainstates exist, determine who needs more cache based on IBD status.
6192 //
6193 // Note: shrink caches first so that we don't inadvertently overwhelm available memory.
6194 if (IsInitialBlockDownload()) {
6195 historical_cs->ResizeCoinsCaches(
6197 current_cs.ResizeCoinsCaches(
6199 } else {
6200 current_cs.ResizeCoinsCaches(
6202 historical_cs->ResizeCoinsCaches(
6204 }
6205 }
6206}
6207
6208void ChainstateManager::ResetChainstates()
6209{
6210 m_chainstates.clear();
6211}
6212
6219{
6220 if (!opts.check_block_index.has_value()) opts.check_block_index = opts.chainparams.DefaultConsistencyChecks();
6221 if (!opts.minimum_chain_work.has_value()) opts.minimum_chain_work = UintToArith256(opts.chainparams.GetConsensus().nMinimumChainWork);
6222 if (!opts.assumed_valid_block.has_value()) opts.assumed_valid_block = opts.chainparams.GetConsensus().defaultAssumeValid;
6223 return std::move(opts);
6224}
6225
6227 : m_script_check_queue{/*batch_size=*/128, std::clamp(options.worker_threads_num, 0, MAX_SCRIPTCHECK_THREADS)},
6228 m_interrupt{interrupt},
6229 m_options{Flatten(std::move(options))},
6230 m_blockman{interrupt, std::move(blockman_options)},
6231 m_all_consensus_script_flags{GetAllConsensusScriptFlags(m_options.chainparams.GetConsensus())},
6232 m_validation_cache{m_options.script_execution_cache_bytes, m_options.signature_cache_bytes}
6233{
6234}
6235
6242
6243Chainstate* ChainstateManager::LoadAssumeutxoChainstate()
6244{
6245 assert(!CurrentChainstate().m_from_snapshot_blockhash);
6246 std::optional<fs::path> path = node::FindAssumeutxoChainstateDir(m_options.datadir);
6247 if (!path) {
6248 return nullptr;
6249 }
6250 std::optional<uint256> base_blockhash = node::ReadSnapshotBaseBlockhash(*path);
6251 if (!base_blockhash) {
6252 return nullptr;
6253 }
6254 LogInfo("[snapshot] detected active snapshot chainstate (%s) - loading",
6255 fs::PathToString(*path));
6256
6257 auto snapshot_chainstate{std::make_unique<Chainstate>(nullptr, m_blockman, *this, base_blockhash)};
6258 LogInfo("[snapshot] switching active chainstate to %s", snapshot_chainstate->ToString());
6259 return &this->AddChainstate(std::move(snapshot_chainstate));
6260}
6261
6262Chainstate& ChainstateManager::AddChainstate(std::unique_ptr<Chainstate> chainstate)
6263{
6266 // Set target block for historical chainstate to snapshot block.
6267 assert(!prev_chainstate.TargetBlockHash());
6268 prev_chainstate.SetTargetBlockHash(*Assert(chainstate->m_from_snapshot_blockhash));
6269 m_chainstates.push_back(std::move(chainstate));
6271 assert(&curr_chainstate == m_chainstates.back().get());
6272
6273 // Transfer possession of the mempool to the chainstate.
6274 // Mempool is empty at this point because we're still in IBD.
6275 assert(!prev_chainstate.m_mempool || prev_chainstate.m_mempool->size() == 0);
6276 assert(!curr_chainstate.m_mempool);
6277 std::swap(curr_chainstate.m_mempool, prev_chainstate.m_mempool);
6278 return curr_chainstate;
6279}
6280
6282{
6283 return (block_index.nHeight==91842 && block_index.GetBlockHash() == uint256{"00000000000a4d0a398161ffc163c503763b1f4360639393e0e4c8e300e0caec"}) ||
6284 (block_index.nHeight==91880 && block_index.GetBlockHash() == uint256{"00000000000743f190a18c5577a3c2d2a1f610ae9601ac046a38084ccb7cd721"});
6285}
6286
6287bool IsBIP30Unspendable(const uint256& block_hash, int block_height)
6288{
6289 return (block_height==91722 && block_hash == uint256{"00000000000271a2dc26e7667f8419f2e15416dc6955e5a6c6cdf3f2574dd08e"}) ||
6290 (block_height==91812 && block_hash == uint256{"00000000000af0aed4792b1acee3d966af36cf5def14935db8de83d6f9306f2f"});
6291}
6292
6293util::Result<void> Chainstate::InvalidateCoinsDBOnDisk()
6294{
6295 // Should never be called on a non-snapshot chainstate.
6297
6298 // Coins views no longer usable.
6299 m_coins_views.reset();
6300
6301 const fs::path db_path{StoragePath()};
6302 const fs::path invalid_path{db_path + "_INVALID"};
6303 const std::string db_path_str{fs::PathToString(db_path)};
6305 LogInfo("[snapshot] renaming snapshot datadir %s to %s", db_path_str, invalid_path_str);
6306
6307 // The invalid storage directory is simply moved and not deleted because we may
6308 // want to do forensics later during issue investigation. The user is instructed
6309 // accordingly in MaybeValidateSnapshot().
6310 try {
6311 fs::rename(db_path, invalid_path);
6312 } catch (const fs::filesystem_error& e) {
6313 LogError("While invalidating the coins db: Error renaming file '%s' -> '%s': %s",
6314 db_path_str, invalid_path_str, e.what());
6315 return util::Error{strprintf(_(
6316 "Rename of '%s' -> '%s' failed. "
6317 "You should resolve this by manually moving or deleting the invalid "
6318 "snapshot directory %s, otherwise you will encounter the same error again "
6319 "on the next startup."),
6321 }
6322 return {};
6323}
6324
6325bool ChainstateManager::DeleteChainstate(Chainstate& chainstate)
6326{
6328 assert(!chainstate.m_coins_views);
6329 const fs::path db_path{chainstate.StoragePath()};
6330 if (!DeleteCoinsDBFromDisk(db_path, /*is_snapshot=*/bool{chainstate.m_from_snapshot_blockhash})) {
6331 LogError("Deletion of %s failed. Please remove it manually to continue reindexing.",
6332 fs::PathToString(db_path));
6333 return false;
6334 }
6335 std::unique_ptr<Chainstate> prev_chainstate{Assert(RemoveChainstate(chainstate))};
6337 assert(!prev_chainstate->m_mempool || prev_chainstate->m_mempool->size() == 0);
6338 assert(!curr_chainstate.m_mempool);
6339 std::swap(curr_chainstate.m_mempool, prev_chainstate->m_mempool);
6340 return true;
6341}
6342
6343ChainstateRole Chainstate::GetRole() const
6344{
6346}
6347
6348void ChainstateManager::RecalculateBestHeader()
6349{
6352 for (auto& entry : m_blockman.m_block_index) {
6353 if (!(entry.second.nStatus & BLOCK_FAILED_VALID) && m_best_header->nChainWork < entry.second.nChainWork) {
6354 m_best_header = &entry.second;
6355 }
6356 }
6357}
6358
6359std::optional<int> ChainstateManager::BlocksAheadOfTip() const
6360{
6361 LOCK(::cs_main);
6363 const CBlockIndex* tip{ActiveChain().Tip()};
6364 // Only consider headers that extend the active tip; ignore competing branches.
6365 if (best_header && tip && best_header->nChainWork > tip->nChainWork &&
6366 best_header->GetAncestor(tip->nHeight) == tip) {
6367 return best_header->nHeight - tip->nHeight;
6368 }
6369 return std::nullopt;
6370}
6371
6372bool ChainstateManager::ValidatedSnapshotCleanup(Chainstate& validated_cs, Chainstate& unvalidated_cs)
6373{
6375 if (unvalidated_cs.m_assumeutxo != Assumeutxo::VALIDATED) {
6376 // No need to clean up.
6377 return false;
6378 }
6379
6380 const fs::path validated_path{validated_cs.StoragePath()};
6381 const fs::path assumed_valid_path{unvalidated_cs.StoragePath()};
6382 const fs::path delete_path{validated_path + "_todelete"};
6383
6384 // Since we're going to be moving around the underlying leveldb filesystem content
6385 // for each chainstate, make sure that the chainstates (and their constituent
6386 // CoinsViews members) have been destructed first.
6387 //
6388 // The caller of this method will be responsible for reinitializing chainstates
6389 // if they want to continue operation.
6390 this->ResetChainstates();
6391 assert(this->m_chainstates.size() == 0);
6392
6393 LogInfo("[snapshot] deleting background chainstate directory (now unnecessary) (%s)",
6394 fs::PathToString(validated_path));
6395
6396 auto rename_failed_abort = [this](
6397 fs::path p_old,
6398 fs::path p_new,
6399 const fs::filesystem_error& err) {
6400 LogError("[snapshot] Error renaming path (%s) -> (%s): %s\n",
6401 fs::PathToString(p_old), fs::PathToString(p_new), err.what());
6403 "Rename of '%s' -> '%s' failed. "
6404 "Cannot clean up the background chainstate leveldb directory."),
6405 fs::PathToString(p_old), fs::PathToString(p_new)));
6406 };
6407
6408 try {
6409 fs::rename(validated_path, delete_path);
6410 } catch (const fs::filesystem_error& e) {
6412 throw;
6413 }
6414
6415 LogInfo("[snapshot] moving snapshot chainstate (%s) to "
6416 "default chainstate directory (%s)",
6417 fs::PathToString(assumed_valid_path), fs::PathToString(validated_path));
6418
6419 try {
6421 } catch (const fs::filesystem_error& e) {
6423 throw;
6424 }
6425
6426 if (!DeleteCoinsDBFromDisk(delete_path, /*is_snapshot=*/false)) {
6427 // No need to FatalError because once the unneeded bg chainstate data is
6428 // moved, it will not interfere with subsequent initialization.
6429 LogWarning("Deletion of %s failed. Please remove it manually, as the "
6430 "directory is now unnecessary.",
6431 fs::PathToString(delete_path));
6432 } else {
6433 LogInfo("[snapshot] deleted background chainstate directory (%s)",
6434 fs::PathToString(validated_path));
6435 }
6436 return true;
6437}
6438
6439std::pair<int, int> Chainstate::GetPruneRange(int last_height_can_prune) const
6440{
6441 if (m_chain.Height() <= 0) {
6442 return {0, 0};
6443 }
6444 int prune_start{0};
6445
6447 // Only prune blocks _after_ the snapshot if this is a snapshot chain
6448 // that has not been fully validated yet. The earlier blocks need to be
6449 // kept to validate the snapshot
6450 prune_start = Assert(SnapshotBase())->nHeight + 1;
6451 }
6452
6453 int max_prune = std::max<int>(
6454 0, m_chain.Height() - static_cast<int>(MIN_BLOCKS_TO_KEEP));
6455
6456 // last block to prune is the lesser of (caller-specified height, MIN_BLOCKS_TO_KEEP from the tip)
6457 //
6458 // While you might be tempted to prune the background chainstate more
6459 // aggressively (i.e. fewer MIN_BLOCKS_TO_KEEP), this won't work with index
6460 // building - specifically blockfilterindex requires undo data, and if
6461 // we don't maintain this trailing window, we hit indexing failures.
6462 int prune_end = std::min(last_height_can_prune, max_prune);
6463
6464 return {prune_start, prune_end};
6465}
6466
6467std::optional<std::pair<const CBlockIndex*, const CBlockIndex*>> ChainstateManager::GetHistoricalBlockRange() const
6468{
6470 if (!chainstate) return {};
6471 return std::make_pair(chainstate->m_chain.Tip(), chainstate->TargetBlock());
6472}
6473
6474util::Result<void> ChainstateManager::ActivateBestChains()
6475{
6476 // We can't hold cs_main during ActivateBestChain even though we're accessing
6477 // the chainman unique_ptrs since ABC requires us not to be holding cs_main, so retrieve
6478 // the relevant pointers before the ABC call.
6480 std::vector<Chainstate*> chainstates;
6481 {
6482 LOCK(GetMutex());
6483 chainstates.reserve(m_chainstates.size());
6484 for (const auto& chainstate : m_chainstates) {
6485 if (chainstate && chainstate->m_assumeutxo != Assumeutxo::INVALID && !chainstate->m_target_utxohash) {
6486 chainstates.push_back(chainstate.get());
6487 }
6488 }
6489 }
6492 if (!chainstate->ActivateBestChain(state, nullptr)) {
6493 LOCK(GetMutex());
6494 return util::Error{Untranslated(strprintf("%s Failed to connect best block (%s)", chainstate->ToString(), state.ToString()))};
6495 }
6496 }
6497 return {};
6498}
bool MoneyRange(const CAmount &nValue)
Definition amount.h:27
int64_t CAmount
Amount in satoshis (Can be negative)
Definition amount.h:12
constexpr CAmount COIN
The amount of satoshis in one BTC.
Definition amount.h:15
arith_uint256 UintToArith256(const uint256 &a)
static void pool cs
int ret
int flags
ArgsManager & args
Definition bitcoind.cpp:280
CBlockLocator GetLocator(const CBlockIndex *index)
Get a locator for a block index entry.
Definition chain.cpp:45
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:135
const CBlockIndex * LastCommonAncestor(const CBlockIndex *pa, const CBlockIndex *pb)
Find the last common ancestor two blocks have.
Definition chain.cpp:154
@ BLOCK_VALID_CHAIN
Outputs do not overspend inputs, no double spends, coinbase output ok, no immature coinbase spends,...
Definition chain.h:65
@ BLOCK_VALID_MASK
All validity bits.
Definition chain.h:72
@ BLOCK_VALID_TRANSACTIONS
Only first tx is coinbase, 2 <= coinbase input script length <= 100, transactions valid,...
Definition chain.h:61
@ BLOCK_VALID_SCRIPTS
Scripts & signatures ok.
Definition chain.h:69
@ BLOCK_VALID_TREE
All parent headers found, difficulty matches, timestamp >= median previous.
Definition chain.h:51
@ BLOCK_HAVE_UNDO
undo data available in rev*.dat
Definition chain.h:76
@ BLOCK_HAVE_DATA
full block available in blk*.dat
Definition chain.h:75
@ BLOCK_FAILED_VALID
stage after last reached validness failed
Definition chain.h:79
@ BLOCK_OPT_WITNESS
block data in blk*.dat was received with a witness-enforcing client
Definition chain.h:82
constexpr int32_t SEQ_ID_BEST_CHAIN_FROM_DISK
Init values for CBlockIndex nSequenceId when loaded from disk.
Definition chain.h:39
arith_uint256 GetBlockProof(const CBlockIndex &block)
Compute how much work a block index entry corresponds to.
Definition chain.h:305
constexpr int32_t SEQ_ID_INIT_FROM_DISK
Definition chain.h:40
static constexpr auto DATABASE_WRITE_INTERVAL_MAX
static constexpr auto DATABASE_WRITE_INTERVAL_MIN
#define NONFATAL_UNREACHABLE()
NONFATAL_UNREACHABLE() is a macro that is used to mark unreachable code.
Definition check.h:139
#define Assert(val)
Identity function.
Definition check.h:119
#define STR_INTERNAL_BUG(msg)
Definition check.h:100
#define Assume(val)
Assume is the identity function.
Definition check.h:131
Non-refcounted RAII wrapper for FILE*.
Definition streams.h:395
Wrapper around an AutoFile& that implements a ring buffer to deserialize from.
Definition streams.h:505
uint64_t GetPos() const
return the current reading position
Definition streams.h:585
Nodes collect new transactions into a block, hash them into a hash tree, and scan through nonce value...
Definition block.h:27
NodeSeconds Time() const
Definition block.h:61
uint32_t nBits
Definition block.h:34
int64_t GetBlockTime() const
Definition block.h:66
int32_t nVersion
Definition block.h:30
uint256 hashPrevBlock
Definition block.h:31
uint256 hashMerkleRoot
Definition block.h:32
uint256 GetHash() const
Definition block.cpp:14
Definition block.h:74
bool m_checked_merkle_root
Definition block.h:82
std::vector< CTransactionRef > vtx
Definition block.h:77
bool m_checked_witness_commitment
Definition block.h:81
bool fChecked
Definition block.h:80
The block chain is a tree shaped structure starting with the genesis block at the root,...
Definition chain.h:94
bool IsValid(enum BlockStatus nUpTo) const EXCLUSIVE_LOCKS_REQUIRED(
Check whether this block index entry is valid up to the passed validity level.
Definition chain.h:250
CBlockIndex * pprev
pointer to the index of the predecessor of this block
Definition chain.h:100
uint64_t m_chain_tx_count
(memory only) Number of transactions in the chain up to and including this block.
Definition chain.h:129
arith_uint256 nChainWork
(memory only) Total amount of work (expected number of hashes) in the chain up to and including this ...
Definition chain.h:118
bool HaveNumChainTxs() const
Check whether this block and all previous blocks back to the genesis block or an assumeutxo snapshot ...
Definition chain.h:214
int32_t nSequenceId
(memory only) Sequential id assigned to distinguish order in which blocks are received.
Definition chain.h:149
uint256 GetBlockHash() const
Definition chain.h:198
int64_t GetBlockTime() const
Definition chain.h:221
FlatFilePos GetUndoPos() const EXCLUSIVE_LOCKS_REQUIRED(
Definition chain.h:174
bool RaiseValidity(enum BlockStatus nUpTo) EXCLUSIVE_LOCKS_REQUIRED(
Raise the validity level of this block index entry.
Definition chain.h:262
CBlockIndex * pskip
pointer to the index of some further predecessor of this block
Definition chain.h:103
unsigned int nTx
Number of transactions in this block.
Definition chain.h:123
CBlockIndex * GetAncestor(int height)
Efficiently find an ancestor of this block.
Definition chain.cpp:109
int nHeight
height of the entry in the chain. The genesis block has height 0
Definition chain.h:106
const uint256 * phashBlock
pointer to the hash of the block, if any. Memory is owned by this CBlockIndex
Definition chain.h:97
Undo information for a CBlock.
Definition undo.h:64
An in-memory indexed chain of blocks.
Definition chain.h:380
bool Contains(const CBlockIndex &index) const
Efficiently check whether a block is present in this chain.
Definition chain.h:410
CBlockIndex * Tip() const
Returns the index entry for the tip of this chain, or nullptr if none.
Definition chain.h:396
const CBlockIndex * FindFork(const CBlockIndex &index) const
Find the last common block between this chain and a block index entry.
Definition chain.cpp:50
void SetTip(CBlockIndex &block)
Set/initialize a chain with a given tip.
Definition chain.cpp:16
CBlockIndex * Genesis() const
Returns the index entry for the genesis block of this chain, or nullptr if none.
Definition chain.h:390
int Height() const
Return the maximal height in the chain.
Definition chain.h:425
CChainParams defines various tweakable parameters of a given instance of the Bitcoin system.
Definition chainparams.h:77
const CBlock & GenesisBlock() const
Definition chainparams.h:94
std::vector< int > GetAvailableSnapshotHeights() const
const ChainTxData & TxData() const
std::optional< AssumeutxoData > AssumeutxoForHeight(int height) const
CCoinsView that adds a memory cache for transactions to another CCoinsView.
Definition coins.h:437
void Sync()
Push the modifications applied to this cache to its base while retaining the contents of this cache (...
Definition coins.cpp:284
bool SpendCoin(const COutPoint &outpoint, Coin *moveto=nullptr)
Spend a coin.
Definition coins.cpp:144
virtual void Flush(bool reallocate_cache=true)
Push the modifications applied to this cache to its base and wipe local state.
Definition coins.cpp:272
void SetBestBlock(const uint256 &block_hash)
Definition coins.cpp:196
unsigned int GetCacheSize() const
Size of the cache (in number of transaction outputs)
Definition coins.cpp:318
uint256 GetBestBlock() const override
Retrieve the block hash whose state this CCoinsView currently represents.
Definition coins.cpp:190
size_t DynamicMemoryUsage() const
Calculate the size of the cache (in bytes)
Definition coins.cpp:50
const Coin & AccessCoin(const COutPoint &output) const
Return a reference to Coin in the cache, or coinEmpty if not found.
Definition coins.cpp:170
CCoinsView backed by the coin database (chainstate/)
Definition txdb.h:37
std::shared_future< void > CompactFullAsync() EXCLUSIVE_LOCKS_REQUIRED(cs_main
Perform a full compaction of the underlying LevelDB on a one-shot background thread.
Definition txdb.cpp:211
void ResizeCache(size_t new_cache_size) EXCLUSIVE_LOCKS_REQUIRED(cs_main
Dynamically alter the underlying leveldb cache size.
Definition txdb.cpp:73
Pure abstract view on the open txout dataset.
Definition coins.h:356
virtual std::optional< Coin > GetCoin(const COutPoint &outpoint) const =0
Retrieve the Coin (unspent transaction output) for a given outpoint.
CCoinsView that brings transactions from a mempool into view.
Definition txmempool.h:785
Fee rate in satoshis per virtualbyte: CAmount / vB the feerate is represented internally as FeeFrac.
Definition feerate.h:32
A hasher class for Bitcoin's 256-bit hash (double SHA-256).
Definition hash.h:32
void Finalize(std::span< unsigned char > output)
Definition hash.h:38
CHash256 & Write(std::span< const unsigned char > input)
Definition hash.h:45
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition transaction.h:30
uint32_t n
Definition transaction.h:33
A hasher class for SHA-256.
Definition sha256.h:14
void Finalize(unsigned char hash[OUTPUT_SIZE])
Definition sha256.cpp:725
CSHA256 & Write(const unsigned char *data, size_t len)
Definition sha256.cpp:699
Closure representing one script verification Note that this stores references to the spending transac...
Definition validation.h:338
SignatureCache * m_signature_cache
Definition validation.h:346
PrecomputedTransactionData * txdata
Definition validation.h:345
CTxOut m_tx_out
Definition validation.h:340
script_verify_flags m_flags
Definition validation.h:343
std::optional< std::pair< ScriptError, std::string > > operator()()
const CTransaction * ptxTo
Definition validation.h:341
unsigned int nIn
Definition validation.h:342
Serialized script, used inside transaction inputs and outputs.
Definition script.h:406
The basic transaction that is broadcasted on the network and contained in blocks.
bool HasWitness() const
const std::vector< CTxOut > vout
const Wtxid & GetWitnessHash() const LIFETIMEBOUND
bool IsCoinBase() const
const Txid & GetHash() const LIFETIMEBOUND
const std::vector< CTxIn > vin
An input of a transaction.
Definition transaction.h:63
CTxMemPool::txiter TxHandle
Definition txmempool.h:665
CTxMemPool stores valid-according-to-the-current-best-chain transactions that may be included in the ...
Definition txmempool.h:188
void check(const CCoinsViewCache &active_coins_tip, int64_t spendheight) const EXCLUSIVE_LOCKS_REQUIRED(void removeRecursive(const CTransaction &tx, MemPoolRemovalReason reason) EXCLUSIVE_LOCKS_REQUIRED(cs)
If sanity-checking is turned on, check makes sure the pool is consistent (does not contain two transa...
Definition txmempool.h:324
void UpdateTransactionsFromBlock(const std::vector< Txid > &vHashesToUpdate) EXCLUSIVE_LOCKS_REQUIRED(cs
UpdateTransactionsFromBlock is called when adding transactions from a disconnected block back to the ...
Definition txmempool.cpp:91
void AddTransactionsUpdated(unsigned int n)
CTransactionRef get(const Txid &hash) const
Return a mempool transaction with a given hash.
size_t DynamicMemoryUsage() const
const Options m_opts
Definition txmempool.h:302
void removeForReorg(CChain &chain, std::function< bool(txiter)> filter_final_and_mature) EXCLUSIVE_LOCKS_REQUIRED(cs
After reorg, filter the entries that would no longer be valid in the next block, and update the entri...
bool exists(const Txid &txid) const
Definition txmempool.h:514
std::set< txiter, CompareIteratorByHash > setEntries
Definition txmempool.h:267
indexed_transaction_set::nth_index< 0 >::type::const_iterator txiter
Definition txmempool.h:264
std::vector< RemovedMempoolTransactionInfo > removeForBlock(const std::vector< CTransactionRef > &vtx) EXCLUSIVE_LOCKS_REQUIRED(cs)
unsigned long size() const
Definition txmempool.h:496
An output of a transaction.
CScript scriptPubKey
CAmount nValue
Undo information for a CTransaction.
Definition undo.h:54
VerifyDBResult VerifyDB(Chainstate &chainstate, const Consensus::Params &consensus_params, CCoinsView &coinsview, int nCheckLevel, int nCheckDepth) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
kernel::Notifications & m_notifications
Definition validation.h:437
CVerifyDB(kernel::Notifications &notifications)
Chainstate stores and provides an API to update our local knowledge of the current best chain.
Definition validation.h:550
void InitCoinsCache(size_t cache_size_bytes) EXCLUSIVE_LOCKS_REQUIRED(bool CanFlushToDisk() const EXCLUSIVE_LOCKS_REQUIRED(
Initialize the in-memory coins cache (to be done after the health of the on-disk database is verified...
Definition validation.h:622
Mutex m_chainstate_mutex
The ChainState Mutex A lock that must be held when modifying this ChainState - held in ActivateBestCh...
Definition validation.h:557
CChain m_chain
The current chain of blockheaders we consult and build on.
Definition validation.h:630
void SetTargetBlock(CBlockIndex *block) EXCLUSIVE_LOCKS_REQUIRED(void SetTargetBlockHash(uint256 block_hash) EXCLUSIVE_LOCKS_REQUIRED(boo ReachedTarget)() const EXCLUSIVE_LOCKS_REQUIRED(
Set target block for this chainstate.
Definition validation.h:677
CTxMemPool * GetMempool()
Definition validation.h:709
bool RollforwardBlock(const CBlockIndex *pindex, CCoinsViewCache &inputs) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Apply the effects of a block on the utxo cache, ignoring that it may already have been applied.
size_t m_coinstip_cache_size_bytes
The cache size of the in-memory coins view.
Definition validation.h:729
void UpdateTip(const CBlockIndex *pindexNew) EXCLUSIVE_LOCKS_REQUIRED(NodeClock::time_poin m_next_write)
Check warning conditions and do some notifications on new chain tip set.
Definition validation.h:900
CCoinsViewCache & CoinsTip() EXCLUSIVE_LOCKS_REQUIRED(
Definition validation.h:694
bool LoadChainTip() EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Update the chain tip based on database information, i.e.
size_t m_coinsdb_cache_size_bytes
The cache size of the on-disk coins view.
Definition validation.h:726
bool PreciousBlock(BlockValidationState &state, CBlockIndex *pindex) LOCKS_EXCLUDED(bool InvalidateBlock(BlockValidationState &state, CBlockIndex *pindex) LOCKS_EXCLUDED(void SetBlockFailureFlags(CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(voi ResetBlockFailureFlags)(CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Mark a block as precious and reorganize.
Definition validation.h:813
void InvalidBlockFound(CBlockIndex *pindex, const BlockValidationState &state) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
bool ConnectTip(BlockValidationState &state, CBlockIndex *pindexNew, std::shared_ptr< const CBlock > block_to_connect, std::vector< ConnectedBlock > &connected_blocks, DisconnectedBlockTransactions &disconnectpool) EXCLUSIVE_LOCKS_REQUIRED(cs_main
Connect a new block to m_chain.
void CheckForkWarningConditions() EXCLUSIVE_LOCKS_REQUIRED(cs_main)
kernel::ChainstateRole GetRole() const EXCLUSIVE_LOCKS_REQUIRED(void InitCoinsDB(size_t cache_size_bytes, bool in_memory, bool should_wipe)
Return the current role of the chainstate.
const std::optional< uint256 > m_from_snapshot_blockhash
The blockhash which is the base of the snapshot this chainstate was created from.
Definition validation.h:642
bool ActivateBestChain(BlockValidationState &state, std::shared_ptr< const CBlock > pblock=nullptr) LOCKS_EXCLUDED(DisconnectResult DisconnectBlock(const CBlock &block, const CBlockIndex *pindex, CCoinsViewCache &view) EXCLUSIVE_LOCKS_REQUIRED(boo ConnectBlock)(const CBlock &block, BlockValidationState &state, CBlockIndex *pindex, CCoinsViewCache &view, bool fJustCheck=false) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Find the best known block, and make it the tip of the block chain.
Definition validation.h:789
bool ActivateBestChainStep(BlockValidationState &state, CBlockIndex &index_most_work, const std::shared_ptr< const CBlock > &pblock, bool &fInvalidFound, std::vector< ConnectedBlock > &connected_blocks) EXCLUSIVE_LOCKS_REQUIRED(cs_main
Return the [start, end] (inclusive) of block heights we can prune.
CTxMemPool * m_mempool
Optional mempool that is kept in sync with the chain.
Definition validation.h:561
CCoinsViewDB & CoinsDB() EXCLUSIVE_LOCKS_REQUIRED(
Definition validation.h:702
bool DisconnectTip(BlockValidationState &state, DisconnectedBlockTransactions *disconnectpool) EXCLUSIVE_LOCKS_REQUIRED(cs_main
Disconnect m_chain's tip.
CBlockIndex * FindMostWorkChain() EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Return the tip of the chain with the most work in it, that isn't known to be invalid (it's however fa...
std::set< CBlockIndex *, node::CBlockIndexWorkComparator > setBlockIndexCandidates
The set of all CBlockIndex entries that have as much work as our current tip or more,...
Definition validation.h:691
ChainstateManager & m_chainman
The chainstate manager that owns this chainstate.
Definition validation.h:588
std::unique_ptr< CoinsViews > m_coins_views
Manages the UTXO set, which is a reflection of the contents of m_chain.
Definition validation.h:564
bool m_mempool cs
Definition validation.h:793
bool ReplayBlocks()
Replay blocks that aren't fully applied to the database.
void PruneBlockIndexCandidates()
Delete all entries in setBlockIndexCandidates that are worse than the current tip.
void TryAddBlockIndexCandidate(CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Add a block to the candidate set if it has as much work as the current tip.
void PruneAndFlush()
Prune blockfiles from the disk if necessary and then flush chainstate changes if we pruned.
bool ResizeCoinsCaches(size_t coinstip_size, size_t coinsdb_size) EXCLUSIVE_LOCKS_REQUIRED(bool FlushStateToDisk(BlockValidationState &state, FlushStateMode mode, int nManualPruneHeight=0)
Resize the CoinsViews caches dynamically and flush state to disk.
node::BlockManager & m_blockman
Reference to a BlockManager instance which itself is shared across all Chainstate instances.
Definition validation.h:583
void ForceFlushStateToDisk(bool wipe_cache=true)
Flush all changes to disk.
void MaybeUpdateMempoolForReorg(DisconnectedBlockTransactions &disconnectpool, bool fAddToMempool) EXCLUSIVE_LOCKS_REQUIRED(cs_main
Make mempool consistent after a reorg, by re-adding or recursively erasing disconnected block transac...
void ClearBlockIndexCandidates() EXCLUSIVE_LOCKS_REQUIRED(void PopulateBlockIndexCandidates() EXCLUSIVE_LOCKS_REQUIRED(const CBlockIndex * FindForkInGlobalIndex(const CBlockLocator &locator) const EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Populate the candidate set by calling TryAddBlockIndexCandidate on all valid block indices.
void InvalidChainFound(CBlockIndex *pindexNew) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Chainstate(CTxMemPool *mempool, node::BlockManager &blockman, ChainstateManager &chainman, std::optional< uint256 > from_snapshot_blockhash=std::nullopt)
RecursiveMutex * MempoolMutex() const LOCK_RETURNED(m_mempool -> cs)
Indirection necessary to make lock annotations work with an optional mempool.
Definition validation.h:852
fs::path StoragePath() const
Return path to chainstate leveldb directory.
bool NeedsRedownload() const EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Whether the chain state needs to be redownloaded due to lack of witness data.
Interface for managing multiple Chainstate objects, where each chainstate is associated with chainsta...
Definition validation.h:950
util::Result< void > PopulateAndValidateSnapshot(Chainstate &snapshot_chainstate, AutoFile &coins_file, const node::SnapshotMetadata &metadata)
Internal helper for ActivateSnapshot().
Chainstate * HistoricalChainstate() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Return historical chainstate targeting a specific block, if any.
const uint256 & AssumedValidBlock() const
ValidationCache m_validation_cache
double GetBackgroundVerificationProgress(const CBlockIndex &pindex) const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Guess background verification progress in case assume-utxo was used (as a fraction between 0....
double GuessVerificationProgress(const CBlockIndex *pindex) const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Guess verification progress (as a fraction between 0.0=genesis and 1.0=current tip).
bool IsInitialBlockDownload() const noexcept
Check whether we are doing an initial block download (synchronizing from disk or network)
const script_verify_flags m_all_consensus_script_flags
Store the potential consensus script flags for this manager's selected params.
size_t m_total_coinstip_cache
The total number of bytes available for us to use across all in-memory coins caches.
MempoolAcceptResult ProcessTransaction(const CTransactionRef &tx, bool test_accept=false) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Try to add a transaction to the memory pool.
std::unique_ptr< Chainstate > RemoveChainstate(Chainstate &chainstate) EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Remove a chainstate.
kernel::Notifications & GetNotifications() const
void ReceivedBlockTransactions(const CBlock &block, CBlockIndex *pindexNew, const FlatFilePos &pos) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Mark a block as having its data received and checked (up to BLOCK_VALID_TRANSACTIONS).
bool ShouldCheckBlockIndex() const
RecursiveMutex & GetMutex() const LOCK_RETURNED(
Alias for cs_main.
CBlockIndex * ActiveTip() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Chainstate & ActiveChainstate() const
Alternatives to CurrentChainstate() used by older code to query latest chainstate information without...
SnapshotCompletionResult MaybeValidateSnapshot(Chainstate &validated_cs, Chainstate &unvalidated_cs) EXCLUSIVE_LOCKS_REQUIRED(Chainstate & CurrentChainstate() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Try to validate an assumeutxo snapshot by using a validated historical chainstate targeted at the sna...
bool ProcessNewBlock(const std::shared_ptr< const CBlock > &block, bool force_processing, bool min_pow_checked, bool *new_block) LOCKS_EXCLUDED(cs_main)
Process an incoming block.
size_t m_total_coinsdb_cache
The total number of bytes available for us to use across all leveldb coins databases.
void CheckBlockIndex() const
Make various assertions about the state of the block index.
const util::SignalInterrupt & m_interrupt
void LoadExternalBlockFile(AutoFile &file_in, FlatFilePos *dbp=nullptr, std::multimap< uint256, FlatFilePos > *blocks_with_unknown_parent=nullptr)
Import blocks from an external file.
int ActiveHeight() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
VersionBitsCache m_versionbitscache
Track versionbit status.
std::function< void()> snapshot_download_completed
Function to restart active indexes; set dynamically to avoid a circular dependency on base/index....
const CChainParams & GetParams() const
void GenerateCoinbaseCommitment(CBlock &block, const CBlockIndex *pindexPrev) const
Produce the necessary coinbase commitment for a block (modifies the hash, don't call for mined blocks...
bool ProcessNewBlockHeaders(std::span< const CBlockHeader > headers, bool min_pow_checked, BlockValidationState &state, const CBlockIndex **ppindex=nullptr) LOCKS_EXCLUDED(cs_main)
Process incoming block headers.
const Consensus::Params & GetConsensus() const
ChainstateManager(const util::SignalInterrupt &interrupt, Options options, node::BlockManager::Options blockman_options)
const arith_uint256 & MinimumChainWork() const
static script_verify_flags GetAllConsensusScriptFlags(const Consensus::Params &params)
Determine the potential consensus script flags for blocks in a chain.
void UpdateIBDStatus() EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Update and possibly latch the IBD status.
bool LoadGenesisBlock()
Ensures a genesis block is in the block tree, possibly writing one to disk.
const Options m_options
bool LoadBlockIndex() EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Load the block tree and coins database from disk, initializing state if we're running with -reindex.
Chainstate &InitializeChainstate(CTxMemPool *mempool) EXCLUSIVE_LOCKS_REQUIRED(util::Result< CBlockIndex * ActivateSnapshot)(AutoFile &coins_file, const node::SnapshotMetadata &metadata, bool in_memory)
Instantiate a new chainstate.
CChain & ActiveChain() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
bool AcceptBlockHeader(const CBlockHeader &block, BlockValidationState &state, CBlockIndex **ppindex, bool min_pow_checked) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
If a block header hasn't already been seen, call CheckBlockHeader on it, ensure that it doesn't desce...
arith_uint256 nLastPreciousChainwork
chainwork for the last block that preciousblock has been applied to.
void ReportHeadersPresync(int64_t height, int64_t timestamp)
This is used by net_processing to report pre-synchronization progress of headers, as headers are not ...
std::atomic_bool m_cached_is_ibd
Whether initial block download (IBD) is ongoing.
bool NotifyHeaderTip() LOCKS_EXCLUDED(GetMutex())
void MaybeRebalanceCaches() EXCLUSIVE_LOCKS_REQUIRED(void UpdateUncommittedBlockStructures(CBlock &block, const CBlockIndex *pindexPrev) const
Check to see if caches are out of balance and if so, call ResizeCoinsCaches() as needed.
Chainstate *LoadAssumeutxoChainstate() EXCLUSIVE_LOCKS_REQUIRED(Chainstate &AddChainstate(std::unique_ptr< Chainstate > chainstate) EXCLUSIVE_LOCKS_REQUIRED(void ResetChainstates() EXCLUSIVE_LOCKS_REQUIRED(bool DeleteChainstate(Chainstate &chainstate) EXCLUSIVE_LOCKS_REQUIRED(bool ValidatedSnapshotCleanup(Chainstate &validated_cs, Chainstate &unvalidated_cs) EXCLUSIVE_LOCKS_REQUIRED(std::optional< std::pair< const CBlockIndex *, const CBlockIndex * > > GetHistoricalBlockRange() const EXCLUSIVE_LOCKS_REQUIRED(util::Result< void > ActivateBestChains() LOCKS_EXCLUDED(void RecalculateBestHeader() EXCLUSIVE_LOCKS_REQUIRED(std::optional< int > BlocksAheadOfTip() const LOCKS_EXCLUDED(CCheckQueue< CScriptCheck > & GetCheckQueue()
When starting up, search the datadir for a chainstate based on a UTXO snapshot that is in the process...
int32_t nBlockReverseSequenceId
Decreasing counter (used by subsequent preciousblock calls).
node::BlockManager m_blockman
A single BlockManager instance is shared across each constructed chainstate to avoid duplicating bloc...
bool AcceptBlock(const std::shared_ptr< const CBlock > &pblock, BlockValidationState &state, CBlockIndex **ppindex, bool fRequested, const FlatFilePos *dbp, bool *fNewBlock, bool min_pow_checked) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Sufficiently validate a block for disk storage (and store on disk).
A UTXO entry.
Definition coins.h:46
bool IsCoinBase() const
Definition coins.h:70
CTxOut out
unspent transaction output
Definition coins.h:49
bool IsSpent() const
Either this coin never existed (see e.g.
Definition coins.h:94
uint32_t nHeight
at which height this containing transaction was included in the active block chain
Definition coins.h:55
Noop coins view.
Definition coins.h:392
static CoinsViewEmpty & Get()
Definition coins.cpp:29
CCoinsViewCache subclass that asynchronously fetches most block input prevouts in parallel during Con...
Definition coins.h:656
ResetGuard StartFetching(const CBlock &block LIFETIMEBOUND) noexcept
Start fetching inputs from block.
Definition coins.cpp:376
CoinsViews(DBParams db_params, CoinsViewOptions options)
This constructor initializes CCoinsViewDB and CCoinsViewErrorCatcher instances, but it does not creat...
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...
DisconnectedBlockTransactions.
Fast randomness source.
Definition random.h:386
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:329
I randrange(I range) noexcept
Generate a random integer in the range [0..range), with range > 0.
Definition random.h:254
Convenience class for initializing and passing the script execution cache and signature cache.
Definition validation.h:370
ValidationCache(size_t script_execution_cache_bytes, size_t signature_cache_bytes)
CuckooCache::cache< uint256, SignatureCacheHasher > m_script_execution_cache
Definition validation.h:376
CSHA256 m_script_execution_cache_hasher
Pre-initialized hasher to avoid having to recreate it for every hash calculation.
Definition validation.h:373
void BlockConnected(const kernel::ChainstateRole &, std::shared_ptr< const CBlock >, const CBlockIndex *pindex)
void BlockChecked(const std::shared_ptr< const CBlock > &, const BlockValidationState &)
void ChainStateFlushed(const kernel::ChainstateRole &, const CBlockLocator &)
void NewPoWValidBlock(const CBlockIndex *, const std::shared_ptr< const CBlock > &)
void UpdatedBlockTip(const CBlockIndex *, const CBlockIndex *, bool fInitialDownload)
void ActiveTipChange(const CBlockIndex &, bool)
void MempoolTransactionsRemovedForBlock(std::shared_ptr< const CBlock >, std::vector< RemovedMempoolTransactionInfo >, unsigned int block_height)
void BlockDisconnected(std::shared_ptr< const CBlock >, const CBlockIndex *pindex)
bool IsValid() const
Definition validation.h:112
std::string GetRejectReason() const
Definition validation.h:116
std::string GetDebugMessage() const
Definition validation.h:117
bool Error(const std::string &reject_reason)
Definition validation.h:105
bool Invalid(Result result, const std::string &reject_reason="", const std::string &debug_message="")
Definition validation.h:95
bool IsError() const
Definition validation.h:114
Result GetResult() const
Definition validation.h:115
std::string ToString() const
Definition validation.h:118
bool IsInvalid() const
Definition validation.h:113
std::vector< std::pair< int, bool > > CheckUnknownActivations(const CBlockIndex *pindex, const CChainParams &chainparams) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Check for unknown activations Returns a vector containing the bit number used for signalling and a bo...
void Clear() EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
256-bit unsigned big integer.
constexpr bool IsNull() const
Definition uint256.h:50
std::string ToString() const
Definition uint256.cpp:21
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 bilingual_str &message)
The fatal error notification is sent to notify the user when an error occurs in kernel code that can'...
virtual void warningSet(Warning id, const bilingual_str &message)
virtual void progress(const bilingual_str &title, int progress_percent, bool resume_possible)
virtual InterruptResult blockTip(SynchronizationState state, const CBlockIndex &index, double verification_progress)
virtual void warningUnset(Warning id)
Maintains a tree of blocks (stored in m_block_index) which is consulted to determine where the most-w...
const kernel::BlockManagerOpts m_opts
void FindFilesToPrune(std::set< int > &setFilesToPrune, int last_prune, const Chainstate &chain, ChainstateManager &chainman)
Prune block and undo files (blk???.dat and rev???.dat) so that the disk space used is less than a use...
CBlockIndex * LookupBlockIndex(const uint256 &hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
bool ReadBlockUndo(CBlockUndo &blockundo, const CBlockIndex &index) const
CBlockFileInfo *GetBlockFileInfo(size_t n) EXCLUSIVE_LOCKS_REQUIRED(bool WriteBlockUndo(const CBlockUndo &blockundo, BlockValidationState &state, CBlockIndex &block) EXCLUSIVE_LOCKS_REQUIRED(FlatFilePos WriteBlock(const CBlock &block, int nHeight) EXCLUSIVE_LOCKS_REQUIRED(void UpdateBlockInfo(const CBlock &block, unsigned int nHeight, const FlatFilePos &pos) EXCLUSIVE_LOCKS_REQUIRED(bool IsPruneMode() const
Get block file info entry for one block file.
std::atomic_bool m_blockfiles_indexed
Whether all blockfiles have been added to the block tree database.
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.
std::set< CBlockIndex * > m_dirty_blockindex
Dirty block index entries.
bool LoadingBlocks() const
void UnlinkPrunedFiles(const std::set< int > &setFilesToPrune) const
Actually unlink the specified files.
void WriteBlockIndexDB() EXCLUSIVE_LOCKS_REQUIRED(bool LoadBlockIndexDB(const std::optional< uint256 > &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.
void AddUnlinkedBlock(CBlockIndex *block) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
bool ReadBlock(CBlock &block, const FlatFilePos &pos, const std::optional< uint256 > &expected_hash) const
Functions for disk access for blocks.
bool m_check_for_pruning
Global flag to indicate we should check to see if there are block/undo files that should be deleted.
void FindFilesToPruneManual(std::set< int > &setFilesToPrune, int nManualPruneHeight, const Chainstate &chain)
std::optional< int > m_snapshot_height
The height of the base block of an assumeutxo snapshot, if one is in use.
uint64_t CalculateCurrentUsage() EXCLUSIVE_LOCKS_REQUIRED(bool CheckBlockDataAvailability(const CBlockIndex &upper_block, const CBlockIndex &lower_block, BlockStatus block_status=BLOCK_HAVE_DATA) EXCLUSIVE_LOCKS_REQUIRED(const CBlockIndex &GetFirstBlock(const CBlockIndex &upper_block LIFETIMEBOUND, uint32_t status_mask, const CBlockIndex *lower_block LIFETIMEBOUND=nullptr) const EXCLUSIVE_LOCKS_REQUIRED(boo m_have_pruned)
Calculate the amount of disk space the block & undo files currently use.
Metadata describing a serialized version of a UTXO set from which an assumeutxo Chainstate can be con...
static constexpr script_verify_flags from_int(value_type f)
constexpr const std::byte * begin() const
const uint256 & ToUint256() const LIFETIMEBOUND
256-bit opaque blob.
Definition uint256.h:196
NotNull is intended to be used to denote that a smart pointer type can not hold a nullptr value.
Definition not_null.h:45
Helper class that manages an interrupt flag, and allows a thread or signal to interrupt another threa...
std::string FormatFullVersion()
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:133
int ApplyTxInUndo(Coin &&undo, CCoinsViewCache &view, const COutPoint &out)
Restore the UTXO in a Coin at a given COutPoint.
void UpdateCoins(const CTransaction &tx, CCoinsViewCache &inputs, CTxUndo &txundo, int nHeight)
static const PrecomputedData data
Precomputed COutPoint and CCoins values.
auto flush
Flush changes in top cache to the one below.
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
Definition merkle.cpp:76
uint256 BlockWitnessMerkleRoot(const CBlock &block)
Definition merkle.cpp:86
constexpr int NO_WITNESS_COMMITMENT
Index marker for when no witness commitment is present in a coinbase transaction.
Definition validation.h:22
constexpr size_t MINIMUM_WITNESS_COMMITMENT
Minimum size of a witness commitment structure.
Definition validation.h:25
static int64_t GetBlockWeight(const CBlock &block)
Definition validation.h:143
@ 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)
int GetWitnessCommitmentIndex(const CBlock &block)
Compute at which vout of the block's coinbase transaction the witness commitment occurs,...
Definition validation.h:154
@ TX_MISSING_INPUTS
transaction was missing some of its inputs
@ TX_MEMPOOL_POLICY
violated mempool's fee/size/descendant/RBF/etc limits
@ TX_PREMATURE_SPEND
transaction spends a coinbase too early, or violates locktime/sequence locks
@ TX_WITNESS_STRIPPED
Transaction is missing a witness.
@ TX_CONFLICT
Tx already in mempool or conflicts with a tx in the chain (if it conflicts with another tx in mempool...
@ TX_NOT_STANDARD
otherwise didn't meet our local policy rules
@ TX_WITNESS_MUTATED
Transaction might have a witness prior to SegWit activation, or witness may have been malleated (whic...
@ TX_NO_MEMPOOL
this node does not have a mempool so can't validate the transaction
@ TX_CONSENSUS
invalid by consensus rules
@ TX_RECONSIDERABLE
fails some policy, but might be acceptable if submitted in a (different) package
constexpr unsigned int LOCKTIME_VERIFY_SEQUENCE
Flags for nSequence and nLockTime locks.
Definition consensus.h:28
constexpr int64_t MAX_BLOCK_SIGOPS_COST
The maximum allowed number of signature check operations in a block (network rule)
Definition consensus.h:17
constexpr int64_t MAX_TIMEWARP
Maximum number of seconds that the timestamp of the first block of a difficulty adjustment period is ...
Definition consensus.h:35
constexpr unsigned int MAX_BLOCK_SERIALIZED_SIZE
The maximum allowed size for a serialized block, in bytes (only for buffer size limits)
Definition consensus.h:13
constexpr int COINBASE_MATURITY
Coinbase transaction outputs can only be spent after this number of new blocks (network rule)
Definition consensus.h:19
constexpr unsigned int MAX_BLOCK_WEIGHT
The maximum allowed weight for a block, see BIP 141 (network rule)
Definition consensus.h:15
constexpr int WITNESS_SCALE_FACTOR
Definition consensus.h:21
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
Definition cs_main.cpp:8
bool DestroyDB(const std::string &path_str)
Definition dbwrapper.cpp:39
bool DeploymentActiveAfter(const CBlockIndex *pindexPrev, const Consensus::Params &params, Consensus::BuriedDeployment dep, VersionBitsCache &versionbitscache)
Determine if a deployment is active for the next block.
bool DeploymentEnabled(const Consensus::Params &params, Consensus::BuriedDeployment dep)
Determine if a deployment is enabled (can ever be active)
bool DeploymentActiveAt(const CBlockIndex &index, const Consensus::Params &params, Consensus::BuriedDeployment dep, VersionBitsCache &versionbitscache)
Determine if a deployment is active for this block.
constexpr unsigned int MAX_DISCONNECTED_TX_POOL_BYTES
Maximum bytes for transactions to store for processing during reorg.
bool CheckEphemeralSpends(const Package &package, CFeeRate dust_relay_rate, const CTxMemPool &tx_pool, TxValidationState &out_child_state, Wtxid &out_child_wtxid)
Called for each transaction(package) if any dust is in the package.
bool PreCheckEphemeralTx(const CTransaction &tx, CFeeRate dust_relay_rate, CAmount base_fee, CAmount mod_fee, TxValidationState &state)
These utility functions ensure that ephemeral dust is safely created and spent without unduly risking...
volatile double sum
Definition examples.cpp:10
static bool exists(const path &p)
Definition fs.h:94
static std::string PathToString(const path &path)
Convert path object to a byte string.
Definition fs.h:160
bool CheckDiskSpace(const fs::path &dir, uint64_t additional_bytes)
HTTPHeaders headers
bool VerifyScript(const CScript &scriptSig, const CScript &scriptPubKey, const CScriptWitness *witness, script_verify_flags flags, const BaseSignatureChecker &checker, ScriptError *serror)
script_verify_flag_name
Definition interpreter.h:50
constexpr script_verify_flags SCRIPT_VERIFY_NONE
Script verification flags.
Definition interpreter.h:48
is a home for simple enum and struct type definitions that can be used internally by functions in the...
#define LogWarning(...)
Definition log.h:137
#define LogInfo(...)
Definition log.h:136
#define LogError(...)
Definition log.h:138
#define LogDebug(category,...)
Definition log.h:154
unsigned int nHeight
LockPoints lp
@ REORG
Removed for reorganization.
std::array< uint8_t, 4 > MessageStartChars
unsigned int nonce
@ COINDB
Definition categories.h:33
@ REINDEX
Definition categories.h:27
@ TXPACKAGES
Definition categories.h:45
@ VALIDATION
Definition categories.h:36
@ PRUNE
Definition categories.h:30
@ MEMPOOL
Definition categories.h:18
@ BENCH
Definition categories.h:20
bool CheckTxInputs(const CTransaction &tx, TxValidationState &state, const CCoinsViewCache &inputs, int nSpendHeight, CAmount &txfee)
Check whether all inputs of this transaction are valid (no double spends and amounts) This does not m...
@ DEPLOYMENT_DERSIG
Definition params.h:30
@ DEPLOYMENT_CSV
Definition params.h:31
@ DEPLOYMENT_SEGWIT
Definition params.h:34
@ DEPLOYMENT_HEIGHTINCB
Definition params.h:28
@ DEPLOYMENT_CLTV
Definition params.h:29
constexpr T & operator&=(T &lhs, T rhs)
std::function< FILE *(const fs::path &, const char *)> FopenFn
Definition fs.h:195
Definition basic.cpp:11
std::optional< CCoinsStats > ComputeUTXOStats(CoinStatsHashType hash_type, const CCoinsViewDB &view, node::BlockManager &blockman, const std::function< void()> &interruption_point)
static std::optional< CCoinsStats > ComputeUTXOStats(T hash_obj, const CCoinsViewDB &view, node::BlockManager &blockman, const std::function< void()> &interruption_point)
Calculate statistics about the unspent transaction output set.
bool IsInterrupted(const T &result)
CoinStatsHashType
Definition coinstats.h:26
const fs::path SNAPSHOT_BLOCKHASH_FILENAME
The file in the snapshot chainstate dir which stores the base blockhash.
bool WriteSnapshotBaseBlockhash(Chainstate &snapshot_chainstate)
std::optional< fs::path > FindAssumeutxoChainstateDir(const fs::path &data_dir)
Return a path to the snapshot-based chainstate dir, if one exists.
bool WriteSnapshotBaseBlockhash(Chainstate &snapshot_chainstate) EXCLUSIVE_LOCKS_REQUIRED(std::optional< uint256 > ReadSnapshotBaseBlockhash(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::unordered_map< uint256, CBlockIndex, BlockHasher > BlockMap
std::optional< uint256 > ReadSnapshotBaseBlockhash(fs::path chaindir)
constexpr NoRateLimitTag NO_RATE_LIMIT
Definition log.h:51
bilingual_str ErrorString(const Result< T > &result)
Definition result.h:93
std::string ToString(const T &t)
Locale-independent version of std::to_string.
Definition string.h:250
auto Join(const C &container, const S &separator, UnaryOp unary_op)
Join all container items.
Definition string.h:209
static ConnectionDirection & operator|=(ConnectionDirection &a, ConnectionDirection b)
Definition netbase.h:41
std::shared_ptr< Chain::Notifications > m_notifications
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:119
bool IsWellFormedPackage(const Package &txns, PackageValidationState &state)
Context-free package policy checks:
Definition packages.cpp:79
uint256 GetPackageHash(const std::vector< CTransactionRef > &transactions)
Get the hash of the concatenated wtxids of transactions, with wtxids treated as a little-endian numbe...
Definition packages.cpp:151
std::vector< CTransactionRef > Package
A package is an ordered list of transactions.
Definition packages.h:45
@ 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.
std::optional< std::pair< DiagramCheckError, std::string > > ImprovesFeerateDiagram(CTxMemPool::ChangeSet &changeset)
The replacement transaction must improve the feerate diagram of the mempool.
Definition rbf.cpp:127
std::optional< std::string > PaysForRBF(CAmount original_fees, CAmount replacement_fees, size_t replacement_vsize, CFeeRate relay_fee, const Txid &txid)
The replacement transaction must pay more fees than the original transactions.
Definition rbf.cpp:100
std::optional< std::string > EntriesAndTxidsDisjoint(const CTxMemPool::setEntries &ancestors, const std::set< Txid > &direct_conflicts, const Txid &txid)
Check the intersection between two sets of transactions (a set of mempool entries and a set of txids)...
Definition rbf.cpp:85
std::optional< std::string > GetEntriesForConflicts(const CTransaction &tx, CTxMemPool &pool, const CTxMemPool::setEntries &iters_conflicting, CTxMemPool::setEntries &all_conflicts)
Get all descendants of iters_conflicting.
Definition rbf.cpp:58
@ FAILURE
New diagram wasn't strictly superior
TxValidationState ValidateInputsStandardness(const CTransaction &tx, const CCoinsViewCache &mapInputs)
Check transaction inputs.
Definition policy.cpp:214
bool SpendsNonAnchorWitnessProg(const CTransaction &tx, const CCoinsViewCache &prevouts)
Check whether this transaction spends any witness program but P2A, including not-yet-defined ones.
Definition policy.cpp:354
bool IsWitnessStandard(const CTransaction &tx, const CCoinsViewCache &mapInputs)
Check if the transaction is over standard P2WSH resources limit: 3600bytes witnessScript size,...
Definition policy.cpp:265
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:100
constexpr script_verify_flags STANDARD_SCRIPT_VERIFY_FLAGS
Standard script verification flags that standard transactions will comply with.
Definition policy.h:112
constexpr unsigned int STANDARD_LOCKTIME_VERIFY_FLAGS
Used as the flags parameter to sequence and nLocktime checks in non-consensus code.
Definition policy.h:131
constexpr script_verify_flags MANDATORY_SCRIPT_VERIFY_FLAGS
Mandatory script verification flags that all new transactions must comply with for them to be valid.
Definition policy.h:98
constexpr unsigned int MAX_STANDARD_TX_SIGOPS_COST
The maximum number of sigops we're willing to relay/mine in a single tx.
Definition policy.h:44
constexpr unsigned int MIN_STANDARD_TX_NONWITNESS_SIZE
The minimum non-witness size for transactions we're willing to relay/mine: one larger than 64
Definition policy.h:40
unsigned int GetNextWorkRequired(const CBlockIndex *pindexLast, const CBlockHeader *pblock, const Consensus::Params &params)
Definition pow.cpp:14
bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params &params)
Check whether a block hash satisfies the proof-of-work requirement specified by nBits.
Definition pow.cpp:140
constexpr TransactionSerParams TX_NO_WITNESS
constexpr TransactionSerParams TX_WITH_WITNESS
static CTransactionRef MakeTransactionRef(Tx &&txIn)
std::shared_ptr< const CTransaction > CTransactionRef
uint256 GetRandHash() noexcept
Generate a random uint256.
Definition random.h:463
const char * prefix
Definition rest.cpp:1197
@ OP_RETURN
Definition script.h:112
std::string ScriptErrorString(const ScriptError serror)
enum ScriptError_t ScriptError
@ SCRIPT_ERR_UNKNOWN_ERROR
uint64_t ReadCompactSize(Stream &is, bool range_check=true)
Decode a CompactSize-encoded variable-length integer.
Definition serialize.h:333
uint64_t GetSerializeSize(const T &t)
Definition serialize.h:1157
bool CheckSignetBlockSolution(const CBlock &block, const Consensus::Params &consensusParams)
Extract signature and check whether a block has a valid solution.
Definition signet.cpp:125
unsigned char * UCharCast(char *c)
Definition span.h:95
Holds configuration for use during UTXO snapshot load and validation.
Definition chainparams.h:34
Describes a place in the block chain to another node such that if the other node doesn't have the sam...
Definition block.h:117
std::vector< uint256 > vHave
Definition block.h:127
A mutable version of CTransaction.
std::vector< CTxOut > vout
std::vector< CTxIn > vin
Holds various statistics on transactions within a chain.
Definition chainparams.h:57
User-controlled performance and debug options.
Definition txdb.h:28
std::shared_ptr< const CBlock > pblock
const CBlockIndex * pindex
Parameters that influence chain consensus.
Definition params.h:88
uint256 BIP34Hash
Definition params.h:100
int BIP34Height
Block height and hash at which BIP34 becomes active.
Definition params.h:99
std::map< uint256, script_verify_flags > script_flag_exceptions
Hashes of blocks that.
Definition params.h:97
uint256 hashGenesisBlock
Definition params.h:89
int64_t nPowTargetSpacing
Definition params.h:124
std::chrono::seconds PowTargetSpacing() const
Definition params.h:126
Application-specific storage settings.
Definition dbwrapper.h:43
fs::path path
Location in the filesystem where leveldb data will be stored.
Definition dbwrapper.h:45
Data structure storing a fee and size.
Definition feefrac.h:21
uint64_t nPos
Definition flatfile.h:17
bool IsNull() const
Definition flatfile.h:32
int32_t nFile
Definition flatfile.h:16
Validation result for a transaction evaluated by MemPoolAccept (single or package).
Definition validation.h:134
const ResultType m_result_type
Result type.
Definition validation.h:143
const TxValidationState m_state
Contains information about why the transaction failed.
Definition validation.h:146
@ INVALID
‍Fully validated, valid.
static MempoolAcceptResult Failure(TxValidationState state)
Definition validation.h:170
static MempoolAcceptResult FeeFailure(TxValidationState state, CFeeRate effective_feerate, const std::vector< Wtxid > &wtxids_fee_calculations)
Definition validation.h:174
static MempoolAcceptResult MempoolTxDifferentWitness(const Wtxid &other_wtxid)
Definition validation.h:193
static MempoolAcceptResult MempoolTx(int64_t vsize, CAmount fees)
Definition validation.h:189
static MempoolAcceptResult Success(std::list< CTransactionRef > &&replaced_txns, int64_t vsize, CAmount fees, CFeeRate effective_feerate, const std::vector< Wtxid > &wtxids_fee_calculations)
Definition validation.h:180
static time_point now() noexcept
Return current system time or mocked time, if set.
Definition time.cpp:64
static time_point now() noexcept
Return current system time or mocked time, if set.
Definition time.cpp:38
Validation result for package mempool acceptance.
Definition validation.h:240
void Init(const T &tx, std::vector< CTxOut > &&spent_outputs, bool force=false)
Initialize this PrecomputedTransactionData with transaction data.
bool m_spent_outputs_ready
Whether m_spent_outputs is initialized.
std::vector< CTxOut > m_spent_outputs
const char * what() const noexcept override
Bilingual messages:
Definition translation.h:24
std::string original
Definition translation.h:25
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...
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.
int32_t prevoutfetch_threads_num
Number of worker threads used for prefetching block input prevouts. Zero means no parallel fetching.
Information about chainstate that notifications are sent from.
Definition types.h:18
bool validated
Whether this is a notification from a chainstate that's been fully validated starting from the genesi...
Definition types.h:22
#define AssertLockNotHeld(cs)
Definition sync.h:149
#define LOCK(cs)
Definition sync.h:268
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
Definition sync.h:299
#define AssertLockHeld(cs)
Definition sync.h:144
CDBWrapper db
#define EXCLUSIVE_LOCKS_REQUIRED(...)
#define LOCKS_EXCLUDED(...)
#define LOG_TIME_MILLIS_WITH_CATEGORY(end_msg, log_category)
Definition timer.h:103
#define LOG_TIME_MILLIS_WITH_CATEGORY_MSG_ONCE(end_msg, log_category)
Definition timer.h:105
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
#define TRACEPOINT(context,...)
Definition trace.h:56
#define TRACEPOINT_SEMAPHORE(context, event)
Definition trace.h:54
consteval auto _(util::TranslatedLiteral str)
Definition translation.h:79
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
Definition translation.h:82
std::optional< std::pair< std::string, CTransactionRef > > SingleTRUCChecks(const CTxMemPool &pool, const CTransactionRef &ptx, const std::vector< CTxMemPoolEntry::CTxMemPoolEntryRef > &mempool_parents, const std::set< Txid > &direct_conflicts, int64_t vsize)
Must be called for every transaction, even if not TRUC.
std::optional< std::string > PackageTRUCChecks(const CTxMemPool &pool, const CTransactionRef &ptx, int64_t vsize, const Package &package, const std::vector< CTxMemPoolEntry::CTxMemPoolEntryRef > &mempool_parents)
Must be called for every transaction that is submitted within a package, even if not TRUC.
bool CheckTransaction(const CTransaction &tx, TxValidationState &state)
Definition tx_check.cpp:19
bool EvaluateSequenceLocks(const CBlockIndex &block, std::pair< int, int64_t > lockPair)
std::pair< int, int64_t > CalculateSequenceLocks(const CTransaction &tx, int flags, std::vector< int > &prevHeights, const CBlockIndex &block)
Calculates the block height and previous block's median time past at which the transaction will be co...
Definition tx_verify.cpp:45
int64_t GetTransactionSigOpCost(const CTransaction &tx, const CCoinsViewCache &inputs, script_verify_flags flags)
Compute total signature operation cost of a transaction.
unsigned int GetLegacySigOpCount(const CTransaction &tx)
Auxiliary functions for transaction validation (ideally should not be exposed)
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.
bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime)
Check if transaction is final and can be included in a block with the specified height and time.
Definition tx_verify.cpp:23
bool TestLockPointValidity(CChain &active_chain, const LockPoints &lp)
Test whether the LockPoints height and time are still valid on the current chain.
Definition txmempool.cpp:40
constexpr uint32_t MEMPOOL_HEIGHT
Fake height value used in Coin to signify they are only in the memory pool (since 0....
Definition txmempool.h:51
#define expect(bit)
int64_t GetTime()
DEPRECATED Use either ClockType::now() or Now<TimePointType>() if a cast is needed.
Definition time.cpp:88
std::string FormatISO8601DateTime(int64_t nTime)
ISO 8601 formatting is preferred.
Definition time.cpp:90
std::chrono::duration< double, std::chrono::seconds::period > SecondsDouble
Definition time.h:102
std::chrono::duration< double, std::chrono::milliseconds::period > MillisecondsDouble
Definition time.h:103
constexpr int64_t count_seconds(std::chrono::seconds t)
Definition time.h:97
std::chrono::time_point< NodeClock, std::chrono::seconds > NodeSeconds
Definition time.h:35
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.
Definition time.h:82
PackageMempoolAcceptResult ProcessNewPackage(Chainstate &active_chainstate, CTxMemPool &pool, const Package &package, bool test_accept, const std::optional< CFeeRate > &client_maxfeerate)
Validate (and maybe submit) a package to the mempool.
static void LimitMempoolSize(CTxMemPool &pool, CCoinsViewCache &coins_cache) EXCLUSIVE_LOCKS_REQUIRED(
bool IsBlockMutated(const CBlock &block, bool check_witness_root)
Check if a block has been mutated (with respect to its merkle root and witness commitments).
script_verify_flags GetBlockScriptFlags(const CBlockIndex &block_index, const ChainstateManager &chainman)
static bool pool cs
bool CheckFinalTxAtTip(const CBlockIndex &active_chain_tip, const CTransaction &tx)
CAmount GetBlockSubsidy(int nHeight, const Consensus::Params &consensusParams)
MempoolAcceptResult AcceptToMemoryPool(Chainstate &active_chainstate, const CTransactionRef &tx, int64_t accept_time, bool bypass_limits, bool test_accept)
Try to add a transaction to the mempool.
bool HasValidProofOfWork(std::span< const CBlockHeader > headers, const Consensus::Params &consensusParams)
Check that the proof of work on each blockheader matches the value in nBits.
int ApplyTxInUndo(Coin &&undo, CCoinsViewCache &view, const COutPoint &out)
Restore the UTXO in a Coin at a given COutPoint.
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 FatalError(Notifications &notifications, BlockValidationState &state, const bilingual_str &message)
bool CheckSequenceLocksAtTip(CBlockIndex *tip, const LockPoints &lock_points)
Check if transaction will be BIP68 final in the next block to be created on top of tip.
static bool ContextualCheckBlockHeader(const CBlockHeader &block, BlockValidationState &state, const ChainstateManager &chainman, const CBlockIndex *pindexPrev) EXCLUSIVE_LOCKS_REQUIRED(
Context-dependent validity checks.
static ChainstateManager::Options && Flatten(ChainstateManager::Options &&opts)
Apply default chain params to nullopt members.
static void UpdateTipLog(const ChainstateManager &chainman, const CCoinsViewCache &coins_tip, const CBlockIndex *tip, const std::string &func_name, const std::string &prefix, const std::string &warning_messages, const bool background_validation) EXCLUSIVE_LOCKS_REQUIRED(
static bool CheckInputsFromMempoolAndCache(const CTransaction &tx, TxValidationState &state, const CCoinsViewCache &view, const CTxMemPool &pool, script_verify_flags flags, PrecomputedTransactionData &txdata, CCoinsViewCache &coins_tip, ValidationCache &validation_cache) EXCLUSIVE_LOCKS_REQUIRED(cs_main
Checks to avoid mempool polluting consensus critical paths since cached signature and script validity...
static constexpr auto DATABASE_WRITE_INTERVAL_MAX
static bool CheckWitnessMalleation(const CBlock &block, bool expect_witness_commitment, BlockValidationState &state)
CheckWitnessMalleation performs checks for block malleation with regard to its witnesses.
void UpdateCoins(const CTransaction &tx, CCoinsViewCache &inputs, CTxUndo &txundo, int nHeight)
static bool DeleteCoinsDBFromDisk(const fs::path db_path, bool is_snapshot) EXCLUSIVE_LOCKS_REQUIRED(
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.
arith_uint256 CalculateClaimedHeadersWork(std::span< const CBlockHeader > headers)
Return the sum of the claimed work on a given set of headers.
const std::vector< std::string > CHECKLEVEL_DOC
Documentation for argument 'checklevel'.
bool CheckBlock(const CBlock &block, BlockValidationState &state, const Consensus::Params &consensusParams, bool fCheckPOW, bool fCheckMerkleRoot)
Functions for validating blocks and updating the block tree.
static constexpr std::chrono::hours MAX_FEE_ESTIMATION_TIP_AGE
Maximum age of our tip for us to be considered current for fee estimation.
void PruneBlockFilesManual(Chainstate &active_chainstate, int nManualPruneHeight)
Prune block files up to a given height.
static void FlushSnapshotToDisk(CCoinsViewCache &coins_cache, bool snapshot_loaded)
static bool IsCurrentForFeeEstimation(Chainstate &active_chainstate) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
static constexpr auto DATABASE_WRITE_INTERVAL_MIN
Time window to wait between writing blocks/block index and chainstate to disk.
BlockValidationState TestBlockValidity(Chainstate &chainstate, const CBlock &block, const bool check_pow, const bool check_merkle_root)
Verify a block, including transactions.
return CheckInputScripts(tx, state, view, flags, CheckInputScriptsFor::Mempool, true, true, txdata, validation_cache)
static bool CheckBlockHeader(const CBlockHeader &block, BlockValidationState &state, const Consensus::Params &consensusParams, bool fCheckPOW=true)
bool IsBIP30Repeat(const CBlockIndex &block_index)
Identifies blocks that overwrote an existing coinbase output in the UTXO set (see BIP30)
static void SnapshotUTXOHashBreakpoint(const util::SignalInterrupt &interrupt)
static bool ShouldCompactChainstate(bool in_ibd)
static SynchronizationState GetSynchronizationState(bool init, bool blockfiles_indexed)
bool IsBIP30Unspendable(const uint256 &block_hash, int block_height)
Identifies blocks which coinbase output was subsequently overwritten in the UTXO set (see BIP30)
static void LimitValidationInterfaceQueue(ValidationSignals &signals) LOCKS_EXCLUDED(cs_main)
assert(!tx.IsCoinBase())
script_verify_flags GetBlockScriptFlags(const CBlockIndex &block_index, const ChainstateManager &chainman)
constexpr int MAX_SCRIPTCHECK_THREADS
Maximum number of dedicated script-checking threads allowed.
Definition validation.h:90
CAmount GetBlockSubsidy(int nHeight, const Consensus::Params &consensusParams)
bool CheckSequenceLocksAtTip(CBlockIndex *tip, const LockPoints &lock_points)
Check if transaction will be BIP68 final in the next block to be created on top of tip.
bool FatalError(kernel::Notifications &notifications, BlockValidationState &state, const bilingual_str &message)
MempoolAcceptResult AcceptToMemoryPool(Chainstate &active_chainstate, const CTransactionRef &tx, int64_t accept_time, bool bypass_limits, bool test_accept) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Try to add a transaction to the mempool.
bool DeploymentActiveAfter(const CBlockIndex *pindexPrev, const ChainstateManager &chainman, DEP dep)
Deployment* info via ChainstateManager.
SnapshotCompletionResult
Definition validation.h:912
Assumeutxo
Chainstate assumeutxo validity.
Definition validation.h:526
@ VALIDATED
Every block in the chain has been validated.
@ UNVALIDATED
Blocks after an assumeutxo snapshot have been validated but the snapshot itself has not been validate...
@ INVALID
The assumeutxo snapshot failed validation.
SynchronizationState
Current sync state passed to tip changed callbacks.
Definition validation.h:96
constexpr std::array FlushStateModeNames
Definition validation.h:460
bool CheckFinalTxAtTip(const CBlockIndex &active_chain_tip, const CTransaction &tx) EXCLUSIVE_LOCKS_REQUIRED(std::optional< LockPoints > CalculateLockPointsAtTip(CBlockIndex *tip, const CCoinsView &coins_view, const CTransaction &tx)
Check if transaction will be final in the next block to be created.
Definition validation.h:316
constexpr int64_t LargeCoinsCacheThreshold(int64_t total_space) noexcept
Definition validation.h:517
VerifyDBResult
Definition validation.h:425
constexpr script_verify_flags CONSENSUS_SCRIPT_VERIFY_FLAGS
Set of script verify flags that may be enforced at the consensus level (for some combination of chain...
bool CheckBlock(const CBlock &block, BlockValidationState &state, const Consensus::Params &consensusParams, bool fCheckPOW=true, bool fCheckMerkleRoot=true)
Functions for validating blocks and updating the block tree.
CheckInputScriptsFor
The context CheckInputScripts is called in, which decides how a script failure is reported: as a cons...
FlushStateMode
Definition validation.h:461
CoinsCacheSizeState
Definition validation.h:509
@ LARGE
The cache is at >= 90% capacity.
@ CRITICAL
The coins cache is in immediate need of a flush.
constexpr unsigned int MIN_BLOCKS_TO_KEEP
Block files containing a block-height within MIN_BLOCKS_TO_KEEP of ActiveChain().Tip() will not be pr...
Definition validation.h:76
bool DeploymentActiveAt(const CBlockIndex &index, const ChainstateManager &chainman, DEP dep)
bool IsBIP30Repeat(const CBlockIndex &block_index)
Identifies blocks that overwrote an existing coinbase output in the UTXO set (see BIP30)
bool CheckInputScripts(const CTransaction &tx, TxValidationState &state, const CCoinsViewCache &inputs, script_verify_flags flags, CheckInputScriptsFor check_for, bool cacheSigStore, bool cacheFullScriptStore, PrecomputedTransactionData &txdata, ValidationCache &validation_cache, std::vector< CScriptCheck > *pvChecks=nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Check whether all of this transaction's input scripts succeed.
DisconnectResult
Definition validation.h:451
@ DISCONNECT_FAILED
Definition validation.h:454
@ DISCONNECT_UNCLEAN
Definition validation.h:453
@ DISCONNECT_OK
Definition validation.h:452