mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-27 19:47:30 -03:00
desc spkm: Return SigningProvider only if we have the privkey
If we know about a pubkey that's in our descriptor, but we don't have the private key, don't return a SigningProvider for that pubkey. This is specifically an issue for Taproot outputs that use the H point as the resulting PSBTs may end up containing irrelevant information because the H point was detected as a pubkey each unrelated descriptor knew about.
This commit is contained in:
parent
c9e67e214f
commit
493656763f
3 changed files with 11 additions and 1 deletions
|
@ -62,6 +62,11 @@ bool FlatSigningProvider::GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info)
|
||||||
if (ret) info = std::move(out.second);
|
if (ret) info = std::move(out.second);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
bool FlatSigningProvider::HaveKey(const CKeyID &keyid) const
|
||||||
|
{
|
||||||
|
CKey key;
|
||||||
|
return LookupHelper(keys, keyid, key);
|
||||||
|
}
|
||||||
bool FlatSigningProvider::GetKey(const CKeyID& keyid, CKey& key) const { return LookupHelper(keys, keyid, key); }
|
bool FlatSigningProvider::GetKey(const CKeyID& keyid, CKey& key) const { return LookupHelper(keys, keyid, key); }
|
||||||
bool FlatSigningProvider::GetTaprootSpendData(const XOnlyPubKey& output_key, TaprootSpendData& spenddata) const
|
bool FlatSigningProvider::GetTaprootSpendData(const XOnlyPubKey& output_key, TaprootSpendData& spenddata) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -215,6 +215,7 @@ struct FlatSigningProvider final : public SigningProvider
|
||||||
bool GetCScript(const CScriptID& scriptid, CScript& script) const override;
|
bool GetCScript(const CScriptID& scriptid, CScript& script) const override;
|
||||||
bool GetPubKey(const CKeyID& keyid, CPubKey& pubkey) const override;
|
bool GetPubKey(const CKeyID& keyid, CPubKey& pubkey) const override;
|
||||||
bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override;
|
bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override;
|
||||||
|
bool HaveKey(const CKeyID &keyid) const override;
|
||||||
bool GetKey(const CKeyID& keyid, CKey& key) const override;
|
bool GetKey(const CKeyID& keyid, CKey& key) const override;
|
||||||
bool GetTaprootSpendData(const XOnlyPubKey& output_key, TaprootSpendData& spenddata) const override;
|
bool GetTaprootSpendData(const XOnlyPubKey& output_key, TaprootSpendData& spenddata) const override;
|
||||||
bool GetTaprootBuilder(const XOnlyPubKey& output_key, TaprootBuilder& builder) const override;
|
bool GetTaprootBuilder(const XOnlyPubKey& output_key, TaprootBuilder& builder) const override;
|
||||||
|
|
|
@ -2456,7 +2456,11 @@ std::unique_ptr<FlatSigningProvider> DescriptorScriptPubKeyMan::GetSigningProvid
|
||||||
int32_t index = it->second;
|
int32_t index = it->second;
|
||||||
|
|
||||||
// Always try to get the signing provider with private keys. This function should only be called during signing anyways
|
// Always try to get the signing provider with private keys. This function should only be called during signing anyways
|
||||||
return GetSigningProvider(index, true);
|
std::unique_ptr<FlatSigningProvider> out = GetSigningProvider(index, true);
|
||||||
|
if (!out->HaveKey(pubkey.GetID())) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<FlatSigningProvider> DescriptorScriptPubKeyMan::GetSigningProvider(int32_t index, bool include_private) const
|
std::unique_ptr<FlatSigningProvider> DescriptorScriptPubKeyMan::GetSigningProvider(int32_t index, bool include_private) const
|
||||||
|
|
Loading…
Add table
Reference in a new issue