Bitcoin Core  29.1.0
P2P Digital Currency
miner.cpp
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2022 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 <node/miner.h>
7 
8 #include <chain.h>
9 #include <chainparams.h>
10 #include <coins.h>
11 #include <common/args.h>
12 #include <consensus/amount.h>
13 #include <consensus/consensus.h>
14 #include <consensus/merkle.h>
15 #include <consensus/tx_verify.h>
16 #include <consensus/validation.h>
17 #include <deploymentstatus.h>
18 #include <logging.h>
19 #include <policy/feerate.h>
20 #include <policy/policy.h>
21 #include <pow.h>
22 #include <primitives/transaction.h>
23 #include <util/moneystr.h>
24 #include <util/time.h>
25 #include <validation.h>
26 
27 #include <algorithm>
28 #include <utility>
29 
30 namespace node {
31 
32 int64_t GetMinimumTime(const CBlockIndex* pindexPrev, const int64_t difficulty_adjustment_interval)
33 {
34  int64_t min_time{pindexPrev->GetMedianTimePast() + 1};
35  // Height of block to be mined.
36  const int height{pindexPrev->nHeight + 1};
37  // Account for BIP94 timewarp rule on all networks. This makes future
38  // activation safer.
39  if (height % difficulty_adjustment_interval == 0) {
40  min_time = std::max<int64_t>(min_time, pindexPrev->GetBlockTime() - MAX_TIMEWARP);
41  }
42  return min_time;
43 }
44 
45 int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev)
46 {
47  int64_t nOldTime = pblock->nTime;
48  int64_t nNewTime{std::max<int64_t>(GetMinimumTime(pindexPrev, consensusParams.DifficultyAdjustmentInterval()),
49  TicksSinceEpoch<std::chrono::seconds>(NodeClock::now()))};
50 
51  if (nOldTime < nNewTime) {
52  pblock->nTime = nNewTime;
53  }
54 
55  // Updating time can change work required on testnet:
56  if (consensusParams.fPowAllowMinDifficultyBlocks) {
57  pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, consensusParams);
58  }
59 
60  return nNewTime - nOldTime;
61 }
62 
64 {
65  CMutableTransaction tx{*block.vtx.at(0)};
66  tx.vout.erase(tx.vout.begin() + GetWitnessCommitmentIndex(block));
67  block.vtx.at(0) = MakeTransactionRef(tx);
68 
69  const CBlockIndex* prev_block = WITH_LOCK(::cs_main, return chainman.m_blockman.LookupBlockIndex(block.hashPrevBlock));
70  chainman.GenerateCoinbaseCommitment(block, prev_block);
71 
72  block.hashMerkleRoot = BlockMerkleRoot(block);
73 }
74 
76 {
80  // Limit weight to between block_reserved_weight and MAX_BLOCK_WEIGHT for sanity:
81  // block_reserved_weight can safely exceed -blockmaxweight, but the rest of the block template will be empty.
82  options.nBlockMaxWeight = std::clamp<size_t>(options.nBlockMaxWeight, options.block_reserved_weight, MAX_BLOCK_WEIGHT);
83  return options;
84 }
85 
86 BlockAssembler::BlockAssembler(Chainstate& chainstate, const CTxMemPool* mempool, const Options& options)
87  : chainparams{chainstate.m_chainman.GetParams()},
88  m_mempool{options.use_mempool ? mempool : nullptr},
89  m_chainstate{chainstate},
90  m_options{ClampOptions(options)}
91 {
92 }
93 
95 {
96  // Block resource limits
97  options.nBlockMaxWeight = args.GetIntArg("-blockmaxweight", options.nBlockMaxWeight);
98  if (const auto blockmintxfee{args.GetArg("-blockmintxfee")}) {
99  if (const auto parsed{ParseMoney(*blockmintxfee)}) options.blockMinFeeRate = CFeeRate{*parsed};
100  }
101  options.print_modified_fee = args.GetBoolArg("-printpriority", options.print_modified_fee);
102  options.block_reserved_weight = args.GetIntArg("-blockreservedweight", options.block_reserved_weight);
103 }
104 
105 void BlockAssembler::resetBlock()
106 {
107  inBlock.clear();
108 
109  // Reserve space for fixed-size block header, txs count, and coinbase tx.
110  nBlockWeight = m_options.block_reserved_weight;
111  nBlockSigOpsCost = m_options.coinbase_output_max_additional_sigops;
112 
113  // These counters do not include coinbase tx
114  nBlockTx = 0;
115  nFees = 0;
116 }
117 
118 std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock()
119 {
120  const auto time_start{SteadyClock::now()};
121 
122  resetBlock();
123 
124  pblocktemplate.reset(new CBlockTemplate());
125  CBlock* const pblock = &pblocktemplate->block; // pointer for convenience
126 
127  // Add dummy coinbase tx as first transaction
128  pblock->vtx.emplace_back();
129  pblocktemplate->vTxFees.push_back(-1); // updated at end
130  pblocktemplate->vTxSigOpsCost.push_back(-1); // updated at end
131 
132  LOCK(::cs_main);
133  CBlockIndex* pindexPrev = m_chainstate.m_chain.Tip();
134  assert(pindexPrev != nullptr);
135  nHeight = pindexPrev->nHeight + 1;
136 
137  pblock->nVersion = m_chainstate.m_chainman.m_versionbitscache.ComputeBlockVersion(pindexPrev, chainparams.GetConsensus());
138  // -regtest only: allow overriding block.nVersion with
139  // -blockversion=N to test forking scenarios
140  if (chainparams.MineBlocksOnDemand()) {
141  pblock->nVersion = gArgs.GetIntArg("-blockversion", pblock->nVersion);
142  }
143 
144  pblock->nTime = TicksSinceEpoch<std::chrono::seconds>(NodeClock::now());
145  m_lock_time_cutoff = pindexPrev->GetMedianTimePast();
146 
147  int nPackagesSelected = 0;
148  int nDescendantsUpdated = 0;
149  if (m_mempool) {
150  addPackageTxs(nPackagesSelected, nDescendantsUpdated);
151  }
152 
153  const auto time_1{SteadyClock::now()};
154 
155  m_last_block_num_txs = nBlockTx;
156  m_last_block_weight = nBlockWeight;
157 
158  // Create coinbase transaction.
159  CMutableTransaction coinbaseTx;
160  coinbaseTx.vin.resize(1);
161  coinbaseTx.vin[0].prevout.SetNull();
162  coinbaseTx.vout.resize(1);
163  coinbaseTx.vout[0].scriptPubKey = m_options.coinbase_output_script;
164  coinbaseTx.vout[0].nValue = nFees + GetBlockSubsidy(nHeight, chainparams.GetConsensus());
165  coinbaseTx.vin[0].scriptSig = CScript() << nHeight << OP_0;
166  pblock->vtx[0] = MakeTransactionRef(std::move(coinbaseTx));
167  pblocktemplate->vchCoinbaseCommitment = m_chainstate.m_chainman.GenerateCoinbaseCommitment(*pblock, pindexPrev);
168  pblocktemplate->vTxFees[0] = -nFees;
169 
170  LogPrintf("CreateNewBlock(): block weight: %u txs: %u fees: %ld sigops %d\n", GetBlockWeight(*pblock), nBlockTx, nFees, nBlockSigOpsCost);
171 
172  // Fill in header
173  pblock->hashPrevBlock = pindexPrev->GetBlockHash();
174  UpdateTime(pblock, chainparams.GetConsensus(), pindexPrev);
175  pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, chainparams.GetConsensus());
176  pblock->nNonce = 0;
177  pblocktemplate->vTxSigOpsCost[0] = WITNESS_SCALE_FACTOR * GetLegacySigOpCount(*pblock->vtx[0]);
178 
179  BlockValidationState state;
180  if (m_options.test_block_validity && !TestBlockValidity(state, chainparams, m_chainstate, *pblock, pindexPrev,
181  /*fCheckPOW=*/false, /*fCheckMerkleRoot=*/false)) {
182  throw std::runtime_error(strprintf("%s: TestBlockValidity failed: %s", __func__, state.ToString()));
183  }
184  const auto time_2{SteadyClock::now()};
185 
186  LogDebug(BCLog::BENCH, "CreateNewBlock() packages: %.2fms (%d packages, %d updated descendants), validity: %.2fms (total %.2fms)\n",
187  Ticks<MillisecondsDouble>(time_1 - time_start), nPackagesSelected, nDescendantsUpdated,
188  Ticks<MillisecondsDouble>(time_2 - time_1),
189  Ticks<MillisecondsDouble>(time_2 - time_start));
190 
191  return std::move(pblocktemplate);
192 }
193 
194 void BlockAssembler::onlyUnconfirmed(CTxMemPool::setEntries& testSet)
195 {
196  for (CTxMemPool::setEntries::iterator iit = testSet.begin(); iit != testSet.end(); ) {
197  // Only test txs not already in the block
198  if (inBlock.count((*iit)->GetSharedTx()->GetHash())) {
199  testSet.erase(iit++);
200  } else {
201  iit++;
202  }
203  }
204 }
205 
206 bool BlockAssembler::TestPackage(uint64_t packageSize, int64_t packageSigOpsCost) const
207 {
208  // TODO: switch to weight-based accounting for packages instead of vsize-based accounting.
209  if (nBlockWeight + WITNESS_SCALE_FACTOR * packageSize >= m_options.nBlockMaxWeight) {
210  return false;
211  }
212  if (nBlockSigOpsCost + packageSigOpsCost >= MAX_BLOCK_SIGOPS_COST) {
213  return false;
214  }
215  return true;
216 }
217 
218 // Perform transaction-level checks before adding to block:
219 // - transaction finality (locktime)
220 bool BlockAssembler::TestPackageTransactions(const CTxMemPool::setEntries& package) const
221 {
222  for (CTxMemPool::txiter it : package) {
223  if (!IsFinalTx(it->GetTx(), nHeight, m_lock_time_cutoff)) {
224  return false;
225  }
226  }
227  return true;
228 }
229 
230 void BlockAssembler::AddToBlock(CTxMemPool::txiter iter)
231 {
232  pblocktemplate->block.vtx.emplace_back(iter->GetSharedTx());
233  pblocktemplate->vTxFees.push_back(iter->GetFee());
234  pblocktemplate->vTxSigOpsCost.push_back(iter->GetSigOpCost());
235  nBlockWeight += iter->GetTxWeight();
236  ++nBlockTx;
237  nBlockSigOpsCost += iter->GetSigOpCost();
238  nFees += iter->GetFee();
239  inBlock.insert(iter->GetSharedTx()->GetHash());
240 
241  if (m_options.print_modified_fee) {
242  LogPrintf("fee rate %s txid %s\n",
243  CFeeRate(iter->GetModifiedFee(), iter->GetTxSize()).ToString(),
244  iter->GetTx().GetHash().ToString());
245  }
246 }
247 
251 static int UpdatePackagesForAdded(const CTxMemPool& mempool,
252  const CTxMemPool::setEntries& alreadyAdded,
254 {
255  AssertLockHeld(mempool.cs);
256 
257  int nDescendantsUpdated = 0;
258  for (CTxMemPool::txiter it : alreadyAdded) {
259  CTxMemPool::setEntries descendants;
260  mempool.CalculateDescendants(it, descendants);
261  // Insert all descendants (not yet in block) into the modified set
262  for (CTxMemPool::txiter desc : descendants) {
263  if (alreadyAdded.count(desc)) {
264  continue;
265  }
266  ++nDescendantsUpdated;
267  modtxiter mit = mapModifiedTx.find(desc);
268  if (mit == mapModifiedTx.end()) {
269  CTxMemPoolModifiedEntry modEntry(desc);
270  mit = mapModifiedTx.insert(modEntry).first;
271  }
272  mapModifiedTx.modify(mit, update_for_parent_inclusion(it));
273  }
274  }
275  return nDescendantsUpdated;
276 }
277 
278 void BlockAssembler::SortForBlock(const CTxMemPool::setEntries& package, std::vector<CTxMemPool::txiter>& sortedEntries)
279 {
280  // Sort package by ancestor count
281  // If a transaction A depends on transaction B, then A's ancestor count
282  // must be greater than B's. So this is sufficient to validly order the
283  // transactions for block inclusion.
284  sortedEntries.clear();
285  sortedEntries.insert(sortedEntries.begin(), package.begin(), package.end());
286  std::sort(sortedEntries.begin(), sortedEntries.end(), CompareTxIterByAncestorCount());
287 }
288 
289 // This transaction selection algorithm orders the mempool based
290 // on feerate of a transaction including all unconfirmed ancestors.
291 // Since we don't remove transactions from the mempool as we select them
292 // for block inclusion, we need an alternate method of updating the feerate
293 // of a transaction with its not-yet-selected ancestors as we go.
294 // This is accomplished by walking the in-mempool descendants of selected
295 // transactions and storing a temporary modified state in mapModifiedTxs.
296 // Each time through the loop, we compare the best transaction in
297 // mapModifiedTxs with the next transaction in the mempool to decide what
298 // transaction package to work on next.
299 void BlockAssembler::addPackageTxs(int& nPackagesSelected, int& nDescendantsUpdated)
300 {
301  const auto& mempool{*Assert(m_mempool)};
302  LOCK(mempool.cs);
303 
304  // mapModifiedTx will store sorted packages after they are modified
305  // because some of their txs are already in the block
306  indexed_modified_transaction_set mapModifiedTx;
307  // Keep track of entries that failed inclusion, to avoid duplicate work
308  std::set<Txid> failedTx;
309 
310  CTxMemPool::indexed_transaction_set::index<ancestor_score>::type::iterator mi = mempool.mapTx.get<ancestor_score>().begin();
311  CTxMemPool::txiter iter;
312 
313  // Limit the number of attempts to add transactions to the block when it is
314  // close to full; this is just a simple heuristic to finish quickly if the
315  // mempool has a lot of entries.
316  const int64_t MAX_CONSECUTIVE_FAILURES = 1000;
317  int64_t nConsecutiveFailed = 0;
318 
319  while (mi != mempool.mapTx.get<ancestor_score>().end() || !mapModifiedTx.empty()) {
320  // First try to find a new transaction in mapTx to evaluate.
321  //
322  // Skip entries in mapTx that are already in a block or are present
323  // in mapModifiedTx (which implies that the mapTx ancestor state is
324  // stale due to ancestor inclusion in the block)
325  // Also skip transactions that we've already failed to add. This can happen if
326  // we consider a transaction in mapModifiedTx and it fails: we can then
327  // potentially consider it again while walking mapTx. It's currently
328  // guaranteed to fail again, but as a belt-and-suspenders check we put it in
329  // failedTx and avoid re-evaluation, since the re-evaluation would be using
330  // cached size/sigops/fee values that are not actually correct.
333  if (mi != mempool.mapTx.get<ancestor_score>().end()) {
334  auto it = mempool.mapTx.project<0>(mi);
335  assert(it != mempool.mapTx.end());
336  if (mapModifiedTx.count(it) || inBlock.count(it->GetSharedTx()->GetHash()) || failedTx.count(it->GetSharedTx()->GetHash())) {
337  ++mi;
338  continue;
339  }
340  }
341 
342  // Now that mi is not stale, determine which transaction to evaluate:
343  // the next entry from mapTx, or the best from mapModifiedTx?
344  bool fUsingModified = false;
345 
346  modtxscoreiter modit = mapModifiedTx.get<ancestor_score>().begin();
347  if (mi == mempool.mapTx.get<ancestor_score>().end()) {
348  // We're out of entries in mapTx; use the entry from mapModifiedTx
349  iter = modit->iter;
350  fUsingModified = true;
351  } else {
352  // Try to compare the mapTx entry to the mapModifiedTx entry
353  iter = mempool.mapTx.project<0>(mi);
354  if (modit != mapModifiedTx.get<ancestor_score>().end() &&
356  // The best entry in mapModifiedTx has higher score
357  // than the one from mapTx.
358  // Switch which transaction (package) to consider
359  iter = modit->iter;
360  fUsingModified = true;
361  } else {
362  // Either no entry in mapModifiedTx, or it's worse than mapTx.
363  // Increment mi for the next loop iteration.
364  ++mi;
365  }
366  }
367 
368  // We skip mapTx entries that are inBlock, and mapModifiedTx shouldn't
369  // contain anything that is inBlock.
370  assert(!inBlock.count(iter->GetSharedTx()->GetHash()));
371 
372  uint64_t packageSize = iter->GetSizeWithAncestors();
373  CAmount packageFees = iter->GetModFeesWithAncestors();
374  int64_t packageSigOpsCost = iter->GetSigOpCostWithAncestors();
375  if (fUsingModified) {
376  packageSize = modit->nSizeWithAncestors;
377  packageFees = modit->nModFeesWithAncestors;
378  packageSigOpsCost = modit->nSigOpCostWithAncestors;
379  }
380 
381  if (packageFees < m_options.blockMinFeeRate.GetFee(packageSize)) {
382  // Everything else we might consider has a lower fee rate
383  return;
384  }
385 
386  if (!TestPackage(packageSize, packageSigOpsCost)) {
387  if (fUsingModified) {
388  // Since we always look at the best entry in mapModifiedTx,
389  // we must erase failed entries so that we can consider the
390  // next best entry on the next loop iteration
391  mapModifiedTx.get<ancestor_score>().erase(modit);
392  failedTx.insert(iter->GetSharedTx()->GetHash());
393  }
394 
395  ++nConsecutiveFailed;
396 
397  if (nConsecutiveFailed > MAX_CONSECUTIVE_FAILURES && nBlockWeight >
398  m_options.nBlockMaxWeight - m_options.block_reserved_weight) {
399  // Give up if we're close to full and haven't succeeded in a while
400  break;
401  }
402  continue;
403  }
404 
405  auto ancestors{mempool.AssumeCalculateMemPoolAncestors(__func__, *iter, CTxMemPool::Limits::NoLimits(), /*fSearchForParents=*/false)};
406 
407  onlyUnconfirmed(ancestors);
408  ancestors.insert(iter);
409 
410  // Test if all tx's are Final
411  if (!TestPackageTransactions(ancestors)) {
412  if (fUsingModified) {
413  mapModifiedTx.get<ancestor_score>().erase(modit);
414  failedTx.insert(iter->GetSharedTx()->GetHash());
415  }
416  continue;
417  }
418 
419  // This transaction will make it in; reset the failed counter.
420  nConsecutiveFailed = 0;
421 
422  // Package can be added. Sort the entries in a valid order.
423  std::vector<CTxMemPool::txiter> sortedEntries;
424  SortForBlock(ancestors, sortedEntries);
425 
426  for (size_t i = 0; i < sortedEntries.size(); ++i) {
427  AddToBlock(sortedEntries[i]);
428  // Erase from the modified set, if present
429  mapModifiedTx.erase(sortedEntries[i]);
430  }
431 
432  ++nPackagesSelected;
433  pblocktemplate->m_package_feerates.emplace_back(packageFees, static_cast<int32_t>(packageSize));
434 
435  // Update transactions that depend on each of these
436  nDescendantsUpdated += UpdatePackagesForAdded(mempool, ancestors, mapModifiedTx);
437  }
438 }
439 } // namespace node
uint32_t nNonce
Definition: block.h:30
node::BlockManager m_blockman
A single BlockManager instance is shared across each constructed chainstate to avoid duplicating bloc...
Definition: validation.h:1007
static BlockAssembler::Options ClampOptions(BlockAssembler::Options options)
Definition: miner.cpp:75
indexed_modified_transaction_set::index< ancestor_score >::type::iterator modtxscoreiter
Definition: miner.h:126
AssertLockHeld(pool.cs)
CAmount GetBlockSubsidy(int nHeight, const Consensus::Params &consensusParams)
static const int WITNESS_SCALE_FACTOR
Definition: consensus.h:21
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())
Definition: block.h:68
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
Definition: validation.h:865
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
Definition: tinyformat.h:1172
std::vector< CTxIn > vin
Definition: transaction.h:379
bool fPowAllowMinDifficultyBlocks
Definition: params.h:110
std::set< txiter, CompareIteratorByHash > setEntries
Definition: txmempool.h:396
size_t coinbase_output_max_additional_sigops
The maximum additional sigops which the pool will add in coinbase transaction outputs.
Definition: types.h:46
bool GetBoolArg(const std::string &strArg, bool fDefault) const
Return boolean argument or default value.
Definition: args.cpp:507
Definition: script.h:76
util::Result< void > ApplyArgsManOptions(const ArgsManager &args, BlockManager::Options &opts)
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 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) ...
int64_t UpdateTime(CBlockHeader *pblock, const Consensus::Params &consensusParams, const CBlockIndex *pindexPrev)
Definition: miner.cpp:45
Definition: miner.h:50
uint32_t nTime
Definition: block.h:28
static const unsigned int MAX_BLOCK_WEIGHT
The maximum allowed weight for a block, see BIP 141 (network rule)
Definition: consensus.h:15
int64_t CAmount
Amount in satoshis (Can be negative)
Definition: amount.h:12
uint256 GetBlockHash() const
Definition: chain.h:243
ChainstateManager & m_chainman
The chainstate manager that owns this chainstate.
Definition: validation.h:545
ArgsManager & args
Definition: bitcoind.cpp:277
Chainstate stores and provides an API to update our local knowledge of the current best chain...
Definition: validation.h:504
Definition: txmempool.h:163
boost::multi_index_container< CTxMemPoolModifiedEntry, CTxMemPoolModifiedEntry_Indices > indexed_modified_transaction_set
Definition: miner.h:123
uint256 hashMerkleRoot
Definition: block.h:27
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...
#define LOCK(cs)
Definition: sync.h:257
unsigned int GetNextWorkRequired(const CBlockIndex *pindexLast, const CBlockHeader *pblock, const Consensus::Params &params)
Definition: pow.cpp:14
std::string ToString() const
Definition: validation.h:112
uint256 hashPrevBlock
Definition: block.h:26
std::optional< CAmount > ParseMoney(const std::string &money_string)
Parse an amount denoted in full coins.
Definition: moneystr.cpp:45
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
Definition: merkle.cpp:66
int64_t GetMinimumTime(const CBlockIndex *pindexPrev, const int64_t difficulty_adjustment_interval)
Get the minimum time a miner should use in the next block.
Definition: miner.cpp:32
Parameters that influence chain consensus.
Definition: params.h:74
CBlockIndex * LookupBlockIndex(const uint256 &hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
std::vector< CTxOut > vout
Definition: transaction.h:380
size_t block_reserved_weight
The default reserved weight for the fixed-size block header, transaction count and coinbase transacti...
Definition: types.h:41
unsigned int nHeight
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
Definition: sync.h:301
int64_t GetMedianTimePast() const
Definition: chain.h:278
static CTransactionRef MakeTransactionRef(Tx &&txIn)
Definition: transaction.h:424
int64_t DifficultyAdjustmentInterval() const
Definition: params.h:123
Definition: messages.h:20
ArgsManager gArgs
Definition: args.cpp:42
const CChainParams & GetParams() const
Definition: validation.h:976
static time_point now() noexcept
Return current system time or mocked time, if set.
Definition: time.cpp:26
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:49
std::vector< CTransactionRef > vtx
Definition: block.h:72
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:381
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
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:414
BlockAssembler(Chainstate &chainstate, const CTxMemPool *mempool, const Options &options)
Definition: miner.cpp:86
int64_t GetIntArg(const std::string &strArg, int64_t nDefault) const
Return integer argument or default value.
Definition: args.cpp:482
std::string GetArg(const std::string &strArg, const std::string &strDefault) const
Return string argument or default value.
Definition: args.cpp:457
indexed_modified_transaction_set::nth_index< 0 >::type::iterator modtxiter
Definition: miner.h:125
Fee rate in satoshis per kilovirtualbyte: CAmount / kvB.
Definition: feerate.h:32
A mutable version of CTransaction.
Definition: transaction.h:377
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
static constexpr MemPoolLimits NoLimits()
int nHeight
height of the entry in the chain. The genesis block has height 0
Definition: chain.h:153
static int UpdatePackagesForAdded(const CTxMemPool &mempool, const CTxMemPool::setEntries &alreadyAdded, indexed_modified_transaction_set &mapModifiedTx) EXCLUSIVE_LOCKS_REQUIRED(mempool.cs)
Add descendants of given transactions to mapModifiedTx with ancestor state updated assuming given tra...
Definition: miner.cpp:251
int GetWitnessCommitmentIndex(const CBlock &block)
Compute at which vout of the block&#39;s coinbase transaction the witness commitment occurs, or -1 if not found.
Definition: validation.h:148
#define LogPrintf(...)
Definition: logging.h:361
static int64_t GetBlockWeight(const CBlock &block)
Definition: validation.h:137
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate...
Definition: cs_main.cpp:8
int32_t nVersion
Definition: block.h:25
void RegenerateCommitments(CBlock &block, ChainstateManager &chainman)
Update an old GenerateCoinbaseCommitment from CreateNewBlock after the block txs have changed...
Definition: miner.cpp:63
static constexpr unsigned int MINIMUM_BLOCK_RESERVED_WEIGHT
This accounts for the block header, var_int encoding of the transaction count and a minimally viable ...
Definition: policy.h:30
Nodes collect new transactions into a block, hash them into a hash tree, and scan through nonce value...
Definition: block.h:21
std::string ToString(const T &t)
Locale-independent version of std::to_string.
Definition: string.h:233
#define Assert(val)
Identity function.
Definition: check.h:85
uint32_t nBits
Definition: block.h:29
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