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