Bitcoin Core  27.99.0
P2P Digital Currency
txorphanage.h
Go to the documentation of this file.
1 // Copyright (c) 2021-2022 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #ifndef BITCOIN_TXORPHANAGE_H
6 #define BITCOIN_TXORPHANAGE_H
7 
8 #include <net.h>
9 #include <primitives/block.h>
10 #include <primitives/transaction.h>
11 #include <sync.h>
12 
13 #include <map>
14 #include <set>
15 
21 class TxOrphanage {
22 public:
25 
27  bool HaveTx(const GenTxid& gtxid) const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
28 
35 
37  int EraseTx(const Txid& txid) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
38 
41 
44 
46  void LimitOrphans(unsigned int max_orphans, FastRandomContext& rng) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
47 
50 
53 
56  {
57  LOCK(m_mutex);
58  return m_orphans.size();
59  }
60 
61 protected:
63  mutable Mutex m_mutex;
64 
65  struct OrphanTx {
68  int64_t nTimeExpire;
69  size_t list_pos;
70  };
71 
74  std::map<Txid, OrphanTx> m_orphans GUARDED_BY(m_mutex);
75 
77  std::map<NodeId, std::set<Txid>> m_peer_work_set GUARDED_BY(m_mutex);
78 
79  using OrphanMap = decltype(m_orphans);
80 
82  {
83  template<typename I>
84  bool operator()(const I& a, const I& b) const
85  {
86  return &(*a) < &(*b);
87  }
88  };
89 
92  std::map<COutPoint, std::set<OrphanMap::iterator, IteratorComparator>> m_outpoint_to_orphan_it GUARDED_BY(m_mutex);
93 
95  std::vector<OrphanMap::iterator> m_orphan_list GUARDED_BY(m_mutex);
96 
99  std::map<Wtxid, OrphanMap::iterator> m_wtxid_to_orphan_it GUARDED_BY(m_mutex);
100 
103 };
104 
105 #endif // BITCOIN_TXORPHANAGE_H
Definition: block.h:69
The basic transaction that is broadcasted on the network and contained in blocks.
Definition: transaction.h:296
Fast randomness source.
Definition: random.h:145
A generic txid reference (txid or wtxid).
Definition: transaction.h:428
A class to track orphan transactions (failed on TX_MISSING_INPUTS) Since we cannot distinguish orphan...
Definition: txorphanage.h:21
bool HaveTxToReconsider(NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Does this peer have any work to do?
int EraseTxNoLock(const Txid &txid) EXCLUSIVE_LOCKS_REQUIRED(m_mutex)
Erase an orphan by txid.
Definition: txorphanage.cpp:63
std::map< Txid, OrphanTx > m_orphans GUARDED_BY(m_mutex)
Map from txid to orphan transaction record.
void AddChildrenToWorkSet(const CTransaction &tx) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Add any orphans that list a particular tx as a parent into the from peer's work set.
decltype(m_orphans) OrphanMap
Definition: txorphanage.h:79
std::map< COutPoint, std::set< OrphanMap::iterator, IteratorComparator > > m_outpoint_to_orphan_it GUARDED_BY(m_mutex)
Index from the parents' COutPoint into the m_orphans.
void LimitOrphans(unsigned int max_orphans, FastRandomContext &rng) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Limit the orphanage to the given maximum.
void EraseForBlock(const CBlock &block) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Erase all orphans included in or invalidated by a new block.
Mutex m_mutex
Guards orphan transactions.
Definition: txorphanage.h:63
bool AddTx(const CTransactionRef &tx, NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Add a new orphan transaction.
Definition: txorphanage.cpp:20
bool HaveTx(const GenTxid &gtxid) const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Check if we already have an orphan transaction (by txid or wtxid)
size_t Size() EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Return how many entries exist in the orphange.
Definition: txorphanage.h:55
CTransactionRef GetTxToReconsider(NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Extract a transaction from a peer's work set Returns nullptr if there are no transactions to work on.
int EraseTx(const Txid &txid) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Erase an orphan by txid.
Definition: txorphanage.cpp:57
void EraseForPeer(NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Erase all orphans announced by a peer (eg, after that peer disconnects)
Definition: txorphanage.cpp:97
std::map< Wtxid, OrphanMap::iterator > m_wtxid_to_orphan_it GUARDED_BY(m_mutex)
Index from wtxid into the m_orphans to lookup orphan transactions using their witness ids.
std::map< NodeId, std::set< Txid > > m_peer_work_set GUARDED_BY(m_mutex)
Which peer provided the orphans that need to be reconsidered.
std::vector< OrphanMap::iterator > m_orphan_list GUARDED_BY(m_mutex)
Orphan transactions in vector for quick random eviction.
int64_t NodeId
Definition: net.h:97
std::shared_ptr< const CTransaction > CTransactionRef
Definition: transaction.h:423
bool operator()(const I &a, const I &b) const
Definition: txorphanage.h:84
CTransactionRef tx
Definition: txorphanage.h:66
#define LOCK(cs)
Definition: sync.h:257
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:49