Skip to content

Commit 3ae5b6a

Browse files
committed
Store TaprootBuilder in SigningProviders instead of TaprootSpendData
TaprootSpendData can be gotten from TaprootBuilder, however for PSBT, we also need TaprootBuilders directly (for the outputs). So we store the TaprootBuilder in the FlatSigningProvider and when the TaprootSpendData is needed, we generate it on the fly using the stored builder.
1 parent 4d1223e commit 3ae5b6a

File tree

3 files changed

+21
-7
lines changed

3 files changed

+21
-7
lines changed

src/script/descriptor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -882,7 +882,7 @@ class TRDescriptor final : public DescriptorImpl
882882
if (!xpk.IsFullyValid()) return {};
883883
builder.Finalize(xpk);
884884
WitnessV1Taproot output = builder.GetOutput();
885-
out.tr_spenddata[output].Merge(builder.GetSpendData());
885+
out.tr_trees[output] = builder;
886886
out.pubkeys.emplace(keys[0].GetID(), keys[0]);
887887
return Vector(GetScriptForDestination(output));
888888
}

src/script/signingprovider.cpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ bool HidingSigningProvider::GetTaprootSpendData(const XOnlyPubKey& output_key, T
4848
{
4949
return m_provider->GetTaprootSpendData(output_key, spenddata);
5050
}
51+
bool HidingSigningProvider::GetTaprootBuilder(const XOnlyPubKey& output_key, TaprootBuilder& builder) const
52+
{
53+
return m_provider->GetTaprootBuilder(output_key, builder);
54+
}
5155

5256
bool FlatSigningProvider::GetCScript(const CScriptID& scriptid, CScript& script) const { return LookupHelper(scripts, scriptid, script); }
5357
bool FlatSigningProvider::GetPubKey(const CKeyID& keyid, CPubKey& pubkey) const { return LookupHelper(pubkeys, keyid, pubkey); }
@@ -61,7 +65,16 @@ bool FlatSigningProvider::GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info)
6165
bool FlatSigningProvider::GetKey(const CKeyID& keyid, CKey& key) const { return LookupHelper(keys, keyid, key); }
6266
bool FlatSigningProvider::GetTaprootSpendData(const XOnlyPubKey& output_key, TaprootSpendData& spenddata) const
6367
{
64-
return LookupHelper(tr_spenddata, output_key, spenddata);
68+
TaprootBuilder builder;
69+
if (LookupHelper(tr_trees, output_key, builder)) {
70+
spenddata = builder.GetSpendData();
71+
return true;
72+
}
73+
return false;
74+
}
75+
bool FlatSigningProvider::GetTaprootBuilder(const XOnlyPubKey& output_key, TaprootBuilder& builder) const
76+
{
77+
return LookupHelper(tr_trees, output_key, builder);
6578
}
6679

6780
FlatSigningProvider Merge(const FlatSigningProvider& a, const FlatSigningProvider& b)
@@ -75,10 +88,8 @@ FlatSigningProvider Merge(const FlatSigningProvider& a, const FlatSigningProvide
7588
ret.keys.insert(b.keys.begin(), b.keys.end());
7689
ret.origins = a.origins;
7790
ret.origins.insert(b.origins.begin(), b.origins.end());
78-
ret.tr_spenddata = a.tr_spenddata;
79-
for (const auto& [output_key, spenddata] : b.tr_spenddata) {
80-
ret.tr_spenddata[output_key].Merge(spenddata);
81-
}
91+
ret.tr_trees = a.tr_trees;
92+
ret.tr_trees.insert(b.tr_trees.begin(), b.tr_trees.end());
8293
return ret;
8394
}
8495

src/script/signingprovider.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class SigningProvider
2525
virtual bool HaveKey(const CKeyID &address) const { return false; }
2626
virtual bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const { return false; }
2727
virtual bool GetTaprootSpendData(const XOnlyPubKey& output_key, TaprootSpendData& spenddata) const { return false; }
28+
virtual bool GetTaprootBuilder(const XOnlyPubKey& output_key, TaprootBuilder& builder) const { return false; }
2829

2930
bool GetKeyByXOnly(const XOnlyPubKey& pubkey, CKey& key) const
3031
{
@@ -67,6 +68,7 @@ class HidingSigningProvider : public SigningProvider
6768
bool GetKey(const CKeyID& keyid, CKey& key) const override;
6869
bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override;
6970
bool GetTaprootSpendData(const XOnlyPubKey& output_key, TaprootSpendData& spenddata) const override;
71+
bool GetTaprootBuilder(const XOnlyPubKey& output_key, TaprootBuilder& builder) const override;
7072
};
7173

7274
struct FlatSigningProvider final : public SigningProvider
@@ -75,13 +77,14 @@ struct FlatSigningProvider final : public SigningProvider
7577
std::map<CKeyID, CPubKey> pubkeys;
7678
std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>> origins;
7779
std::map<CKeyID, CKey> keys;
78-
std::map<XOnlyPubKey, TaprootSpendData> tr_spenddata; /** Map from output key to spend data. */
80+
std::map<XOnlyPubKey, TaprootBuilder> tr_trees; /** Map from output key to Taproot tree (which can then make the TaprootSpendData */
7981

8082
bool GetCScript(const CScriptID& scriptid, CScript& script) const override;
8183
bool GetPubKey(const CKeyID& keyid, CPubKey& pubkey) const override;
8284
bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override;
8385
bool GetKey(const CKeyID& keyid, CKey& key) const override;
8486
bool GetTaprootSpendData(const XOnlyPubKey& output_key, TaprootSpendData& spenddata) const override;
87+
bool GetTaprootBuilder(const XOnlyPubKey& output_key, TaprootBuilder& builder) const override;
8588
};
8689

8790
FlatSigningProvider Merge(const FlatSigningProvider& a, const FlatSigningProvider& b);

0 commit comments

Comments
 (0)