40 std::vector<COutPoint> outpoints;
42 for (uint8_t i = 0; i < 4; i++) {
46 const bool duplicate_input = fuzzed_data_provider.
ConsumeBool();
58 for (uint32_t i = 0; i < num_in; i++) {
59 auto& prevout =
PickValue(fuzzed_data_provider, outpoints);
60 tx_mut.
vin.emplace_back(prevout);
62 if (!duplicate_input) {
63 std::swap(prevout, outpoints.back());
68 for (uint32_t i = 0; i < num_out; i++) {
72 for (
auto& in : tx_mut.
vin) {
73 outpoints.push_back(in.prevout);
77 for (uint32_t i = 0; i < num_out; i++) {
78 outpoints.emplace_back(new_tx->GetHash(), i);
85 if (ptx_potential_parent) {
92 assert(std::any_of(child->vin.cbegin(), child->vin.cend(), [&](
const auto& input) {
93 return input.prevout.hash == ptx_potential_parent->GetHash();
97 assert(std::any_of(child->vin.cbegin(), child->vin.cend(), [&](
const auto& input) {
98 return input.prevout.hash == ptx_potential_parent->GetHash();
110 fuzzed_data_provider,
125 bool add_tx = orphanage.AddTx(tx, peer_id);
127 Assert(!have_tx || !add_tx);
131 bool add_tx = orphanage.AddTx(tx, peer_id);
133 Assert(!have_tx == (GetTransactionWeight(*tx) > MAX_STANDARD_TX_WEIGHT));
134 Assert(!have_tx || !add_tx);
141 Assert(have_tx == orphanage.EraseTx(tx->GetHash()));
146 Assert(!have_tx && !orphanage.EraseTx(tx->GetHash()));
162 if (!ptx_potential_parent || fuzzed_data_provider.
ConsumeBool()) {
163 ptx_potential_parent = tx;
int64_t CAmount
Amount in satoshis (Can be negative)
#define Assert(val)
Identity function.
Serialized script, used inside transaction inputs and outputs.
T ConsumeIntegralInRange(T min, T max)
static GenTxid Wtxid(const uint256 &hash)
static GenTxid Txid(const uint256 &hash)
A class to track orphan transactions (failed on TX_MISSING_INPUTS) Since we cannot distinguish orphan...
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.
void LimitOrphans(unsigned int max_orphans, FastRandomContext &rng) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Limit the orphanage to the given maximum.
bool HaveTx(const GenTxid >xid) const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Check if we already have an orphan transaction (by txid or wtxid)
std::vector< std::pair< CTransactionRef, NodeId > > GetChildrenFromDifferentPeer(const CTransactionRef &parent, NodeId nodeid) const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Get all children that spend from this tx but were not received from nodeid.
size_t Size() EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Return how many entries exist in the orphange.
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.
void EraseForPeer(NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Erase all orphans announced by a peer (eg, after that peer disconnects)
std::vector< CTransactionRef > GetChildrenFromSamePeer(const CTransactionRef &parent, NodeId nodeid) const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Get all children that spend from this tx and were received from nodeid.
static transaction_identifier FromUint256(const uint256 &id)
#define LIMITED_WHILE(condition, limit)
Can be used to limit a theoretically unbounded loop.
static const uint32_t DEFAULT_MAX_ORPHAN_TRANSACTIONS
Default for -maxorphantx, maximum number of orphan transactions kept in memory.
static CTransactionRef MakeTransactionRef(Tx &&txIn)
std::shared_ptr< const CTransaction > CTransactionRef
std::unique_ptr< T > MakeNoLogFileContext(const ChainType chain_type=ChainType::REGTEST, const std::vector< const char * > &extra_args={})
Make a test setup that has disk access to the debug.log file disabled.
A mutable version of CTransaction.
std::vector< CTxOut > vout
int64_t ConsumeTime(FuzzedDataProvider &fuzzed_data_provider, const std::optional< int64_t > &min, const std::optional< int64_t > &max) noexcept
auto & PickValue(FuzzedDataProvider &fuzzed_data_provider, Collection &col)
size_t CallOneOf(FuzzedDataProvider &fuzzed_data_provider, Callables... callables)
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
void initialize_orphanage()
FUZZ_TARGET(txorphan,.init=initialize_orphanage)