Changeset View
Changeset View
Standalone View
Standalone View
src/txorphanage.h
// Copyright (c) 2021 The Bitcoin Core developers | // Copyright (c) 2021 The Bitcoin Core developers | ||||
// Distributed under the MIT software license, see the accompanying | // Distributed under the MIT software license, see the accompanying | ||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
#ifndef BITCOIN_TXORPHANAGE_H | #ifndef BITCOIN_TXORPHANAGE_H | ||||
#define BITCOIN_TXORPHANAGE_H | #define BITCOIN_TXORPHANAGE_H | ||||
#include <net.h> | #include <net.h> | ||||
#include <primitives/block.h> | #include <primitives/block.h> | ||||
#include <primitives/transaction.h> | #include <primitives/transaction.h> | ||||
#include <sync.h> | #include <sync.h> | ||||
/** Guards orphan transactions and extra txs for compact blocks */ | /** Guards orphan transactions and extra txs for compact blocks */ | ||||
extern RecursiveMutex g_cs_orphans; | extern RecursiveMutex g_cs_orphans; | ||||
/** Data structure to keep track of orphan transactions */ | /** | ||||
* A class to track orphan transactions (failed on TX_MISSING_INPUTS) | |||||
* Since we cannot distinguish orphans from bad transactions with | |||||
* non-existent inputs, we heavily limit the number of orphans | |||||
* we keep and the duration we keep them for. | |||||
*/ | |||||
class TxOrphanage { | class TxOrphanage { | ||||
public: | public: | ||||
/** Add a new orphan transaction */ | /** Add a new orphan transaction */ | ||||
bool AddTx(const CTransactionRef &tx, NodeId peer) | bool AddTx(const CTransactionRef &tx, NodeId peer) | ||||
EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); | EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); | ||||
/** Check if we already have an orphan transaction */ | /** Check if we already have an orphan transaction */ | ||||
bool HaveTx(const TxId &txid) const LOCKS_EXCLUDED(g_cs_orphans); | bool HaveTx(const TxId &txid) const LOCKS_EXCLUDED(g_cs_orphans); | ||||
/** | /** | ||||
* Get the details of an orphan transaction (returns nullptr if not found) | * Get an orphan transaction and its originating peer | ||||
* (Transaction ref will be nullptr if not found) | |||||
*/ | */ | ||||
std::pair<CTransactionRef, NodeId> GetTx(const TxId &txid) const | std::pair<CTransactionRef, NodeId> GetTx(const TxId &txid) const | ||||
EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); | EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); | ||||
/** Erase an orphan by txid */ | /** Erase an orphan by txid */ | ||||
int EraseTx(const TxId &txid) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); | int EraseTx(const TxId &txid) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); | ||||
/** | /** | ||||
* Erase all orphans announced by a peer (eg, after that peer disconnects) | * Erase all orphans announced by a peer (eg, after that peer disconnects) | ||||
*/ | */ | ||||
void EraseForPeer(NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); | void EraseForPeer(NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); | ||||
/** Erase all orphans included in / invalidated by a new block */ | /** Erase all orphans included in or invalidated by a new block */ | ||||
void EraseForBlock(const CBlock &block) LOCKS_EXCLUDED(g_cs_orphans); | void EraseForBlock(const CBlock &block) LOCKS_EXCLUDED(g_cs_orphans); | ||||
/** Limit the orphanage to the given maximum */ | /** Limit the orphanage to the given maximum */ | ||||
unsigned int LimitOrphans(unsigned int max_orphans) | unsigned int LimitOrphans(unsigned int max_orphans) | ||||
EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); | EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); | ||||
/** | /** | ||||
* Add any orphans that list a particular tx as a parent into a peer's work | * Add any orphans that list a particular tx as a parent into a peer's work | ||||
▲ Show 20 Lines • Show All 41 Lines • Show Last 20 Lines |