Merge bitcoin/bitcoin#33031: wallet: Set descriptor cache upgraded flag for migrated wallets

88b0647f02 wallet: Always write last hardened cache flag in migrated wallets (Ava Chow)
8a08eef645 tests: 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-ACK 88b0647
  rkrux:
    lgtm ACK 88b0647f02
  pablomartin4btc:
    ACK 88b0647f02

Tree-SHA512: 7d0850db0ae38eedd1e6a3bfaa548c6c612182291059fb1a47279a4c4984ee7914ecd02d8c7e427ef67bf9f5e67cbc57a7ae4412fad539e1bf3e05c512a60d69
This commit is contained in:
merge-script committed 2025-09-23 15:27:17 -04:00
commit dd61f08fd5
4 files changed
+67 -15

No files matched your search

+23 -2
View File
@@ -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):