diff --git a/src/psbt.cpp b/src/psbt.cpp index 28ccdcb1eaa..92ddcba6a59 100644 --- a/src/psbt.cpp +++ b/src/psbt.cpp @@ -149,6 +149,13 @@ void PSBTInput::FillSignatureData(SignatureData& sigdata) const for (const auto& [hash, preimage] : hash256_preimages) { sigdata.hash256_preimages.emplace(std::vector(hash.begin(), hash.end()), preimage); } + sigdata.musig2_pubkeys.insert(m_musig2_participants.begin(), m_musig2_participants.end()); + for (const auto& [agg_key_lh, pubnonces] : m_musig2_pubnonces) { + sigdata.musig2_pubnonces[agg_key_lh].insert(pubnonces.begin(), pubnonces.end()); + } + for (const auto& [agg_key_lh, psigs] : m_musig2_partial_sigs) { + sigdata.musig2_partial_sigs[agg_key_lh].insert(psigs.begin(), psigs.end()); + } } void PSBTInput::FromSignatureData(const SignatureData& sigdata) @@ -196,6 +203,13 @@ void PSBTInput::FromSignatureData(const SignatureData& sigdata) for (const auto& [pubkey, leaf_origin] : sigdata.taproot_misc_pubkeys) { m_tap_bip32_paths.emplace(pubkey, leaf_origin); } + m_musig2_participants.insert(sigdata.musig2_pubkeys.begin(), sigdata.musig2_pubkeys.end()); + for (const auto& [agg_key_lh, pubnonces] : sigdata.musig2_pubnonces) { + m_musig2_pubnonces[agg_key_lh].insert(pubnonces.begin(), pubnonces.end()); + } + for (const auto& [agg_key_lh, psigs] : sigdata.musig2_partial_sigs) { + m_musig2_partial_sigs[agg_key_lh].insert(psigs.begin(), psigs.end()); + } } void PSBTInput::Merge(const PSBTInput& input) @@ -223,6 +237,13 @@ void PSBTInput::Merge(const PSBTInput& input) if (m_tap_key_sig.empty() && !input.m_tap_key_sig.empty()) m_tap_key_sig = input.m_tap_key_sig; if (m_tap_internal_key.IsNull() && !input.m_tap_internal_key.IsNull()) m_tap_internal_key = input.m_tap_internal_key; if (m_tap_merkle_root.IsNull() && !input.m_tap_merkle_root.IsNull()) m_tap_merkle_root = input.m_tap_merkle_root; + m_musig2_participants.insert(input.m_musig2_participants.begin(), input.m_musig2_participants.end()); + for (const auto& [agg_key_lh, pubnonces] : input.m_musig2_pubnonces) { + m_musig2_pubnonces[agg_key_lh].insert(pubnonces.begin(), pubnonces.end()); + } + for (const auto& [agg_key_lh, psigs] : input.m_musig2_partial_sigs) { + m_musig2_partial_sigs[agg_key_lh].insert(psigs.begin(), psigs.end()); + } } void PSBTOutput::FillSignatureData(SignatureData& sigdata) const @@ -252,6 +273,7 @@ void PSBTOutput::FillSignatureData(SignatureData& sigdata) const sigdata.taproot_misc_pubkeys.emplace(pubkey, leaf_origin); sigdata.tap_pubkeys.emplace(Hash160(pubkey), pubkey); } + sigdata.musig2_pubkeys.insert(m_musig2_participants.begin(), m_musig2_participants.end()); } void PSBTOutput::FromSignatureData(const SignatureData& sigdata) @@ -274,6 +296,7 @@ void PSBTOutput::FromSignatureData(const SignatureData& sigdata) for (const auto& [pubkey, leaf_origin] : sigdata.taproot_misc_pubkeys) { m_tap_bip32_paths.emplace(pubkey, leaf_origin); } + m_musig2_participants.insert(sigdata.musig2_pubkeys.begin(), sigdata.musig2_pubkeys.end()); } bool PSBTOutput::IsNull() const @@ -291,6 +314,7 @@ void PSBTOutput::Merge(const PSBTOutput& output) if (witness_script.empty() && !output.witness_script.empty()) witness_script = output.witness_script; if (m_tap_internal_key.IsNull() && !output.m_tap_internal_key.IsNull()) m_tap_internal_key = output.m_tap_internal_key; if (m_tap_tree.empty() && !output.m_tap_tree.empty()) m_tap_tree = output.m_tap_tree; + m_musig2_participants.insert(output.m_musig2_participants.begin(), output.m_musig2_participants.end()); } bool PSBTInputSigned(const PSBTInput& input) diff --git a/src/script/sign.h b/src/script/sign.h index fea937108ba..2b4db20019c 100644 --- a/src/script/sign.h +++ b/src/script/sign.h @@ -90,6 +90,12 @@ struct SignatureData { std::map, std::vector> hash256_preimages; ///< Mapping from a HASH256 hash to its preimage provided to solve a Script std::map, std::vector> ripemd160_preimages; ///< Mapping from a RIPEMD160 hash to its preimage provided to solve a Script std::map, std::vector> hash160_preimages; ///< Mapping from a HASH160 hash to its preimage provided to solve a Script + //! Map MuSig2 aggregate pubkeys to its participants + std::map> musig2_pubkeys; + //! Mapping from pair of MuSig2 aggregate pubkey, and tapleaf hash to map of MuSig2 participant pubkeys to MuSig2 public nonce + std::map, std::map>> musig2_pubnonces; + //! Mapping from pair of MuSig2 aggregate pubkey, and tapleaf hash to map of MuSig2 participant pubkeys to MuSig2 partial signature + std::map, std::map> musig2_partial_sigs; SignatureData() = default; explicit SignatureData(const CScript& script) : scriptSig(script) {}