mirror of
https://github.com/kvazar-network/kevacoin.git
synced 2025-01-25 22:34:27 +00:00
[test] Remove priority from tests
Remove all coin age priority functionality from unit tests and RPC tests.
This commit is contained in:
parent
f838005444
commit
0315888d0d
@ -50,10 +50,8 @@ class PrioritiseTransactionTest(BitcoinTestFramework):
|
|||||||
assert(sizes[i] > MAX_BLOCK_BASE_SIZE) # Fail => raise utxo_count
|
assert(sizes[i] > MAX_BLOCK_BASE_SIZE) # Fail => raise utxo_count
|
||||||
|
|
||||||
# add a fee delta to something in the cheapest bucket and make sure it gets mined
|
# add a fee delta to something in the cheapest bucket and make sure it gets mined
|
||||||
# also check that a different entry in the cheapest bucket is NOT mined (lower
|
# also check that a different entry in the cheapest bucket is NOT mined
|
||||||
# the priority to ensure its not mined due to priority)
|
|
||||||
self.nodes[0].prioritisetransaction(txids[0][0], 0, int(3*base_fee*COIN))
|
self.nodes[0].prioritisetransaction(txids[0][0], 0, int(3*base_fee*COIN))
|
||||||
self.nodes[0].prioritisetransaction(txids[0][1], -1e15, 0)
|
|
||||||
|
|
||||||
self.nodes[0].generate(1)
|
self.nodes[0].generate(1)
|
||||||
|
|
||||||
@ -96,7 +94,7 @@ class PrioritiseTransactionTest(BitcoinTestFramework):
|
|||||||
if (x != high_fee_tx):
|
if (x != high_fee_tx):
|
||||||
assert(x not in mempool)
|
assert(x not in mempool)
|
||||||
|
|
||||||
# Create a free, low priority transaction. Should be rejected.
|
# Create a free transaction. Should be rejected.
|
||||||
utxo_list = self.nodes[0].listunspent()
|
utxo_list = self.nodes[0].listunspent()
|
||||||
assert(len(utxo_list) > 0)
|
assert(len(utxo_list) > 0)
|
||||||
utxo = utxo_list[0]
|
utxo = utxo_list[0]
|
||||||
@ -104,37 +102,27 @@ class PrioritiseTransactionTest(BitcoinTestFramework):
|
|||||||
inputs = []
|
inputs = []
|
||||||
outputs = {}
|
outputs = {}
|
||||||
inputs.append({"txid" : utxo["txid"], "vout" : utxo["vout"]})
|
inputs.append({"txid" : utxo["txid"], "vout" : utxo["vout"]})
|
||||||
outputs[self.nodes[0].getnewaddress()] = utxo["amount"] - self.relayfee
|
outputs[self.nodes[0].getnewaddress()] = utxo["amount"]
|
||||||
raw_tx = self.nodes[0].createrawtransaction(inputs, outputs)
|
raw_tx = self.nodes[0].createrawtransaction(inputs, outputs)
|
||||||
tx_hex = self.nodes[0].signrawtransaction(raw_tx)["hex"]
|
tx_hex = self.nodes[0].signrawtransaction(raw_tx)["hex"]
|
||||||
txid = self.nodes[0].sendrawtransaction(tx_hex)
|
tx_id = self.nodes[0].decoderawtransaction(tx_hex)["txid"]
|
||||||
|
|
||||||
# A tx that spends an in-mempool tx has 0 priority, so we can use it to
|
|
||||||
# test the effect of using prioritise transaction for mempool acceptance
|
|
||||||
inputs = []
|
|
||||||
inputs.append({"txid": txid, "vout": 0})
|
|
||||||
outputs = {}
|
|
||||||
outputs[self.nodes[0].getnewaddress()] = utxo["amount"] - self.relayfee
|
|
||||||
raw_tx2 = self.nodes[0].createrawtransaction(inputs, outputs)
|
|
||||||
tx2_hex = self.nodes[0].signrawtransaction(raw_tx2)["hex"]
|
|
||||||
tx2_id = self.nodes[0].decoderawtransaction(tx2_hex)["txid"]
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.nodes[0].sendrawtransaction(tx2_hex)
|
self.nodes[0].sendrawtransaction(tx_hex)
|
||||||
except JSONRPCException as exp:
|
except JSONRPCException as exp:
|
||||||
assert_equal(exp.error['code'], -26) # insufficient fee
|
assert_equal(exp.error['code'], -26) # insufficient fee
|
||||||
assert(tx2_id not in self.nodes[0].getrawmempool())
|
assert(tx_id not in self.nodes[0].getrawmempool())
|
||||||
else:
|
else:
|
||||||
assert(False)
|
assert(False)
|
||||||
|
|
||||||
# This is a less than 1000-byte transaction, so just set the fee
|
# This is a less than 1000-byte transaction, so just set the fee
|
||||||
# to be the minimum for a 1000 byte transaction and check that it is
|
# to be the minimum for a 1000 byte transaction and check that it is
|
||||||
# accepted.
|
# accepted.
|
||||||
self.nodes[0].prioritisetransaction(tx2_id, 0, int(self.relayfee*COIN))
|
self.nodes[0].prioritisetransaction(tx_id, 0, int(self.relayfee*COIN))
|
||||||
|
|
||||||
print("Assert that prioritised free transaction is accepted to mempool")
|
print("Assert that prioritised free transaction is accepted to mempool")
|
||||||
assert_equal(self.nodes[0].sendrawtransaction(tx2_hex), tx2_id)
|
assert_equal(self.nodes[0].sendrawtransaction(tx_hex), tx_id)
|
||||||
assert(tx2_id in self.nodes[0].getrawmempool())
|
assert(tx_id in self.nodes[0].getrawmempool())
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
PrioritiseTransactionTest().main()
|
PrioritiseTransactionTest().main()
|
||||||
|
@ -69,10 +69,11 @@ def small_txpuzzle_randfee(from_node, conflist, unconflist, amount, min_fee, fee
|
|||||||
|
|
||||||
def split_inputs(from_node, txins, txouts, initial_split = False):
|
def split_inputs(from_node, txins, txouts, initial_split = False):
|
||||||
"""
|
"""
|
||||||
We need to generate a lot of very small inputs so we can generate a ton of transactions
|
We need to generate a lot of inputs so we can generate a ton of transactions.
|
||||||
and they will have low priority.
|
|
||||||
This function takes an input from txins, and creates and sends a transaction
|
This function takes an input from txins, and creates and sends a transaction
|
||||||
which splits the value into 2 outputs which are appended to txouts.
|
which splits the value into 2 outputs which are appended to txouts.
|
||||||
|
Previously this was designed to be small inputs so they wouldn't have
|
||||||
|
a high coin age when the notion of priority still existed.
|
||||||
"""
|
"""
|
||||||
prevtxout = txins.pop()
|
prevtxout = txins.pop()
|
||||||
inputs = []
|
inputs = []
|
||||||
@ -150,7 +151,7 @@ class EstimateFeeTest(BitcoinTestFramework):
|
|||||||
def setup_network(self):
|
def setup_network(self):
|
||||||
"""
|
"""
|
||||||
We'll setup the network to have 3 nodes that all mine with different parameters.
|
We'll setup the network to have 3 nodes that all mine with different parameters.
|
||||||
But first we need to use one node to create a lot of small low priority outputs
|
But first we need to use one node to create a lot of outputs
|
||||||
which we will use to generate our transactions.
|
which we will use to generate our transactions.
|
||||||
"""
|
"""
|
||||||
self.nodes = []
|
self.nodes = []
|
||||||
@ -159,7 +160,7 @@ class EstimateFeeTest(BitcoinTestFramework):
|
|||||||
"-whitelist=127.0.0.1"]))
|
"-whitelist=127.0.0.1"]))
|
||||||
|
|
||||||
print("This test is time consuming, please be patient")
|
print("This test is time consuming, please be patient")
|
||||||
print("Splitting inputs to small size so we can generate low priority tx's")
|
print("Splitting inputs so we can generate tx's")
|
||||||
self.txouts = []
|
self.txouts = []
|
||||||
self.txouts2 = []
|
self.txouts2 = []
|
||||||
# Split a coinbase into two transaction puzzle outputs
|
# Split a coinbase into two transaction puzzle outputs
|
||||||
|
@ -442,47 +442,6 @@ def make_change(from_node, amount_in, amount_out, fee):
|
|||||||
outputs[from_node.getnewaddress()] = change
|
outputs[from_node.getnewaddress()] = change
|
||||||
return outputs
|
return outputs
|
||||||
|
|
||||||
def send_zeropri_transaction(from_node, to_node, amount, fee):
|
|
||||||
"""
|
|
||||||
Create&broadcast a zero-priority transaction.
|
|
||||||
Returns (txid, hex-encoded-txdata)
|
|
||||||
Ensures transaction is zero-priority by first creating a send-to-self,
|
|
||||||
then using its output
|
|
||||||
"""
|
|
||||||
|
|
||||||
# Create a send-to-self with confirmed inputs:
|
|
||||||
self_address = from_node.getnewaddress()
|
|
||||||
(total_in, inputs) = gather_inputs(from_node, amount+fee*2)
|
|
||||||
outputs = make_change(from_node, total_in, amount+fee, fee)
|
|
||||||
outputs[self_address] = float(amount+fee)
|
|
||||||
|
|
||||||
self_rawtx = from_node.createrawtransaction(inputs, outputs)
|
|
||||||
self_signresult = from_node.signrawtransaction(self_rawtx)
|
|
||||||
self_txid = from_node.sendrawtransaction(self_signresult["hex"], True)
|
|
||||||
|
|
||||||
vout = find_output(from_node, self_txid, amount+fee)
|
|
||||||
# Now immediately spend the output to create a 1-input, 1-output
|
|
||||||
# zero-priority transaction:
|
|
||||||
inputs = [ { "txid" : self_txid, "vout" : vout } ]
|
|
||||||
outputs = { to_node.getnewaddress() : float(amount) }
|
|
||||||
|
|
||||||
rawtx = from_node.createrawtransaction(inputs, outputs)
|
|
||||||
signresult = from_node.signrawtransaction(rawtx)
|
|
||||||
txid = from_node.sendrawtransaction(signresult["hex"], True)
|
|
||||||
|
|
||||||
return (txid, signresult["hex"])
|
|
||||||
|
|
||||||
def random_zeropri_transaction(nodes, amount, min_fee, fee_increment, fee_variants):
|
|
||||||
"""
|
|
||||||
Create a random zero-priority transaction.
|
|
||||||
Returns (txid, hex-encoded-transaction-data, fee)
|
|
||||||
"""
|
|
||||||
from_node = random.choice(nodes)
|
|
||||||
to_node = random.choice(nodes)
|
|
||||||
fee = min_fee + fee_increment*random.randint(0,fee_variants)
|
|
||||||
(txid, txhex) = send_zeropri_transaction(from_node, to_node, amount, fee)
|
|
||||||
return (txid, txhex, fee)
|
|
||||||
|
|
||||||
def random_transaction(nodes, amount, min_fee, fee_increment, fee_variants):
|
def random_transaction(nodes, amount, min_fee, fee_increment, fee_variants):
|
||||||
"""
|
"""
|
||||||
Create a random transaction.
|
Create a random transaction.
|
||||||
|
@ -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);
|
||||||
|
@ -193,7 +193,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
|||||||
uint256 hash;
|
uint256 hash;
|
||||||
TestMemPoolEntryHelper entry;
|
TestMemPoolEntryHelper entry;
|
||||||
entry.nFee = 11;
|
entry.nFee = 11;
|
||||||
entry.dPriority = 111.0;
|
|
||||||
entry.nHeight = 11;
|
entry.nHeight = 11;
|
||||||
|
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
@ -298,7 +297,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
|||||||
BOOST_CHECK_THROW(BlockAssembler(chainparams).CreateNewBlock(scriptPubKey), std::runtime_error);
|
BOOST_CHECK_THROW(BlockAssembler(chainparams).CreateNewBlock(scriptPubKey), std::runtime_error);
|
||||||
mempool.clear();
|
mempool.clear();
|
||||||
|
|
||||||
// child with higher priority than parent
|
// child with higher feerate than parent
|
||||||
tx.vin[0].scriptSig = CScript() << OP_1;
|
tx.vin[0].scriptSig = CScript() << OP_1;
|
||||||
tx.vin[0].prevout.hash = txFirst[1]->GetHash();
|
tx.vin[0].prevout.hash = txFirst[1]->GetHash();
|
||||||
tx.vout[0].nValue = BLOCKSUBSIDY-HIGHFEE;
|
tx.vout[0].nValue = BLOCKSUBSIDY-HIGHFEE;
|
||||||
|
@ -56,7 +56,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
|
|||||||
for (int k = 0; k < 4; k++) { // add 4 fee txs
|
for (int k = 0; k < 4; k++) { // add 4 fee txs
|
||||||
tx.vin[0].prevout.n = 10000*blocknum+100*j+k; // make transaction unique
|
tx.vin[0].prevout.n = 10000*blocknum+100*j+k; // make transaction unique
|
||||||
uint256 hash = tx.GetHash();
|
uint256 hash = tx.GetHash();
|
||||||
mpool.addUnchecked(hash, entry.Fee(feeV[j]).Time(GetTime()).Priority(0).Height(blocknum).FromTx(tx, &mpool));
|
mpool.addUnchecked(hash, entry.Fee(feeV[j]).Time(GetTime()).Height(blocknum).FromTx(tx));
|
||||||
txHashes[j].push_back(hash);
|
txHashes[j].push_back(hash);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -132,7 +132,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
|
|||||||
for (int k = 0; k < 4; k++) { // add 4 fee txs
|
for (int k = 0; k < 4; k++) { // add 4 fee txs
|
||||||
tx.vin[0].prevout.n = 10000*blocknum+100*j+k;
|
tx.vin[0].prevout.n = 10000*blocknum+100*j+k;
|
||||||
uint256 hash = tx.GetHash();
|
uint256 hash = tx.GetHash();
|
||||||
mpool.addUnchecked(hash, entry.Fee(feeV[j]).Time(GetTime()).Priority(0).Height(blocknum).FromTx(tx, &mpool));
|
mpool.addUnchecked(hash, entry.Fee(feeV[j]).Time(GetTime()).Height(blocknum).FromTx(tx));
|
||||||
txHashes[j].push_back(hash);
|
txHashes[j].push_back(hash);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -169,7 +169,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
|
|||||||
for (int k = 0; k < 4; k++) { // add 4 fee txs
|
for (int k = 0; k < 4; k++) { // add 4 fee txs
|
||||||
tx.vin[0].prevout.n = 10000*blocknum+100*j+k;
|
tx.vin[0].prevout.n = 10000*blocknum+100*j+k;
|
||||||
uint256 hash = tx.GetHash();
|
uint256 hash = tx.GetHash();
|
||||||
mpool.addUnchecked(hash, entry.Fee(feeV[j]).Time(GetTime()).Priority(0).Height(blocknum).FromTx(tx, &mpool));
|
mpool.addUnchecked(hash, entry.Fee(feeV[j]).Time(GetTime()).Height(blocknum).FromTx(tx));
|
||||||
CTransactionRef ptx = mpool.get(hash);
|
CTransactionRef ptx = mpool.get(hash);
|
||||||
if (ptx)
|
if (ptx)
|
||||||
block.push_back(ptx);
|
block.push_back(ptx);
|
||||||
@ -185,7 +185,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Test that if the mempool is limited, estimateSmartFee won't return a value below the mempool min fee
|
// Test that if the mempool is limited, estimateSmartFee won't return a value below the mempool min fee
|
||||||
mpool.addUnchecked(tx.GetHash(), entry.Fee(feeV[5]).Time(GetTime()).Priority(0).Height(blocknum).FromTx(tx, &mpool));
|
mpool.addUnchecked(tx.GetHash(), entry.Fee(feeV[5]).Time(GetTime()).Height(blocknum).FromTx(tx));
|
||||||
// evict that transaction which should set a mempool min fee of minRelayTxFee + feeV[5]
|
// evict that transaction which should set a mempool min fee of minRelayTxFee + feeV[5]
|
||||||
mpool.TrimToSize(1);
|
mpool.TrimToSize(1);
|
||||||
BOOST_CHECK(mpool.GetMinFee(1).GetFeePerK() > feeV[5]);
|
BOOST_CHECK(mpool.GetMinFee(1).GetFeePerK() > feeV[5]);
|
||||||
|
@ -141,17 +141,14 @@ TestChain100Setup::~TestChain100Setup()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(const CMutableTransaction &tx, CTxMemPool *pool) {
|
CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(const CMutableTransaction &tx) {
|
||||||
CTransaction txn(tx);
|
CTransaction txn(tx);
|
||||||
return FromTx(txn, pool);
|
return FromTx(txn);
|
||||||
}
|
}
|
||||||
|
|
||||||
CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(const CTransaction &txn, CTxMemPool *pool) {
|
CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(const CTransaction &txn) {
|
||||||
// Hack to assume either it's completely dependent on other mempool txs or not at all
|
return CTxMemPoolEntry(MakeTransactionRef(txn), nFee, nTime, 0.0, nHeight,
|
||||||
CAmount inChainValue = pool && pool->HasNoInputsOf(txn) ? txn.GetValueOut() : 0;
|
0, spendsCoinbase, sigOpCost, lp);
|
||||||
|
|
||||||
return CTxMemPoolEntry(MakeTransactionRef(txn), nFee, nTime, dPriority, nHeight,
|
|
||||||
inChainValue, spendsCoinbase, sigOpCost, lp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shutdown(void* parg)
|
void Shutdown(void* parg)
|
||||||
|
@ -61,30 +61,27 @@ struct TestChain100Setup : public TestingSetup {
|
|||||||
};
|
};
|
||||||
|
|
||||||
class CTxMemPoolEntry;
|
class CTxMemPoolEntry;
|
||||||
class CTxMemPool;
|
|
||||||
|
|
||||||
struct TestMemPoolEntryHelper
|
struct TestMemPoolEntryHelper
|
||||||
{
|
{
|
||||||
// Default values
|
// Default values
|
||||||
CAmount nFee;
|
CAmount nFee;
|
||||||
int64_t nTime;
|
int64_t nTime;
|
||||||
double dPriority;
|
|
||||||
unsigned int nHeight;
|
unsigned int nHeight;
|
||||||
bool spendsCoinbase;
|
bool spendsCoinbase;
|
||||||
unsigned int sigOpCost;
|
unsigned int sigOpCost;
|
||||||
LockPoints lp;
|
LockPoints lp;
|
||||||
|
|
||||||
TestMemPoolEntryHelper() :
|
TestMemPoolEntryHelper() :
|
||||||
nFee(0), nTime(0), dPriority(0.0), nHeight(1),
|
nFee(0), nTime(0), nHeight(1),
|
||||||
spendsCoinbase(false), sigOpCost(4) { }
|
spendsCoinbase(false), sigOpCost(4) { }
|
||||||
|
|
||||||
CTxMemPoolEntry FromTx(const CMutableTransaction &tx, CTxMemPool *pool = NULL);
|
CTxMemPoolEntry FromTx(const CMutableTransaction &tx);
|
||||||
CTxMemPoolEntry FromTx(const CTransaction &tx, CTxMemPool *pool = NULL);
|
CTxMemPoolEntry FromTx(const CTransaction &tx);
|
||||||
|
|
||||||
// Change the default value
|
// Change the default value
|
||||||
TestMemPoolEntryHelper &Fee(CAmount _fee) { nFee = _fee; return *this; }
|
TestMemPoolEntryHelper &Fee(CAmount _fee) { nFee = _fee; return *this; }
|
||||||
TestMemPoolEntryHelper &Time(int64_t _time) { nTime = _time; return *this; }
|
TestMemPoolEntryHelper &Time(int64_t _time) { nTime = _time; return *this; }
|
||||||
TestMemPoolEntryHelper &Priority(double _priority) { dPriority = _priority; return *this; }
|
|
||||||
TestMemPoolEntryHelper &Height(unsigned int _height) { nHeight = _height; return *this; }
|
TestMemPoolEntryHelper &Height(unsigned int _height) { nHeight = _height; return *this; }
|
||||||
TestMemPoolEntryHelper &SpendsCoinbase(bool _flag) { spendsCoinbase = _flag; return *this; }
|
TestMemPoolEntryHelper &SpendsCoinbase(bool _flag) { spendsCoinbase = _flag; return *this; }
|
||||||
TestMemPoolEntryHelper &SigOpsCost(unsigned int _sigopsCost) { sigOpCost = _sigopsCost; return *this; }
|
TestMemPoolEntryHelper &SigOpsCost(unsigned int _sigopsCost) { sigOpCost = _sigopsCost; return *this; }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user