|
|
|
@ -47,7 +47,7 @@ class MempoolPackagesTest(BitcoinTestFramework):
|
|
|
|
|
value = sent_value
|
|
|
|
|
chain.append(txid)
|
|
|
|
|
|
|
|
|
|
# Check mempool has MAX_ANCESTORS transactions in it, and descendant
|
|
|
|
|
# Check mempool has MAX_ANCESTORS transactions in it, and descendant and ancestor
|
|
|
|
|
# count and fees should look correct
|
|
|
|
|
mempool = self.nodes[0].getrawmempool(True)
|
|
|
|
|
assert_equal(len(mempool), MAX_ANCESTORS)
|
|
|
|
@ -55,6 +55,10 @@ class MempoolPackagesTest(BitcoinTestFramework):
|
|
|
|
|
descendant_fees = 0
|
|
|
|
|
descendant_size = 0
|
|
|
|
|
|
|
|
|
|
ancestor_size = sum([mempool[tx]['size'] for tx in mempool])
|
|
|
|
|
ancestor_count = MAX_ANCESTORS
|
|
|
|
|
ancestor_fees = sum([mempool[tx]['fee'] for tx in mempool])
|
|
|
|
|
|
|
|
|
|
descendants = []
|
|
|
|
|
ancestors = list(chain)
|
|
|
|
|
for x in reversed(chain):
|
|
|
|
@ -71,14 +75,43 @@ class MempoolPackagesTest(BitcoinTestFramework):
|
|
|
|
|
assert_equal(mempool[x]['descendantsize'], descendant_size)
|
|
|
|
|
descendant_count += 1
|
|
|
|
|
|
|
|
|
|
# Check that ancestor calculations are correct
|
|
|
|
|
assert_equal(mempool[x]['ancestorcount'], ancestor_count)
|
|
|
|
|
assert_equal(mempool[x]['ancestorfees'], ancestor_fees * COIN)
|
|
|
|
|
assert_equal(mempool[x]['ancestorsize'], ancestor_size)
|
|
|
|
|
ancestor_size -= mempool[x]['size']
|
|
|
|
|
ancestor_fees -= mempool[x]['fee']
|
|
|
|
|
ancestor_count -= 1
|
|
|
|
|
|
|
|
|
|
# Check that parent/child list is correct
|
|
|
|
|
assert_equal(mempool[x]['spentby'], descendants[-1:])
|
|
|
|
|
assert_equal(mempool[x]['depends'], ancestors[-2:-1])
|
|
|
|
|
|
|
|
|
|
# Check that getmempooldescendants is correct
|
|
|
|
|
assert_equal(sorted(descendants), sorted(self.nodes[0].getmempooldescendants(x)))
|
|
|
|
|
|
|
|
|
|
# Check getmempooldescendants verbose output is correct
|
|
|
|
|
for descendant, dinfo in self.nodes[0].getmempooldescendants(x, True).items():
|
|
|
|
|
assert_equal(dinfo['depends'], [chain[chain.index(descendant)-1]])
|
|
|
|
|
if dinfo['descendantcount'] > 1:
|
|
|
|
|
assert_equal(dinfo['spentby'], [chain[chain.index(descendant)+1]])
|
|
|
|
|
else:
|
|
|
|
|
assert_equal(dinfo['spentby'], [])
|
|
|
|
|
descendants.append(x)
|
|
|
|
|
|
|
|
|
|
# Check that getmempoolancestors is correct
|
|
|
|
|
ancestors.remove(x)
|
|
|
|
|
assert_equal(sorted(ancestors), sorted(self.nodes[0].getmempoolancestors(x)))
|
|
|
|
|
|
|
|
|
|
# Check that getmempoolancestors verbose output is correct
|
|
|
|
|
for ancestor, ainfo in self.nodes[0].getmempoolancestors(x, True).items():
|
|
|
|
|
assert_equal(ainfo['spentby'], [chain[chain.index(ancestor)+1]])
|
|
|
|
|
if ainfo['ancestorcount'] > 1:
|
|
|
|
|
assert_equal(ainfo['depends'], [chain[chain.index(ancestor)-1]])
|
|
|
|
|
else:
|
|
|
|
|
assert_equal(ainfo['depends'], [])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Check that getmempoolancestors/getmempooldescendants correctly handle verbose=true
|
|
|
|
|
v_ancestors = self.nodes[0].getmempoolancestors(chain[-1], True)
|
|
|
|
|
assert_equal(len(v_ancestors), len(chain)-1)
|
|
|
|
@ -100,7 +133,7 @@ class MempoolPackagesTest(BitcoinTestFramework):
|
|
|
|
|
for x in chain:
|
|
|
|
|
ancestor_fees += mempool[x]['fee']
|
|
|
|
|
assert_equal(mempool[x]['ancestorfees'], ancestor_fees * COIN + 1000)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Undo the prioritisetransaction for later tests
|
|
|
|
|
self.nodes[0].prioritisetransaction(txid=chain[0], fee_delta=-1000)
|
|
|
|
|
|
|
|
|
@ -149,6 +182,7 @@ class MempoolPackagesTest(BitcoinTestFramework):
|
|
|
|
|
vout = utxo[1]['vout']
|
|
|
|
|
|
|
|
|
|
transaction_package = []
|
|
|
|
|
tx_children = []
|
|
|
|
|
# First create one parent tx with 10 children
|
|
|
|
|
(txid, sent_value) = self.chain_transaction(self.nodes[0], txid, vout, value, fee, 10)
|
|
|
|
|
parent_transaction = txid
|
|
|
|
@ -159,11 +193,17 @@ class MempoolPackagesTest(BitcoinTestFramework):
|
|
|
|
|
for i in range(MAX_DESCENDANTS - 1):
|
|
|
|
|
utxo = transaction_package.pop(0)
|
|
|
|
|
(txid, sent_value) = self.chain_transaction(self.nodes[0], utxo['txid'], utxo['vout'], utxo['amount'], fee, 10)
|
|
|
|
|
if utxo['txid'] is parent_transaction:
|
|
|
|
|
tx_children.append(txid)
|
|
|
|
|
for j in range(10):
|
|
|
|
|
transaction_package.append({'txid': txid, 'vout': j, 'amount': sent_value})
|
|
|
|
|
|
|
|
|
|
mempool = self.nodes[0].getrawmempool(True)
|
|
|
|
|
assert_equal(mempool[parent_transaction]['descendantcount'], MAX_DESCENDANTS)
|
|
|
|
|
assert_equal(sorted(mempool[parent_transaction]['spentby']), sorted(tx_children))
|
|
|
|
|
|
|
|
|
|
for child in tx_children:
|
|
|
|
|
assert_equal(mempool[child]['depends'], [parent_transaction])
|
|
|
|
|
|
|
|
|
|
# Sending one more chained transaction will fail
|
|
|
|
|
utxo = transaction_package.pop(0)
|
|
|
|
@ -232,7 +272,7 @@ class MempoolPackagesTest(BitcoinTestFramework):
|
|
|
|
|
signedtx = self.nodes[0].signrawtransactionwithwallet(rawtx)
|
|
|
|
|
txid = self.nodes[0].sendrawtransaction(signedtx['hex'])
|
|
|
|
|
sync_mempools(self.nodes)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Now try to disconnect the tip on each node...
|
|
|
|
|
self.nodes[1].invalidateblock(self.nodes[1].getbestblockhash())
|
|
|
|
|
self.nodes[0].invalidateblock(self.nodes[0].getbestblockhash())
|
|
|
|
|