Bitcoin Core 28.99.0
P2P Digital Currency
|
#include <txdownloadman_impl.h>
Classes | |
struct | PeerInfo |
Public Member Functions | |
CRollingBloomFilter & | RecentRejectsFilter () |
CRollingBloomFilter & | RecentRejectsReconsiderableFilter () |
CRollingBloomFilter & | RecentConfirmedTransactionsFilter () |
TxDownloadManagerImpl (const TxDownloadOptions &options) | |
void | ActiveTipChange () |
void | BlockConnected (const std::shared_ptr< const CBlock > &pblock) |
void | BlockDisconnected () |
bool | AlreadyHaveTx (const GenTxid >xid, bool include_reconsiderable) |
Check whether we already have this gtxid in: More... | |
void | ConnectedPeer (NodeId nodeid, const TxDownloadConnectionInfo &info) |
void | DisconnectedPeer (NodeId nodeid) |
bool | AddTxAnnouncement (NodeId peer, const GenTxid >xid, std::chrono::microseconds now, bool p2p_inv) |
Consider adding this tx hash to txrequest. More... | |
std::vector< GenTxid > | GetRequestsToSend (NodeId nodeid, std::chrono::microseconds current_time) |
Get getdata requests to send. More... | |
void | ReceivedNotFound (NodeId nodeid, const std::vector< uint256 > &txhashes) |
Marks a tx as ReceivedResponse in txrequest. More... | |
std::optional< PackageToValidate > | Find1P1CPackage (const CTransactionRef &ptx, NodeId nodeid) |
Look for a child of this transaction in the orphanage to form a 1-parent-1-child package, skipping any combinations that have already been tried. More... | |
void | MempoolAcceptedTx (const CTransactionRef &tx) |
RejectedTxTodo | MempoolRejectedTx (const CTransactionRef &ptx, const TxValidationState &state, NodeId nodeid, bool first_time_failure) |
void | MempoolRejectedPackage (const Package &package) |
std::pair< bool, std::optional< PackageToValidate > > | ReceivedTx (NodeId nodeid, const CTransactionRef &ptx) |
bool | HaveMoreWork (NodeId nodeid) |
CTransactionRef | GetTxToReconsider (NodeId nodeid) |
void | CheckIsEmpty () |
void | CheckIsEmpty (NodeId nodeid) |
std::vector< TxOrphanage::OrphanTxBase > | GetOrphanTransactions () const |
Public Attributes | |
TxDownloadOptions | m_opts |
TxOrphanage | m_orphanage |
Manages unvalidated tx data (orphan transactions for which we are downloading ancestors). More... | |
TxRequestTracker | m_txrequest |
Tracks candidates for requesting and downloading transaction data. More... | |
std::unique_ptr< CRollingBloomFilter > | m_lazy_recent_rejects {nullptr} |
Filter for transactions that were recently rejected by the mempool. More... | |
std::unique_ptr< CRollingBloomFilter > | m_lazy_recent_rejects_reconsiderable {nullptr} |
Filter for: (1) wtxids of transactions that were recently rejected by the mempool but are eligible for reconsideration if submitted with other transactions. More... | |
std::unique_ptr< CRollingBloomFilter > | m_lazy_recent_confirmed_transactions {nullptr} |
std::map< NodeId, PeerInfo > | m_peer_info |
Information for all of the peers we may download transactions from. More... | |
uint32_t | m_num_wtxid_peers {0} |
Number of wtxid relay peers we have in m_peer_info. More... | |
Definition at line 20 of file txdownloadman_impl.h.
|
inline |
Definition at line 131 of file txdownloadman_impl.h.
void node::TxDownloadManagerImpl::ActiveTipChange | ( | ) |
bool node::TxDownloadManagerImpl::AddTxAnnouncement | ( | NodeId | peer, |
const GenTxid & | gtxid, | ||
std::chrono::microseconds | now, | ||
bool | p2p_inv | ||
) |
Consider adding this tx hash to txrequest.
Should be called whenever a new inv has been received. Also called internally when a transaction is missing parents so that we can request them.
Definition at line 175 of file txdownloadman_impl.cpp.
bool node::TxDownloadManagerImpl::AlreadyHaveTx | ( | const GenTxid & | gtxid, |
bool | include_reconsiderable | ||
) |
Check whether we already have this gtxid in:
Definition at line 125 of file txdownloadman_impl.cpp.
void node::TxDownloadManagerImpl::BlockConnected | ( | const std::shared_ptr< const CBlock > & | pblock | ) |
void node::TxDownloadManagerImpl::BlockDisconnected | ( | ) |
void node::TxDownloadManagerImpl::CheckIsEmpty | ( | ) |
void node::TxDownloadManagerImpl::CheckIsEmpty | ( | NodeId | nodeid | ) |
void node::TxDownloadManagerImpl::ConnectedPeer | ( | NodeId | nodeid, |
const TxDownloadConnectionInfo & | info | ||
) |
void node::TxDownloadManagerImpl::DisconnectedPeer | ( | NodeId | nodeid | ) |
std::optional< PackageToValidate > node::TxDownloadManagerImpl::Find1P1CPackage | ( | const CTransactionRef & | ptx, |
NodeId | nodeid | ||
) |
Look for a child of this transaction in the orphanage to form a 1-parent-1-child package, skipping any combinations that have already been tried.
Return the resulting package along with the senders of its respective transactions, or std::nullopt if no package is found.
Definition at line 240 of file txdownloadman_impl.cpp.
std::vector< TxOrphanage::OrphanTxBase > node::TxDownloadManagerImpl::GetOrphanTransactions | ( | ) | const |
std::vector< GenTxid > node::TxDownloadManagerImpl::GetRequestsToSend | ( | NodeId | nodeid, |
std::chrono::microseconds | current_time | ||
) |
Get getdata requests to send.
Definition at line 207 of file txdownloadman_impl.cpp.
CTransactionRef node::TxDownloadManagerImpl::GetTxToReconsider | ( | NodeId | nodeid | ) |
bool node::TxDownloadManagerImpl::HaveMoreWork | ( | NodeId | nodeid | ) |
void node::TxDownloadManagerImpl::MempoolAcceptedTx | ( | const CTransactionRef & | tx | ) |
void node::TxDownloadManagerImpl::MempoolRejectedPackage | ( | const Package & | package | ) |
node::RejectedTxTodo node::TxDownloadManagerImpl::MempoolRejectedTx | ( | const CTransactionRef & | ptx, |
const TxValidationState & | state, | ||
NodeId | nodeid, | ||
bool | first_time_failure | ||
) |
void node::TxDownloadManagerImpl::ReceivedNotFound | ( | NodeId | nodeid, |
const std::vector< uint256 > & | txhashes | ||
) |
Marks a tx as ReceivedResponse in txrequest.
Definition at line 231 of file txdownloadman_impl.cpp.
std::pair< bool, std::optional< PackageToValidate > > node::TxDownloadManagerImpl::ReceivedTx | ( | NodeId | nodeid, |
const CTransactionRef & | ptx | ||
) |
|
inline |
|
inline |
|
inline |
std::unique_ptr<CRollingBloomFilter> node::TxDownloadManagerImpl::m_lazy_recent_confirmed_transactions {nullptr} |
Definition at line 120 of file txdownloadman_impl.h.
std::unique_ptr<CRollingBloomFilter> node::TxDownloadManagerImpl::m_lazy_recent_rejects {nullptr} |
Filter for transactions that were recently rejected by the mempool.
These are not rerequested until the chain tip changes, at which point the entire filter is reset.
Without this filter we'd be re-requesting txs from each of our peers, increasing bandwidth consumption considerably. For instance, with 100 peers, half of which relay a tx we don't accept, that might be a 50x bandwidth increase. A flooding attacker attempting to roll-over the filter using minimum-sized, 60byte, transactions might manage to send 1000/sec if we have fast peers, so we pick 120,000 to give our peers a two minute window to send invs to us.
Decreasing the false positive rate is fairly cheap, so we pick one in a million to make it highly unlikely for users to have issues with this filter.
We typically only add wtxids to this filter. For non-segwit transactions, the txid == wtxid, so this only prevents us from re-downloading non-segwit transactions when communicating with non-wtxidrelay peers – which is important for avoiding malleation attacks that could otherwise interfere with transaction relay from non-wtxidrelay peers. For communicating with wtxidrelay peers, having the reject filter store wtxids is exactly what we want to avoid redownload of a rejected transaction.
In cases where we can tell that a segwit transaction will fail validation no matter the witness, we may add the txid of such transaction to the filter as well. This can be helpful when communicating with txid-relay peers or if we were to otherwise fetch a transaction via txid (eg in our orphan handling).
Memory used: 1.3 MB
Definition at line 63 of file txdownloadman_impl.h.
std::unique_ptr<CRollingBloomFilter> node::TxDownloadManagerImpl::m_lazy_recent_rejects_reconsiderable {nullptr} |
Filter for: (1) wtxids of transactions that were recently rejected by the mempool but are eligible for reconsideration if submitted with other transactions.
(2) packages (see GetPackageHash) we have already rejected before and should not retry.
Similar to m_lazy_recent_rejects, this filter is used to save bandwidth when e.g. all of our peers have larger mempools and thus lower minimum feerates than us.
When a transaction's error is TxValidationResult::TX_RECONSIDERABLE (in a package or by itself), add its wtxid to this filter. When a package fails for any reason, add the combined hash to this filter.
Upon receiving an announcement for a transaction, if it exists in this filter, do not download the txdata. When considering packages, if it exists in this filter, drop it.
Reset this filter when the chain tip changes.
Parameters are picked to be the same as m_lazy_recent_rejects, with the same rationale.
Definition at line 94 of file txdownloadman_impl.h.
uint32_t node::TxDownloadManagerImpl::m_num_wtxid_peers {0} |
Number of wtxid relay peers we have in m_peer_info.
Definition at line 145 of file txdownloadman_impl.h.
TxDownloadOptions node::TxDownloadManagerImpl::m_opts |
Definition at line 22 of file txdownloadman_impl.h.
TxOrphanage node::TxDownloadManagerImpl::m_orphanage |
Manages unvalidated tx data (orphan transactions for which we are downloading ancestors).
Definition at line 25 of file txdownloadman_impl.h.
Information for all of the peers we may download transactions from.
This is not necessarily all peers we are connected to (no block-relay-only and temporary connections).
Definition at line 142 of file txdownloadman_impl.h.
TxRequestTracker node::TxDownloadManagerImpl::m_txrequest |
Tracks candidates for requesting and downloading transaction data.
Definition at line 27 of file txdownloadman_impl.h.