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