Changeset View
Changeset View
Standalone View
Standalone View
test/functional/wallet_abandonconflict.py
Show First 20 Lines • Show All 60 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
sync_blocks(self.nodes) | sync_blocks(self.nodes) | ||||
newbalance = self.nodes[0].getbalance() | newbalance = self.nodes[0].getbalance() | ||||
# no more than fees lost | # no more than fees lost | ||||
assert balance - newbalance <= total_fees(txA, txB, txC) | assert balance - newbalance <= total_fees(txA, txB, txC) | ||||
balance = newbalance | balance = newbalance | ||||
# Disconnect nodes so node0's transactions don't get into node1's mempool | # Disconnect nodes so node0's transactions don't get into node1's | ||||
# mempool | |||||
disconnect_nodes(self.nodes[0], self.nodes[1]) | disconnect_nodes(self.nodes[0], self.nodes[1]) | ||||
# Identify the 10btc outputs | # Identify the 10btc outputs | ||||
nA = next(i for i, vout in enumerate(self.nodes[0].getrawtransaction( | nA = next(i for i, vout in enumerate(self.nodes[0].getrawtransaction( | ||||
txA, 1)["vout"]) if vout["value"] == Decimal("10")) | txA, 1)["vout"]) if vout["value"] == Decimal("10")) | ||||
nB = next(i for i, vout in enumerate(self.nodes[0].getrawtransaction( | nB = next(i for i, vout in enumerate(self.nodes[0].getrawtransaction( | ||||
txB, 1)["vout"]) if vout["value"] == Decimal("10")) | txB, 1)["vout"]) if vout["value"] == Decimal("10")) | ||||
nC = next(i for i, vout in enumerate(self.nodes[0].getrawtransaction( | nC = next(i for i, vout in enumerate(self.nodes[0].getrawtransaction( | ||||
Show All 28 Lines | def run_test(self): | ||||
txABC2 = self.nodes[0].sendrawtransaction(signed2["hex"]) | txABC2 = self.nodes[0].sendrawtransaction(signed2["hex"]) | ||||
# Create a child tx spending ABC2 | # Create a child tx spending ABC2 | ||||
signed3_change = Decimal("24.999") | signed3_change = Decimal("24.999") | ||||
inputs = [{"txid": txABC2, "vout": 0}] | inputs = [{"txid": txABC2, "vout": 0}] | ||||
outputs = {self.nodes[0].getnewaddress(): signed3_change} | outputs = {self.nodes[0].getnewaddress(): signed3_change} | ||||
signed3 = self.nodes[0].signrawtransactionwithwallet( | signed3 = self.nodes[0].signrawtransactionwithwallet( | ||||
self.nodes[0].createrawtransaction(inputs, outputs)) | self.nodes[0].createrawtransaction(inputs, outputs)) | ||||
# note tx is never directly referenced, only abandoned as a child of the above | # note tx is never directly referenced, only abandoned as a child of | ||||
# the above | |||||
self.nodes[0].sendrawtransaction(signed3["hex"]) | self.nodes[0].sendrawtransaction(signed3["hex"]) | ||||
# In mempool txs from self should increase balance from change | # In mempool txs from self should increase balance from change | ||||
newbalance = self.nodes[0].getbalance() | newbalance = self.nodes[0].getbalance() | ||||
assert_equal(newbalance, balance - Decimal("30") + signed3_change) | assert_equal(newbalance, balance - Decimal("30") + signed3_change) | ||||
balance = newbalance | balance = newbalance | ||||
# Restart the node with a higher min relay fee so the parent tx is no longer in mempool | # Restart the node with a higher min relay fee so the parent tx is no longer in mempool | ||||
# TODO: redo with eviction | # TODO: redo with eviction | ||||
self.stop_node(0) | self.stop_node(0) | ||||
self.start_node(0, extra_args=["-minrelaytxfee=0.0001"]) | self.start_node(0, extra_args=["-minrelaytxfee=0.0001"]) | ||||
# Verify txs no longer in either node's mempool | # Verify txs no longer in either node's mempool | ||||
assert_equal(len(self.nodes[0].getrawmempool()), 0) | assert_equal(len(self.nodes[0].getrawmempool()), 0) | ||||
assert_equal(len(self.nodes[1].getrawmempool()), 0) | assert_equal(len(self.nodes[1].getrawmempool()), 0) | ||||
# Transactions which are not in the mempool should only reduce wallet balance. | # Transactions which are not in the mempool should only reduce wallet balance. | ||||
# Transaction inputs should still be spent, but the change not yet received. | # Transaction inputs should still be spent, but the change not yet | ||||
# received. | |||||
newbalance = self.nodes[0].getbalance() | newbalance = self.nodes[0].getbalance() | ||||
assert_equal(newbalance, balance - signed3_change) | assert_equal(newbalance, balance - signed3_change) | ||||
# Unconfirmed received funds that are not in mempool also shouldn't show | # Unconfirmed received funds that are not in mempool also shouldn't show | ||||
# up in unconfirmed balance. Note that the transactions stored in the wallet | # up in unconfirmed balance. Note that the transactions stored in the wallet | ||||
# are not necessarily in the node's mempool. | # are not necessarily in the node's mempool. | ||||
unconfbalance = self.nodes[0].getunconfirmedbalance( | unconfbalance = self.nodes[0].getunconfirmedbalance( | ||||
) + self.nodes[0].getbalance() | ) + self.nodes[0].getbalance() | ||||
assert_equal(unconfbalance, newbalance) | assert_equal(unconfbalance, newbalance) | ||||
Show All 25 Lines | def run_test(self): | ||||
self.nodes[0].sendrawtransaction(signed["hex"]) | self.nodes[0].sendrawtransaction(signed["hex"]) | ||||
newbalance = self.nodes[0].getbalance() | newbalance = self.nodes[0].getbalance() | ||||
assert_equal(newbalance, balance - Decimal("20") + Decimal("14.99998")) | assert_equal(newbalance, balance - Decimal("20") + Decimal("14.99998")) | ||||
balance = newbalance | balance = newbalance | ||||
# Send child tx again so it is no longer abandoned. | # Send child tx again so it is no longer abandoned. | ||||
self.nodes[0].sendrawtransaction(signed2["hex"]) | self.nodes[0].sendrawtransaction(signed2["hex"]) | ||||
newbalance = self.nodes[0].getbalance() | newbalance = self.nodes[0].getbalance() | ||||
assert_equal(newbalance, balance - Decimal("10") - | assert_equal(newbalance, balance - Decimal("10") | ||||
Decimal("14.99998") + Decimal("24.9996")) | - Decimal("14.99998") + Decimal("24.9996")) | ||||
balance = newbalance | balance = newbalance | ||||
# Reset to a higher relay fee so that we abandon a transaction | # Reset to a higher relay fee so that we abandon a transaction | ||||
self.stop_node(0) | self.stop_node(0) | ||||
self.start_node(0, extra_args=["-minrelaytxfee=0.0001"]) | self.start_node(0, extra_args=["-minrelaytxfee=0.0001"]) | ||||
assert_equal(len(self.nodes[0].getrawmempool()), 0) | assert_equal(len(self.nodes[0].getrawmempool()), 0) | ||||
newbalance = self.nodes[0].getbalance() | newbalance = self.nodes[0].getbalance() | ||||
assert_equal(newbalance, balance - Decimal("24.9996")) | assert_equal(newbalance, balance - Decimal("24.9996")) | ||||
balance = newbalance | balance = newbalance | ||||
# Create a double spend of AB1. Spend it again from only A's 10 output. | # Create a double spend of AB1. Spend it again from only A's 10 output. | ||||
# Mine double spend from node 1. | # Mine double spend from node 1. | ||||
inputs = [] | inputs = [] | ||||
inputs.append({"txid": txA, "vout": nA}) | inputs.append({"txid": txA, "vout": nA}) | ||||
outputs = {} | outputs = {} | ||||
outputs[self.nodes[1].getnewaddress()] = Decimal("9.9999") | outputs[self.nodes[1].getnewaddress()] = Decimal("9.9999") | ||||
tx = self.nodes[0].createrawtransaction(inputs, outputs) | tx = self.nodes[0].createrawtransaction(inputs, outputs) | ||||
signed = self.nodes[0].signrawtransactionwithwallet(tx) | signed = self.nodes[0].signrawtransactionwithwallet(tx) | ||||
self.nodes[1].sendrawtransaction(signed["hex"]) | self.nodes[1].sendrawtransaction(signed["hex"]) | ||||
self.nodes[1].generate(1) | self.nodes[1].generate(1) | ||||
connect_nodes(self.nodes[0], self.nodes[1]) | connect_nodes(self.nodes[0], self.nodes[1]) | ||||
sync_blocks(self.nodes) | sync_blocks(self.nodes) | ||||
# Verify that B and C's 10 BCH outputs are available for spending again because AB1 is now conflicted | # Verify that B and C's 10 BCH outputs are available for spending again | ||||
# because AB1 is now conflicted | |||||
newbalance = self.nodes[0].getbalance() | newbalance = self.nodes[0].getbalance() | ||||
assert_equal(newbalance, balance + Decimal("20")) | assert_equal(newbalance, balance + Decimal("20")) | ||||
balance = newbalance | balance = newbalance | ||||
# There is currently a minor bug around this and so this test doesn't work. See Issue #7315 | # There is currently a minor bug around this and so this test doesn't work. See Issue #7315 | ||||
# Invalidate the block with the double spend and B's 10 BCH output should no longer be available | # Invalidate the block with the double spend and B's 10 BCH output should no longer be available | ||||
# Don't think C's should either | # Don't think C's should either | ||||
self.nodes[0].invalidateblock(self.nodes[0].getbestblockhash()) | self.nodes[0].invalidateblock(self.nodes[0].getbestblockhash()) | ||||
Show All 11 Lines |