diff --git a/src/script/descriptor.cpp b/src/script/descriptor.cpp index e6fc1feb2b0..0b7cd4a4dc1 100644 --- a/src/script/descriptor.cpp +++ b/src/script/descriptor.cpp @@ -211,8 +211,8 @@ public: */ virtual bool ToNormalizedString(const SigningProvider& arg, std::string& out, const DescriptorCache* cache = nullptr) const = 0; - /** Derive a private key, if private data is available in arg. */ - virtual bool GetPrivKey(int pos, const SigningProvider& arg, CKey& key) const = 0; + /** Derive a private key, if private data is available in arg and put it into out. */ + virtual void GetPrivKey(int pos, const SigningProvider& arg, FlatSigningProvider& out) const = 0; /** Return the non-extended public key for this PubkeyProvider, if it has one. */ virtual std::optional GetRootPubKey() const = 0; @@ -274,9 +274,9 @@ public: } return true; } - bool GetPrivKey(int pos, const SigningProvider& arg, CKey& key) const override + void GetPrivKey(int pos, const SigningProvider& arg, FlatSigningProvider& out) const override { - return m_provider->GetPrivKey(pos, arg, key); + m_provider->GetPrivKey(pos, arg, out); } std::optional GetRootPubKey() const override { @@ -298,6 +298,14 @@ class ConstPubkeyProvider final : public PubkeyProvider CPubKey m_pubkey; bool m_xonly; + std::optional GetPrivKey(const SigningProvider& arg) const + { + CKey key; + if (!(m_xonly ? arg.GetKeyByXOnly(XOnlyPubKey(m_pubkey), key) : + arg.GetKey(m_pubkey.GetID(), key))) return std::nullopt; + return key; + } + public: ConstPubkeyProvider(uint32_t exp_index, const CPubKey& pubkey, bool xonly) : PubkeyProvider(exp_index), m_pubkey(pubkey), m_xonly(xonly) {} std::optional GetPubKey(int pos, const SigningProvider&, FlatSigningProvider& out, const DescriptorCache* read_cache = nullptr, DescriptorCache* write_cache = nullptr) const override @@ -314,9 +322,9 @@ public: std::string ToString(StringType type) const override { return m_xonly ? HexStr(m_pubkey).substr(2) : HexStr(m_pubkey); } bool ToPrivateString(const SigningProvider& arg, std::string& ret) const override { - CKey key; - if (!GetPrivKey(/*pos=*/0, arg, key)) return false; - ret = EncodeSecret(key); + std::optional key = GetPrivKey(arg); + if (!key) return false; + ret = EncodeSecret(*key); return true; } bool ToNormalizedString(const SigningProvider& arg, std::string& ret, const DescriptorCache* cache) const override @@ -324,10 +332,11 @@ public: ret = ToString(StringType::PUBLIC); return true; } - bool GetPrivKey(int pos, const SigningProvider& arg, CKey& key) const override + void GetPrivKey(int pos, const SigningProvider& arg, FlatSigningProvider& out) const override { - return m_xonly ? arg.GetKeyByXOnly(XOnlyPubKey(m_pubkey), key) : - arg.GetKey(m_pubkey.GetID(), key); + std::optional key = GetPrivKey(arg); + if (!key) return; + out.keys.emplace(key->GetPubKey().GetID(), *key); } std::optional GetRootPubKey() const override { @@ -542,15 +551,14 @@ public: } return true; } - bool GetPrivKey(int pos, const SigningProvider& arg, CKey& key) const override + void GetPrivKey(int pos, const SigningProvider& arg, FlatSigningProvider& out) const override { CExtKey extkey; CExtKey dummy; - if (!GetDerivedExtKey(arg, extkey, dummy)) return false; - if (m_derive == DeriveType::UNHARDENED && !extkey.Derive(extkey, pos)) return false; - if (m_derive == DeriveType::HARDENED && !extkey.Derive(extkey, pos | 0x80000000UL)) return false; - key = extkey.key; - return true; + if (!GetDerivedExtKey(arg, extkey, dummy)) return; + if (m_derive == DeriveType::UNHARDENED && !extkey.Derive(extkey, pos)) return; + if (m_derive == DeriveType::HARDENED && !extkey.Derive(extkey, pos | 0x80000000UL)) return; + out.keys.emplace(extkey.key.GetPubKey().GetID(), extkey.key); } std::optional GetRootPubKey() const override { @@ -736,9 +744,7 @@ public: void ExpandPrivate(int pos, const SigningProvider& provider, FlatSigningProvider& out) const final { for (const auto& p : m_pubkey_args) { - CKey key; - if (!p->GetPrivKey(pos, provider, key)) continue; - out.keys.emplace(key.GetPubKey().GetID(), key); + p->GetPrivKey(pos, provider, out); } for (const auto& arg : m_subdescriptor_args) { arg->ExpandPrivate(pos, provider, out);