mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-04-18 19:47:53 +02:00
Merge bitcoin/bitcoin#26595: wallet: be able to specify a wallet name and passphrase to migratewallet
9486509be6wallet, rpc: Update migratewallet help text for encrypted wallets (Andrew Chow)aaf02b5721tests: Tests for migrating wallets by name, and providing passphrase (Andrew Chow)7fd125b27dwallet: Be able to unlock the wallet for migration (Andrew Chow)6bdbc5ff59rpc: Allow users to specify wallet name for migratewallet (Andrew Chow)dbfa345403wallet: Allow MigrateLegacyToDescriptor to take a wallet name (Andrew Chow) Pull request description: `migratewallet` currently operates on wallets that are already loaded, however this is not necessarily required, and in the future, not possible once the legacy wallet is removed. So we need to also be able to give the wallet name to migrate. Additionally, the passphrase is required when migrating a wallet. Since a wallet may not be loaded when we migrate, and as we currently unload wallets when migrating, we need the passphrase to be given to `migratewallet` in order to migrate encrypted wallets. Fixes #27048 ACKs for top commit: john-moffett: reACK9486509be6pinheadmz: ACK9486509be6furszy: ACK9486509bTree-SHA512: 35e2ba69a148e129a41e20d7fb99c4cab7947b1b7e7c362f4fd06ff8ac6e79e476e07207e063ba5b80e1a33e2343f4b4f1d72d7930ce80c34571c130d2f5cff4
This commit is contained in:
@@ -400,11 +400,75 @@ class WalletMigrationTest(BitcoinTestFramework):
|
||||
def test_encrypted(self):
|
||||
self.log.info("Test migration of an encrypted wallet")
|
||||
wallet = self.create_legacy_wallet("encrypted")
|
||||
default = self.nodes[0].get_wallet_rpc(self.default_wallet_name)
|
||||
|
||||
wallet.encryptwallet("pass")
|
||||
addr = wallet.getnewaddress()
|
||||
txid = default.sendtoaddress(addr, 1)
|
||||
self.generate(self.nodes[0], 1)
|
||||
bals = wallet.getbalances()
|
||||
|
||||
assert_raises_rpc_error(-15, "Error: migratewallet on encrypted wallets is currently unsupported.", wallet.migratewallet)
|
||||
# TODO: Fix migratewallet so that we can actually migrate encrypted wallets
|
||||
assert_raises_rpc_error(-4, "Error: Wallet decryption failed, the wallet passphrase was not provided or was incorrect", wallet.migratewallet)
|
||||
assert_raises_rpc_error(-4, "Error: Wallet decryption failed, the wallet passphrase was not provided or was incorrect", wallet.migratewallet, None, "badpass")
|
||||
assert_raises_rpc_error(-4, "The passphrase contains a null character", wallet.migratewallet, None, "pass\0with\0null")
|
||||
|
||||
wallet.migratewallet(passphrase="pass")
|
||||
|
||||
info = wallet.getwalletinfo()
|
||||
assert_equal(info["descriptors"], True)
|
||||
assert_equal(info["format"], "sqlite")
|
||||
assert_equal(info["unlocked_until"], 0)
|
||||
wallet.gettransaction(txid)
|
||||
|
||||
assert_equal(bals, wallet.getbalances())
|
||||
|
||||
def test_unloaded(self):
|
||||
self.log.info("Test migration of a wallet that isn't loaded")
|
||||
wallet = self.create_legacy_wallet("notloaded")
|
||||
default = self.nodes[0].get_wallet_rpc(self.default_wallet_name)
|
||||
|
||||
addr = wallet.getnewaddress()
|
||||
txid = default.sendtoaddress(addr, 1)
|
||||
self.generate(self.nodes[0], 1)
|
||||
bals = wallet.getbalances()
|
||||
|
||||
wallet.unloadwallet()
|
||||
|
||||
assert_raises_rpc_error(-8, "RPC endpoint wallet and wallet_name parameter specify different wallets", wallet.migratewallet, "someotherwallet")
|
||||
assert_raises_rpc_error(-8, "Either RPC endpoint wallet or wallet_name parameter must be provided", self.nodes[0].migratewallet)
|
||||
self.nodes[0].migratewallet("notloaded")
|
||||
|
||||
info = wallet.getwalletinfo()
|
||||
assert_equal(info["descriptors"], True)
|
||||
assert_equal(info["format"], "sqlite")
|
||||
wallet.gettransaction(txid)
|
||||
|
||||
assert_equal(bals, wallet.getbalances())
|
||||
|
||||
def test_unloaded_by_path(self):
|
||||
self.log.info("Test migration of a wallet that isn't loaded, specified by path")
|
||||
wallet = self.create_legacy_wallet("notloaded2")
|
||||
default = self.nodes[0].get_wallet_rpc(self.default_wallet_name)
|
||||
|
||||
addr = wallet.getnewaddress()
|
||||
txid = default.sendtoaddress(addr, 1)
|
||||
self.generate(self.nodes[0], 1)
|
||||
bals = wallet.getbalances()
|
||||
|
||||
wallet.unloadwallet()
|
||||
|
||||
wallet_file_path = os.path.join(self.nodes[0].datadir, "regtest", "wallets", "notloaded2")
|
||||
self.nodes[0].migratewallet(wallet_file_path)
|
||||
|
||||
# Because we gave the name by full path, the loaded wallet's name is that path too.
|
||||
wallet = self.nodes[0].get_wallet_rpc(wallet_file_path)
|
||||
|
||||
info = wallet.getwalletinfo()
|
||||
assert_equal(info["descriptors"], True)
|
||||
assert_equal(info["format"], "sqlite")
|
||||
wallet.gettransaction(txid)
|
||||
|
||||
assert_equal(bals, wallet.getbalances())
|
||||
|
||||
def run_test(self):
|
||||
self.generate(self.nodes[0], 101)
|
||||
@@ -416,6 +480,8 @@ class WalletMigrationTest(BitcoinTestFramework):
|
||||
self.test_no_privkeys()
|
||||
self.test_pk_coinbases()
|
||||
self.test_encrypted()
|
||||
self.test_unloaded()
|
||||
self.test_unloaded_by_path()
|
||||
|
||||
if __name__ == '__main__':
|
||||
WalletMigrationTest().main()
|
||||
|
||||
Reference in New Issue
Block a user