mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-21 12:22:50 -05:00
migration: Skip descriptors which do not parse
InferDescriptors can sometimes make descriptors which are actually invalid and cannot be parsed. Detect and skip such descriptors by doing a Parse() check before adding the descriptor to the wallet.
This commit is contained in:
parent
440ea1ab63
commit
fa1b7cd6e2
1 changed files with 15 additions and 0 deletions
|
@ -1928,6 +1928,21 @@ std::optional<MigrationData> LegacyDataSPKM::MigrateToDescriptor()
|
|||
|
||||
// InferDescriptor as that will get us all the solving info if it is there
|
||||
std::unique_ptr<Descriptor> desc = InferDescriptor(spk, *GetSolvingProvider(spk));
|
||||
|
||||
// Past bugs in InferDescriptor have caused it to create descriptors which cannot be re-parsed.
|
||||
// Re-parse the descriptors to detect that, and skip any that do not parse.
|
||||
{
|
||||
std::string desc_str = desc->ToString();
|
||||
FlatSigningProvider parsed_keys;
|
||||
std::string parse_error;
|
||||
std::vector<std::unique_ptr<Descriptor>> parsed_descs = Parse(desc_str, parsed_keys, parse_error);
|
||||
if (parsed_descs.empty()) {
|
||||
// Remove this scriptPubKey from the set
|
||||
it = spks.erase(it);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Get the private keys for this descriptor
|
||||
std::vector<CScript> scripts;
|
||||
FlatSigningProvider keys;
|
||||
|
|
Loading…
Add table
Reference in a new issue