mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-22 12:23:34 -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
|
// InferDescriptor as that will get us all the solving info if it is there
|
||||||
std::unique_ptr<Descriptor> desc = InferDescriptor(spk, *GetSolvingProvider(spk));
|
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
|
// Get the private keys for this descriptor
|
||||||
std::vector<CScript> scripts;
|
std::vector<CScript> scripts;
|
||||||
FlatSigningProvider keys;
|
FlatSigningProvider keys;
|
||||||
|
|
Loading…
Add table
Reference in a new issue