66
77Test various backwards compatibility scenarios. Download the previous node binaries:
88
9- contrib/devtools/previous_release.sh -b v0.19.0.1 v0.18.1 v0.17.1
9+ contrib/devtools/previous_release.sh -b v0.19.1 v0.18.1 v0.17.1 v0.16.3 v0.15.2
10+
11+ v0.15.2 is not required by this test, but it is used in wallet_upgradewallet.py.
12+ Due to a hardfork in regtest, it can't be used to sync nodes.
13+
1014
1115Due to RPC changes introduced in various versions the below tests
1216won't work for older versions without some patches or workarounds.
2226from test_framework .descriptors import descsum_create
2327
2428from test_framework .util import (
29+ adjust_bitcoin_conf_for_pre_17 ,
2530 assert_equal ,
2631 sync_blocks ,
2732 sync_mempools ,
3136class BackwardsCompatibilityTest (BitcoinTestFramework ):
3237 def set_test_params (self ):
3338 self .setup_clean_chain = True
34- self .num_nodes = 5
39+ self .num_nodes = 6
3540 # Add new version after each release:
3641 self .extra_args = [
3742 ["-addresstype=bech32" ], # Pre-release: use to mine blocks
3843 ["-nowallet" , "-walletrbf=1" , "-addresstype=bech32" ], # Pre-release: use to receive coins, swap wallets, etc
39- ["-nowallet" , "-walletrbf=1" , "-addresstype=bech32" ], # v0.19.0. 1
44+ ["-nowallet" , "-walletrbf=1" , "-addresstype=bech32" ], # v0.19.1
4045 ["-nowallet" , "-walletrbf=1" , "-addresstype=bech32" ], # v0.18.1
41- ["-nowallet" , "-walletrbf=1" , "-addresstype=bech32" ] # v0.17.1
46+ ["-nowallet" , "-walletrbf=1" , "-addresstype=bech32" ], # v0.17.1
47+ ["-nowallet" , "-walletrbf=1" , "-addresstype=bech32" ], # v0.16.3
4248 ]
4349
4450 def skip_test_if_missing_module (self ):
@@ -49,10 +55,13 @@ def setup_nodes(self):
4955 self .add_nodes (self .num_nodes , extra_args = self .extra_args , versions = [
5056 None ,
5157 None ,
52- 190001 ,
58+ 190100 ,
5359 180100 ,
5460 170100 ,
61+ 160300 ,
5562 ])
63+ # adapt bitcoin.conf, because older bitcoind's don't recognize config sections
64+ adjust_bitcoin_conf_for_pre_17 (self .nodes [5 ].bitcoinconf )
5665
5766 self .start_nodes ()
5867
@@ -65,10 +74,11 @@ def run_test(self):
6574 res = self .nodes [self .num_nodes - 1 ].getblockchaininfo ()
6675 assert_equal (res ['blocks' ], 101 )
6776
68- node_master = self .nodes [self .num_nodes - 4 ]
69- node_v19 = self .nodes [self .num_nodes - 3 ]
70- node_v18 = self .nodes [self .num_nodes - 2 ]
71- node_v17 = self .nodes [self .num_nodes - 1 ]
77+ node_master = self .nodes [self .num_nodes - 5 ]
78+ node_v19 = self .nodes [self .num_nodes - 4 ]
79+ node_v18 = self .nodes [self .num_nodes - 3 ]
80+ node_v17 = self .nodes [self .num_nodes - 2 ]
81+ node_v16 = self .nodes [self .num_nodes - 1 ]
7282
7383 self .log .info ("Test wallet backwards compatibility..." )
7484 # Create a number of wallets and open them in older versions:
@@ -167,13 +177,21 @@ def run_test(self):
167177 node_v19_wallets_dir = os .path .join (node_v19 .datadir , "regtest/wallets" )
168178 node_v18_wallets_dir = os .path .join (node_v18 .datadir , "regtest/wallets" )
169179 node_v17_wallets_dir = os .path .join (node_v17 .datadir , "regtest/wallets" )
180+ node_v16_wallets_dir = os .path .join (node_v16 .datadir , "regtest" )
170181 node_master .unloadwallet ("w1" )
171182 node_master .unloadwallet ("w2" )
172183 node_v19 .unloadwallet ("w1_v19" )
173184 node_v19 .unloadwallet ("w2_v19" )
174185 node_v18 .unloadwallet ("w1_v18" )
175186 node_v18 .unloadwallet ("w2_v18" )
176187
188+ # Copy wallets to v0.16
189+ for wallet in os .listdir (node_master_wallets_dir ):
190+ shutil .copytree (
191+ os .path .join (node_master_wallets_dir , wallet ),
192+ os .path .join (node_v16_wallets_dir , wallet )
193+ )
194+
177195 # Copy wallets to v0.17
178196 for wallet in os .listdir (node_master_wallets_dir ):
179197 shutil .copytree (
@@ -292,10 +310,17 @@ def run_test(self):
292310 # assert_raises_rpc_error(-4, "Wallet loading failed.", node_v17.loadwallet, 'w3_v18')
293311
294312 # Instead, we stop node and try to launch it with the wallet:
295- self .stop_node (self . num_nodes - 1 )
313+ self .stop_node (4 )
296314 node_v17 .assert_start_raises_init_error (["-wallet=w3_v18" ], "Error: Error loading w3_v18: Wallet requires newer version of Bitcoin Core" )
297315 node_v17 .assert_start_raises_init_error (["-wallet=w3" ], "Error: Error loading w3: Wallet requires newer version of Bitcoin Core" )
298- self .start_node (self .num_nodes - 1 )
316+ self .start_node (4 )
317+
318+ # Open most recent wallet in v0.16 (no loadwallet RPC)
319+ self .stop_node (5 )
320+ self .start_node (5 , extra_args = ["-wallet=w2" ])
321+ wallet = node_v16 .get_wallet_rpc ("w2" )
322+ info = wallet .getwalletinfo ()
323+ assert info ['keypoolsize' ] == 1
299324
300325 self .log .info ("Test wallet upgrade path..." )
301326 # u1: regular wallet, created with v0.17
0 commit comments