Branch data 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 : : #ifndef BITCOIN_NODE_MINER_H
7 : : #define BITCOIN_NODE_MINER_H
8 : :
9 : : #include <node/types.h>
10 : : #include <policy/policy.h>
11 : : #include <primitives/block.h>
12 : : #include <txmempool.h>
13 : : #include <util/feefrac.h>
14 : :
15 : : #include <memory>
16 : : #include <optional>
17 : : #include <stdint.h>
18 : :
19 : : #include <boost/multi_index/identity.hpp>
20 : : #include <boost/multi_index/indexed_by.hpp>
21 : : #include <boost/multi_index/ordered_index.hpp>
22 : : #include <boost/multi_index/tag.hpp>
23 : : #include <boost/multi_index_container.hpp>
24 : :
25 : : class ArgsManager;
26 : : class CBlockIndex;
27 : : class CChainParams;
28 : : class CScript;
29 : : class Chainstate;
30 : : class ChainstateManager;
31 : :
32 : : namespace Consensus { struct Params; };
33 : :
34 : : namespace node {
35 : : static const bool DEFAULT_PRINT_MODIFIED_FEE = false;
36 : :
37 : : struct CBlockTemplate
38 : : {
39 : : CBlock block;
40 : : // Fees per transaction, not including coinbase transaction (unlike CBlock::vtx).
41 : : std::vector<CAmount> vTxFees;
42 : : // Sigops per transaction, not including coinbase transaction (unlike CBlock::vtx).
43 : : std::vector<int64_t> vTxSigOpsCost;
44 : : std::vector<unsigned char> vchCoinbaseCommitment;
45 : : /* A vector of package fee rates, ordered by the sequence in which
46 : : * packages are selected for inclusion in the block template.*/
47 : : std::vector<FeeFrac> m_package_feerates;
48 : : };
49 : :
50 : : // Container for tracking updates to ancestor feerate as we include (parent)
51 : : // transactions in a block
52 : : struct CTxMemPoolModifiedEntry {
53 : 2785 : explicit CTxMemPoolModifiedEntry(CTxMemPool::txiter entry)
54 [ + - + - ]: 2785 : {
55 : 2785 : iter = entry;
56 [ + - + - ]: 2785 : nSizeWithAncestors = entry->GetSizeWithAncestors();
57 [ + - + - ]: 2785 : nModFeesWithAncestors = entry->GetModFeesWithAncestors();
58 [ + - + - ]: 2785 : nSigOpCostWithAncestors = entry->GetSigOpCostWithAncestors();
59 : : }
60 : :
61 : 2056323 : CAmount GetModifiedFee() const { return iter->GetModifiedFee(); }
62 : 413 : uint64_t GetSizeWithAncestors() const { return nSizeWithAncestors; }
63 : 1028781 : CAmount GetModFeesWithAncestors() const { return nModFeesWithAncestors; }
64 [ + + ]: 1028368 : size_t GetTxSize() const { return iter->GetTxSize(); }
65 : 511679 : const CTransaction& GetTx() const { return iter->GetTx(); }
66 : :
67 : : CTxMemPool::txiter iter;
68 : : uint64_t nSizeWithAncestors;
69 : : CAmount nModFeesWithAncestors;
70 : : int64_t nSigOpCostWithAncestors;
71 : : };
72 : :
73 : : /** Comparator for CTxMemPool::txiter objects.
74 : : * It simply compares the internal memory address of the CTxMemPoolEntry object
75 : : * pointed to. This means it has no meaning, and is only useful for using them
76 : : * as key in other indexes.
77 : : */
78 : : struct CompareCTxMemPoolIter {
79 : 3037101 : bool operator()(const CTxMemPool::txiter& a, const CTxMemPool::txiter& b) const
80 : : {
81 : 3037101 : return &(*a) < &(*b);
82 : : }
83 : : };
84 : :
85 : : struct modifiedentry_iter {
86 : : typedef CTxMemPool::txiter result_type;
87 : 3038919 : result_type operator() (const CTxMemPoolModifiedEntry &entry) const
88 : : {
89 [ + - - + : 3021261 : return entry.iter;
+ + + - +
- + - + +
+ + + + +
+ ]
90 : : }
91 : : };
92 : :
93 : : // A comparator that sorts transactions based on number of ancestors.
94 : : // This is sufficient to sort an ancestor package in an order that is valid
95 : : // to appear in a block.
96 : : struct CompareTxIterByAncestorCount {
97 : 24587 : bool operator()(const CTxMemPool::txiter& a, const CTxMemPool::txiter& b) const
98 : : {
99 [ + + ]: 24587 : if (a->GetCountWithAncestors() != b->GetCountWithAncestors()) {
100 : 24512 : return a->GetCountWithAncestors() < b->GetCountWithAncestors();
101 : : }
102 : 75 : return CompareIteratorByHash()(a, b);
103 : : }
104 : : };
105 : :
106 : :
107 : : struct CTxMemPoolModifiedEntry_Indices final : boost::multi_index::indexed_by<
108 : : boost::multi_index::ordered_unique<
109 : : modifiedentry_iter,
110 : : CompareCTxMemPoolIter
111 : : >,
112 : : // sorted by modified ancestor fee rate
113 : : boost::multi_index::ordered_non_unique<
114 : : // Reuse same tag from CTxMemPool's similar index
115 : : boost::multi_index::tag<ancestor_score>,
116 : : boost::multi_index::identity<CTxMemPoolModifiedEntry>,
117 : : CompareTxMemPoolEntryByAncestorFee
118 : : >
119 : : >
120 : : {};
121 : :
122 : : typedef boost::multi_index_container<
123 : : CTxMemPoolModifiedEntry,
124 : : CTxMemPoolModifiedEntry_Indices
125 : : > indexed_modified_transaction_set;
126 : :
127 : : typedef indexed_modified_transaction_set::nth_index<0>::type::iterator modtxiter;
128 : : typedef indexed_modified_transaction_set::index<ancestor_score>::type::iterator modtxscoreiter;
129 : :
130 : : struct update_for_parent_inclusion
131 : : {
132 [ + - ]: 251740 : explicit update_for_parent_inclusion(CTxMemPool::txiter it) : iter(it) {}
133 : :
134 : 251740 : void operator() (CTxMemPoolModifiedEntry &e)
135 : : {
136 : 251740 : e.nModFeesWithAncestors -= iter->GetModifiedFee();
137 : 251740 : e.nSizeWithAncestors -= iter->GetTxSize();
138 : 251740 : e.nSigOpCostWithAncestors -= iter->GetSigOpCost();
139 : 251740 : }
140 : :
141 : : CTxMemPool::txiter iter;
142 : : };
143 : :
144 : : /** Generate a new block, without valid proof-of-work */
145 : : class BlockAssembler
146 : : {
147 : : private:
148 : : // The constructed block template
149 : : std::unique_ptr<CBlockTemplate> pblocktemplate;
150 : :
151 : : // Information on the current status of the block
152 : : uint64_t nBlockWeight;
153 : : uint64_t nBlockTx;
154 : : uint64_t nBlockSigOpsCost;
155 : : CAmount nFees;
156 : : std::unordered_set<Txid, SaltedTxidHasher> inBlock;
157 : :
158 : : // Chain context for the block
159 : : int nHeight;
160 : : int64_t m_lock_time_cutoff;
161 : :
162 : : const CChainParams& chainparams;
163 : : const CTxMemPool* const m_mempool;
164 : : Chainstate& m_chainstate;
165 : :
166 : : public:
167 [ + - + - ]: 137344 : struct Options : BlockCreateOptions {
[ + - + -
+ - + - ]
168 : : // Configuration parameters for the block size
169 : : size_t nBlockMaxWeight{DEFAULT_BLOCK_MAX_WEIGHT};
170 : : CFeeRate blockMinFeeRate{DEFAULT_BLOCK_MIN_TX_FEE};
171 : : // Whether to call TestBlockValidity() at the end of CreateNewBlock().
172 : : bool test_block_validity{true};
173 : : bool print_modified_fee{DEFAULT_PRINT_MODIFIED_FEE};
174 : : };
175 : :
176 : : explicit BlockAssembler(Chainstate& chainstate, const CTxMemPool* mempool, const Options& options);
177 : :
178 : : /** Construct a new block template */
179 : : std::unique_ptr<CBlockTemplate> CreateNewBlock();
180 : :
181 : : /** The number of transactions in the last assembled block (excluding coinbase transaction) */
182 : : inline static std::optional<int64_t> m_last_block_num_txs{};
183 : : /** The weight of the last assembled block (including reserved weight for block header, txs count and coinbase tx) */
184 : : inline static std::optional<int64_t> m_last_block_weight{};
185 : :
186 : : private:
187 : : const Options m_options;
188 : :
189 : : // utility functions
190 : : /** Clear the block's state and prepare for assembling a new block */
191 : : void resetBlock();
192 : : /** Add a tx to the block */
193 : : void AddToBlock(CTxMemPool::txiter iter);
194 : :
195 : : // Methods for how to add transactions to a block.
196 : : /** Add transactions based on feerate including unconfirmed ancestors
197 : : * Increments nPackagesSelected / nDescendantsUpdated with corresponding
198 : : * statistics from the package selection (for logging statistics).
199 : : *
200 : : * @pre BlockAssembler::m_mempool must not be nullptr
201 : : */
202 : : void addPackageTxs(int& nPackagesSelected, int& nDescendantsUpdated) EXCLUSIVE_LOCKS_REQUIRED(!m_mempool->cs);
203 : :
204 : : // helper functions for addPackageTxs()
205 : : /** Remove confirmed (inBlock) entries from given set */
206 : : void onlyUnconfirmed(CTxMemPool::setEntries& testSet);
207 : : /** Test if a new package would "fit" in the block */
208 : : bool TestPackage(uint64_t packageSize, int64_t packageSigOpsCost) const;
209 : : /** Perform checks on each transaction in a package:
210 : : * locktime, premature-witness, serialized size (if necessary)
211 : : * These checks should always succeed, and they're here
212 : : * only as an extra check in case of suboptimal node configuration */
213 : : bool TestPackageTransactions(const CTxMemPool::setEntries& package) const;
214 : : /** Sort the package in an order that is valid to appear in a block */
215 : : void SortForBlock(const CTxMemPool::setEntries& package, std::vector<CTxMemPool::txiter>& sortedEntries);
216 : : };
217 : :
218 : : /**
219 : : * Get the minimum time a miner should use in the next block. This always
220 : : * accounts for the BIP94 timewarp rule, so does not necessarily reflect the
221 : : * consensus limit.
222 : : */
223 : : int64_t GetMinimumTime(const CBlockIndex* pindexPrev, const int64_t difficulty_adjustment_interval);
224 : :
225 : : int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev);
226 : :
227 : : /** Update an old GenerateCoinbaseCommitment from CreateNewBlock after the block txs have changed */
228 : : void RegenerateCommitments(CBlock& block, ChainstateManager& chainman);
229 : :
230 : : /** Apply -blockmintxfee and -blockmaxweight options from ArgsManager to BlockAssembler options. */
231 : : void ApplyArgsManOptions(const ArgsManager& gArgs, BlockAssembler::Options& options);
232 : : } // namespace node
233 : :
234 : : #endif // BITCOIN_NODE_MINER_H
|