Skip to content

Commit

Permalink
Merge bitcoin/bitcoin#31452: wallet: Migrate non-HD keys to combo() d…
Browse files Browse the repository at this point in the history
…escriptor

62b2d23 wallet: Migrate non-HD keys to combo() descriptor (Ava Chow)

Pull request description:

  Non-HD keys do not have an HD seed ID associated with them, so if this value is the null value (all 0s), then we should not perform any seed ID comparison that would result in excluding the keys from combo() migration.

  This changes the migration of non-HD wallets (or blank wallets with imported private keys) to make a single combo() descriptors for the non-HD/imported keys, rather than pk(), pkh(), sh(wpkh()), and wpkh() descriptors for the keys.

  Implements bitcoin/bitcoin#31374 (comment)

ACKs for top commit:
  laanwj:
    Concept and code review ACK 62b2d23
  brunoerg:
    code review ACK 62b2d23
  furszy:
    Nice catch. ACK 62b2d23
  theStack:
    ACK 62b2d23
  rkrux:
    tACK 62b2d23

Tree-SHA512: 86a80b7dcc1598ab18068a2572ff4b4920b233178b760f7b76c5b21a9e6608005ac872f90e082a8f99b51daab0b049e73e4bee5b8e0b537d56ed0d34122a1f49
  • Loading branch information
fanquake committed Dec 13, 2024
2 parents beac62e + 62b2d23 commit d5ab5a4
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 7 deletions.
2 changes: 1 addition & 1 deletion src/wallet/scriptpubkeyman.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1799,7 +1799,7 @@ std::optional<MigrationData> LegacyDataSPKM::MigrateToDescriptor()
keyid_it++;
continue;
}
if (m_hd_chain.seed_id == meta.hd_seed_id || m_inactive_hd_chains.count(meta.hd_seed_id) > 0) {
if (!meta.hd_seed_id.IsNull() && (m_hd_chain.seed_id == meta.hd_seed_id || m_inactive_hd_chains.count(meta.hd_seed_id) > 0)) {
keyid_it = keyids.erase(keyid_it);
continue;
}
Expand Down
8 changes: 2 additions & 6 deletions test/functional/wallet_migration.py
Original file line number Diff line number Diff line change
Expand Up @@ -1032,15 +1032,11 @@ def test_manual_keys_import(self):
# There should be descriptors containing the imported key for: pk(), pkh(), sh(wpkh()), wpkh()
key_origin = hash160(pubkey)[:4].hex()
pubkey_hex = pubkey.hex()
pk_desc = descsum_create(f'pk([{key_origin}]{pubkey_hex})')
pkh_desc = descsum_create(f'pkh([{key_origin}]{pubkey_hex})')
sh_wpkh_desc = descsum_create(f'sh(wpkh([{key_origin}]{pubkey_hex}))')
wpkh_desc = descsum_create(f'wpkh([{key_origin}]{pubkey_hex})')
expected_descs = [pk_desc, pkh_desc, sh_wpkh_desc, wpkh_desc]
combo_desc = descsum_create(f"combo([{key_origin}]{pubkey_hex})")

# Verify all expected descriptors were migrated
migrated_desc = [item['desc'] for item in wallet.listdescriptors()['descriptors'] if pubkey.hex() in item['desc']]
assert_equal(expected_descs, migrated_desc)
assert_equal([combo_desc], migrated_desc)
wallet.unloadwallet()

######################################################
Expand Down

0 comments on commit d5ab5a4

Please sign in to comment.