mirror of https://github.com/bitcoin/bitcoin.git
fuzz: don't bypass_limits for most mempool harnesses
Using bypass_limits=true is essentially fuzzing part of a reorg only, and results in TRUC invariants unable to be checked. Remove most instances of bypassing limits, leaving one harness able to do so.
This commit is contained in:
parent
65e909dfdd
commit
bbe8e9063c
|
@ -325,7 +325,7 @@ FUZZ_TARGET(ephemeral_package_eval, .init = initialize_tx_pool)
|
||||||
return ProcessNewPackage(chainstate, tx_pool, txs, /*test_accept=*/single_submit, /*client_maxfeerate=*/{}));
|
return ProcessNewPackage(chainstate, tx_pool, txs, /*test_accept=*/single_submit, /*client_maxfeerate=*/{}));
|
||||||
|
|
||||||
const auto res = WITH_LOCK(::cs_main, return AcceptToMemoryPool(chainstate, txs.back(), GetTime(),
|
const auto res = WITH_LOCK(::cs_main, return AcceptToMemoryPool(chainstate, txs.back(), GetTime(),
|
||||||
/*bypass_limits=*/fuzzed_data_provider.ConsumeBool(), /*test_accept=*/!single_submit));
|
/*bypass_limits=*/false, /*test_accept=*/!single_submit));
|
||||||
|
|
||||||
if (!single_submit && result_package.m_state.GetResult() != PackageValidationResult::PCKG_POLICY) {
|
if (!single_submit && result_package.m_state.GetResult() != PackageValidationResult::PCKG_POLICY) {
|
||||||
// We don't know anything about the validity since transactions were randomly generated, so
|
// We don't know anything about the validity since transactions were randomly generated, so
|
||||||
|
|
|
@ -296,7 +296,6 @@ FUZZ_TARGET(tx_pool_standard, .init = initialize_tx_pool)
|
||||||
std::set<CTransactionRef> added;
|
std::set<CTransactionRef> added;
|
||||||
auto txr = std::make_shared<TransactionsDelta>(removed, added);
|
auto txr = std::make_shared<TransactionsDelta>(removed, added);
|
||||||
node.validation_signals->RegisterSharedValidationInterface(txr);
|
node.validation_signals->RegisterSharedValidationInterface(txr);
|
||||||
const bool bypass_limits = fuzzed_data_provider.ConsumeBool();
|
|
||||||
|
|
||||||
// Make sure ProcessNewPackage on one transaction works.
|
// Make sure ProcessNewPackage on one transaction works.
|
||||||
// The result is not guaranteed to be the same as what is returned by ATMP.
|
// The result is not guaranteed to be the same as what is returned by ATMP.
|
||||||
|
@ -311,7 +310,7 @@ FUZZ_TARGET(tx_pool_standard, .init = initialize_tx_pool)
|
||||||
it->second.m_result_type == MempoolAcceptResult::ResultType::INVALID);
|
it->second.m_result_type == MempoolAcceptResult::ResultType::INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto res = WITH_LOCK(::cs_main, return AcceptToMemoryPool(chainstate, tx, GetTime(), bypass_limits, /*test_accept=*/false));
|
const auto res = WITH_LOCK(::cs_main, return AcceptToMemoryPool(chainstate, tx, GetTime(), /*bypass_limits=*/false, /*test_accept=*/false));
|
||||||
const bool accepted = res.m_result_type == MempoolAcceptResult::ResultType::VALID;
|
const bool accepted = res.m_result_type == MempoolAcceptResult::ResultType::VALID;
|
||||||
node.validation_signals->SyncWithValidationInterfaceQueue();
|
node.validation_signals->SyncWithValidationInterfaceQueue();
|
||||||
node.validation_signals->UnregisterSharedValidationInterface(txr);
|
node.validation_signals->UnregisterSharedValidationInterface(txr);
|
||||||
|
@ -394,6 +393,9 @@ FUZZ_TARGET(tx_pool, .init = initialize_tx_pool)
|
||||||
|
|
||||||
chainstate.SetMempool(&tx_pool);
|
chainstate.SetMempool(&tx_pool);
|
||||||
|
|
||||||
|
// If we ever bypass limits, do not do TRUC invariants checks
|
||||||
|
bool ever_bypassed_limits{false};
|
||||||
|
|
||||||
LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 300)
|
LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 300)
|
||||||
{
|
{
|
||||||
const auto mut_tx = ConsumeTransaction(fuzzed_data_provider, txids);
|
const auto mut_tx = ConsumeTransaction(fuzzed_data_provider, txids);
|
||||||
|
@ -412,13 +414,17 @@ FUZZ_TARGET(tx_pool, .init = initialize_tx_pool)
|
||||||
tx_pool.PrioritiseTransaction(txid, delta);
|
tx_pool.PrioritiseTransaction(txid, delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const bool bypass_limits{fuzzed_data_provider.ConsumeBool()};
|
||||||
|
ever_bypassed_limits |= bypass_limits;
|
||||||
|
|
||||||
const auto tx = MakeTransactionRef(mut_tx);
|
const auto tx = MakeTransactionRef(mut_tx);
|
||||||
const bool bypass_limits = fuzzed_data_provider.ConsumeBool();
|
|
||||||
const auto res = WITH_LOCK(::cs_main, return AcceptToMemoryPool(chainstate, tx, GetTime(), bypass_limits, /*test_accept=*/false));
|
const auto res = WITH_LOCK(::cs_main, return AcceptToMemoryPool(chainstate, tx, GetTime(), bypass_limits, /*test_accept=*/false));
|
||||||
const bool accepted = res.m_result_type == MempoolAcceptResult::ResultType::VALID;
|
const bool accepted = res.m_result_type == MempoolAcceptResult::ResultType::VALID;
|
||||||
if (accepted) {
|
if (accepted) {
|
||||||
txids.push_back(tx->GetHash());
|
txids.push_back(tx->GetHash());
|
||||||
CheckMempoolTRUCInvariants(tx_pool);
|
if (!ever_bypassed_limits) {
|
||||||
|
CheckMempoolTRUCInvariants(tx_pool);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Finish(fuzzed_data_provider, tx_pool, chainstate);
|
Finish(fuzzed_data_provider, tx_pool, chainstate);
|
||||||
|
|
Loading…
Reference in New Issue