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