Skip to content

Commit 651fa40

Browse files
committed
fuzz: tx_pool checks ATMP result invariants
1 parent 3c0b66c commit 651fa40

File tree

1 file changed

+51
-2
lines changed

1 file changed

+51
-2
lines changed

src/test/fuzz/tx_pool.cpp

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,53 @@ CTxMemPool MakeMempool(FuzzedDataProvider& fuzzed_data_provider, const NodeConte
131131
return CTxMemPool{mempool_opts};
132132
}
133133

134+
void CheckATMPInvariants(const MempoolAcceptResult& res, bool txid_in_mempool, bool wtxid_in_mempool)
135+
{
136+
137+
switch (res.m_result_type) {
138+
case MempoolAcceptResult::ResultType::VALID:
139+
{
140+
Assert(txid_in_mempool);
141+
Assert(wtxid_in_mempool);
142+
Assert(res.m_state.IsValid());
143+
Assert(!res.m_state.IsInvalid());
144+
Assert(res.m_replaced_transactions);
145+
Assert(res.m_vsize);
146+
Assert(res.m_base_fees);
147+
Assert(res.m_effective_feerate);
148+
Assert(res.m_wtxids_fee_calculations);
149+
Assert(!res.m_other_wtxid);
150+
break;
151+
}
152+
case MempoolAcceptResult::ResultType::INVALID:
153+
{
154+
// It may be already in the mempool since in ATMP cases we don't set MEMPOOL_ENTRY or DIFFERENT_WITNESS
155+
Assert(!res.m_state.IsValid());
156+
Assert(res.m_state.IsInvalid());
157+
Assert(!res.m_replaced_transactions);
158+
Assert(!res.m_vsize);
159+
Assert(!res.m_base_fees);
160+
// Unable or unwilling to calculate fees
161+
Assert(!res.m_effective_feerate);
162+
Assert(!res.m_wtxids_fee_calculations);
163+
Assert(!res.m_other_wtxid);
164+
break;
165+
}
166+
case MempoolAcceptResult::ResultType::MEMPOOL_ENTRY:
167+
{
168+
// ATMP never sets this; only set in package settings
169+
Assert(false);
170+
break;
171+
}
172+
case MempoolAcceptResult::ResultType::DIFFERENT_WITNESS:
173+
{
174+
// ATMP never sets this; only set in package settings
175+
Assert(false);
176+
break;
177+
}
178+
}
179+
}
180+
134181
FUZZ_TARGET(tx_pool_standard, .init = initialize_tx_pool)
135182
{
136183
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
@@ -258,9 +305,11 @@ FUZZ_TARGET(tx_pool_standard, .init = initialize_tx_pool)
258305
SyncWithValidationInterfaceQueue();
259306
UnregisterSharedValidationInterface(txr);
260307

308+
bool txid_in_mempool = tx_pool.exists(GenTxid::Txid(tx->GetHash()));
309+
bool wtxid_in_mempool = tx_pool.exists(GenTxid::Wtxid(tx->GetWitnessHash()));
310+
CheckATMPInvariants(res, txid_in_mempool, wtxid_in_mempool);
311+
261312
Assert(accepted != added.empty());
262-
Assert(accepted == res.m_state.IsValid());
263-
Assert(accepted != res.m_state.IsInvalid());
264313
if (accepted) {
265314
Assert(added.size() == 1); // For now, no package acceptance
266315
Assert(tx == *added.begin());

0 commit comments

Comments
 (0)