From 4b0303197e40a556bea2d9df76d1407981c361e6 Mon Sep 17 00:00:00 2001 From: Ava Chow Date: Mon, 22 Jan 2024 17:23:08 -0500 Subject: [PATCH] descriptors: Move FlatSigningProvider pubkey filling to GetPubKey Instead of MakeScripts inconsistently filling the output FlatSigningProvider with the pubkeys involved, just do it in GetPubKey. --- src/script/descriptor.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/script/descriptor.cpp b/src/script/descriptor.cpp index 3abd85dd7ff..e6fc1feb2b0 100644 --- a/src/script/descriptor.cpp +++ b/src/script/descriptor.cpp @@ -242,6 +242,7 @@ public: { std::optional pub = m_provider->GetPubKey(pos, arg, out, read_cache, write_cache); if (!pub) return std::nullopt; + Assert(out.pubkeys.contains(pub->GetID())); auto& [pubkey, suborigin] = out.origins[pub->GetID()]; Assert(pubkey == *pub); // m_provider must have a valid origin by this point. std::copy(std::begin(m_origin.fingerprint), std::end(m_origin.fingerprint), suborigin.fingerprint); @@ -305,6 +306,7 @@ public: CKeyID keyid = m_pubkey.GetID(); std::copy(keyid.begin(), keyid.begin() + sizeof(info.fingerprint), info.fingerprint); out.origins.emplace(keyid, std::make_pair(m_pubkey, info)); + out.pubkeys.emplace(keyid, m_pubkey); return m_pubkey; } bool IsRange() const override { return false; } @@ -439,6 +441,7 @@ public: if (!der) return std::nullopt; out.origins.emplace(final_extkey.pubkey.GetID(), std::make_pair(final_extkey.pubkey, info)); + out.pubkeys.emplace(final_extkey.pubkey.GetID(), final_extkey.pubkey); if (write_cache) { // Only cache parent if there is any unhardened derivation @@ -874,10 +877,9 @@ public: class PKHDescriptor final : public DescriptorImpl { protected: - std::vector MakeScripts(const std::vector& keys, std::span, FlatSigningProvider& out) const override + std::vector MakeScripts(const std::vector& keys, std::span, FlatSigningProvider&) const override { CKeyID id = keys[0].GetID(); - out.pubkeys.emplace(id, keys[0]); return Vector(GetScriptForDestination(PKHash(id))); } public: @@ -909,10 +911,9 @@ public: class WPKHDescriptor final : public DescriptorImpl { protected: - std::vector MakeScripts(const std::vector& keys, std::span, FlatSigningProvider& out) const override + std::vector MakeScripts(const std::vector& keys, std::span, FlatSigningProvider&) const override { CKeyID id = keys[0].GetID(); - out.pubkeys.emplace(id, keys[0]); return Vector(GetScriptForDestination(WitnessV0KeyHash(id))); } public: @@ -948,7 +949,6 @@ protected: { std::vector ret; CKeyID id = keys[0].GetID(); - out.pubkeys.emplace(id, keys[0]); ret.emplace_back(GetScriptForRawPubKey(keys[0])); // P2PK ret.emplace_back(GetScriptForDestination(PKHash(id))); // P2PKH if (keys[0].IsCompressed()) { @@ -1175,7 +1175,6 @@ protected: builder.Finalize(xpk); WitnessV1Taproot output = builder.GetOutput(); out.tr_trees[output] = builder; - out.pubkeys.emplace(keys[0].GetID(), keys[0]); return Vector(GetScriptForDestination(output)); } bool ToStringSubScriptHelper(const SigningProvider* arg, std::string& ret, const StringType type, const DescriptorCache* cache = nullptr) const override