Skip to content

Commit 2d21060

Browse files
committed
Merge bitcoin/bitcoin#30300: fuzz: have package_rbf always make small txns
4ccb3d6 fuzz: have package_rbf always make small txns (Greg Sanders) Pull request description: hopefully resolves bitcoin/bitcoin#30241 The fuzz target is generating a large amount of transactions, but the core of the logic is ConsumeTxMemPoolEntry making the mempool entries for adding to the mempool. Since ConsumeTxMemPoolEntry generates its own transaction "vsize", we can improve efficiency of the target by explicitly creating very small transactions, reducing the hashing and memory burden. ACKs for top commit: maflcko: lgtm ACK 4ccb3d6 hodlinator: ACK 4ccb3d6 glozow: ACK 4ccb3d6 Tree-SHA512: 5d2e7e98460c6144dfe7deac554865e2e8e0e5f934dbdf5857dc4b4f471a64dc933297dc0dcf516f748a4348be6bd184808b7ece17ce073fdcc77f81b74c64de
2 parents ac4ea78 + 4ccb3d6 commit 2d21060

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

src/test/fuzz/rbf.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,10 @@ FUZZ_TARGET(package_rbf, .init = initialize_package_rbf)
9191
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
9292
SetMockTime(ConsumeTime(fuzzed_data_provider));
9393

94-
std::optional<CMutableTransaction> child = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider, TX_WITH_WITNESS);
95-
if (!child) return;
94+
// "Real" virtual size is not important for this test since ConsumeTxMemPoolEntry generates its own virtual size values
95+
// so we construct small transactions for performance reasons. Child simply needs an input for later to perhaps connect to parent.
96+
CMutableTransaction child;
97+
child.vin.resize(1);
9698

9799
bilingual_str error;
98100
CTxMemPool pool{MemPoolOptionsForTest(g_setup->m_node), error};
@@ -113,15 +115,13 @@ FUZZ_TARGET(package_rbf, .init = initialize_package_rbf)
113115
LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), NUM_ITERS)
114116
{
115117
// Make sure txns only have one input, and that a unique input is given to avoid circular references
116-
std::optional<CMutableTransaction> parent = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider, TX_WITH_WITNESS);
117-
if (!parent) {
118-
return;
119-
}
118+
CMutableTransaction parent;
120119
assert(iter <= g_outpoints.size());
121-
parent->vin.resize(1);
122-
parent->vin[0].prevout = g_outpoints[iter++];
120+
parent.vin.resize(1);
121+
parent.vin[0].prevout = g_outpoints[iter++];
122+
parent.vout.emplace_back(0, CScript());
123123

124-
mempool_txs.emplace_back(*parent);
124+
mempool_txs.emplace_back(parent);
125125
const auto parent_entry = ConsumeTxMemPoolEntry(fuzzed_data_provider, mempool_txs.back());
126126
running_vsize_total += parent_entry.GetTxSize();
127127
if (running_vsize_total > std::numeric_limits<int32_t>::max()) {
@@ -130,10 +130,10 @@ FUZZ_TARGET(package_rbf, .init = initialize_package_rbf)
130130
break;
131131
}
132132
pool.addUnchecked(parent_entry);
133-
if (fuzzed_data_provider.ConsumeBool() && !child->vin.empty()) {
134-
child->vin[0].prevout = COutPoint{mempool_txs.back().GetHash(), 0};
133+
if (fuzzed_data_provider.ConsumeBool()) {
134+
child.vin[0].prevout = COutPoint{mempool_txs.back().GetHash(), 0};
135135
}
136-
mempool_txs.emplace_back(*child);
136+
mempool_txs.emplace_back(child);
137137
const auto child_entry = ConsumeTxMemPoolEntry(fuzzed_data_provider, mempool_txs.back());
138138
running_vsize_total += child_entry.GetTxSize();
139139
if (running_vsize_total > std::numeric_limits<int32_t>::max()) {

0 commit comments

Comments
 (0)