mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-10-05 22:25:51 +02:00
[unit test] TxOrphanage handling of same-txid-different-witness txns
This commit is contained in:
@@ -70,6 +70,16 @@ static CTransactionRef MakeTransactionSpending(const std::vector<COutPoint>& out
|
|||||||
return MakeTransactionRef(tx);
|
return MakeTransactionRef(tx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make another (not necessarily valid) tx with the same txid but different wtxid.
|
||||||
|
static CTransactionRef MakeMutation(const CTransactionRef& ptx)
|
||||||
|
{
|
||||||
|
CMutableTransaction tx(*ptx);
|
||||||
|
tx.vin[0].scriptWitness.stack.push_back({5});
|
||||||
|
auto mutated_tx = MakeTransactionRef(tx);
|
||||||
|
assert(ptx->GetHash() == mutated_tx->GetHash());
|
||||||
|
return mutated_tx;
|
||||||
|
}
|
||||||
|
|
||||||
static bool EqualTxns(const std::set<CTransactionRef>& set_txns, const std::vector<CTransactionRef>& vec_txns)
|
static bool EqualTxns(const std::set<CTransactionRef>& set_txns, const std::vector<CTransactionRef>& vec_txns)
|
||||||
{
|
{
|
||||||
if (vec_txns.size() != set_txns.size()) return false;
|
if (vec_txns.size() != set_txns.size()) return false;
|
||||||
@@ -180,6 +190,49 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans)
|
|||||||
BOOST_CHECK(orphanage.CountOrphans() == 0);
|
BOOST_CHECK(orphanage.CountOrphans() == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(same_txid_diff_witness)
|
||||||
|
{
|
||||||
|
FastRandomContext det_rand{true};
|
||||||
|
TxOrphanage orphanage;
|
||||||
|
NodeId peer{0};
|
||||||
|
|
||||||
|
std::vector<COutPoint> empty_outpoints;
|
||||||
|
auto parent = MakeTransactionSpending(empty_outpoints, det_rand);
|
||||||
|
|
||||||
|
// Create children to go into orphanage.
|
||||||
|
auto child_normal = MakeTransactionSpending({{parent->GetHash(), 0}}, det_rand);
|
||||||
|
auto child_mutated = MakeMutation(child_normal);
|
||||||
|
|
||||||
|
const auto& normal_wtxid = child_normal->GetWitnessHash();
|
||||||
|
const auto& mutated_wtxid = child_mutated->GetWitnessHash();
|
||||||
|
BOOST_CHECK(normal_wtxid != mutated_wtxid);
|
||||||
|
|
||||||
|
BOOST_CHECK(orphanage.AddTx(child_normal, peer));
|
||||||
|
// EraseTx fails as transaction by this wtxid doesn't exist.
|
||||||
|
BOOST_CHECK_EQUAL(orphanage.EraseTx(mutated_wtxid), 0);
|
||||||
|
BOOST_CHECK(orphanage.HaveTx(normal_wtxid));
|
||||||
|
BOOST_CHECK(!orphanage.HaveTx(mutated_wtxid));
|
||||||
|
|
||||||
|
// Must succeed. Both transactions should be present in orphanage.
|
||||||
|
BOOST_CHECK(orphanage.AddTx(child_mutated, peer));
|
||||||
|
BOOST_CHECK(orphanage.HaveTx(normal_wtxid));
|
||||||
|
BOOST_CHECK(orphanage.HaveTx(mutated_wtxid));
|
||||||
|
|
||||||
|
// Outpoints map should track all entries: check that both are returned as children of the parent.
|
||||||
|
std::set<CTransactionRef> expected_children{child_normal, child_mutated};
|
||||||
|
BOOST_CHECK(EqualTxns(expected_children, orphanage.GetChildrenFromSamePeer(parent, peer)));
|
||||||
|
|
||||||
|
// Erase by wtxid: mutated first
|
||||||
|
BOOST_CHECK_EQUAL(orphanage.EraseTx(mutated_wtxid), 1);
|
||||||
|
BOOST_CHECK(orphanage.HaveTx(normal_wtxid));
|
||||||
|
BOOST_CHECK(!orphanage.HaveTx(mutated_wtxid));
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(orphanage.EraseTx(normal_wtxid), 1);
|
||||||
|
BOOST_CHECK(!orphanage.HaveTx(normal_wtxid));
|
||||||
|
BOOST_CHECK(!orphanage.HaveTx(mutated_wtxid));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(get_children)
|
BOOST_AUTO_TEST_CASE(get_children)
|
||||||
{
|
{
|
||||||
FastRandomContext det_rand{true};
|
FastRandomContext det_rand{true};
|
||||||
|
Reference in New Issue
Block a user