mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-12-05 10:12:48 +01:00
Merge bitcoin/bitcoin#19651: wallet: importdescriptors update existing
3efaf83c75wallet: deactivate descriptor (S3RK)6737d9655btest: wallet importdescriptors update existing (S3RK)586f1d53d6wallet: maintain SPK consistency on internal flag change (S3RK)f1b7db1474wallet: don't mute exceptions in importdescriptors (S3RK)bf68ebc1cdwallet: allow to import same descriptor twice (S3RK) Pull request description: Rationale: allow updating existing descriptors with `importdescriptors` command. Currently if you run same `importdescriptors` command twice with a descriptor containing private key you will get very confusing error — `Missing required fields`. What happens is that Wallet tries to write imported private key to the disk, but it exists already so we get `DB_KEYEXIST (-30995)` from BerkelyDB. Please note, that we set `DB_NOOVERWRITE` (I guess not to lose some keys accidentally). The exception is caught in `catch (...)` in rpcdump.cpp with a generic error. With this PR if a descriptor is already present than we will update its activeness, internalness, label, range and next_index. For the range only expansion is allowed (range start can only decrease, range end increase). ACKs for top commit: achow101: re-ACK3efaf83c75meshcollider: Code review ACK3efaf83c75jonatack: Light ACK3efaf83c75per `git range-diffa000cb05d96704 3efaf83` and as a sanity check, re-debug-built on debian with gcc 10.2.1 and clang 11, ran wallet_importdescriptors.py Tree-SHA512: 122c4b621d64ec8a3b625f3aed9f01a2b5cbaf2029ad0325b5ff38d67fff5cd35324335fabe2dd5169548b01b267c81be6ae0f5c834342f3d5f6eeed515c4843
This commit is contained in:
@@ -210,6 +210,12 @@ bool WalletBatch::WriteActiveScriptPubKeyMan(uint8_t type, const uint256& id, bo
|
||||
return WriteIC(make_pair(key, type), id);
|
||||
}
|
||||
|
||||
bool WalletBatch::EraseActiveScriptPubKeyMan(uint8_t type, bool internal)
|
||||
{
|
||||
const std::string key{internal ? DBKeys::ACTIVEINTERNALSPK : DBKeys::ACTIVEEXTERNALSPK};
|
||||
return EraseIC(make_pair(key, type));
|
||||
}
|
||||
|
||||
bool WalletBatch::WriteDescriptorKey(const uint256& desc_id, const CPubKey& pubkey, const CPrivKey& privkey)
|
||||
{
|
||||
// hash pubkey/privkey to accelerate wallet load
|
||||
|
||||
Reference in New Issue
Block a user