mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-06-17 20:32:33 +02:00
Merge #20153: wallet: do not import a descriptor with hardened derivations into a watch-only wallet
538be4219ae7e65862e4aff540af88c9421e6061 wallet: fix importdescriptor silent fail (Ivan Metlushko) Pull request description: Currently `importdescriptor` command will successfully import a descriptor with hardened derivations into a watch-only wallet while silently failing to expand the descriptor to fill the cache. This leads to a broken wallet state and failure to load such wallet due to missing cache on subsequent restart. ACKs for top commit: laanwj: Code review ACK 538be4219ae7e65862e4aff540af88c9421e6061 achow101: ACK 538be4219ae7e65862e4aff540af88c9421e6061 meshcollider: utACK 538be4219ae7e65862e4aff540af88c9421e6061 Tree-SHA512: 4bdd0ab4437d55b3f1a79c3a300a0b186089155c020fe220a73d0cce274de47d90371d88918d39fd795f9fccf8db328f1e322d29a6062f9ce94a1c254398f004
This commit is contained in:
commit
1dfe19e284
@ -1523,7 +1523,9 @@ static UniValue ProcessDescriptorImport(CWallet * const pwallet, const UniValue&
|
|||||||
// Need to ExpandPrivate to check if private keys are available for all pubkeys
|
// Need to ExpandPrivate to check if private keys are available for all pubkeys
|
||||||
FlatSigningProvider expand_keys;
|
FlatSigningProvider expand_keys;
|
||||||
std::vector<CScript> scripts;
|
std::vector<CScript> scripts;
|
||||||
parsed_desc->Expand(0, keys, scripts, expand_keys);
|
if (!parsed_desc->Expand(0, keys, scripts, expand_keys)) {
|
||||||
|
throw JSONRPCError(RPC_WALLET_ERROR, "Cannot expand descriptor. Probably because of hardened derivations without private keys provided");
|
||||||
|
}
|
||||||
parsed_desc->ExpandPrivate(0, keys, expand_keys);
|
parsed_desc->ExpandPrivate(0, keys, expand_keys);
|
||||||
|
|
||||||
// Check if all private keys are provided
|
// Check if all private keys are provided
|
||||||
|
@ -4556,7 +4556,10 @@ ScriptPubKeyMan* CWallet::AddWalletDescriptor(WalletDescriptor& desc, const Flat
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Top up key pool, the manager will generate new scriptPubKeys internally
|
// Top up key pool, the manager will generate new scriptPubKeys internally
|
||||||
new_spk_man->TopUp();
|
if (!new_spk_man->TopUp()) {
|
||||||
|
WalletLogPrintf("Could not top up scriptPubKeys\n");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
// Apply the label if necessary
|
// Apply the label if necessary
|
||||||
// Note: we disable labels for ranged descriptors
|
// Note: we disable labels for ranged descriptors
|
||||||
|
@ -221,6 +221,15 @@ class ImportDescriptorsTest(BitcoinTestFramework):
|
|||||||
success=False,
|
success=False,
|
||||||
error_code=-4,
|
error_code=-4,
|
||||||
error_message='Cannot import private keys to a wallet with private keys disabled')
|
error_message='Cannot import private keys to a wallet with private keys disabled')
|
||||||
|
|
||||||
|
self.log.info("Should not import a descriptor with hardened derivations when private keys are disabled")
|
||||||
|
self.test_importdesc({"desc": descsum_create("wpkh(" + xpub + "/1h/*)"),
|
||||||
|
"timestamp": "now",
|
||||||
|
"range": 1},
|
||||||
|
success=False,
|
||||||
|
error_code=-4,
|
||||||
|
error_message='Cannot expand descriptor. Probably because of hardened derivations without private keys provided')
|
||||||
|
|
||||||
for address in addresses:
|
for address in addresses:
|
||||||
test_address(w1,
|
test_address(w1,
|
||||||
address,
|
address,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user