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