/Users/eugenesiegel/btc/bitcoin/src/txmempool.h
| Line | Count | Source (jump to first uncovered line) | 
| 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_TXMEMPOOL_H | 
| 7 |  | #define BITCOIN_TXMEMPOOL_H | 
| 8 |  |  | 
| 9 |  | #include <coins.h> | 
| 10 |  | #include <consensus/amount.h> | 
| 11 |  | #include <indirectmap.h> | 
| 12 |  | #include <kernel/cs_main.h> | 
| 13 |  | #include <kernel/mempool_entry.h>          // IWYU pragma: export | 
| 14 |  | #include <kernel/mempool_limits.h>         // IWYU pragma: export | 
| 15 |  | #include <kernel/mempool_options.h>        // IWYU pragma: export | 
| 16 |  | #include <kernel/mempool_removal_reason.h> // IWYU pragma: export | 
| 17 |  | #include <policy/feerate.h> | 
| 18 |  | #include <policy/packages.h> | 
| 19 |  | #include <primitives/transaction.h> | 
| 20 |  | #include <primitives/transaction_identifier.h> | 
| 21 |  | #include <sync.h> | 
| 22 |  | #include <util/epochguard.h> | 
| 23 |  | #include <util/feefrac.h> | 
| 24 |  | #include <util/hasher.h> | 
| 25 |  | #include <util/result.h> | 
| 26 |  |  | 
| 27 |  | #include <boost/multi_index/hashed_index.hpp> | 
| 28 |  | #include <boost/multi_index/identity.hpp> | 
| 29 |  | #include <boost/multi_index/indexed_by.hpp> | 
| 30 |  | #include <boost/multi_index/ordered_index.hpp> | 
| 31 |  | #include <boost/multi_index/sequenced_index.hpp> | 
| 32 |  | #include <boost/multi_index/tag.hpp> | 
| 33 |  | #include <boost/multi_index_container.hpp> | 
| 34 |  |  | 
| 35 |  | #include <atomic> | 
| 36 |  | #include <map> | 
| 37 |  | #include <optional> | 
| 38 |  | #include <set> | 
| 39 |  | #include <string> | 
| 40 |  | #include <string_view> | 
| 41 |  | #include <utility> | 
| 42 |  | #include <vector> | 
| 43 |  |  | 
| 44 |  | class CChain; | 
| 45 |  | class ValidationSignals; | 
| 46 |  |  | 
| 47 |  | struct bilingual_str; | 
| 48 |  |  | 
| 49 |  | /** Fake height value used in Coin to signify they are only in the memory pool (since 0.8) */ | 
| 50 |  | static const uint32_t MEMPOOL_HEIGHT = 0x7FFFFFFF; | 
| 51 |  |  | 
| 52 |  | /** | 
| 53 |  |  * Test whether the LockPoints height and time are still valid on the current chain | 
| 54 |  |  */ | 
| 55 |  | bool TestLockPointValidity(CChain& active_chain, const LockPoints& lp) EXCLUSIVE_LOCKS_REQUIRED(cs_main); | 
| 56 |  |  | 
| 57 |  | // extracts a transaction hash from CTxMemPoolEntry or CTransactionRef | 
| 58 |  | struct mempoolentry_txid | 
| 59 |  | { | 
| 60 |  |     typedef Txid result_type; | 
| 61 |  |     result_type operator() (const CTxMemPoolEntry &entry) const | 
| 62 | 84.4M |     { | 
| 63 | 84.4M |         return entry.GetTx().GetHash(); | 
| 64 | 84.4M |     } | 
| 65 |  |  | 
| 66 |  |     result_type operator() (const CTransactionRef& tx) const | 
| 67 | 0 |     { | 
| 68 | 0 |         return tx->GetHash(); | 
| 69 | 0 |     } | 
| 70 |  | }; | 
| 71 |  |  | 
| 72 |  | // extracts a transaction witness-hash from CTxMemPoolEntry or CTransactionRef | 
| 73 |  | struct mempoolentry_wtxid | 
| 74 |  | { | 
| 75 |  |     typedef Wtxid result_type; | 
| 76 |  |     result_type operator() (const CTxMemPoolEntry &entry) const | 
| 77 | 9.09M |     { | 
| 78 | 9.09M |         return entry.GetTx().GetWitnessHash(); | 
| 79 | 9.09M |     } | 
| 80 |  |  | 
| 81 |  |     result_type operator() (const CTransactionRef& tx) const | 
| 82 | 0 |     { | 
| 83 | 0 |         return tx->GetWitnessHash(); | 
| 84 | 0 |     } | 
| 85 |  | }; | 
| 86 |  |  | 
| 87 |  |  | 
| 88 |  | /** \class CompareTxMemPoolEntryByDescendantScore | 
| 89 |  |  * | 
| 90 |  |  *  Sort an entry by max(score/size of entry's tx, score/size with all descendants). | 
| 91 |  |  */ | 
| 92 |  | class CompareTxMemPoolEntryByDescendantScore | 
| 93 |  | { | 
| 94 |  | public: | 
| 95 |  |     bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b) const | 
| 96 | 11.5M |     { | 
| 97 | 11.5M |         FeeFrac f1 = GetModFeeAndSize(a); | 
| 98 | 11.5M |         FeeFrac f2 = GetModFeeAndSize(b); | 
| 99 |  |  | 
| 100 | 11.5M |         if (FeeRateCompare(f1, f2) == 0) { | 
| 101 | 11.5M |             return a.GetTime() >= b.GetTime(); | 
| 102 | 11.5M |         } | 
| 103 | 0 |         return f1 < f2; | 
| 104 | 11.5M |     } | 
| 105 |  |  | 
| 106 |  |     // Return the fee/size we're using for sorting this entry. | 
| 107 |  |     FeeFrac GetModFeeAndSize(const CTxMemPoolEntry &a) const | 
| 108 | 23.1M |     { | 
| 109 |  |         // Compare feerate with descendants to feerate of the transaction, and | 
| 110 |  |         // return the fee/size for the max. | 
| 111 | 23.1M |         return std::max<FeeFrac>( | 
| 112 | 23.1M |             FeeFrac(a.GetModFeesWithDescendants(), a.GetSizeWithDescendants()), | 
| 113 | 23.1M |             FeeFrac(a.GetModifiedFee(), a.GetTxSize()) | 
| 114 | 23.1M |         ); | 
| 115 | 23.1M |     } | 
| 116 |  | }; | 
| 117 |  |  | 
| 118 |  | /** \class CompareTxMemPoolEntryByScore | 
| 119 |  |  * | 
| 120 |  |  *  Sort by feerate of entry (fee/size) in descending order | 
| 121 |  |  *  This is only used for transaction relay, so we use GetFee() | 
| 122 |  |  *  instead of GetModifiedFee() to avoid leaking prioritization | 
| 123 |  |  *  information via the sort order. | 
| 124 |  |  */ | 
| 125 |  | class CompareTxMemPoolEntryByScore | 
| 126 |  | { | 
| 127 |  | public: | 
| 128 |  |     bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b) const | 
| 129 | 40.0M |     { | 
| 130 | 40.0M |         FeeFrac f1(a.GetFee(), a.GetTxSize()); | 
| 131 | 40.0M |         FeeFrac f2(b.GetFee(), b.GetTxSize()); | 
| 132 | 40.0M |         if (FeeRateCompare(f1, f2) == 0) { | 
| 133 | 40.0M |             return b.GetTx().GetHash() < a.GetTx().GetHash(); | 
| 134 | 40.0M |         } | 
| 135 | 0 |         return f1 > f2; | 
| 136 | 40.0M |     } | 
| 137 |  | }; | 
| 138 |  |  | 
| 139 |  | class CompareTxMemPoolEntryByEntryTime | 
| 140 |  | { | 
| 141 |  | public: | 
| 142 |  |     bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b) const | 
| 143 | 4.98M |     { | 
| 144 | 4.98M |         return a.GetTime() < b.GetTime(); | 
| 145 | 4.98M |     } | 
| 146 |  | }; | 
| 147 |  |  | 
| 148 |  | /** \class CompareTxMemPoolEntryByAncestorScore | 
| 149 |  |  * | 
| 150 |  |  *  Sort an entry by min(score/size of entry's tx, score/size with all ancestors). | 
| 151 |  |  */ | 
| 152 |  | class CompareTxMemPoolEntryByAncestorFee | 
| 153 |  | { | 
| 154 |  | public: | 
| 155 |  |     template<typename T> | 
| 156 |  |     bool operator()(const T& a, const T& b) const | 
| 157 | 4.63M |     { | 
| 158 | 4.63M |         FeeFrac f1 = GetModFeeAndSize(a); | 
| 159 | 4.63M |         FeeFrac f2 = GetModFeeAndSize(b); | 
| 160 |  |  | 
| 161 | 4.63M |         if (FeeRateCompare(f1, f2) == 0) { | 
| 162 | 4.63M |             return a.GetTx().GetHash() < b.GetTx().GetHash(); | 
| 163 | 4.63M |         } | 
| 164 | 0 |         return f1 > f2; | 
| 165 | 4.63M |     } Unexecuted instantiation: _ZNK34CompareTxMemPoolEntryByAncestorFeeclIN4node23CTxMemPoolModifiedEntryEEEbRKT_S5__ZNK34CompareTxMemPoolEntryByAncestorFeeclI15CTxMemPoolEntryEEbRKT_S4_| Line | Count | Source |  | 157 | 4.63M |     { |  | 158 | 4.63M |         FeeFrac f1 = GetModFeeAndSize(a); |  | 159 | 4.63M |         FeeFrac f2 = GetModFeeAndSize(b); |  | 160 |  |  |  | 161 | 4.63M |         if (FeeRateCompare(f1, f2) == 0) { |  | 162 | 4.63M |             return a.GetTx().GetHash() < b.GetTx().GetHash(); |  | 163 | 4.63M |         } |  | 164 | 0 |         return f1 > f2; |  | 165 | 4.63M |     } | 
 | 
| 166 |  |  | 
| 167 |  |     // Return the fee/size we're using for sorting this entry. | 
| 168 |  |     template <typename T> | 
| 169 |  |     FeeFrac GetModFeeAndSize(const T &a) const | 
| 170 | 9.26M |     { | 
| 171 |  |         // Compare feerate with ancestors to feerate of the transaction, and | 
| 172 |  |         // return the fee/size for the min. | 
| 173 | 9.26M |         return std::min<FeeFrac>( | 
| 174 | 9.26M |             FeeFrac(a.GetModFeesWithAncestors(), a.GetSizeWithAncestors()), | 
| 175 | 9.26M |             FeeFrac(a.GetModifiedFee(), a.GetTxSize()) | 
| 176 | 9.26M |         ); | 
| 177 | 9.26M |     } Unexecuted instantiation: _ZNK34CompareTxMemPoolEntryByAncestorFee16GetModFeeAndSizeIN4node23CTxMemPoolModifiedEntryEEE7FeeFracRKT__ZNK34CompareTxMemPoolEntryByAncestorFee16GetModFeeAndSizeI15CTxMemPoolEntryEE7FeeFracRKT_| Line | Count | Source |  | 170 | 9.26M |     { |  | 171 |  |         // Compare feerate with ancestors to feerate of the transaction, and |  | 172 |  |         // return the fee/size for the min. |  | 173 | 9.26M |         return std::min<FeeFrac>( |  | 174 | 9.26M |             FeeFrac(a.GetModFeesWithAncestors(), a.GetSizeWithAncestors()), |  | 175 | 9.26M |             FeeFrac(a.GetModifiedFee(), a.GetTxSize()) |  | 176 | 9.26M |         ); |  | 177 | 9.26M |     } | 
 | 
| 178 |  | }; | 
| 179 |  |  | 
| 180 |  | // Multi_index tag names | 
| 181 |  | struct descendant_score {}; | 
| 182 |  | struct entry_time {}; | 
| 183 |  | struct ancestor_score {}; | 
| 184 |  | struct index_by_wtxid {}; | 
| 185 |  |  | 
| 186 |  | /** | 
| 187 |  |  * Information about a mempool transaction. | 
| 188 |  |  */ | 
| 189 |  | struct TxMempoolInfo | 
| 190 |  | { | 
| 191 |  |     /** The transaction itself */ | 
| 192 |  |     CTransactionRef tx; | 
| 193 |  |  | 
| 194 |  |     /** Time the transaction entered the mempool. */ | 
| 195 |  |     std::chrono::seconds m_time; | 
| 196 |  |  | 
| 197 |  |     /** Fee of the transaction. */ | 
| 198 |  |     CAmount fee; | 
| 199 |  |  | 
| 200 |  |     /** Virtual size of the transaction. */ | 
| 201 |  |     int32_t vsize; | 
| 202 |  |  | 
| 203 |  |     /** The fee delta. */ | 
| 204 |  |     int64_t nFeeDelta; | 
| 205 |  | }; | 
| 206 |  |  | 
| 207 |  | /** | 
| 208 |  |  * CTxMemPool stores valid-according-to-the-current-best-chain transactions | 
| 209 |  |  * that may be included in the next block. | 
| 210 |  |  * | 
| 211 |  |  * Transactions are added when they are seen on the network (or created by the | 
| 212 |  |  * local node), but not all transactions seen are added to the pool. For | 
| 213 |  |  * example, the following new transactions will not be added to the mempool: | 
| 214 |  |  * - a transaction which doesn't meet the minimum fee requirements. | 
| 215 |  |  * - a new transaction that double-spends an input of a transaction already in | 
| 216 |  |  * the pool where the new transaction does not meet the Replace-By-Fee | 
| 217 |  |  * requirements as defined in doc/policy/mempool-replacements.md. | 
| 218 |  |  * - a non-standard transaction. | 
| 219 |  |  * | 
| 220 |  |  * CTxMemPool::mapTx, and CTxMemPoolEntry bookkeeping: | 
| 221 |  |  * | 
| 222 |  |  * mapTx is a boost::multi_index that sorts the mempool on 5 criteria: | 
| 223 |  |  * - transaction hash (txid) | 
| 224 |  |  * - witness-transaction hash (wtxid) | 
| 225 |  |  * - descendant feerate [we use max(feerate of tx, feerate of tx with all descendants)] | 
| 226 |  |  * - time in mempool | 
| 227 |  |  * - ancestor feerate [we use min(feerate of tx, feerate of tx with all unconfirmed ancestors)] | 
| 228 |  |  * | 
| 229 |  |  * Note: the term "descendant" refers to in-mempool transactions that depend on | 
| 230 |  |  * this one, while "ancestor" refers to in-mempool transactions that a given | 
| 231 |  |  * transaction depends on. | 
| 232 |  |  * | 
| 233 |  |  * In order for the feerate sort to remain correct, we must update transactions | 
| 234 |  |  * in the mempool when new descendants arrive.  To facilitate this, we track | 
| 235 |  |  * the set of in-mempool direct parents and direct children in mapLinks.  Within | 
| 236 |  |  * each CTxMemPoolEntry, we track the size and fees of all descendants. | 
| 237 |  |  * | 
| 238 |  |  * Usually when a new transaction is added to the mempool, it has no in-mempool | 
| 239 |  |  * children (because any such children would be an orphan).  So in | 
| 240 |  |  * addNewTransaction(), we: | 
| 241 |  |  * - update a new entry's m_parents to include all in-mempool parents | 
| 242 |  |  * - update each of those parent entries to include the new tx as a child | 
| 243 |  |  * - update all ancestors of the transaction to include the new tx's size/fee | 
| 244 |  |  * | 
| 245 |  |  * When a transaction is removed from the mempool, we must: | 
| 246 |  |  * - update all in-mempool parents to not track the tx in their m_children | 
| 247 |  |  * - update all ancestors to not include the tx's size/fees in descendant state | 
| 248 |  |  * - update all in-mempool children to not include it as a parent | 
| 249 |  |  * | 
| 250 |  |  * These happen in UpdateForRemoveFromMempool().  (Note that when removing a | 
| 251 |  |  * transaction along with its descendants, we must calculate that set of | 
| 252 |  |  * transactions to be removed before doing the removal, or else the mempool can | 
| 253 |  |  * be in an inconsistent state where it's impossible to walk the ancestors of | 
| 254 |  |  * a transaction.) | 
| 255 |  |  * | 
| 256 |  |  * In the event of a reorg, the assumption that a newly added tx has no | 
| 257 |  |  * in-mempool children is false.  In particular, the mempool is in an | 
| 258 |  |  * inconsistent state while new transactions are being added, because there may | 
| 259 |  |  * be descendant transactions of a tx coming from a disconnected block that are | 
| 260 |  |  * unreachable from just looking at transactions in the mempool (the linking | 
| 261 |  |  * transactions may also be in the disconnected block, waiting to be added). | 
| 262 |  |  * Because of this, there's not much benefit in trying to search for in-mempool | 
| 263 |  |  * children in addNewTransaction().  Instead, in the special case of transactions | 
| 264 |  |  * being added from a disconnected block, we require the caller to clean up the | 
| 265 |  |  * state, to account for in-mempool, out-of-block descendants for all the | 
| 266 |  |  * in-block transactions by calling UpdateTransactionsFromBlock().  Note that | 
| 267 |  |  * until this is called, the mempool state is not consistent, and in particular | 
| 268 |  |  * mapLinks may not be correct (and therefore functions like | 
| 269 |  |  * CalculateMemPoolAncestors() and CalculateDescendants() that rely | 
| 270 |  |  * on them to walk the mempool are not generally safe to use). | 
| 271 |  |  * | 
| 272 |  |  * Computational limits: | 
| 273 |  |  * | 
| 274 |  |  * Updating all in-mempool ancestors of a newly added transaction can be slow, | 
| 275 |  |  * if no bound exists on how many in-mempool ancestors there may be. | 
| 276 |  |  * CalculateMemPoolAncestors() takes configurable limits that are designed to | 
| 277 |  |  * prevent these calculations from being too CPU intensive. | 
| 278 |  |  * | 
| 279 |  |  */ | 
| 280 |  | class CTxMemPool | 
| 281 |  | { | 
| 282 |  | protected: | 
| 283 |  |     std::atomic<unsigned int> nTransactionsUpdated{0}; //!< Used by getblocktemplate to trigger CreateNewBlock() invocation | 
| 284 |  |  | 
| 285 |  |     uint64_t totalTxSize GUARDED_BY(cs){0};      //!< sum of all mempool tx's virtual sizes. Differs from serialized tx size since witness data is discounted. Defined in BIP 141. | 
| 286 |  |     CAmount m_total_fee GUARDED_BY(cs){0};       //!< sum of all mempool tx's fees (NOT modified fee) | 
| 287 |  |     uint64_t cachedInnerUsage GUARDED_BY(cs){0}; //!< sum of dynamic memory usage of all the map elements (NOT the maps themselves) | 
| 288 |  |  | 
| 289 |  |     mutable int64_t lastRollingFeeUpdate GUARDED_BY(cs){GetTime()}; | 
| 290 |  |     mutable bool blockSinceLastRollingFeeBump GUARDED_BY(cs){false}; | 
| 291 |  |     mutable double rollingMinimumFeeRate GUARDED_BY(cs){0}; //!< minimum fee to get into the pool, decreases exponentially | 
| 292 |  |     mutable Epoch m_epoch GUARDED_BY(cs){}; | 
| 293 |  |  | 
| 294 |  |     // In-memory counter for external mempool tracking purposes. | 
| 295 |  |     // This number is incremented once every time a transaction | 
| 296 |  |     // is added or removed from the mempool for any reason. | 
| 297 |  |     mutable uint64_t m_sequence_number GUARDED_BY(cs){1}; | 
| 298 |  |  | 
| 299 |  |     void trackPackageRemoved(const CFeeRate& rate) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 300 |  |  | 
| 301 |  |     bool m_load_tried GUARDED_BY(cs){false}; | 
| 302 |  |  | 
| 303 |  |     CFeeRate GetMinFee(size_t sizelimit) const; | 
| 304 |  |  | 
| 305 |  | public: | 
| 306 |  |  | 
| 307 |  |     static const int ROLLING_FEE_HALFLIFE = 60 * 60 * 12; // public only for testing | 
| 308 |  |  | 
| 309 |  |     struct CTxMemPoolEntry_Indices final : boost::multi_index::indexed_by< | 
| 310 |  |             // sorted by txid | 
| 311 |  |             boost::multi_index::hashed_unique<mempoolentry_txid, SaltedTxidHasher>, | 
| 312 |  |             // sorted by wtxid | 
| 313 |  |             boost::multi_index::hashed_unique< | 
| 314 |  |                 boost::multi_index::tag<index_by_wtxid>, | 
| 315 |  |                 mempoolentry_wtxid, | 
| 316 |  |                 SaltedWtxidHasher | 
| 317 |  |             >, | 
| 318 |  |             // sorted by fee rate | 
| 319 |  |             boost::multi_index::ordered_non_unique< | 
| 320 |  |                 boost::multi_index::tag<descendant_score>, | 
| 321 |  |                 boost::multi_index::identity<CTxMemPoolEntry>, | 
| 322 |  |                 CompareTxMemPoolEntryByDescendantScore | 
| 323 |  |             >, | 
| 324 |  |             // sorted by entry time | 
| 325 |  |             boost::multi_index::ordered_non_unique< | 
| 326 |  |                 boost::multi_index::tag<entry_time>, | 
| 327 |  |                 boost::multi_index::identity<CTxMemPoolEntry>, | 
| 328 |  |                 CompareTxMemPoolEntryByEntryTime | 
| 329 |  |             >, | 
| 330 |  |             // sorted by fee rate with ancestors | 
| 331 |  |             boost::multi_index::ordered_non_unique< | 
| 332 |  |                 boost::multi_index::tag<ancestor_score>, | 
| 333 |  |                 boost::multi_index::identity<CTxMemPoolEntry>, | 
| 334 |  |                 CompareTxMemPoolEntryByAncestorFee | 
| 335 |  |             > | 
| 336 |  |         > | 
| 337 |  |         {}; | 
| 338 |  |     typedef boost::multi_index_container< | 
| 339 |  |         CTxMemPoolEntry, | 
| 340 |  |         CTxMemPoolEntry_Indices | 
| 341 |  |     > indexed_transaction_set; | 
| 342 |  |  | 
| 343 |  |     /** | 
| 344 |  |      * This mutex needs to be locked when accessing `mapTx` or other members | 
| 345 |  |      * that are guarded by it. | 
| 346 |  |      * | 
| 347 |  |      * @par Consistency guarantees | 
| 348 |  |      * By design, it is guaranteed that: | 
| 349 |  |      * 1. Locking both `cs_main` and `mempool.cs` will give a view of mempool | 
| 350 |  |      *    that is consistent with current chain tip (`ActiveChain()` and | 
| 351 |  |      *    `CoinsTip()`) and is fully populated. Fully populated means that if the | 
| 352 |  |      *    current active chain is missing transactions that were present in a | 
| 353 |  |      *    previously active chain, all the missing transactions will have been | 
| 354 |  |      *    re-added to the mempool and should be present if they meet size and | 
| 355 |  |      *    consistency constraints. | 
| 356 |  |      * 2. Locking `mempool.cs` without `cs_main` will give a view of a mempool | 
| 357 |  |      *    consistent with some chain that was active since `cs_main` was last | 
| 358 |  |      *    locked, and that is fully populated as described above. It is ok for | 
| 359 |  |      *    code that only needs to query or remove transactions from the mempool | 
| 360 |  |      *    to lock just `mempool.cs` without `cs_main`. | 
| 361 |  |      * | 
| 362 |  |      * To provide these guarantees, it is necessary to lock both `cs_main` and | 
| 363 |  |      * `mempool.cs` whenever adding transactions to the mempool and whenever | 
| 364 |  |      * changing the chain tip. It's necessary to keep both mutexes locked until | 
| 365 |  |      * the mempool is consistent with the new chain tip and fully populated. | 
| 366 |  |      */ | 
| 367 |  |     mutable RecursiveMutex cs; | 
| 368 |  |     indexed_transaction_set mapTx GUARDED_BY(cs); | 
| 369 |  |  | 
| 370 |  |     using txiter = indexed_transaction_set::nth_index<0>::type::const_iterator; | 
| 371 |  |     std::vector<std::pair<Wtxid, txiter>> txns_randomized GUARDED_BY(cs); //!< All transactions in mapTx with their wtxids, in arbitrary order | 
| 372 |  |  | 
| 373 |  |     typedef std::set<txiter, CompareIteratorByHash> setEntries; | 
| 374 |  |  | 
| 375 |  |     using Limits = kernel::MemPoolLimits; | 
| 376 |  |  | 
| 377 |  |     uint64_t CalculateDescendantMaximum(txiter entry) const EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 378 |  | private: | 
| 379 |  |     typedef std::map<txiter, setEntries, CompareIteratorByHash> cacheMap; | 
| 380 |  |  | 
| 381 |  |  | 
| 382 |  |     void UpdateParent(txiter entry, txiter parent, bool add) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 383 |  |     void UpdateChild(txiter entry, txiter child, bool add) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 384 |  |  | 
| 385 |  |     std::vector<indexed_transaction_set::const_iterator> GetSortedDepthAndScore() const EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 386 |  |  | 
| 387 |  |     /** | 
| 388 |  |      * Track locally submitted transactions to periodically retry initial broadcast. | 
| 389 |  |      */ | 
| 390 |  |     std::set<Txid> m_unbroadcast_txids GUARDED_BY(cs); | 
| 391 |  |  | 
| 392 |  |  | 
| 393 |  |     /** | 
| 394 |  |      * Helper function to calculate all in-mempool ancestors of staged_ancestors and apply ancestor | 
| 395 |  |      * and descendant limits (including staged_ancestors themselves, entry_size and entry_count). | 
| 396 |  |      * | 
| 397 |  |      * @param[in]   entry_size          Virtual size to include in the limits. | 
| 398 |  |      * @param[in]   entry_count         How many entries to include in the limits. | 
| 399 |  |      * @param[in]   staged_ancestors    Should contain entries in the mempool. | 
| 400 |  |      * @param[in]   limits              Maximum number and size of ancestors and descendants | 
| 401 |  |      * | 
| 402 |  |      * @return all in-mempool ancestors, or an error if any ancestor or descendant limits were hit | 
| 403 |  |      */ | 
| 404 |  |     util::Result<setEntries> CalculateAncestorsAndCheckLimits(int64_t entry_size, | 
| 405 |  |                                                               size_t entry_count, | 
| 406 |  |                                                               CTxMemPoolEntry::Parents &staged_ancestors, | 
| 407 |  |                                                               const Limits& limits | 
| 408 |  |                                                               ) const EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 409 |  |  | 
| 410 |  |     static TxMempoolInfo GetInfo(CTxMemPool::indexed_transaction_set::const_iterator it) | 
| 411 | 10.4k |     { | 
| 412 | 10.4k |         return TxMempoolInfo{it->GetSharedTx(), it->GetTime(), it->GetFee(), it->GetTxSize(), it->GetModifiedFee() - it->GetFee()}; | 
| 413 | 10.4k |     } | 
| 414 |  |  | 
| 415 |  | public: | 
| 416 |  |     indirectmap<COutPoint, const CTransaction*> mapNextTx GUARDED_BY(cs); | 
| 417 |  |     std::map<Txid, CAmount> mapDeltas GUARDED_BY(cs); | 
| 418 |  |  | 
| 419 |  |     using Options = kernel::MemPoolOptions; | 
| 420 |  |  | 
| 421 |  |     const Options m_opts; | 
| 422 |  |  | 
| 423 |  |     /** Create a new CTxMemPool. | 
| 424 |  |      * Sanity checks will be off by default for performance, because otherwise | 
| 425 |  |      * accepting transactions becomes O(N^2) where N is the number of transactions | 
| 426 |  |      * in the pool. | 
| 427 |  |      */ | 
| 428 |  |     explicit CTxMemPool(Options opts, bilingual_str& error); | 
| 429 |  |  | 
| 430 |  |     /** | 
| 431 |  |      * If sanity-checking is turned on, check makes sure the pool is | 
| 432 |  |      * consistent (does not contain two transactions that spend the same inputs, | 
| 433 |  |      * all inputs are in the mapNextTx array). If sanity-checking is turned off, | 
| 434 |  |      * check does nothing. | 
| 435 |  |      */ | 
| 436 |  |     void check(const CCoinsViewCache& active_coins_tip, int64_t spendheight) const EXCLUSIVE_LOCKS_REQUIRED(::cs_main); | 
| 437 |  |  | 
| 438 |  |  | 
| 439 |  |     void removeRecursive(const CTransaction& tx, MemPoolRemovalReason reason) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 440 |  |     /** After reorg, filter the entries that would no longer be valid in the next block, and update | 
| 441 |  |      * the entries' cached LockPoints if needed.  The mempool does not have any knowledge of | 
| 442 |  |      * consensus rules. It just applies the callable function and removes the ones for which it | 
| 443 |  |      * returns true. | 
| 444 |  |      * @param[in]   filter_final_and_mature   Predicate that checks the relevant validation rules | 
| 445 |  |      *                                        and updates an entry's LockPoints. | 
| 446 |  |      * */ | 
| 447 |  |     void removeForReorg(CChain& chain, std::function<bool(txiter)> filter_final_and_mature) EXCLUSIVE_LOCKS_REQUIRED(cs, cs_main); | 
| 448 |  |     void removeConflicts(const CTransaction& tx) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 449 |  |     void removeForBlock(const std::vector<CTransactionRef>& vtx, unsigned int nBlockHeight) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 450 |  |  | 
| 451 |  |     bool CompareDepthAndScore(const Wtxid& hasha, const Wtxid& hashb) const; | 
| 452 |  |     bool isSpent(const COutPoint& outpoint) const; | 
| 453 |  |     unsigned int GetTransactionsUpdated() const; | 
| 454 |  |     void AddTransactionsUpdated(unsigned int n); | 
| 455 |  |     /** | 
| 456 |  |      * Check that none of this transactions inputs are in the mempool, and thus | 
| 457 |  |      * the tx is not dependent on other mempool transactions to be included in a block. | 
| 458 |  |      */ | 
| 459 |  |     bool HasNoInputsOf(const CTransaction& tx) const EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 460 |  |  | 
| 461 |  |     /** Affect CreateNewBlock prioritisation of transactions */ | 
| 462 |  |     void PrioritiseTransaction(const Txid& hash, const CAmount& nFeeDelta); | 
| 463 |  |     void ApplyDelta(const Txid& hash, CAmount &nFeeDelta) const EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 464 |  |     void ClearPrioritisation(const Txid& hash) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 465 |  |  | 
| 466 |  |     struct delta_info { | 
| 467 |  |         /** Whether this transaction is in the mempool. */ | 
| 468 |  |         const bool in_mempool; | 
| 469 |  |         /** The fee delta added using PrioritiseTransaction(). */ | 
| 470 |  |         const CAmount delta; | 
| 471 |  |         /** The modified fee (base fee + delta) of this entry. Only present if in_mempool=true. */ | 
| 472 |  |         std::optional<CAmount> modified_fee; | 
| 473 |  |         /** The prioritised transaction's txid. */ | 
| 474 |  |         const Txid txid; | 
| 475 |  |     }; | 
| 476 |  |     /** Return a vector of all entries in mapDeltas with their corresponding delta_info. */ | 
| 477 |  |     std::vector<delta_info> GetPrioritisedTransactions() const EXCLUSIVE_LOCKS_REQUIRED(!cs); | 
| 478 |  |  | 
| 479 |  |     /** Get the transaction in the pool that spends the same prevout */ | 
| 480 |  |     const CTransaction* GetConflictTx(const COutPoint& prevout) const EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 481 |  |  | 
| 482 |  |     /** Returns an iterator to the given hash, if found */ | 
| 483 |  |     std::optional<txiter> GetIter(const Txid& txid) const EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 484 |  |     std::optional<txiter> GetIter(const Wtxid& wtxid) const EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 485 |  |  | 
| 486 |  |     /** Translate a set of hashes into a set of pool iterators to avoid repeated lookups. | 
| 487 |  |      * Does not require that all of the hashes correspond to actual transactions in the mempool, | 
| 488 |  |      * only returns the ones that exist. */ | 
| 489 |  |     setEntries GetIterSet(const std::set<Txid>& hashes) const EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 490 |  |  | 
| 491 |  |     /** Translate a list of hashes into a list of mempool iterators to avoid repeated lookups. | 
| 492 |  |      * The nth element in txids becomes the nth element in the returned vector. If any of the txids | 
| 493 |  |      * don't actually exist in the mempool, returns an empty vector. */ | 
| 494 |  |     std::vector<txiter> GetIterVec(const std::vector<Txid>& txids) const EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 495 |  |  | 
| 496 |  |     /** UpdateTransactionsFromBlock is called when adding transactions from a | 
| 497 |  |      * disconnected block back to the mempool, new mempool entries may have | 
| 498 |  |      * children in the mempool (which is generally not the case when otherwise | 
| 499 |  |      * adding transactions). | 
| 500 |  |      *  @post updated descendant state for descendants of each transaction in | 
| 501 |  |      *        vHashesToUpdate (excluding any child transactions present in | 
| 502 |  |      *        vHashesToUpdate, which are already accounted for). Updated state | 
| 503 |  |      *        includes add fee/size information for such descendants to the | 
| 504 |  |      *        parent and updated ancestor state to include the parent. | 
| 505 |  |      * | 
| 506 |  |      * @param[in] vHashesToUpdate          The set of txids from the | 
| 507 |  |      *     disconnected block that have been accepted back into the mempool. | 
| 508 |  |      */ | 
| 509 |  |     void UpdateTransactionsFromBlock(const std::vector<Txid>& vHashesToUpdate) EXCLUSIVE_LOCKS_REQUIRED(cs, cs_main) LOCKS_EXCLUDED(m_epoch); | 
| 510 |  |  | 
| 511 |  |     /** | 
| 512 |  |      * Try to calculate all in-mempool ancestors of entry. | 
| 513 |  |      * (these are all calculated including the tx itself) | 
| 514 |  |      * | 
| 515 |  |      * @param[in]   entry               CTxMemPoolEntry of which all in-mempool ancestors are calculated | 
| 516 |  |      * @param[in]   limits              Maximum number and size of ancestors and descendants | 
| 517 |  |      * @param[in]   fSearchForParents   Whether to search a tx's vin for in-mempool parents, or look | 
| 518 |  |      *                                  up parents from mapLinks. Must be true for entries not in | 
| 519 |  |      *                                  the mempool | 
| 520 |  |      * | 
| 521 |  |      * @return all in-mempool ancestors, or an error if any ancestor or descendant limits were hit | 
| 522 |  |      */ | 
| 523 |  |     util::Result<setEntries> CalculateMemPoolAncestors(const CTxMemPoolEntry& entry, | 
| 524 |  |                                    const Limits& limits, | 
| 525 |  |                                    bool fSearchForParents = true) const EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 526 |  |  | 
| 527 |  |     /** | 
| 528 |  |      * Same as CalculateMemPoolAncestors, but always returns a (non-optional) setEntries. | 
| 529 |  |      * Should only be used when it is assumed CalculateMemPoolAncestors would not fail. If | 
| 530 |  |      * CalculateMemPoolAncestors does unexpectedly fail, an empty setEntries is returned and the | 
| 531 |  |      * error is logged to BCLog::MEMPOOL with level BCLog::Level::Error. In debug builds, failure | 
| 532 |  |      * of CalculateMemPoolAncestors will lead to shutdown due to assertion failure. | 
| 533 |  |      * | 
| 534 |  |      * @param[in]   calling_fn_name     Name of calling function so we can properly log the call site | 
| 535 |  |      * | 
| 536 |  |      * @return a setEntries corresponding to the result of CalculateMemPoolAncestors or an empty | 
| 537 |  |      *         setEntries if it failed | 
| 538 |  |      * | 
| 539 |  |      * @see CTXMemPool::CalculateMemPoolAncestors() | 
| 540 |  |      */ | 
| 541 |  |     setEntries AssumeCalculateMemPoolAncestors( | 
| 542 |  |         std::string_view calling_fn_name, | 
| 543 |  |         const CTxMemPoolEntry &entry, | 
| 544 |  |         const Limits& limits, | 
| 545 |  |         bool fSearchForParents = true) const EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 546 |  |  | 
| 547 |  |     /** Collect the entire cluster of connected transactions for each transaction in txids. | 
| 548 |  |      * All txids must correspond to transaction entries in the mempool, otherwise this returns an | 
| 549 |  |      * empty vector. This call will also exit early and return an empty vector if it collects 500 or | 
| 550 |  |      * more transactions as a DoS protection. */ | 
| 551 |  |     std::vector<txiter> GatherClusters(const std::vector<Txid>& txids) const EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 552 |  |  | 
| 553 |  |     /** Calculate all in-mempool ancestors of a set of transactions not already in the mempool and | 
| 554 |  |      * check ancestor and descendant limits. Heuristics are used to estimate the ancestor and | 
| 555 |  |      * descendant count of all entries if the package were to be added to the mempool.  The limits | 
| 556 |  |      * are applied to the union of all package transactions. For example, if the package has 3 | 
| 557 |  |      * transactions and limits.ancestor_count = 25, the union of all 3 sets of ancestors (including the | 
| 558 |  |      * transactions themselves) must be <= 22. | 
| 559 |  |      * @param[in]       package                 Transaction package being evaluated for acceptance | 
| 560 |  |      *                                          to mempool. The transactions need not be direct | 
| 561 |  |      *                                          ancestors/descendants of each other. | 
| 562 |  |      * @param[in]       total_vsize             Sum of virtual sizes for all transactions in package. | 
| 563 |  |      * @returns {} or the error reason if a limit is hit. | 
| 564 |  |      */ | 
| 565 |  |     util::Result<void> CheckPackageLimits(const Package& package, | 
| 566 |  |                                           int64_t total_vsize) const EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 567 |  |  | 
| 568 |  |     /** Populate setDescendants with all in-mempool descendants of hash. | 
| 569 |  |      *  Assumes that setDescendants includes all in-mempool descendants of anything | 
| 570 |  |      *  already in it.  */ | 
| 571 |  |     void CalculateDescendants(txiter it, setEntries& setDescendants) const EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 572 |  |  | 
| 573 |  |     /** The minimum fee to get into the mempool, which may itself not be enough | 
| 574 |  |      *  for larger-sized transactions. | 
| 575 |  |      *  The m_incremental_relay_feerate policy variable is used to bound the time it | 
| 576 |  |      *  takes the fee rate to go back down all the way to 0. When the feerate | 
| 577 |  |      *  would otherwise be half of this, it is set to 0 instead. | 
| 578 |  |      */ | 
| 579 | 6.02M |     CFeeRate GetMinFee() const { | 
| 580 | 6.02M |         return GetMinFee(m_opts.max_size_bytes); | 
| 581 | 6.02M |     } | 
| 582 |  |  | 
| 583 |  |     /** Remove transactions from the mempool until its dynamic size is <= sizelimit. | 
| 584 |  |       *  pvNoSpendsRemaining, if set, will be populated with the list of outpoints | 
| 585 |  |       *  which are not in mempool which no longer have any spends in this mempool. | 
| 586 |  |       */ | 
| 587 |  |     void TrimToSize(size_t sizelimit, std::vector<COutPoint>* pvNoSpendsRemaining = nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 588 |  |  | 
| 589 |  |     /** Expire all transaction (and their dependencies) in the mempool older than time. Return the number of removed transactions. */ | 
| 590 |  |     int Expire(std::chrono::seconds time) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 591 |  |  | 
| 592 |  |     /** | 
| 593 |  |      * Calculate the ancestor and descendant count for the given transaction. | 
| 594 |  |      * The counts include the transaction itself. | 
| 595 |  |      * When ancestors is non-zero (ie, the transaction itself is in the mempool), | 
| 596 |  |      * ancestorsize and ancestorfees will also be set to the appropriate values. | 
| 597 |  |      */ | 
| 598 |  |     void GetTransactionAncestry(const Txid& txid, size_t& ancestors, size_t& descendants, size_t* ancestorsize = nullptr, CAmount* ancestorfees = nullptr) const; | 
| 599 |  |  | 
| 600 |  |     /** | 
| 601 |  |      * @returns true if an initial attempt to load the persisted mempool was made, regardless of | 
| 602 |  |      *          whether the attempt was successful or not | 
| 603 |  |      */ | 
| 604 |  |     bool GetLoadTried() const; | 
| 605 |  |  | 
| 606 |  |     /** | 
| 607 |  |      * Set whether or not an initial attempt to load the persisted mempool was made (regardless | 
| 608 |  |      * of whether the attempt was successful or not) | 
| 609 |  |      */ | 
| 610 |  |     void SetLoadTried(bool load_tried); | 
| 611 |  |  | 
| 612 |  |     unsigned long size() const | 
| 613 | 13.8M |     { | 
| 614 | 13.8M |         LOCK(cs); | Line | Count | Source |  | 259 | 13.8M | #define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__) | Line | Count | Source |  | 11 | 13.8M | #define UNIQUE_NAME(name) PASTE2(name, __COUNTER__) | Line | Count | Source |  | 9 | 13.8M | #define PASTE2(x, y) PASTE(x, y) | Line | Count | Source |  | 8 | 13.8M | #define PASTE(x, y) x ## y | 
 | 
 | 
 | 
 | 
| 615 | 13.8M |         return mapTx.size(); | 
| 616 | 13.8M |     } | 
| 617 |  |  | 
| 618 |  |     uint64_t GetTotalTxSize() const EXCLUSIVE_LOCKS_REQUIRED(cs) | 
| 619 | 0 |     { | 
| 620 | 0 |         AssertLockHeld(cs); | Line | Count | Source |  | 137 | 0 | #define AssertLockHeld(cs) AssertLockHeldInternal(#cs, __FILE__, __LINE__, &cs) | 
 | 
| 621 | 0 |         return totalTxSize; | 
| 622 | 0 |     } | 
| 623 |  |  | 
| 624 |  |     CAmount GetTotalFee() const EXCLUSIVE_LOCKS_REQUIRED(cs) | 
| 625 | 0 |     { | 
| 626 | 0 |         AssertLockHeld(cs); | Line | Count | Source |  | 137 | 0 | #define AssertLockHeld(cs) AssertLockHeldInternal(#cs, __FILE__, __LINE__, &cs) | 
 | 
| 627 | 0 |         return m_total_fee; | 
| 628 | 0 |     } | 
| 629 |  |  | 
| 630 |  |     bool exists(const Txid& txid) const | 
| 631 | 1.75M |     { | 
| 632 | 1.75M |         LOCK(cs); | Line | Count | Source |  | 259 | 1.75M | #define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__) | Line | Count | Source |  | 11 | 1.75M | #define UNIQUE_NAME(name) PASTE2(name, __COUNTER__) | Line | Count | Source |  | 9 | 1.75M | #define PASTE2(x, y) PASTE(x, y) | Line | Count | Source |  | 8 | 1.75M | #define PASTE(x, y) x ## y | 
 | 
 | 
 | 
 | 
| 633 | 1.75M |         return (mapTx.count(txid) != 0); | 
| 634 | 1.75M |     } | 
| 635 |  |  | 
| 636 |  |     bool exists(const Wtxid& wtxid) const | 
| 637 | 4.19M |     { | 
| 638 | 4.19M |         LOCK(cs); | Line | Count | Source |  | 259 | 4.19M | #define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__) | Line | Count | Source |  | 11 | 4.19M | #define UNIQUE_NAME(name) PASTE2(name, __COUNTER__) | Line | Count | Source |  | 9 | 4.19M | #define PASTE2(x, y) PASTE(x, y) | Line | Count | Source |  | 8 | 4.19M | #define PASTE(x, y) x ## y | 
 | 
 | 
 | 
 | 
| 639 | 4.19M |         return (mapTx.get<index_by_wtxid>().count(wtxid) != 0); | 
| 640 | 4.19M |     } | 
| 641 |  |  | 
| 642 |  |     const CTxMemPoolEntry* GetEntry(const Txid& txid) const LIFETIMEBOUND EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 643 |  |  | 
| 644 |  |     CTransactionRef get(const Txid& hash) const; | 
| 645 |  |  | 
| 646 |  |     template <TxidOrWtxid T> | 
| 647 |  |     TxMempoolInfo info(const T& id) const | 
| 648 | 12.8k |     { | 
| 649 | 12.8k |         LOCK(cs); | Line | Count | Source |  | 259 | 0 | #define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__) | Line | Count | Source |  | 11 | 0 | #define UNIQUE_NAME(name) PASTE2(name, __COUNTER__) | Line | Count | Source |  | 9 | 0 | #define PASTE2(x, y) PASTE(x, y) | Line | Count | Source |  | 8 | 0 | #define PASTE(x, y) x ## y | 
 | 
 | 
 | 
 |         LOCK(cs); | Line | Count | Source |  | 259 | 12.8k | #define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__) | Line | Count | Source |  | 11 | 12.8k | #define UNIQUE_NAME(name) PASTE2(name, __COUNTER__) | Line | Count | Source |  | 9 | 12.8k | #define PASTE2(x, y) PASTE(x, y) | Line | Count | Source |  | 8 | 12.8k | #define PASTE(x, y) x ## y | 
 | 
 | 
 | 
 | 
| 650 | 12.8k |         auto i{GetIter(id)}; | 
| 651 | 12.8k |         return i.has_value() ? GetInfo(*i)10.4k: TxMempoolInfo{}2.36k; | 
| 652 | 12.8k |     } Unexecuted instantiation: _ZNK10CTxMemPool4infoITk11TxidOrWtxid22transaction_identifierILb0EEEE13TxMempoolInfoRKT__ZNK10CTxMemPool4infoITk11TxidOrWtxid22transaction_identifierILb1EEEE13TxMempoolInfoRKT_| Line | Count | Source |  | 648 | 12.8k |     { |  | 649 | 12.8k |         LOCK(cs); | Line | Count | Source |  | 259 | 12.8k | #define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__) | Line | Count | Source |  | 11 | 12.8k | #define UNIQUE_NAME(name) PASTE2(name, __COUNTER__) | Line | Count | Source |  | 9 | 12.8k | #define PASTE2(x, y) PASTE(x, y) | Line | Count | Source |  | 8 | 12.8k | #define PASTE(x, y) x ## y | 
 | 
 | 
 | 
 |  | 650 | 12.8k |         auto i{GetIter(id)}; |  | 651 | 12.8k |         return i.has_value() ? GetInfo(*i)10.4k: TxMempoolInfo{}2.36k; |  | 652 | 12.8k |     } | 
 | 
| 653 |  |  | 
| 654 |  |     /** Returns info for a transaction if its entry_sequence < last_sequence */ | 
| 655 |  |     template <TxidOrWtxid T> | 
| 656 |  |     TxMempoolInfo info_for_relay(const T& id, uint64_t last_sequence) const | 
| 657 | 0 |     { | 
| 658 | 0 |         LOCK(cs); | Line | Count | Source |  | 259 | 0 | #define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__) | Line | Count | Source |  | 11 | 0 | #define UNIQUE_NAME(name) PASTE2(name, __COUNTER__) | Line | Count | Source |  | 9 | 0 | #define PASTE2(x, y) PASTE(x, y) | Line | Count | Source |  | 8 | 0 | #define PASTE(x, y) x ## y | 
 | 
 | 
 | 
 |         LOCK(cs); | Line | Count | Source |  | 259 | 0 | #define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__) | Line | Count | Source |  | 11 | 0 | #define UNIQUE_NAME(name) PASTE2(name, __COUNTER__) | Line | Count | Source |  | 9 | 0 | #define PASTE2(x, y) PASTE(x, y) | Line | Count | Source |  | 8 | 0 | #define PASTE(x, y) x ## y | 
 | 
 | 
 | 
 | 
| 659 | 0 |         auto i{GetIter(id)}; | 
| 660 | 0 |         return (i.has_value() && i.value()->GetSequence() < last_sequence) ? GetInfo(*i) : TxMempoolInfo{}; | 
| 661 | 0 |     } Unexecuted instantiation: _ZNK10CTxMemPool14info_for_relayITk11TxidOrWtxid22transaction_identifierILb0EEEE13TxMempoolInfoRKT_yUnexecuted instantiation: _ZNK10CTxMemPool14info_for_relayITk11TxidOrWtxid22transaction_identifierILb1EEEE13TxMempoolInfoRKT_y | 
| 662 |  |  | 
| 663 |  |     std::vector<CTxMemPoolEntryRef> entryAll() const EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 664 |  |     std::vector<TxMempoolInfo> infoAll() const; | 
| 665 |  |  | 
| 666 |  |     size_t DynamicMemoryUsage() const; | 
| 667 |  |  | 
| 668 |  |     /** Adds a transaction to the unbroadcast set */ | 
| 669 |  |     void AddUnbroadcastTx(const Txid& txid) | 
| 670 | 0 |     { | 
| 671 | 0 |         LOCK(cs); | Line | Count | Source |  | 259 | 0 | #define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__) | Line | Count | Source |  | 11 | 0 | #define UNIQUE_NAME(name) PASTE2(name, __COUNTER__) | Line | Count | Source |  | 9 | 0 | #define PASTE2(x, y) PASTE(x, y) | Line | Count | Source |  | 8 | 0 | #define PASTE(x, y) x ## y | 
 | 
 | 
 | 
 | 
| 672 |  |         // Sanity check the transaction is in the mempool & insert into | 
| 673 |  |         // unbroadcast set. | 
| 674 | 0 |         if (exists(txid)) m_unbroadcast_txids.insert(txid); | 
| 675 | 0 |     }; | 
| 676 |  |  | 
| 677 |  |     /** Removes a transaction from the unbroadcast set */ | 
| 678 |  |     void RemoveUnbroadcastTx(const Txid& txid, const bool unchecked = false); | 
| 679 |  |  | 
| 680 |  |     /** Returns transactions in unbroadcast set */ | 
| 681 |  |     std::set<Txid> GetUnbroadcastTxs() const | 
| 682 | 0 |     { | 
| 683 | 0 |         LOCK(cs); | Line | Count | Source |  | 259 | 0 | #define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__) | Line | Count | Source |  | 11 | 0 | #define UNIQUE_NAME(name) PASTE2(name, __COUNTER__) | Line | Count | Source |  | 9 | 0 | #define PASTE2(x, y) PASTE(x, y) | Line | Count | Source |  | 8 | 0 | #define PASTE(x, y) x ## y | 
 | 
 | 
 | 
 | 
| 684 | 0 |         return m_unbroadcast_txids; | 
| 685 | 0 |     } | 
| 686 |  |  | 
| 687 |  |     /** Returns whether a txid is in the unbroadcast set */ | 
| 688 |  |     bool IsUnbroadcastTx(const Txid& txid) const EXCLUSIVE_LOCKS_REQUIRED(cs) | 
| 689 | 0 |     { | 
| 690 | 0 |         AssertLockHeld(cs); | Line | Count | Source |  | 137 | 0 | #define AssertLockHeld(cs) AssertLockHeldInternal(#cs, __FILE__, __LINE__, &cs) | 
 | 
| 691 | 0 |         return m_unbroadcast_txids.count(txid) != 0; | 
| 692 | 0 |     } | 
| 693 |  |  | 
| 694 |  |     /** Guards this internal counter for external reporting */ | 
| 695 | 651k |     uint64_t GetAndIncrementSequence() const EXCLUSIVE_LOCKS_REQUIRED(cs) { | 
| 696 | 651k |         return m_sequence_number++; | 
| 697 | 651k |     } | 
| 698 |  |  | 
| 699 | 766k |     uint64_t GetSequence() const EXCLUSIVE_LOCKS_REQUIRED(cs) { | 
| 700 | 766k |         return m_sequence_number; | 
| 701 | 766k |     } | 
| 702 |  |  | 
| 703 |  |     /* Check that all direct conflicts are in a cluster size of two or less. Each | 
| 704 |  |      * direct conflict may be in a separate cluster. | 
| 705 |  |      */ | 
| 706 |  |     std::optional<std::string> CheckConflictTopology(const setEntries& direct_conflicts); | 
| 707 |  |  | 
| 708 |  | private: | 
| 709 |  |     /** Remove a set of transactions from the mempool. | 
| 710 |  |      *  If a transaction is in this set, then all in-mempool descendants must | 
| 711 |  |      *  also be in the set, unless this transaction is being removed for being | 
| 712 |  |      *  in a block. | 
| 713 |  |      *  Set updateDescendants to true when removing a tx that was in a block, so | 
| 714 |  |      *  that any in-mempool descendants have their ancestor state updated. | 
| 715 |  |      */ | 
| 716 |  |     void RemoveStaged(setEntries& stage, bool updateDescendants, MemPoolRemovalReason reason) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 717 |  |  | 
| 718 |  |     /** UpdateForDescendants is used by UpdateTransactionsFromBlock to update | 
| 719 |  |      *  the descendants for a single transaction that has been added to the | 
| 720 |  |      *  mempool but may have child transactions in the mempool, eg during a | 
| 721 |  |      *  chain reorg. | 
| 722 |  |      * | 
| 723 |  |      * @pre CTxMemPoolEntry::m_children is correct for the given tx and all | 
| 724 |  |      *      descendants. | 
| 725 |  |      * @pre cachedDescendants is an accurate cache where each entry has all | 
| 726 |  |      *      descendants of the corresponding key, including those that should | 
| 727 |  |      *      be removed for violation of ancestor limits. | 
| 728 |  |      * @post if updateIt has any non-excluded descendants, cachedDescendants has | 
| 729 |  |      *       a new cache line for updateIt. | 
| 730 |  |      * @post descendants_to_remove has a new entry for any descendant which exceeded | 
| 731 |  |      *       ancestor limits relative to updateIt. | 
| 732 |  |      * | 
| 733 |  |      * @param[in] updateIt the entry to update for its descendants | 
| 734 |  |      * @param[in,out] cachedDescendants a cache where each line corresponds to all | 
| 735 |  |      *     descendants. It will be updated with the descendants of the transaction | 
| 736 |  |      *     being updated, so that future invocations don't need to walk the same | 
| 737 |  |      *     transaction again, if encountered in another transaction chain. | 
| 738 |  |      * @param[in] setExclude the set of descendant transactions in the mempool | 
| 739 |  |      *     that must not be accounted for (because any descendants in setExclude | 
| 740 |  |      *     were added to the mempool after the transaction being updated and hence | 
| 741 |  |      *     their state is already reflected in the parent state). | 
| 742 |  |      * @param[out] descendants_to_remove Populated with the txids of entries that | 
| 743 |  |      *     exceed ancestor limits. It's the responsibility of the caller to | 
| 744 |  |      *     removeRecursive them. | 
| 745 |  |      */ | 
| 746 |  |     void UpdateForDescendants(txiter updateIt, cacheMap& cachedDescendants, | 
| 747 |  |                               const std::set<Txid>& setExclude, std::set<Txid>& descendants_to_remove) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 748 |  |     /** Update ancestors of hash to add/remove it as a descendant transaction. */ | 
| 749 |  |     void UpdateAncestorsOf(bool add, txiter hash, setEntries &setAncestors) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 750 |  |     /** Set ancestor state for an entry */ | 
| 751 |  |     void UpdateEntryForAncestors(txiter it, const setEntries &setAncestors) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 752 |  |     /** For each transaction being removed, update ancestors and any direct children. | 
| 753 |  |       * If updateDescendants is true, then also update in-mempool descendants' | 
| 754 |  |       * ancestor state. */ | 
| 755 |  |     void UpdateForRemoveFromMempool(const setEntries &entriesToRemove, bool updateDescendants) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 756 |  |     /** Sever link between specified transaction and direct children. */ | 
| 757 |  |     void UpdateChildrenForRemoval(txiter entry) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 758 |  |  | 
| 759 |  |     /** Before calling removeUnchecked for a given transaction, | 
| 760 |  |      *  UpdateForRemoveFromMempool must be called on the entire (dependent) set | 
| 761 |  |      *  of transactions being removed at the same time.  We use each | 
| 762 |  |      *  CTxMemPoolEntry's m_parents in order to walk ancestors of a | 
| 763 |  |      *  given transaction that is removed, so we can't remove intermediate | 
| 764 |  |      *  transactions in a chain before we've updated all the state for the | 
| 765 |  |      *  removal. | 
| 766 |  |      */ | 
| 767 |  |     void removeUnchecked(txiter entry, MemPoolRemovalReason reason) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 768 |  | public: | 
| 769 |  |     /** visited marks a CTxMemPoolEntry as having been traversed | 
| 770 |  |      * during the lifetime of the most recently created Epoch::Guard | 
| 771 |  |      * and returns false if we are the first visitor, true otherwise. | 
| 772 |  |      * | 
| 773 |  |      * An Epoch::Guard must be held when visited is called or an assert will be | 
| 774 |  |      * triggered. | 
| 775 |  |      * | 
| 776 |  |      */ | 
| 777 |  |     bool visited(const txiter it) const EXCLUSIVE_LOCKS_REQUIRED(cs, m_epoch) | 
| 778 | 0 |     { | 
| 779 | 0 |         return m_epoch.visited(it->m_epoch_marker); | 
| 780 | 0 |     } | 
| 781 |  |  | 
| 782 |  |     bool visited(std::optional<txiter> it) const EXCLUSIVE_LOCKS_REQUIRED(cs, m_epoch) | 
| 783 | 0 |     { | 
| 784 | 0 |         assert(m_epoch.guarded()); // verify guard even when it==nullopt | 
| 785 | 0 |         return !it || visited(*it); | 
| 786 | 0 |     } | 
| 787 |  |  | 
| 788 |  |     /* | 
| 789 |  |      * CTxMemPool::ChangeSet: | 
| 790 |  |      * | 
| 791 |  |      * This class is used for all mempool additions and associated removals (eg | 
| 792 |  |      * due to rbf). Removals that don't need to be evaluated for acceptance, | 
| 793 |  |      * such as removing transactions that appear in a block, or due to reorg, | 
| 794 |  |      * or removals related to mempool limiting or expiry do not need to use | 
| 795 |  |      * this. | 
| 796 |  |      * | 
| 797 |  |      * Callers can interleave calls to StageAddition()/StageRemoval(), and | 
| 798 |  |      * removals may be invoked in any order, but additions must be done in a | 
| 799 |  |      * topological order in the case of transaction packages (ie, parents must | 
| 800 |  |      * be added before children). | 
| 801 |  |      * | 
| 802 |  |      * CalculateChunksForRBF() can be used to calculate the feerate diagram of | 
| 803 |  |      * the proposed set of new transactions and compare with the existing | 
| 804 |  |      * mempool. | 
| 805 |  |      * | 
| 806 |  |      * CalculateMemPoolAncestors() calculates the in-mempool (not including | 
| 807 |  |      * what is in the change set itself) ancestors of a given transaction. | 
| 808 |  |      * | 
| 809 |  |      * Apply() will apply the removals and additions that are staged into the | 
| 810 |  |      * mempool. | 
| 811 |  |      * | 
| 812 |  |      * Only one changeset may exist at a time. While a changeset is | 
| 813 |  |      * outstanding, no removals or additions may be made directly to the | 
| 814 |  |      * mempool. | 
| 815 |  |      */ | 
| 816 |  |     class ChangeSet { | 
| 817 |  |     public: | 
| 818 | 638k |         explicit ChangeSet(CTxMemPool* pool) : m_pool(pool) {} | 
| 819 | 638k |         ~ChangeSet() EXCLUSIVE_LOCKS_REQUIRED(m_pool->cs) { m_pool->m_have_changeset = false; } | 
| 820 |  |  | 
| 821 |  |         ChangeSet(const ChangeSet&) = delete; | 
| 822 |  |         ChangeSet& operator=(const ChangeSet&) = delete; | 
| 823 |  |  | 
| 824 |  |         using TxHandle = CTxMemPool::txiter; | 
| 825 |  |  | 
| 826 |  |         TxHandle StageAddition(const CTransactionRef& tx, const CAmount fee, int64_t time, unsigned int entry_height, uint64_t entry_sequence, bool spends_coinbase, int64_t sigops_cost, LockPoints lp); | 
| 827 | 0 |         void StageRemoval(CTxMemPool::txiter it) { m_to_remove.insert(it); } | 
| 828 |  |  | 
| 829 | 987k |         const CTxMemPool::setEntries& GetRemovals() const { return m_to_remove; } | 
| 830 |  |  | 
| 831 |  |         util::Result<CTxMemPool::setEntries> CalculateMemPoolAncestors(TxHandle tx, const Limits& limits) | 
| 832 | 1.13M |         { | 
| 833 |  |             // Look up transaction in our cache first | 
| 834 | 1.13M |             auto it = m_ancestors.find(tx); | 
| 835 | 1.13M |             if (it != m_ancestors.end()) return it->second493k; | 
| 836 |  |  | 
| 837 |  |             // If not found, try to have the mempool calculate it, and cache | 
| 838 |  |             // for later. | 
| 839 | 638k |             LOCK(m_pool->cs); | Line | Count | Source |  | 259 | 638k | #define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__) | Line | Count | Source |  | 11 | 638k | #define UNIQUE_NAME(name) PASTE2(name, __COUNTER__) | Line | Count | Source |  | 9 | 638k | #define PASTE2(x, y) PASTE(x, y) | Line | Count | Source |  | 8 | 638k | #define PASTE(x, y) x ## y | 
 | 
 | 
 | 
 | 
| 840 | 638k |             auto ret{m_pool->CalculateMemPoolAncestors(*tx, limits)}; | 
| 841 | 638k |             if (ret) m_ancestors.try_emplace(tx, *ret); | 
| 842 | 638k |             return ret; | 
| 843 | 1.13M |         } | 
| 844 |  |  | 
| 845 | 0 |         std::vector<CTransactionRef> GetAddedTxns() const { | 
| 846 | 0 |             std::vector<CTransactionRef> ret; | 
| 847 | 0 |             ret.reserve(m_entry_vec.size()); | 
| 848 | 0 |             for (const auto& entry : m_entry_vec) { | 
| 849 | 0 |                 ret.emplace_back(entry->GetSharedTx()); | 
| 850 | 0 |             } | 
| 851 | 0 |             return ret; | 
| 852 | 0 |         } | 
| 853 |  |  | 
| 854 |  |         /** | 
| 855 |  |          * Calculate the sorted chunks for the old and new mempool relating to the | 
| 856 |  |          * clusters that would be affected by a potential replacement transaction. | 
| 857 |  |          * | 
| 858 |  |          * @return old and new diagram pair respectively, or an error string if the conflicts don't match a calculable topology | 
| 859 |  |          */ | 
| 860 |  |         util::Result<std::pair<std::vector<FeeFrac>, std::vector<FeeFrac>>> CalculateChunksForRBF(); | 
| 861 |  |  | 
| 862 | 0 |         size_t GetTxCount() const { return m_entry_vec.size(); } | 
| 863 | 0 |         const CTransaction& GetAddedTxn(size_t index) const { return m_entry_vec.at(index)->GetTx(); } | 
| 864 |  |  | 
| 865 |  |         void Apply() EXCLUSIVE_LOCKS_REQUIRED(cs_main); | 
| 866 |  |  | 
| 867 |  |     private: | 
| 868 |  |         CTxMemPool* m_pool; | 
| 869 |  |         CTxMemPool::indexed_transaction_set m_to_add; | 
| 870 |  |         std::vector<CTxMemPool::txiter> m_entry_vec; // track the added transactions' insertion order | 
| 871 |  |         // map from the m_to_add index to the ancestors for the transaction | 
| 872 |  |         std::map<CTxMemPool::txiter, CTxMemPool::setEntries, CompareIteratorByHash> m_ancestors; | 
| 873 |  |         CTxMemPool::setEntries m_to_remove; | 
| 874 |  |  | 
| 875 |  |         friend class CTxMemPool; | 
| 876 |  |     }; | 
| 877 |  |  | 
| 878 | 638k |     std::unique_ptr<ChangeSet> GetChangeSet() EXCLUSIVE_LOCKS_REQUIRED(cs) { | 
| 879 | 638k |         Assume(!m_have_changeset); | Line | Count | Source |  | 118 | 638k | #define Assume(val) inline_assertion_check<false>(val, __FILE__, __LINE__, __func__, #val) | 
 | 
| 880 | 638k |         m_have_changeset = true; | 
| 881 | 638k |         return std::make_unique<ChangeSet>(this); | 
| 882 | 638k |     } | 
| 883 |  |  | 
| 884 |  |     bool m_have_changeset GUARDED_BY(cs){false}; | 
| 885 |  |  | 
| 886 |  |     friend class CTxMemPool::ChangeSet; | 
| 887 |  |  | 
| 888 |  | private: | 
| 889 |  |     // Apply the given changeset to the mempool, by removing transactions in | 
| 890 |  |     // the to_remove set and adding transactions in the to_add set. | 
| 891 |  |     void Apply(CTxMemPool::ChangeSet* changeset) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 892 |  |  | 
| 893 |  |     // addNewTransaction must update state for all ancestors of a given transaction, | 
| 894 |  |     // to track size/count of descendant transactions.  First version of | 
| 895 |  |     // addNewTransaction can be used to have it call CalculateMemPoolAncestors(), and | 
| 896 |  |     // then invoke the second version. | 
| 897 |  |     // Note that addNewTransaction is ONLY called (via Apply()) from ATMP | 
| 898 |  |     // outside of tests and any other callers may break wallet's in-mempool | 
| 899 |  |     // tracking (due to lack of CValidationInterface::TransactionAddedToMempool | 
| 900 |  |     // callbacks). | 
| 901 |  |     void addNewTransaction(CTxMemPool::txiter it) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 902 |  |     void addNewTransaction(CTxMemPool::txiter it, CTxMemPool::setEntries& setAncestors) EXCLUSIVE_LOCKS_REQUIRED(cs); | 
| 903 |  | }; | 
| 904 |  |  | 
| 905 |  | /** | 
| 906 |  |  * CCoinsView that brings transactions from a mempool into view. | 
| 907 |  |  * It does not check for spendings by memory pool transactions. | 
| 908 |  |  * Instead, it provides access to all Coins which are either unspent in the | 
| 909 |  |  * base CCoinsView, are outputs from any mempool transaction, or are | 
| 910 |  |  * tracked temporarily to allow transaction dependencies in package validation. | 
| 911 |  |  * This allows transaction replacement to work as expected, as you want to | 
| 912 |  |  * have all inputs "available" to check signatures, and any cycles in the | 
| 913 |  |  * dependency graph are checked directly in AcceptToMemoryPool. | 
| 914 |  |  * It also allows you to sign a double-spend directly in | 
| 915 |  |  * signrawtransactionwithkey and signrawtransactionwithwallet, | 
| 916 |  |  * as long as the conflicting transaction is not yet confirmed. | 
| 917 |  |  */ | 
| 918 |  | class CCoinsViewMemPool : public CCoinsViewBacked | 
| 919 |  | { | 
| 920 |  |     /** | 
| 921 |  |     * Coins made available by transactions being validated. Tracking these allows for package | 
| 922 |  |     * validation, since we can access transaction outputs without submitting them to mempool. | 
| 923 |  |     */ | 
| 924 |  |     std::unordered_map<COutPoint, Coin, SaltedOutpointHasher> m_temp_added; | 
| 925 |  |  | 
| 926 |  |     /** | 
| 927 |  |      * Set of all coins that have been fetched from mempool or created using PackageAddTransaction | 
| 928 |  |      * (not base). Used to track the origin of a coin, see GetNonBaseCoins(). | 
| 929 |  |      */ | 
| 930 |  |     mutable std::unordered_set<COutPoint, SaltedOutpointHasher> m_non_base_coins; | 
| 931 |  | protected: | 
| 932 |  |     const CTxMemPool& mempool; | 
| 933 |  |  | 
| 934 |  | public: | 
| 935 |  |     CCoinsViewMemPool(CCoinsView* baseIn, const CTxMemPool& mempoolIn); | 
| 936 |  |     /** GetCoin, returning whether it exists and is not spent. Also updates m_non_base_coins if the | 
| 937 |  |      * coin is not fetched from base. */ | 
| 938 |  |     std::optional<Coin> GetCoin(const COutPoint& outpoint) const override; | 
| 939 |  |     /** Add the coins created by this transaction. These coins are only temporarily stored in | 
| 940 |  |      * m_temp_added and cannot be flushed to the back end. Only used for package validation. */ | 
| 941 |  |     void PackageAddTransaction(const CTransactionRef& tx); | 
| 942 |  |     /** Get all coins in m_non_base_coins. */ | 
| 943 | 493k |     const std::unordered_set<COutPoint, SaltedOutpointHasher>& GetNonBaseCoins() const { return m_non_base_coins; } | 
| 944 |  |     /** Clear m_temp_added and m_non_base_coins. */ | 
| 945 |  |     void Reset(); | 
| 946 |  | }; | 
| 947 |  | #endif // BITCOIN_TXMEMPOOL_H |