|
|
|
@ -13,7 +13,15 @@
|
|
|
|
|
from decimal import Decimal
|
|
|
|
|
|
|
|
|
|
from test_framework.test_framework import BitcoinTestFramework
|
|
|
|
|
from test_framework.util import assert_equal, assert_raises_rpc_error, connect_nodes, disconnect_nodes, sync_blocks, sync_mempools
|
|
|
|
|
from test_framework.util import (
|
|
|
|
|
assert_equal,
|
|
|
|
|
assert_raises_rpc_error,
|
|
|
|
|
connect_nodes,
|
|
|
|
|
disconnect_nodes,
|
|
|
|
|
sync_blocks,
|
|
|
|
|
sync_mempools,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AbandonConflictTest(BitcoinTestFramework):
|
|
|
|
|
def set_test_params(self):
|
|
|
|
@ -40,7 +48,7 @@ class AbandonConflictTest(BitcoinTestFramework):
|
|
|
|
|
|
|
|
|
|
sync_blocks(self.nodes)
|
|
|
|
|
newbalance = self.nodes[0].getbalance()
|
|
|
|
|
assert(balance - newbalance < Decimal("0.001")) #no more than fees lost
|
|
|
|
|
assert balance - newbalance < Decimal("0.001") #no more than fees lost
|
|
|
|
|
balance = newbalance
|
|
|
|
|
|
|
|
|
|
# Disconnect nodes so node0's transactions don't get into node1's mempool
|
|
|
|
@ -51,10 +59,10 @@ class AbandonConflictTest(BitcoinTestFramework):
|
|
|
|
|
nB = next(i for i, vout in enumerate(self.nodes[0].getrawtransaction(txB, 1)["vout"]) if vout["value"] == Decimal("10"))
|
|
|
|
|
nC = next(i for i, vout in enumerate(self.nodes[0].getrawtransaction(txC, 1)["vout"]) if vout["value"] == Decimal("10"))
|
|
|
|
|
|
|
|
|
|
inputs =[]
|
|
|
|
|
inputs = []
|
|
|
|
|
# spend 10btc outputs from txA and txB
|
|
|
|
|
inputs.append({"txid":txA, "vout":nA})
|
|
|
|
|
inputs.append({"txid":txB, "vout":nB})
|
|
|
|
|
inputs.append({"txid": txA, "vout": nA})
|
|
|
|
|
inputs.append({"txid": txB, "vout": nB})
|
|
|
|
|
outputs = {}
|
|
|
|
|
|
|
|
|
|
outputs[self.nodes[0].getnewaddress()] = Decimal("14.99998")
|
|
|
|
@ -67,8 +75,8 @@ class AbandonConflictTest(BitcoinTestFramework):
|
|
|
|
|
|
|
|
|
|
#Create a child tx spending AB1 and C
|
|
|
|
|
inputs = []
|
|
|
|
|
inputs.append({"txid":txAB1, "vout":nAB})
|
|
|
|
|
inputs.append({"txid":txC, "vout":nC})
|
|
|
|
|
inputs.append({"txid": txAB1, "vout": nAB})
|
|
|
|
|
inputs.append({"txid": txC, "vout": nC})
|
|
|
|
|
outputs = {}
|
|
|
|
|
outputs[self.nodes[0].getnewaddress()] = Decimal("24.9996")
|
|
|
|
|
signed2 = self.nodes[0].signrawtransactionwithwallet(self.nodes[0].createrawtransaction(inputs, outputs))
|
|
|
|
@ -76,8 +84,8 @@ class AbandonConflictTest(BitcoinTestFramework):
|
|
|
|
|
|
|
|
|
|
# Create a child tx spending ABC2
|
|
|
|
|
signed3_change = Decimal("24.999")
|
|
|
|
|
inputs = [ {"txid":txABC2, "vout":0} ]
|
|
|
|
|
outputs = { self.nodes[0].getnewaddress(): signed3_change }
|
|
|
|
|
inputs = [{"txid": txABC2, "vout": 0}]
|
|
|
|
|
outputs = {self.nodes[0].getnewaddress(): signed3_change}
|
|
|
|
|
signed3 = self.nodes[0].signrawtransactionwithwallet(self.nodes[0].createrawtransaction(inputs, outputs))
|
|
|
|
|
# note tx is never directly referenced, only abandoned as a child of the above
|
|
|
|
|
self.nodes[0].sendrawtransaction(signed3["hex"])
|
|
|
|
@ -105,7 +113,7 @@ class AbandonConflictTest(BitcoinTestFramework):
|
|
|
|
|
unconfbalance = self.nodes[0].getunconfirmedbalance() + self.nodes[0].getbalance()
|
|
|
|
|
assert_equal(unconfbalance, newbalance)
|
|
|
|
|
# Also shouldn't show up in listunspent
|
|
|
|
|
assert(not txABC2 in [utxo["txid"] for utxo in self.nodes[0].listunspent(0)])
|
|
|
|
|
assert not txABC2 in [utxo["txid"] for utxo in self.nodes[0].listunspent(0)]
|
|
|
|
|
balance = newbalance
|
|
|
|
|
|
|
|
|
|
# Abandon original transaction and verify inputs are available again
|
|
|
|
@ -145,8 +153,8 @@ class AbandonConflictTest(BitcoinTestFramework):
|
|
|
|
|
|
|
|
|
|
# Create a double spend of AB1 by spending again from only A's 10 output
|
|
|
|
|
# Mine double spend from node 1
|
|
|
|
|
inputs =[]
|
|
|
|
|
inputs.append({"txid":txA, "vout":nA})
|
|
|
|
|
inputs = []
|
|
|
|
|
inputs.append({"txid": txA, "vout": nA})
|
|
|
|
|
outputs = {}
|
|
|
|
|
outputs[self.nodes[1].getnewaddress()] = Decimal("9.9999")
|
|
|
|
|
tx = self.nodes[0].createrawtransaction(inputs, outputs)
|
|
|
|
@ -172,5 +180,6 @@ class AbandonConflictTest(BitcoinTestFramework):
|
|
|
|
|
self.log.info("conflicted has not resumed causing its inputs to be seen as spent. See Issue #7315")
|
|
|
|
|
self.log.info(str(balance) + " -> " + str(newbalance) + " ?")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
AbandonConflictTest().main()
|
|
|
|
|