p2tr : Vous avez reçu un message d'erreur non obligatoire-script-verify-flag (signature Schnorr invalide) lors d'une transaction de racine pivotante

  • J'essaie de dépenser une adresse Taproot avec 2 propriétaires via un chemin de dépense clé dans Rust et je reçois le message d'erreur non obligatoire-script-verify-flag.
  • Ce message survient lors de la diffusion de la transaction hexadécimale sur un site en ligne et il semble être lié à la création d'une signature agrégée à partir du code fourni.
  • Les différentes étapes pour créer cette transaction incluent la création d'une adresse agrégée, la génération d'une signature partielle utilisant le document musig2, ainsi que l'agrégation des signatures partielles pour produire une signature finale.
  • Cependant, bien que cette signature réussisse à passer les vérifications musig2, elle échoue lors de la vérification du nœud. Il est possible que le problème soit lié au message sighash demandé pour signer la transaction.

info/testnet/tx/push

« message » : »non-mandatory-script-verify-flag (signature Schnorr invalide) »}

La logique pour créer cette transaction est la suivante. Je dois d’abord créer une transaction de dépôt contenant cette adresse agrégée en sortie. Voici le code pour créer l'adresse agrégée :

p2tr : Vous avez reçu un message d'erreur non obligatoire-script-verify-flag (signature Schnorr invalide) lors d'une transaction de racine pivotante

se_pubkey  : PublicKey laissez mut pubkeys  : Vec = vec  pubkeys laissez key_agg_ctx_tw = KeyAggContext: :new(pubkeysunwrap()aggregated_pubkey_untweaked()aggregated_pubkey()secpx_only_public_key() Aggreged_pubkey_tw key_agg_ctx_tw

Ensuite, j'utilise la clé pub agrégée pour créer la clé scriptpubkey pour la sortie de la transaction de dépôt  :

secpx_only_public_key() script_pubkey  : agg_scriptpubkey

Je suis ce document pour créer la signature https://docs.rs/musig2/latest/musig2/

voici le code pour créer la transaction de dépense  :

PoolWrapperKeyAggContextPublicKeyPublicKeyAddressstrstr laissez seckey = pool statechain_id) seckey)secpx_only_public_key()parse() let input = TxIn { previous_output  : prev_outpoint séquence  : Sequence ::ENABLE_RBF_NO_LOCKTIME let output_address = Address: :from_str(receiver_address)require_network(Network ::Testnet)BASE_TX_FEE)script_pubkey() let mut unsigned_tx = Transaction { version : transaction : : Version : : TWO lock_time  : absolu ::LockTime ::ZERO let utxo = TxOut { valeur  : montant  ::from_sat (montant) }  laissez sighash_type = TapSighashType : : All  &ampexpect(« échec de la construction de sighash ») laissez parsed_msg = messageclone()clone()conn &ampawaitserver_nonce 32]with_seckey(seckey)public_nonce()

parse ::().unwrap(),

iter()to_string()key_agg_ctx messageto_bytes() let get_sign_res = statechain ::get_partial_signature( &amp &amp &amp &amp &amp ) partial_signature

server_signature).unwrap(),

key_agg_ctx partial_signatures ) final_signature hash_ty : sighash_type let mut wit = Witness: :new() *sighasherunwrap() = esprit let tx_hex = consensus: :encode ::serialize_hex(&amp

La signature réussit la vérification musig2 mais pas la vérification du nœud. Je pense que le problème peut être lié au message sighash que je demande à signer. Ici, la transaction de dépôt et la transaction de dépense générées à partir du code. Toute pensée ou aide serait immensément appréciée. Merci d'avance !

Dépôt TX Hex : SPECT TX HEX :