Line data Source code
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 2 : #include <deploymentstatus.h>
18 2 : #include <logging.h>
19 : #include <policy/feerate.h>
20 : #include <policy/policy.h>
21 : #include <pow.h>
22 : #include <primitives/transaction.h>
23 : #include <timedata.h>
24 : #include <util/moneystr.h>
25 : #include <validation.h>
26 :
27 : #include <algorithm>
28 : #include <utility>
29 :
30 : namespace node {
31 5059 : int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev)
32 : {
33 5059 : int64_t nOldTime = pblock->nTime;
34 5059 : int64_t nNewTime{std::max<int64_t>(pindexPrev->GetMedianTimePast() + 1, TicksSinceEpoch<std::chrono::seconds>(GetAdjustedTime()))};
35 :
36 5059 : if (nOldTime < nNewTime) {
37 0 : pblock->nTime = nNewTime;
38 0 : }
39 :
40 : // Updating time can change work required on testnet:
41 5059 : if (consensusParams.fPowAllowMinDifficultyBlocks) {
42 5059 : pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, consensusParams);
43 5059 : }
44 :
45 5059 : return nNewTime - nOldTime;
46 : }
47 :
48 0 : void RegenerateCommitments(CBlock& block, ChainstateManager& chainman)
49 : {
50 0 : CMutableTransaction tx{*block.vtx.at(0)};
51 0 : tx.vout.erase(tx.vout.begin() + GetWitnessCommitmentIndex(block));
52 0 : block.vtx.at(0) = MakeTransactionRef(tx);
53 :
54 0 : const CBlockIndex* prev_block = WITH_LOCK(::cs_main, return chainman.m_blockman.LookupBlockIndex(block.hashPrevBlock));
55 0 : chainman.GenerateCoinbaseCommitment(block, prev_block);
56 :
57 0 : block.hashMerkleRoot = BlockMerkleRoot(block);
58 0 : }
59 :
60 5059 : static BlockAssembler::Options ClampOptions(BlockAssembler::Options options)
61 : {
62 : // Limit weight to between 4K and DEFAULT_BLOCK_MAX_WEIGHT for sanity:
63 5059 : options.nBlockMaxWeight = std::clamp<size_t>(options.nBlockMaxWeight, 4000, DEFAULT_BLOCK_MAX_WEIGHT);
64 5059 : return options;
65 : }
66 :
67 5059 : BlockAssembler::BlockAssembler(Chainstate& chainstate, const CTxMemPool* mempool, const Options& options)
68 5059 : : chainparams{chainstate.m_chainman.GetParams()},
69 5059 : m_mempool{mempool},
70 5059 : m_chainstate{chainstate},
71 5059 : m_options{ClampOptions(options)}
72 : {
73 5059 : }
74 2 :
75 200 : void ApplyArgsManOptions(const ArgsManager& args, BlockAssembler::Options& options)
76 : {
77 : // Block resource limits
78 200 : options.nBlockMaxWeight = args.GetIntArg("-blockmaxweight", options.nBlockMaxWeight);
79 200 : if (const auto blockmintxfee{args.GetArg("-blockmintxfee")}) {
80 0 : if (const auto parsed{ParseMoney(*blockmintxfee)}) options.blockMinFeeRate = CFeeRate{*parsed};
81 0 : }
82 200 : }
83 0 : static BlockAssembler::Options ConfiguredOptions()
84 : {
85 0 : BlockAssembler::Options options;
86 0 : ApplyArgsManOptions(gArgs, options);
87 0 : return options;
88 : }
89 :
90 0 : BlockAssembler::BlockAssembler(Chainstate& chainstate, const CTxMemPool* mempool)
91 0 : : BlockAssembler(chainstate, mempool, ConfiguredOptions()) {}
92 :
93 5059 : void BlockAssembler::resetBlock()
94 : {
95 5059 : inBlock.clear();
96 :
97 : // Reserve space for coinbase tx
98 5059 : nBlockWeight = 4000;
99 5059 : nBlockSigOpsCost = 400;
100 :
101 : // These counters do not include coinbase tx
102 5059 : nBlockTx = 0;
103 5059 : nFees = 0;
104 5059 : }
105 :
106 5059 : std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& scriptPubKeyIn)
107 : {
108 5059 : const auto time_start{SteadyClock::now()};
109 :
110 5059 : resetBlock();
111 :
112 5059 : pblocktemplate.reset(new CBlockTemplate());
113 :
114 5059 : if (!pblocktemplate.get()) {
115 0 : return nullptr;
116 : }
117 5059 : CBlock* const pblock = &pblocktemplate->block; // pointer for convenience
118 :
119 : // Add dummy coinbase tx as first transaction
120 5059 : pblock->vtx.emplace_back();
121 5059 : pblocktemplate->vTxFees.push_back(-1); // updated at end
122 5059 : pblocktemplate->vTxSigOpsCost.push_back(-1); // updated at end
123 :
124 5059 : LOCK(::cs_main);
125 5059 : CBlockIndex* pindexPrev = m_chainstate.m_chain.Tip();
126 5059 : assert(pindexPrev != nullptr);
127 5059 : nHeight = pindexPrev->nHeight + 1;
128 :
129 5059 : pblock->nVersion = m_chainstate.m_chainman.m_versionbitscache.ComputeBlockVersion(pindexPrev, chainparams.GetConsensus());
130 : // -regtest only: allow overriding block.nVersion with
131 : // -blockversion=N to test forking scenarios
132 5059 : if (chainparams.MineBlocksOnDemand()) {
133 5059 : pblock->nVersion = gArgs.GetIntArg("-blockversion", pblock->nVersion);
134 5059 : }
135 :
136 5059 : pblock->nTime = TicksSinceEpoch<std::chrono::seconds>(GetAdjustedTime());
137 5059 : m_lock_time_cutoff = pindexPrev->GetMedianTimePast();
138 :
139 5059 : int nPackagesSelected = 0;
140 5059 : int nDescendantsUpdated = 0;
141 5059 : if (m_mempool) {
142 5059 : LOCK(m_mempool->cs);
143 5059 : addPackageTxs(*m_mempool, nPackagesSelected, nDescendantsUpdated);
144 5059 : }
145 :
146 5059 : const auto time_1{SteadyClock::now()};
147 :
148 5059 : m_last_block_num_txs = nBlockTx;
149 5059 : m_last_block_weight = nBlockWeight;
150 :
151 : // Create coinbase transaction.
152 5059 : CMutableTransaction coinbaseTx;
153 5059 : coinbaseTx.vin.resize(1);
154 5059 : coinbaseTx.vin[0].prevout.SetNull();
155 5059 : coinbaseTx.vout.resize(1);
156 5059 : coinbaseTx.vout[0].scriptPubKey = scriptPubKeyIn;
157 5059 : coinbaseTx.vout[0].nValue = nFees + GetBlockSubsidy(nHeight, chainparams.GetConsensus());
158 5059 : coinbaseTx.vin[0].scriptSig = CScript() << nHeight << OP_0;
159 5059 : pblock->vtx[0] = MakeTransactionRef(std::move(coinbaseTx));
160 5059 : pblocktemplate->vchCoinbaseCommitment = m_chainstate.m_chainman.GenerateCoinbaseCommitment(*pblock, pindexPrev);
161 5059 : pblocktemplate->vTxFees[0] = -nFees;
162 :
163 5059 : LogPrintf("CreateNewBlock(): block weight: %u txs: %u fees: %ld sigops %d\n", GetBlockWeight(*pblock), nBlockTx, nFees, nBlockSigOpsCost);
164 :
165 : // Fill in header
166 5059 : pblock->hashPrevBlock = pindexPrev->GetBlockHash();
167 5059 : UpdateTime(pblock, chainparams.GetConsensus(), pindexPrev);
168 5059 : pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, chainparams.GetConsensus());
169 5059 : pblock->nNonce = 0;
170 5059 : pblocktemplate->vTxSigOpsCost[0] = WITNESS_SCALE_FACTOR * GetLegacySigOpCount(*pblock->vtx[0]);
171 :
172 5059 : BlockValidationState state;
173 5059 : if (m_options.test_block_validity && !TestBlockValidity(state, chainparams, m_chainstate, *pblock, pindexPrev,
174 5059 : GetAdjustedTime, /*fCheckPOW=*/false, /*fCheckMerkleRoot=*/false)) {
175 0 : throw std::runtime_error(strprintf("%s: TestBlockValidity failed: %s", __func__, state.ToString()));
176 : }
177 5059 : const auto time_2{SteadyClock::now()};
178 :
179 5059 : LogPrint(BCLog::BENCH, "CreateNewBlock() packages: %.2fms (%d packages, %d updated descendants), validity: %.2fms (total %.2fms)\n",
180 : Ticks<MillisecondsDouble>(time_1 - time_start), nPackagesSelected, nDescendantsUpdated,
181 : Ticks<MillisecondsDouble>(time_2 - time_1),
182 : Ticks<MillisecondsDouble>(time_2 - time_start));
183 :
184 5059 : return std::move(pblocktemplate);
185 5059 : }
186 :
187 804 : void BlockAssembler::onlyUnconfirmed(CTxMemPool::setEntries& testSet)
188 : {
189 846 : for (CTxMemPool::setEntries::iterator iit = testSet.begin(); iit != testSet.end(); ) {
190 : // Only test txs not already in the block
191 42 : if (inBlock.count(*iit)) {
192 31 : testSet.erase(iit++);
193 31 : } else {
194 11 : iit++;
195 : }
196 : }
197 804 : }
198 :
199 1858 : bool BlockAssembler::TestPackage(uint64_t packageSize, int64_t packageSigOpsCost) const
200 : {
201 : // TODO: switch to weight-based accounting for packages instead of vsize-based accounting.
202 1858 : if (nBlockWeight + WITNESS_SCALE_FACTOR * packageSize >= m_options.nBlockMaxWeight) {
203 1054 : return false;
204 : }
205 804 : if (nBlockSigOpsCost + packageSigOpsCost >= MAX_BLOCK_SIGOPS_COST) {
206 0 : return false;
207 : }
208 804 : return true;
209 1858 : }
210 :
211 : // Perform transaction-level checks before adding to block:
212 : // - transaction finality (locktime)
213 804 : bool BlockAssembler::TestPackageTransactions(const CTxMemPool::setEntries& package) const
214 : {
215 1619 : for (CTxMemPool::txiter it : package) {
216 815 : if (!IsFinalTx(it->GetTx(), nHeight, m_lock_time_cutoff)) {
217 0 : return false;
218 : }
219 : }
220 804 : return true;
221 804 : }
222 :
223 815 : void BlockAssembler::AddToBlock(CTxMemPool::txiter iter)
224 : {
225 815 : pblocktemplate->block.vtx.emplace_back(iter->GetSharedTx());
226 815 : pblocktemplate->vTxFees.push_back(iter->GetFee());
227 815 : pblocktemplate->vTxSigOpsCost.push_back(iter->GetSigOpCost());
228 815 : nBlockWeight += iter->GetTxWeight();
229 815 : ++nBlockTx;
230 815 : nBlockSigOpsCost += iter->GetSigOpCost();
231 815 : nFees += iter->GetFee();
232 815 : inBlock.insert(iter);
233 :
234 815 : bool fPrintPriority = gArgs.GetBoolArg("-printpriority", DEFAULT_PRINTPRIORITY);
235 815 : if (fPrintPriority) {
236 0 : LogPrintf("fee rate %s txid %s\n",
237 : CFeeRate(iter->GetModifiedFee(), iter->GetTxSize()).ToString(),
238 : iter->GetTx().GetHash().ToString());
239 0 : }
240 815 : }
241 :
242 : /** Add descendants of given transactions to mapModifiedTx with ancestor
243 : * state updated assuming given transactions are inBlock. Returns number
244 : * of updated descendants. */
245 804 : static int UpdatePackagesForAdded(const CTxMemPool& mempool,
246 : const CTxMemPool::setEntries& alreadyAdded,
247 : indexed_modified_transaction_set& mapModifiedTx) EXCLUSIVE_LOCKS_REQUIRED(mempool.cs)
248 : {
249 804 : AssertLockHeld(mempool.cs);
250 :
251 804 : int nDescendantsUpdated = 0;
252 1619 : for (CTxMemPool::txiter it : alreadyAdded) {
253 815 : CTxMemPool::setEntries descendants;
254 815 : mempool.CalculateDescendants(it, descendants);
255 : // Insert all descendants (not yet in block) into the modified set
256 1678 : for (CTxMemPool::txiter desc : descendants) {
257 863 : if (alreadyAdded.count(desc)) {
258 826 : continue;
259 : }
260 37 : ++nDescendantsUpdated;
261 37 : modtxiter mit = mapModifiedTx.find(desc);
262 37 : if (mit == mapModifiedTx.end()) {
263 37 : CTxMemPoolModifiedEntry modEntry(desc);
264 37 : mit = mapModifiedTx.insert(modEntry).first;
265 37 : }
266 37 : mapModifiedTx.modify(mit, update_for_parent_inclusion(it));
267 : }
268 815 : }
269 804 : return nDescendantsUpdated;
270 0 : }
271 :
272 804 : void BlockAssembler::SortForBlock(const CTxMemPool::setEntries& package, std::vector<CTxMemPool::txiter>& sortedEntries)
273 : {
274 : // Sort package by ancestor count
275 : // If a transaction A depends on transaction B, then A's ancestor count
276 : // must be greater than B's. So this is sufficient to validly order the
277 : // transactions for block inclusion.
278 804 : sortedEntries.clear();
279 804 : sortedEntries.insert(sortedEntries.begin(), package.begin(), package.end());
280 804 : std::sort(sortedEntries.begin(), sortedEntries.end(), CompareTxIterByAncestorCount());
281 804 : }
282 :
283 : // This transaction selection algorithm orders the mempool based
284 : // on feerate of a transaction including all unconfirmed ancestors.
285 : // Since we don't remove transactions from the mempool as we select them
286 : // for block inclusion, we need an alternate method of updating the feerate
287 : // of a transaction with its not-yet-selected ancestors as we go.
288 : // This is accomplished by walking the in-mempool descendants of selected
289 : // transactions and storing a temporary modified state in mapModifiedTxs.
290 : // Each time through the loop, we compare the best transaction in
291 : // mapModifiedTxs with the next transaction in the mempool to decide what
292 : // transaction package to work on next.
293 5059 : void BlockAssembler::addPackageTxs(const CTxMemPool& mempool, int& nPackagesSelected, int& nDescendantsUpdated)
294 : {
295 5059 : AssertLockHeld(mempool.cs);
296 :
297 : // mapModifiedTx will store sorted packages after they are modified
298 : // because some of their txs are already in the block
299 5059 : indexed_modified_transaction_set mapModifiedTx;
300 : // Keep track of entries that failed inclusion, to avoid duplicate work
301 5059 : CTxMemPool::setEntries failedTx;
302 :
303 5059 : CTxMemPool::indexed_transaction_set::index<ancestor_score>::type::iterator mi = mempool.mapTx.get<ancestor_score>().begin();
304 5059 : CTxMemPool::txiter iter;
305 :
306 : // Limit the number of attempts to add transactions to the block when it is
307 : // close to full; this is just a simple heuristic to finish quickly if the
308 : // mempool has a lot of entries.
309 5059 : const int64_t MAX_CONSECUTIVE_FAILURES = 1000;
310 5059 : int64_t nConsecutiveFailed = 0;
311 :
312 6965 : while (mi != mempool.mapTx.get<ancestor_score>().end() || !mapModifiedTx.empty()) {
313 : // First try to find a new transaction in mapTx to evaluate.
314 : //
315 : // Skip entries in mapTx that are already in a block or are present
316 : // in mapModifiedTx (which implies that the mapTx ancestor state is
317 : // stale due to ancestor inclusion in the block)
318 : // Also skip transactions that we've already failed to add. This can happen if
319 : // we consider a transaction in mapModifiedTx and it fails: we can then
320 : // potentially consider it again while walking mapTx. It's currently
321 : // guaranteed to fail again, but as a belt-and-suspenders check we put it in
322 : // failedTx and avoid re-evaluation, since the re-evaluation would be using
323 : // cached size/sigops/fee values that are not actually correct.
324 : /** Return true if given transaction from mapTx has already been evaluated,
325 : * or if the transaction's cached data in mapTx is incorrect. */
326 1939 : if (mi != mempool.mapTx.get<ancestor_score>().end()) {
327 1902 : auto it = mempool.mapTx.project<0>(mi);
328 1902 : assert(it != mempool.mapTx.end());
329 1902 : if (mapModifiedTx.count(it) || inBlock.count(it) || failedTx.count(it)) {
330 48 : ++mi;
331 48 : continue;
332 : }
333 1854 : }
334 :
335 : // Now that mi is not stale, determine which transaction to evaluate:
336 : // the next entry from mapTx, or the best from mapModifiedTx?
337 1891 : bool fUsingModified = false;
338 :
339 1891 : modtxscoreiter modit = mapModifiedTx.get<ancestor_score>().begin();
340 1891 : if (mi == mempool.mapTx.get<ancestor_score>().end()) {
341 : // We're out of entries in mapTx; use the entry from mapModifiedTx
342 37 : iter = modit->iter;
343 37 : fUsingModified = true;
344 37 : } else {
345 : // Try to compare the mapTx entry to the mapModifiedTx entry
346 1854 : iter = mempool.mapTx.project<0>(mi);
347 1855 : if (modit != mapModifiedTx.get<ancestor_score>().end() &&
348 1 : CompareTxMemPoolEntryByAncestorFee()(*modit, CTxMemPoolModifiedEntry(iter))) {
349 : // The best entry in mapModifiedTx has higher score
350 : // than the one from mapTx.
351 : // Switch which transaction (package) to consider
352 0 : iter = modit->iter;
353 0 : fUsingModified = true;
354 0 : } else {
355 : // Either no entry in mapModifiedTx, or it's worse than mapTx.
356 : // Increment mi for the next loop iteration.
357 1854 : ++mi;
358 : }
359 : }
360 :
361 : // We skip mapTx entries that are inBlock, and mapModifiedTx shouldn't
362 : // contain anything that is inBlock.
363 1891 : assert(!inBlock.count(iter));
364 :
365 1891 : uint64_t packageSize = iter->GetSizeWithAncestors();
366 1891 : CAmount packageFees = iter->GetModFeesWithAncestors();
367 1891 : int64_t packageSigOpsCost = iter->GetSigOpCostWithAncestors();
368 1891 : if (fUsingModified) {
369 37 : packageSize = modit->nSizeWithAncestors;
370 37 : packageFees = modit->nModFeesWithAncestors;
371 37 : packageSigOpsCost = modit->nSigOpCostWithAncestors;
372 37 : }
373 :
374 1891 : if (packageFees < m_options.blockMinFeeRate.GetFee(packageSize)) {
375 : // Everything else we might consider has a lower fee rate
376 33 : return;
377 : }
378 :
379 1858 : if (!TestPackage(packageSize, packageSigOpsCost)) {
380 1054 : if (fUsingModified) {
381 : // Since we always look at the best entry in mapModifiedTx,
382 : // we must erase failed entries so that we can consider the
383 : // next best entry on the next loop iteration
384 0 : mapModifiedTx.get<ancestor_score>().erase(modit);
385 0 : failedTx.insert(iter);
386 0 : }
387 :
388 1054 : ++nConsecutiveFailed;
389 :
390 1054 : if (nConsecutiveFailed > MAX_CONSECUTIVE_FAILURES && nBlockWeight >
391 0 : m_options.nBlockMaxWeight - 4000) {
392 : // Give up if we're close to full and haven't succeeded in a while
393 0 : break;
394 : }
395 1054 : continue;
396 : }
397 :
398 804 : auto ancestors{mempool.AssumeCalculateMemPoolAncestors(__func__, *iter, CTxMemPool::Limits::NoLimits(), /*fSearchForParents=*/false)};
399 :
400 804 : onlyUnconfirmed(ancestors);
401 804 : ancestors.insert(iter);
402 :
403 : // Test if all tx's are Final
404 804 : if (!TestPackageTransactions(ancestors)) {
405 0 : if (fUsingModified) {
406 0 : mapModifiedTx.get<ancestor_score>().erase(modit);
407 0 : failedTx.insert(iter);
408 0 : }
409 0 : continue;
410 : }
411 :
412 : // This transaction will make it in; reset the failed counter.
413 804 : nConsecutiveFailed = 0;
414 :
415 : // Package can be added. Sort the entries in a valid order.
416 804 : std::vector<CTxMemPool::txiter> sortedEntries;
417 804 : SortForBlock(ancestors, sortedEntries);
418 :
419 1619 : for (size_t i = 0; i < sortedEntries.size(); ++i) {
420 815 : AddToBlock(sortedEntries[i]);
421 : // Erase from the modified set, if present
422 815 : mapModifiedTx.erase(sortedEntries[i]);
423 815 : }
424 :
425 804 : ++nPackagesSelected;
426 :
427 : // Update transactions that depend on each of these
428 804 : nDescendantsUpdated += UpdatePackagesForAdded(mempool, ancestors, mapModifiedTx);
429 804 : }
430 5059 : }
431 : } // namespace node
|