wallet_crosschain.py raw
1 #!/usr/bin/env python3
2 # Copyright (c) 2020-2022 The Limenka developers
3 # Distributed under the MIT software license, see the accompanying
4 # file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6 from test_framework.test_framework import LimenkaTestFramework
7 from test_framework.util import assert_raises_rpc_error
8
9 class WalletCrossChain(LimenkaTestFramework):
10 def add_options(self, parser):
11 self.add_wallet_options(parser)
12
13 def set_test_params(self):
14 self.num_nodes = 3
15 self.setup_clean_chain = True
16
17 def skip_test_if_missing_module(self):
18 self.skip_if_no_wallet()
19
20 def setup_network(self):
21 self.add_nodes(self.num_nodes)
22
23 # Switch node 1 to testnet before starting it.
24 self.nodes[1].chain = 'testnet3'
25 self.nodes[1].extra_args = ['-maxconnections=0', '-prune=550'] # disable testnet sync
26 self.nodes[1].replace_in_config([('regtest=', 'testnet='), ('[regtest]', '[test]')])
27
28 # Switch node 2 to testnet4 before starting it.
29 self.nodes[2].chain = 'testnet4'
30 self.nodes[2].extra_args = ['-maxconnections=0', '-prune=550'] # disable testnet4 sync
31 self.nodes[2].replace_in_config([('regtest=', 'testnet4='), ('[regtest]', '[testnet4]')])
32
33 self.start_nodes()
34
35 def run_test(self):
36 self.log.info("Creating wallets")
37
38 node0_wallet = self.nodes[0].datadir_path / 'node0_wallet'
39 node0_wallet_backup = self.nodes[0].datadir_path / 'node0_wallet.bak'
40 self.nodes[0].createwallet(node0_wallet)
41 self.nodes[0].backupwallet(node0_wallet_backup)
42 self.nodes[0].unloadwallet(node0_wallet)
43 node1_wallet = self.nodes[1].datadir_path / 'node1_wallet'
44 node1_wallet_backup = self.nodes[0].datadir_path / 'node1_wallet.bak'
45 self.nodes[1].createwallet(node1_wallet)
46 self.nodes[1].backupwallet(node1_wallet_backup)
47 self.nodes[1].unloadwallet(node1_wallet)
48 node2_wallet = self.nodes[2].datadir_path / 'node2_wallet'
49 node2_wallet_backup = self.nodes[0].datadir_path / 'node2_wallet.bak'
50 self.nodes[2].createwallet(node2_wallet)
51 self.nodes[2].backupwallet(node2_wallet_backup)
52 self.nodes[2].unloadwallet(node2_wallet)
53
54 self.log.info("Loading/restoring wallets into nodes with a different genesis block")
55
56 if self.options.descriptors:
57 assert_raises_rpc_error(-18, 'Wallet file verification failed.', self.nodes[0].loadwallet, node1_wallet)
58 assert_raises_rpc_error(-18, 'Wallet file verification failed.', self.nodes[0].loadwallet, node2_wallet)
59 assert_raises_rpc_error(-18, 'Wallet file verification failed.', self.nodes[1].loadwallet, node0_wallet)
60 assert_raises_rpc_error(-18, 'Wallet file verification failed.', self.nodes[2].loadwallet, node0_wallet)
61 assert_raises_rpc_error(-18, 'Wallet file verification failed.', self.nodes[1].loadwallet, node2_wallet)
62 assert_raises_rpc_error(-18, 'Wallet file verification failed.', self.nodes[2].loadwallet, node1_wallet)
63 assert_raises_rpc_error(-18, 'Wallet file verification failed.', self.nodes[0].restorewallet, 'w', node1_wallet_backup)
64 assert_raises_rpc_error(-18, 'Wallet file verification failed.', self.nodes[0].restorewallet, 'w', node2_wallet_backup)
65 assert_raises_rpc_error(-18, 'Wallet file verification failed.', self.nodes[1].restorewallet, 'w', node0_wallet_backup)
66 assert_raises_rpc_error(-18, 'Wallet file verification failed.', self.nodes[2].restorewallet, 'w', node0_wallet_backup)
67 assert_raises_rpc_error(-18, 'Wallet file verification failed.', self.nodes[1].restorewallet, 'w', node2_wallet_backup)
68 assert_raises_rpc_error(-18, 'Wallet file verification failed.', self.nodes[2].restorewallet, 'w', node1_wallet_backup)
69 else:
70 assert_raises_rpc_error(-4, 'Wallet files should not be reused across chains.', self.nodes[0].loadwallet, node1_wallet)
71 assert_raises_rpc_error(-4, 'Wallet files should not be reused across chains.', self.nodes[0].loadwallet, node2_wallet)
72 assert_raises_rpc_error(-4, 'Wallet files should not be reused across chains.', self.nodes[1].loadwallet, node0_wallet)
73 assert_raises_rpc_error(-4, 'Wallet files should not be reused across chains.', self.nodes[2].loadwallet, node0_wallet)
74 assert_raises_rpc_error(-4, 'Wallet files should not be reused across chains.', self.nodes[1].loadwallet, node2_wallet)
75 assert_raises_rpc_error(-4, 'Wallet files should not be reused across chains.', self.nodes[2].loadwallet, node1_wallet)
76 assert_raises_rpc_error(-4, 'Wallet files should not be reused across chains.', self.nodes[0].restorewallet, 'w', node1_wallet_backup)
77 assert_raises_rpc_error(-4, 'Wallet files should not be reused across chains.', self.nodes[0].restorewallet, 'w', node2_wallet_backup)
78 assert_raises_rpc_error(-4, 'Wallet files should not be reused across chains.', self.nodes[1].restorewallet, 'w', node0_wallet_backup)
79 assert_raises_rpc_error(-4, 'Wallet files should not be reused across chains.', self.nodes[2].restorewallet, 'w', node0_wallet_backup)
80 assert_raises_rpc_error(-4, 'Wallet files should not be reused across chains.', self.nodes[1].restorewallet, 'w', node2_wallet_backup)
81 assert_raises_rpc_error(-4, 'Wallet files should not be reused across chains.', self.nodes[2].restorewallet, 'w', node1_wallet_backup)
82
83 if not self.options.descriptors:
84 self.log.info("Override cross-chain wallet load protection")
85 self.stop_nodes()
86 self.start_nodes([['-walletcrosschain', '-prune=550']] * self.num_nodes)
87 self.nodes[0].loadwallet(node1_wallet)
88 self.nodes[1].loadwallet(node0_wallet)
89
90
91 if __name__ == '__main__':
92 WalletCrossChain(__file__).main()
93