descriptor: fix duplicate check for hardened keys
The miniscript duplicate key check compares two key expressions by deriving each of them at index 0, and it did that with an empty signing provider. Any expression with a hardened step could therefore not be derived and came back empty, so two of them compared equal and the descriptor was rejected with "contains duplicate public keys" even though the keys were different. musig() makes this easy to run into, since one participant on a hardened path keeps the whole aggregate key from resolving, but plain key expressions are affected just the same. Derive with the signing provider that is filled while parsing, or with the one we are inferring from, since that is where the private keys for the hardened steps are. If both keys still cannot be derived, compare the key expressions instead, so that two different expressions are not mistaken for one another. A duplicate written two different ways can still be missed if either spelling cannot be derived. The private key that is missing for the comparison is also needed to expand the descriptor, so deriveaddresses and importdescriptors both refuse it. Once the needed private keys are available, both expressions resolve and the duplicate is caught again.
S
Shuvam Pandey committed
7b15e2cb442c0bfec76d7d4b9abdd31c7a538da8
Parent: b970bb3