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