Skip to content

Commit

Permalink
walletdb: don't reinitialize desc cache with multiple cache entries
Browse files Browse the repository at this point in the history
When loading descriptor caches, we would accidentally reinitialize the
descriptor cache when seeing that one already exists. This should have
only been initializing the cache when one does not exist. However this
code itself is unnecessary as the act of looking up the cache to add to
it will initialize it if it didn't already exist.

This issue could be hit by trying to load a wallet that had imported a
multisig descriptor. The wallet would fail to load.

A test has been added to wallet_importdescriptors.py to catch this case.
Another test case has also been added to check that loading a wallet
with only single key descriptors works.
achow101 committed Jul 4, 2020
1 parent 3276c14 commit a66a7a1
Showing 2 changed files with 12 additions and 3 deletions.
3 changes: 0 additions & 3 deletions src/wallet/walletdb.cpp
Original file line number Diff line number Diff line change
@@ -592,9 +592,6 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
ssValue >> ser_xpub;
CExtPubKey xpub;
xpub.Decode(ser_xpub.data());
if (wss.m_descriptor_caches.count(desc_id)) {
wss.m_descriptor_caches[desc_id] = DescriptorCache();
}
if (parent) {
wss.m_descriptor_caches[desc_id].CacheParentExtPubKey(key_exp_index, xpub);
} else {
12 changes: 12 additions & 0 deletions test/functional/wallet_importdescriptors.py
Original file line number Diff line number Diff line change
@@ -141,6 +141,14 @@ def run_test(self):
success=True)
assert_equal(w1.getwalletinfo()['keypoolsize'], 0)

test_address(w1,
key.p2sh_p2wpkh_addr,
ismine=True,
solvable=True)

# Check persistence of data and that loading works correctly
w1.unloadwallet()
self.nodes[1].loadwallet('w1')
test_address(w1,
key.p2sh_p2wpkh_addr,
ismine=True,
@@ -370,6 +378,10 @@ def run_test(self):
self.sync_all()
assert_equal(wmulti_pub.getbalance(), wmulti_priv.getbalance())

# Make sure that descriptor wallets containing multiple xpubs in a single descriptor load correctly
wmulti_pub.unloadwallet()
self.nodes[1].loadwallet('wmulti_pub')

self.log.info("Multisig with distributed keys")
self.nodes[1].createwallet(wallet_name="wmulti_priv1", descriptors=True)
wmulti_priv1 = self.nodes[1].get_wallet_rpc("wmulti_priv1")

0 comments on commit a66a7a1

Please sign in to comment.