|
|
@ -126,28 +126,28 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest) |
|
|
|
tx1.vout.resize(1); |
|
|
|
tx1.vout.resize(1); |
|
|
|
tx1.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; |
|
|
|
tx1.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; |
|
|
|
tx1.vout[0].nValue = 10 * COIN; |
|
|
|
tx1.vout[0].nValue = 10 * COIN; |
|
|
|
pool.addUnchecked(tx1.GetHash(), entry.Fee(10000LL).Priority(10.0).FromTx(tx1)); |
|
|
|
pool.addUnchecked(tx1.GetHash(), entry.Fee(10000LL).FromTx(tx1)); |
|
|
|
|
|
|
|
|
|
|
|
/* highest fee */ |
|
|
|
/* highest fee */ |
|
|
|
CMutableTransaction tx2 = CMutableTransaction(); |
|
|
|
CMutableTransaction tx2 = CMutableTransaction(); |
|
|
|
tx2.vout.resize(1); |
|
|
|
tx2.vout.resize(1); |
|
|
|
tx2.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; |
|
|
|
tx2.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; |
|
|
|
tx2.vout[0].nValue = 2 * COIN; |
|
|
|
tx2.vout[0].nValue = 2 * COIN; |
|
|
|
pool.addUnchecked(tx2.GetHash(), entry.Fee(20000LL).Priority(9.0).FromTx(tx2)); |
|
|
|
pool.addUnchecked(tx2.GetHash(), entry.Fee(20000LL).FromTx(tx2)); |
|
|
|
|
|
|
|
|
|
|
|
/* lowest fee */ |
|
|
|
/* lowest fee */ |
|
|
|
CMutableTransaction tx3 = CMutableTransaction(); |
|
|
|
CMutableTransaction tx3 = CMutableTransaction(); |
|
|
|
tx3.vout.resize(1); |
|
|
|
tx3.vout.resize(1); |
|
|
|
tx3.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; |
|
|
|
tx3.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; |
|
|
|
tx3.vout[0].nValue = 5 * COIN; |
|
|
|
tx3.vout[0].nValue = 5 * COIN; |
|
|
|
pool.addUnchecked(tx3.GetHash(), entry.Fee(0LL).Priority(100.0).FromTx(tx3)); |
|
|
|
pool.addUnchecked(tx3.GetHash(), entry.Fee(0LL).FromTx(tx3)); |
|
|
|
|
|
|
|
|
|
|
|
/* 2nd highest fee */ |
|
|
|
/* 2nd highest fee */ |
|
|
|
CMutableTransaction tx4 = CMutableTransaction(); |
|
|
|
CMutableTransaction tx4 = CMutableTransaction(); |
|
|
|
tx4.vout.resize(1); |
|
|
|
tx4.vout.resize(1); |
|
|
|
tx4.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; |
|
|
|
tx4.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; |
|
|
|
tx4.vout[0].nValue = 6 * COIN; |
|
|
|
tx4.vout[0].nValue = 6 * COIN; |
|
|
|
pool.addUnchecked(tx4.GetHash(), entry.Fee(15000LL).Priority(1.0).FromTx(tx4)); |
|
|
|
pool.addUnchecked(tx4.GetHash(), entry.Fee(15000LL).FromTx(tx4)); |
|
|
|
|
|
|
|
|
|
|
|
/* equal fee rate to tx1, but newer */ |
|
|
|
/* equal fee rate to tx1, but newer */ |
|
|
|
CMutableTransaction tx5 = CMutableTransaction(); |
|
|
|
CMutableTransaction tx5 = CMutableTransaction(); |
|
|
@ -155,7 +155,6 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest) |
|
|
|
tx5.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; |
|
|
|
tx5.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; |
|
|
|
tx5.vout[0].nValue = 11 * COIN; |
|
|
|
tx5.vout[0].nValue = 11 * COIN; |
|
|
|
entry.nTime = 1; |
|
|
|
entry.nTime = 1; |
|
|
|
entry.dPriority = 10.0; |
|
|
|
|
|
|
|
pool.addUnchecked(tx5.GetHash(), entry.Fee(10000LL).FromTx(tx5)); |
|
|
|
pool.addUnchecked(tx5.GetHash(), entry.Fee(10000LL).FromTx(tx5)); |
|
|
|
BOOST_CHECK_EQUAL(pool.size(), 5); |
|
|
|
BOOST_CHECK_EQUAL(pool.size(), 5); |
|
|
|
|
|
|
|
|
|
|
@ -328,14 +327,14 @@ BOOST_AUTO_TEST_CASE(MempoolAncestorIndexingTest) |
|
|
|
tx1.vout.resize(1); |
|
|
|
tx1.vout.resize(1); |
|
|
|
tx1.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; |
|
|
|
tx1.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; |
|
|
|
tx1.vout[0].nValue = 10 * COIN; |
|
|
|
tx1.vout[0].nValue = 10 * COIN; |
|
|
|
pool.addUnchecked(tx1.GetHash(), entry.Fee(10000LL).Priority(10.0).FromTx(tx1)); |
|
|
|
pool.addUnchecked(tx1.GetHash(), entry.Fee(10000LL).FromTx(tx1)); |
|
|
|
|
|
|
|
|
|
|
|
/* highest fee */ |
|
|
|
/* highest fee */ |
|
|
|
CMutableTransaction tx2 = CMutableTransaction(); |
|
|
|
CMutableTransaction tx2 = CMutableTransaction(); |
|
|
|
tx2.vout.resize(1); |
|
|
|
tx2.vout.resize(1); |
|
|
|
tx2.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; |
|
|
|
tx2.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; |
|
|
|
tx2.vout[0].nValue = 2 * COIN; |
|
|
|
tx2.vout[0].nValue = 2 * COIN; |
|
|
|
pool.addUnchecked(tx2.GetHash(), entry.Fee(20000LL).Priority(9.0).FromTx(tx2)); |
|
|
|
pool.addUnchecked(tx2.GetHash(), entry.Fee(20000LL).FromTx(tx2)); |
|
|
|
uint64_t tx2Size = GetVirtualTransactionSize(tx2); |
|
|
|
uint64_t tx2Size = GetVirtualTransactionSize(tx2); |
|
|
|
|
|
|
|
|
|
|
|
/* lowest fee */ |
|
|
|
/* lowest fee */ |
|
|
@ -343,14 +342,14 @@ BOOST_AUTO_TEST_CASE(MempoolAncestorIndexingTest) |
|
|
|
tx3.vout.resize(1); |
|
|
|
tx3.vout.resize(1); |
|
|
|
tx3.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; |
|
|
|
tx3.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; |
|
|
|
tx3.vout[0].nValue = 5 * COIN; |
|
|
|
tx3.vout[0].nValue = 5 * COIN; |
|
|
|
pool.addUnchecked(tx3.GetHash(), entry.Fee(0LL).Priority(100.0).FromTx(tx3)); |
|
|
|
pool.addUnchecked(tx3.GetHash(), entry.Fee(0LL).FromTx(tx3)); |
|
|
|
|
|
|
|
|
|
|
|
/* 2nd highest fee */ |
|
|
|
/* 2nd highest fee */ |
|
|
|
CMutableTransaction tx4 = CMutableTransaction(); |
|
|
|
CMutableTransaction tx4 = CMutableTransaction(); |
|
|
|
tx4.vout.resize(1); |
|
|
|
tx4.vout.resize(1); |
|
|
|
tx4.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; |
|
|
|
tx4.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; |
|
|
|
tx4.vout[0].nValue = 6 * COIN; |
|
|
|
tx4.vout[0].nValue = 6 * COIN; |
|
|
|
pool.addUnchecked(tx4.GetHash(), entry.Fee(15000LL).Priority(1.0).FromTx(tx4)); |
|
|
|
pool.addUnchecked(tx4.GetHash(), entry.Fee(15000LL).FromTx(tx4)); |
|
|
|
|
|
|
|
|
|
|
|
/* equal fee rate to tx1, but newer */ |
|
|
|
/* equal fee rate to tx1, but newer */ |
|
|
|
CMutableTransaction tx5 = CMutableTransaction(); |
|
|
|
CMutableTransaction tx5 = CMutableTransaction(); |
|
|
@ -434,7 +433,6 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) |
|
|
|
{ |
|
|
|
{ |
|
|
|
CTxMemPool pool(CFeeRate(1000)); |
|
|
|
CTxMemPool pool(CFeeRate(1000)); |
|
|
|
TestMemPoolEntryHelper entry; |
|
|
|
TestMemPoolEntryHelper entry; |
|
|
|
entry.dPriority = 10.0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CMutableTransaction tx1 = CMutableTransaction(); |
|
|
|
CMutableTransaction tx1 = CMutableTransaction(); |
|
|
|
tx1.vin.resize(1); |
|
|
|
tx1.vin.resize(1); |
|
|
@ -442,7 +440,7 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) |
|
|
|
tx1.vout.resize(1); |
|
|
|
tx1.vout.resize(1); |
|
|
|
tx1.vout[0].scriptPubKey = CScript() << OP_1 << OP_EQUAL; |
|
|
|
tx1.vout[0].scriptPubKey = CScript() << OP_1 << OP_EQUAL; |
|
|
|
tx1.vout[0].nValue = 10 * COIN; |
|
|
|
tx1.vout[0].nValue = 10 * COIN; |
|
|
|
pool.addUnchecked(tx1.GetHash(), entry.Fee(10000LL).FromTx(tx1, &pool)); |
|
|
|
pool.addUnchecked(tx1.GetHash(), entry.Fee(10000LL).FromTx(tx1)); |
|
|
|
|
|
|
|
|
|
|
|
CMutableTransaction tx2 = CMutableTransaction(); |
|
|
|
CMutableTransaction tx2 = CMutableTransaction(); |
|
|
|
tx2.vin.resize(1); |
|
|
|
tx2.vin.resize(1); |
|
|
@ -450,7 +448,7 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) |
|
|
|
tx2.vout.resize(1); |
|
|
|
tx2.vout.resize(1); |
|
|
|
tx2.vout[0].scriptPubKey = CScript() << OP_2 << OP_EQUAL; |
|
|
|
tx2.vout[0].scriptPubKey = CScript() << OP_2 << OP_EQUAL; |
|
|
|
tx2.vout[0].nValue = 10 * COIN; |
|
|
|
tx2.vout[0].nValue = 10 * COIN; |
|
|
|
pool.addUnchecked(tx2.GetHash(), entry.Fee(5000LL).FromTx(tx2, &pool)); |
|
|
|
pool.addUnchecked(tx2.GetHash(), entry.Fee(5000LL).FromTx(tx2)); |
|
|
|
|
|
|
|
|
|
|
|
pool.TrimToSize(pool.DynamicMemoryUsage()); // should do nothing
|
|
|
|
pool.TrimToSize(pool.DynamicMemoryUsage()); // should do nothing
|
|
|
|
BOOST_CHECK(pool.exists(tx1.GetHash())); |
|
|
|
BOOST_CHECK(pool.exists(tx1.GetHash())); |
|
|
@ -460,7 +458,7 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) |
|
|
|
BOOST_CHECK(pool.exists(tx1.GetHash())); |
|
|
|
BOOST_CHECK(pool.exists(tx1.GetHash())); |
|
|
|
BOOST_CHECK(!pool.exists(tx2.GetHash())); |
|
|
|
BOOST_CHECK(!pool.exists(tx2.GetHash())); |
|
|
|
|
|
|
|
|
|
|
|
pool.addUnchecked(tx2.GetHash(), entry.FromTx(tx2, &pool)); |
|
|
|
pool.addUnchecked(tx2.GetHash(), entry.FromTx(tx2)); |
|
|
|
CMutableTransaction tx3 = CMutableTransaction(); |
|
|
|
CMutableTransaction tx3 = CMutableTransaction(); |
|
|
|
tx3.vin.resize(1); |
|
|
|
tx3.vin.resize(1); |
|
|
|
tx3.vin[0].prevout = COutPoint(tx2.GetHash(), 0); |
|
|
|
tx3.vin[0].prevout = COutPoint(tx2.GetHash(), 0); |
|
|
@ -468,7 +466,7 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) |
|
|
|
tx3.vout.resize(1); |
|
|
|
tx3.vout.resize(1); |
|
|
|
tx3.vout[0].scriptPubKey = CScript() << OP_3 << OP_EQUAL; |
|
|
|
tx3.vout[0].scriptPubKey = CScript() << OP_3 << OP_EQUAL; |
|
|
|
tx3.vout[0].nValue = 10 * COIN; |
|
|
|
tx3.vout[0].nValue = 10 * COIN; |
|
|
|
pool.addUnchecked(tx3.GetHash(), entry.Fee(20000LL).FromTx(tx3, &pool)); |
|
|
|
pool.addUnchecked(tx3.GetHash(), entry.Fee(20000LL).FromTx(tx3)); |
|
|
|
|
|
|
|
|
|
|
|
pool.TrimToSize(pool.DynamicMemoryUsage() * 3 / 4); // tx3 should pay for tx2 (CPFP)
|
|
|
|
pool.TrimToSize(pool.DynamicMemoryUsage() * 3 / 4); // tx3 should pay for tx2 (CPFP)
|
|
|
|
BOOST_CHECK(!pool.exists(tx1.GetHash())); |
|
|
|
BOOST_CHECK(!pool.exists(tx1.GetHash())); |
|
|
@ -531,10 +529,10 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) |
|
|
|
tx7.vout[1].scriptPubKey = CScript() << OP_7 << OP_EQUAL; |
|
|
|
tx7.vout[1].scriptPubKey = CScript() << OP_7 << OP_EQUAL; |
|
|
|
tx7.vout[1].nValue = 10 * COIN; |
|
|
|
tx7.vout[1].nValue = 10 * COIN; |
|
|
|
|
|
|
|
|
|
|
|
pool.addUnchecked(tx4.GetHash(), entry.Fee(7000LL).FromTx(tx4, &pool)); |
|
|
|
pool.addUnchecked(tx4.GetHash(), entry.Fee(7000LL).FromTx(tx4)); |
|
|
|
pool.addUnchecked(tx5.GetHash(), entry.Fee(1000LL).FromTx(tx5, &pool)); |
|
|
|
pool.addUnchecked(tx5.GetHash(), entry.Fee(1000LL).FromTx(tx5)); |
|
|
|
pool.addUnchecked(tx6.GetHash(), entry.Fee(1100LL).FromTx(tx6, &pool)); |
|
|
|
pool.addUnchecked(tx6.GetHash(), entry.Fee(1100LL).FromTx(tx6)); |
|
|
|
pool.addUnchecked(tx7.GetHash(), entry.Fee(9000LL).FromTx(tx7, &pool)); |
|
|
|
pool.addUnchecked(tx7.GetHash(), entry.Fee(9000LL).FromTx(tx7)); |
|
|
|
|
|
|
|
|
|
|
|
// we only require this remove, at max, 2 txn, because its not clear what we're really optimizing for aside from that
|
|
|
|
// we only require this remove, at max, 2 txn, because its not clear what we're really optimizing for aside from that
|
|
|
|
pool.TrimToSize(pool.DynamicMemoryUsage() - 1); |
|
|
|
pool.TrimToSize(pool.DynamicMemoryUsage() - 1); |
|
|
@ -543,8 +541,8 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) |
|
|
|
BOOST_CHECK(!pool.exists(tx7.GetHash())); |
|
|
|
BOOST_CHECK(!pool.exists(tx7.GetHash())); |
|
|
|
|
|
|
|
|
|
|
|
if (!pool.exists(tx5.GetHash())) |
|
|
|
if (!pool.exists(tx5.GetHash())) |
|
|
|
pool.addUnchecked(tx5.GetHash(), entry.Fee(1000LL).FromTx(tx5, &pool)); |
|
|
|
pool.addUnchecked(tx5.GetHash(), entry.Fee(1000LL).FromTx(tx5)); |
|
|
|
pool.addUnchecked(tx7.GetHash(), entry.Fee(9000LL).FromTx(tx7, &pool)); |
|
|
|
pool.addUnchecked(tx7.GetHash(), entry.Fee(9000LL).FromTx(tx7)); |
|
|
|
|
|
|
|
|
|
|
|
pool.TrimToSize(pool.DynamicMemoryUsage() / 2); // should maximize mempool size by only removing 5/7
|
|
|
|
pool.TrimToSize(pool.DynamicMemoryUsage() / 2); // should maximize mempool size by only removing 5/7
|
|
|
|
BOOST_CHECK(pool.exists(tx4.GetHash())); |
|
|
|
BOOST_CHECK(pool.exists(tx4.GetHash())); |
|
|
@ -552,8 +550,8 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) |
|
|
|
BOOST_CHECK(pool.exists(tx6.GetHash())); |
|
|
|
BOOST_CHECK(pool.exists(tx6.GetHash())); |
|
|
|
BOOST_CHECK(!pool.exists(tx7.GetHash())); |
|
|
|
BOOST_CHECK(!pool.exists(tx7.GetHash())); |
|
|
|
|
|
|
|
|
|
|
|
pool.addUnchecked(tx5.GetHash(), entry.Fee(1000LL).FromTx(tx5, &pool)); |
|
|
|
pool.addUnchecked(tx5.GetHash(), entry.Fee(1000LL).FromTx(tx5)); |
|
|
|
pool.addUnchecked(tx7.GetHash(), entry.Fee(9000LL).FromTx(tx7, &pool)); |
|
|
|
pool.addUnchecked(tx7.GetHash(), entry.Fee(9000LL).FromTx(tx7)); |
|
|
|
|
|
|
|
|
|
|
|
std::vector<CTransactionRef> vtx; |
|
|
|
std::vector<CTransactionRef> vtx; |
|
|
|
SetMockTime(42); |
|
|
|
SetMockTime(42); |
|
|
|