Skip to content

Commit d99a081

Browse files
committed
psbt: MuSig2 data in Fill/FromSignatureData
1 parent 4d8b4f5 commit d99a081

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

src/psbt.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,13 @@ void PSBTInput::FillSignatureData(SignatureData& sigdata) const
149149
for (const auto& [hash, preimage] : hash256_preimages) {
150150
sigdata.hash256_preimages.emplace(std::vector<unsigned char>(hash.begin(), hash.end()), preimage);
151151
}
152+
sigdata.musig2_pubkeys.insert(m_musig2_participants.begin(), m_musig2_participants.end());
153+
for (const auto& [agg_key_lh, pubnonces] : m_musig2_pubnonces) {
154+
sigdata.musig2_pubnonces[agg_key_lh].insert(pubnonces.begin(), pubnonces.end());
155+
}
156+
for (const auto& [agg_key_lh, psigs] : m_musig2_partial_sigs) {
157+
sigdata.musig2_partial_sigs[agg_key_lh].insert(psigs.begin(), psigs.end());
158+
}
152159
}
153160

154161
void PSBTInput::FromSignatureData(const SignatureData& sigdata)
@@ -196,6 +203,13 @@ void PSBTInput::FromSignatureData(const SignatureData& sigdata)
196203
for (const auto& [pubkey, leaf_origin] : sigdata.taproot_misc_pubkeys) {
197204
m_tap_bip32_paths.emplace(pubkey, leaf_origin);
198205
}
206+
m_musig2_participants.insert(sigdata.musig2_pubkeys.begin(), sigdata.musig2_pubkeys.end());
207+
for (const auto& [agg_key_lh, pubnonces] : sigdata.musig2_pubnonces) {
208+
m_musig2_pubnonces[agg_key_lh].insert(pubnonces.begin(), pubnonces.end());
209+
}
210+
for (const auto& [agg_key_lh, psigs] : sigdata.musig2_partial_sigs) {
211+
m_musig2_partial_sigs[agg_key_lh].insert(psigs.begin(), psigs.end());
212+
}
199213
}
200214

201215
void PSBTInput::Merge(const PSBTInput& input)
@@ -223,6 +237,13 @@ void PSBTInput::Merge(const PSBTInput& input)
223237
if (m_tap_key_sig.empty() && !input.m_tap_key_sig.empty()) m_tap_key_sig = input.m_tap_key_sig;
224238
if (m_tap_internal_key.IsNull() && !input.m_tap_internal_key.IsNull()) m_tap_internal_key = input.m_tap_internal_key;
225239
if (m_tap_merkle_root.IsNull() && !input.m_tap_merkle_root.IsNull()) m_tap_merkle_root = input.m_tap_merkle_root;
240+
m_musig2_participants.insert(input.m_musig2_participants.begin(), input.m_musig2_participants.end());
241+
for (const auto& [agg_key_lh, pubnonces] : input.m_musig2_pubnonces) {
242+
m_musig2_pubnonces[agg_key_lh].insert(pubnonces.begin(), pubnonces.end());
243+
}
244+
for (const auto& [agg_key_lh, psigs] : input.m_musig2_partial_sigs) {
245+
m_musig2_partial_sigs[agg_key_lh].insert(psigs.begin(), psigs.end());
246+
}
226247
}
227248

228249
void PSBTOutput::FillSignatureData(SignatureData& sigdata) const
@@ -252,6 +273,7 @@ void PSBTOutput::FillSignatureData(SignatureData& sigdata) const
252273
sigdata.taproot_misc_pubkeys.emplace(pubkey, leaf_origin);
253274
sigdata.tap_pubkeys.emplace(Hash160(pubkey), pubkey);
254275
}
276+
sigdata.musig2_pubkeys.insert(m_musig2_participants.begin(), m_musig2_participants.end());
255277
}
256278

257279
void PSBTOutput::FromSignatureData(const SignatureData& sigdata)
@@ -274,6 +296,7 @@ void PSBTOutput::FromSignatureData(const SignatureData& sigdata)
274296
for (const auto& [pubkey, leaf_origin] : sigdata.taproot_misc_pubkeys) {
275297
m_tap_bip32_paths.emplace(pubkey, leaf_origin);
276298
}
299+
m_musig2_participants.insert(sigdata.musig2_pubkeys.begin(), sigdata.musig2_pubkeys.end());
277300
}
278301

279302
bool PSBTOutput::IsNull() const
@@ -291,6 +314,7 @@ void PSBTOutput::Merge(const PSBTOutput& output)
291314
if (witness_script.empty() && !output.witness_script.empty()) witness_script = output.witness_script;
292315
if (m_tap_internal_key.IsNull() && !output.m_tap_internal_key.IsNull()) m_tap_internal_key = output.m_tap_internal_key;
293316
if (m_tap_tree.empty() && !output.m_tap_tree.empty()) m_tap_tree = output.m_tap_tree;
317+
m_musig2_participants.insert(output.m_musig2_participants.begin(), output.m_musig2_participants.end());
294318
}
295319

296320
bool PSBTInputSigned(const PSBTInput& input)

src/script/sign.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@ struct SignatureData {
9090
std::map<std::vector<uint8_t>, std::vector<uint8_t>> hash256_preimages; ///< Mapping from a HASH256 hash to its preimage provided to solve a Script
9191
std::map<std::vector<uint8_t>, std::vector<uint8_t>> ripemd160_preimages; ///< Mapping from a RIPEMD160 hash to its preimage provided to solve a Script
9292
std::map<std::vector<uint8_t>, std::vector<uint8_t>> hash160_preimages; ///< Mapping from a HASH160 hash to its preimage provided to solve a Script
93+
//! Map MuSig2 aggregate pubkeys to its participants
94+
std::map<CPubKey, std::vector<CPubKey>> musig2_pubkeys;
95+
//! Mapping from pair of MuSig2 aggregate pubkey, and tapleaf hash to map of MuSig2 participant pubkeys to MuSig2 public nonce
96+
std::map<std::pair<CPubKey, uint256>, std::map<CPubKey, std::vector<uint8_t>>> musig2_pubnonces;
97+
//! Mapping from pair of MuSig2 aggregate pubkey, and tapleaf hash to map of MuSig2 participant pubkeys to MuSig2 partial signature
98+
std::map<std::pair<CPubKey, uint256>, std::map<CPubKey, uint256>> musig2_partial_sigs;
9399

94100
SignatureData() = default;
95101
explicit SignatureData(const CScript& script) : scriptSig(script) {}

0 commit comments

Comments
 (0)