I am attempting to construct a p2tr that spends a 2-2 musig aggregated deal with. My course of is as observe:
- Create SecretKey, PublicKey pair from every get together
- Mixture these 2 public keys
- Create and publish a transaction to ship deposit cash to that aggregated deal with (Tx0)
- Utilizing musig2 to aggregated a sound signature to spend that deal with
- Create a p2tr transaction to spend that deal with with the legitimate signature (Tx1)
Each time I publish Tx1 to the blocktream, it at all times returns the Invalid Schnoor Signature error.
Within the context of making the keypair in step 1, I used this code :
let owner_keypair = Keypair::new(&secp, &mut rand::thread_rng());
let owner_seckey = SecretKey::from_keypair(&owner_keypair);
let owner_pubkey = PublicKey::from_keypair(&owner_keypair);
Do we have to tweak these keys earlier than the aggregation step, since I do know that the legitimate pubkey for BIP340 is an even-y-coordinate pubkey.
FYI I’ve this operate to create the aggregated keys :
pub fn aggregate_pubkeys(
owner_pubkey: PublicKey,
se_pubkey: PublicKey,
) -> (PublicKey, PublicKey, Deal with, KeyAggContext) {
let secp = Secp256k1::new();
let mut pubkeys: Vec<PublicKey> = vec![];
pubkeys.push(owner_pubkey);
pubkeys.push(se_pubkey);
let key_agg_ctx_tw = KeyAggContext::new(pubkeys.clone())
.unwrap()
.with_unspendable_taproot_tweak()
.unwrap();
let aggregated_pubkey: PublicKey = key_agg_ctx_tw.aggregated_pubkey_untweaked();
let aggregated_pubkey_tw: PublicKey = key_agg_ctx_tw.aggregated_pubkey();
let aggregated_address = Deal with::p2tr(
&secp,
aggregated_pubkey.x_only_public_key().0,
None,
Community::Testnet,
);
(
aggregated_pubkey,
aggregated_pubkey_tw,
aggregated_address,
key_agg_ctx_tw,
)
}
The aggregated_pubkey is used to create the scriptpubkey for Tx0 and aggregated_pubkey_tw is used for the musig2 course of.
Thank you numerous for serving to me.