|
4 | 4 | # file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
5 | 5 | """Test the zapwallettxes functionality.
|
6 | 6 |
|
7 |
| -- start three bitcoind nodes |
8 |
| -- create four transactions on node 0 - two are confirmed and two are |
9 |
| - unconfirmed. |
10 |
| -- restart node 1 and verify that both the confirmed and the unconfirmed |
| 7 | +- start two bitcoind nodes |
| 8 | +- create two transactions on node 0 - one is confirmed and one is unconfirmed. |
| 9 | +- restart node 0 and verify that both the confirmed and the unconfirmed |
11 | 10 | transactions are still available.
|
12 |
| -- restart node 0 and verify that the confirmed transactions are still |
13 |
| - available, but that the unconfirmed transaction has been zapped. |
| 11 | +- restart node 0 with zapwallettxes and persistmempool, and verify that both |
| 12 | + the confirmed and the unconfirmed transactions are still available. |
| 13 | +- restart node 0 with just zapwallettxed and verify that the confirmed |
| 14 | + transactions are still available, but that the unconfirmed transaction has |
| 15 | + been zapped. |
14 | 16 | """
|
15 | 17 | from test_framework.test_framework import BitcoinTestFramework
|
16 |
| -from test_framework.util import * |
17 |
| - |
| 18 | +from test_framework.util import (assert_equal, |
| 19 | + assert_raises_jsonrpc, |
| 20 | + ) |
18 | 21 |
|
19 | 22 | class ZapWalletTXesTest (BitcoinTestFramework):
|
20 | 23 |
|
21 | 24 | def __init__(self):
|
22 | 25 | super().__init__()
|
23 | 26 | self.setup_clean_chain = True
|
24 |
| - self.num_nodes = 3 |
25 |
| - |
26 |
| - def setup_network(self): |
27 |
| - super().setup_network() |
28 |
| - connect_nodes_bi(self.nodes,0,2) |
| 27 | + self.num_nodes = 2 |
29 | 28 |
|
30 |
| - def run_test (self): |
| 29 | + def run_test(self): |
31 | 30 | self.log.info("Mining blocks...")
|
32 | 31 | self.nodes[0].generate(1)
|
33 | 32 | self.sync_all()
|
34 |
| - self.nodes[1].generate(101) |
35 |
| - self.sync_all() |
36 |
| - |
37 |
| - assert_equal(self.nodes[0].getbalance(), 50) |
38 |
| - |
39 |
| - txid0 = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 11) |
40 |
| - txid1 = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 10) |
| 33 | + self.nodes[1].generate(100) |
41 | 34 | self.sync_all()
|
| 35 | + |
| 36 | + # This transaction will be confirmed |
| 37 | + txid1 = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 10) |
| 38 | + |
42 | 39 | self.nodes[0].generate(1)
|
43 | 40 | self.sync_all()
|
44 |
| - |
45 |
| - txid2 = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 11) |
46 |
| - txid3 = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 10) |
47 |
| - |
48 |
| - tx0 = self.nodes[0].gettransaction(txid0) |
49 |
| - assert_equal(tx0['txid'], txid0) #tx0 must be available (confirmed) |
50 |
| - |
51 |
| - tx1 = self.nodes[0].gettransaction(txid1) |
52 |
| - assert_equal(tx1['txid'], txid1) #tx1 must be available (confirmed) |
53 |
| - |
54 |
| - tx2 = self.nodes[0].gettransaction(txid2) |
55 |
| - assert_equal(tx2['txid'], txid2) #tx2 must be available (unconfirmed) |
56 |
| - |
57 |
| - tx3 = self.nodes[0].gettransaction(txid3) |
58 |
| - assert_equal(tx3['txid'], txid3) #tx3 must be available (unconfirmed) |
59 |
| - |
60 |
| - #restart bitcoind |
| 41 | + |
| 42 | + # This transaction will not be confirmed |
| 43 | + txid2 = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 20) |
| 44 | + |
| 45 | + # Confirmed and unconfirmed transactions are now in the wallet. |
| 46 | + assert_equal(self.nodes[0].gettransaction(txid1)['txid'], txid1) |
| 47 | + assert_equal(self.nodes[0].gettransaction(txid2)['txid'], txid2) |
| 48 | + |
| 49 | + # Stop-start node0. Both confirmed and unconfirmed transactions remain in the wallet. |
| 50 | + self.stop_node(0) |
| 51 | + self.nodes[0] = self.start_node(0, self.options.tmpdir) |
| 52 | + |
| 53 | + assert_equal(self.nodes[0].gettransaction(txid1)['txid'], txid1) |
| 54 | + assert_equal(self.nodes[0].gettransaction(txid2)['txid'], txid2) |
| 55 | + |
| 56 | + # Stop node0 and restart with zapwallettxes and persistmempool. The unconfirmed |
| 57 | + # transaction is zapped from the wallet, but is re-added when the mempool is reloaded. |
61 | 58 | self.stop_node(0)
|
62 |
| - self.nodes[0] = self.start_node(0,self.options.tmpdir) |
63 |
| - |
64 |
| - tx3 = self.nodes[0].gettransaction(txid3) |
65 |
| - assert_equal(tx3['txid'], txid3) #tx must be available (unconfirmed) |
66 |
| - |
| 59 | + self.nodes[0] = self.start_node(0, self.options.tmpdir, ["-persistmempool=1", "-zapwallettxes=2"]) |
| 60 | + |
| 61 | + assert_equal(self.nodes[0].gettransaction(txid1)['txid'], txid1) |
| 62 | + assert_equal(self.nodes[0].gettransaction(txid2)['txid'], txid2) |
| 63 | + |
| 64 | + # Stop node0 and restart with zapwallettxes, but not persistmempool. |
| 65 | + # The unconfirmed transaction is zapped and is no longer in the wallet. |
67 | 66 | self.stop_node(0)
|
68 |
| - |
69 |
| - #restart bitcoind with zapwallettxes |
70 |
| - self.nodes[0] = self.start_node(0,self.options.tmpdir, ["-zapwallettxes=1"]) |
71 |
| - |
72 |
| - assert_raises(JSONRPCException, self.nodes[0].gettransaction, [txid3]) |
73 |
| - #there must be an exception because the unconfirmed wallettx0 must be gone by now |
| 67 | + self.nodes[0] = self.start_node(0, self.options.tmpdir, ["-zapwallettxes=2"]) |
74 | 68 |
|
75 |
| - tx0 = self.nodes[0].gettransaction(txid0) |
76 |
| - assert_equal(tx0['txid'], txid0) #tx0 (confirmed) must still be available because it was confirmed |
| 69 | + # tx1 is still be available because it was confirmed |
| 70 | + assert_equal(self.nodes[0].gettransaction(txid1)['txid'], txid1) |
77 | 71 |
|
| 72 | + # This will raise an exception because the unconfirmed transaction has been zapped |
| 73 | + assert_raises_jsonrpc(-5, 'Invalid or non-wallet transaction id', self.nodes[0].gettransaction, txid2) |
78 | 74 |
|
79 | 75 | if __name__ == '__main__':
|
80 |
| - ZapWalletTXesTest ().main () |
| 76 | + ZapWalletTXesTest().main() |
0 commit comments