Merge bitcoin/bitcoin#33031: wallet: Set descriptor cache upgraded flag for migrated wallets
88b0647f02wallet: Always write last hardened cache flag in migrated wallets (Ava Chow)8a08eef645tests: Check that the last hardened cache upgrade occurs (Ava Chow) Pull request description: #32597 set the descriptor cache upgraded flag for newly created wallets, but migrated wallets still did not have the flag set when they are migrated. For consistency, and to avoid an unnecessary upgrade, we should be setting this flag for migrated wallets. The flag would end up being set anyways at the end of migration when the wallet is reloaded as it would perform the automatic upgrade at that time. However, this is unnecessary and we should just set it from the get go. This PR also adds a couple tests to verify that the flag is being set, and that the upgrade is being performed. ACKs for top commit: cedwies: re-ACK88b0647rkrux: lgtm ACK88b0647f02pablomartin4btc: ACK88b0647f02Tree-SHA512: 7d0850db0ae38eedd1e6a3bfaa548c6c612182291059fb1a47279a4c4984ee7914ecd02d8c7e427ef67bf9f5e67cbc57a7ae4412fad539e1bf3e05c512a60d69
This commit is contained in:
4 files changed
+67
-15
No files matched your search
@@ -18,11 +18,12 @@ from test_framework.address import (
|
||||
from test_framework.descriptors import descsum_create
|
||||
from test_framework.key import ECPubKey
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.messages import COIN, CTransaction, CTxOut
|
||||
from test_framework.messages import COIN, CTransaction, CTxOut, ser_string
|
||||
from test_framework.script import hash160
|
||||
from test_framework.script_util import key_to_p2pkh_script, key_to_p2pk_script, script_to_p2sh_script, script_to_p2wsh_script
|
||||
from test_framework.util import (
|
||||
assert_equal,
|
||||
assert_greater_than,
|
||||
assert_raises_rpc_error,
|
||||
find_vout_for_address,
|
||||
sha256sum_file,
|
||||
@@ -140,7 +141,8 @@ class WalletMigrationTest(BitcoinTestFramework):
|
||||
# (in which case the wallet name would be suffixed by the 'watchonly' term)
|
||||
migrated_wallet_name = migrate_info['wallet_name']
|
||||
wallet = self.master_node.get_wallet_rpc(migrated_wallet_name)
|
||||
assert_equal(wallet.getwalletinfo()["descriptors"], True)
|
||||
wallet_info = wallet.getwalletinfo()
|
||||
assert_equal(wallet_info["descriptors"], True)
|
||||
self.assert_is_sqlite(migrated_wallet_name)
|
||||
# Always verify the backup path exist after migration
|
||||
assert os.path.exists(migrate_info['backup_path'])
|
||||
@@ -154,6 +156,25 @@ class WalletMigrationTest(BitcoinTestFramework):
|
||||
assert_equal(str(expected_backup_path), migrate_info['backup_path'])
|
||||
assert {"name": backup_filename} not in self.master_node.listwalletdir()["wallets"]
|
||||
|
||||
# Open the wallet with sqlite and verify that the wallet has the last hardened cache flag
|
||||
# set and the last hardened cache entries
|
||||
def check_last_hardened(conn):
|
||||
flags_rec = conn.execute(f"SELECT value FROM main WHERE key = x'{ser_string(b'flags').hex()}'").fetchone()
|
||||
flags = int.from_bytes(flags_rec[0], byteorder="little")
|
||||
|
||||
# All wallets should have the upgrade flag set
|
||||
assert_equal(bool(flags & (1 << 2)), True)
|
||||
|
||||
# Fetch all records with the walletdescriptorlhcache prefix
|
||||
# if the wallet has private keys and is not blank
|
||||
if wallet_info["private_keys_enabled"] and not wallet_info["blank"]:
|
||||
lh_cache_recs = conn.execute(f"SELECT value FROM main where key >= x'{ser_string(b'walletdescriptorlhcache').hex()}' AND key < x'{ser_string(b'walletdescriptorlhcachf').hex()}'").fetchall()
|
||||
assert_greater_than(len(lh_cache_recs), 0)
|
||||
|
||||
inspect_path = os.path.join(self.options.tmpdir, os.path.basename(f"{migrated_wallet_name}_inspect.dat"))
|
||||
wallet.backupwallet(inspect_path)
|
||||
self.inspect_sqlite_db(inspect_path, check_last_hardened)
|
||||
|
||||
return migrate_info, wallet
|
||||
|
||||
def test_basic(self):
|
||||
|
||||
Reference in new issue
Block a user