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 #include <util/time.h>
13 
14 #include <map>
15 #include <set>
16 
23 class TxOrphanage {
24 public:
26  bool AddTx(const CTransactionRef& tx, NodeId peer);
27 
29  bool HaveTx(const Wtxid& wtxid) const;
30 
37 
39  int EraseTx(const Wtxid& wtxid);
40 
42  void EraseForPeer(NodeId peer);
43 
45  void EraseForBlock(const CBlock& block);
46 
48  void LimitOrphans(unsigned int max_orphans, FastRandomContext& rng);
49 
51  void AddChildrenToWorkSet(const CTransaction& tx);
52 
54  bool HaveTxToReconsider(NodeId peer);
55 
58  std::vector<CTransactionRef> GetChildrenFromSamePeer(const CTransactionRef& parent, NodeId nodeid) const;
59 
62  std::vector<std::pair<CTransactionRef, NodeId>> GetChildrenFromDifferentPeer(const CTransactionRef& parent, NodeId nodeid) const;
63 
65  size_t Size()
66  {
67  return m_orphans.size();
68  }
69 
70 protected:
71  struct OrphanTx {
75  size_t list_pos;
76  };
77 
80  std::map<Wtxid, OrphanTx> m_orphans;
81 
83  std::map<NodeId, std::set<Wtxid>> m_peer_work_set;
84 
85  using OrphanMap = decltype(m_orphans);
86 
88  {
89  template<typename I>
90  bool operator()(const I& a, const I& b) const
91  {
92  return a->first < b->first;
93  }
94  };
95 
98  std::map<COutPoint, std::set<OrphanMap::iterator, IteratorComparator>> m_outpoint_to_orphan_it;
99 
101  std::vector<OrphanMap::iterator> m_orphan_list;
102 
105 };
106 
107 #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:377
A class to track orphan transactions (failed on TX_MISSING_INPUTS) Since we cannot distinguish orphan...
Definition: txorphanage.h:23
bool AddTx(const CTransactionRef &tx, NodeId peer)
Add a new orphan transaction.
Definition: txorphanage.cpp:21
void EraseForPeer(NodeId peer)
Erase all orphans announced by a peer (eg, after that peer disconnects)
Definition: txorphanage.cpp:89
void AddChildrenToWorkSet(const CTransaction &tx)
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:85
void LimitOrphans(unsigned int max_orphans, FastRandomContext &rng)
Limit the orphanage to the given maximum.
int EraseTx(const Wtxid &wtxid)
Erase an orphan by wtxid.
Definition: txorphanage.cpp:54
void EraseForBlock(const CBlock &block)
Erase all orphans included in or invalidated by a new block.
std::map< NodeId, std::set< Wtxid > > m_peer_work_set
Which peer provided the orphans that need to be reconsidered.
Definition: txorphanage.h:83
std::map< COutPoint, std::set< OrphanMap::iterator, IteratorComparator > > m_outpoint_to_orphan_it
Index from the parents' COutPoint into the m_orphans.
Definition: txorphanage.h:98
std::vector< std::pair< CTransactionRef, NodeId > > GetChildrenFromDifferentPeer(const CTransactionRef &parent, NodeId nodeid) const
Get all children that spend from this tx but were not received from nodeid.
std::vector< OrphanMap::iterator > m_orphan_list
Orphan transactions in vector for quick random eviction.
Definition: txorphanage.h:101
std::vector< CTransactionRef > GetChildrenFromSamePeer(const CTransactionRef &parent, NodeId nodeid) const
Get all children that spend from this tx and were received from nodeid.
std::map< Wtxid, OrphanTx > m_orphans
Map from wtxid to orphan transaction record.
Definition: txorphanage.h:80
size_t Size()
Return how many entries exist in the orphange.
Definition: txorphanage.h:65
bool HaveTx(const Wtxid &wtxid) const
Check if we already have an orphan transaction (by wtxid only)
bool HaveTxToReconsider(NodeId peer)
Does this peer have any work to do?
CTransactionRef GetTxToReconsider(NodeId peer)
Extract a transaction from a peer's work set Returns nullptr if there are no transactions to work on.
NodeSeconds m_next_sweep
Timestamp for the next scheduled sweep of expired orphans.
Definition: txorphanage.h:104
transaction_identifier represents the two canonical transaction identifier types (txid,...
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:90
CTransactionRef tx
Definition: txorphanage.h:72
NodeSeconds nTimeExpire
Definition: txorphanage.h:74
std::chrono::time_point< NodeClock, std::chrono::seconds > NodeSeconds
Definition: time.h:23