Testnet - Taproot - Script UTXO de deux adresses P2TR vers deux autres adresses P2TR

J'espère que vous pourrez m'aider à résoudre ce problème. J'utilise la bibliothèque python-bitcoin-utils développée par Karask et je voudrais exécuter une transaction où l'UTXO a 2 adresses P2TR (Taproot) et envoyer la sortie vers 2 autres adresses P2TR (Taproot). Avant d'atteindre cet objectif, j'essaierais d'utiliser https://github.com/karask/python-bitcoin-utils/blob/master/examples/spend_multi_input_p2tr_and_p2pkh.py pour exécuter l'UTXO d'entrée de 2 P2TR à 1 P2TR. J'ai compilé le code et produit la transaction brute, mais j'ai obtenu l'erreur non-mandatory-script-verify-flag (signature Schnorr non valide) (code -26). J'ai essayé de consulter les règles BIP340 mais je ne comprends pas vraiment ce que je dois faire pour le résoudre. Voici le code que j'utilise : # Copyright (C) 2018-2024 Les développeurs de python-bitcoin-utils # # Ce fichier fait partie de python-bitcoin-utils # # Il est soumis aux termes de licence du fichier LICENSE qui se trouve dans le répertoire de niveau supérieur # de cette distribution. # # Aucune partie de python-bitcoin-utils, y compris ce fichier, ne peut être copiée, # modifiée, propagée ou distribuée, sauf conformément aux termes contenus # dans le fichier LICENSE. de bitcoinutils.setup importer setup de bitcoinutils.utils importer to_satoshis de bitcoinutils.transactions importer Transaction, TxInput, TxOutput, TxWitnessInput de bitcoinutils.keys importer P2pkhAddress, PrivateKey, P2trAddress de bitcoinutils.script importer Script def main(): # pensez toujours à configurer le réseau setup("testnet") # la clé qui correspond à l'adresse P2WPKH priv1 = PrivateKey("cMrLFqBmVQgQpkpf6Q6YqR6KC7gmUuQGbQtXtyJV9PR3rf1PAoF4") #priv2 = PrivateKey("cSfna7riKJdNU7skpRUx17WYANNsyHTA2FmuzLpFzpp37xpytgob") priv3 = PrivateKey("cRhBdjfJqGVKkdcBeiTSdkiDGnmfntD4yyfeHHTDQwhtueQYDLZC") pub1 = priv1.get_public_key() #pub2 = priv2.get_public_key() pub3 = priv3.get_public_key() fromAddress1 = pub1.get_taproot_address() #fromAddress2 = pub2.get_address() fromAddress3 = pub3.get_taproot_address() print(fromAddress1.to_string()) #print(fromAddress2.to_string()) print(fromAddress3.to_string()) # UTXO de fromAddress respectivement txid1 = "c7cc326c838699a5c62c13af85877512cf76c803504dbc3de82fe295ba94cfbe" vout1 = 0 #txid2 = "99fb66cbc26a2d1a5a03c3d00118fd370a37a29fb368817dde3b8b50920cd4dc" #vout2 = 1 txid3 = "c7cc326c838699a5c62c13af85877512cf76c803504dbc3de82fe295ba94cfbe" vout3 = 1 # tous les montants sont nécessaires pour signer une entrée de racine pivotante # (selon le sighash) amount1 = to_satoshis(0.00005000) #amount2 = to_satoshis(0.0001312) amount3 = to_satoshis(0.00009114) #amounts = [amount1, amount2, amount3] montants = [amount1, amount3]

# toutes les scriptPubKeys sont nécessaires pour signer une entrée de racine pivotante # (selon sighash) mais toujours de l'entrée de dépense script_pubkey1 = fromAddress1.to_script_pub_key() #script_pubkey2 = fromAddress2.to_script_pub_key() script_pubkey3 = fromAddress3.to_script_pub_key() #utxos_script_pubkeys = [script_pubkey1, script_pubkey2, script_pubkey3] utxos_script_pubkeys = [script_pubkey1, script_pubkey3]

#toAddress = P2pkhAddress("mtVHHCqCECGwiMbMoZe8ayhJHuTdDbYWdJ") toAddress = P2trAddress("tb1ph76fd3w923rfc025hwfhpqf5p9gslqzsent43p4ah2g9nklelr3q5gzzuy") # créer une entrée de transaction à partir de l'ID de transaction de UTXO txin1 = TxInput(txid1, vout1) #txin2 = TxInput(txid2, vout2) txin3 = TxInput(txid3, vout3) # créer une sortie de transaction txOut = TxOutput(to_satoshis(0.00010), toAddress.to_script_pub_key()) # créer une transaction sans modifier la sortie - si au moins une entrée est # segwit, nous devons définir has_segwit=True #tx = Transaction([txin1, txin2, txin3], has_segwit=True) tx = Transaction([txin1, txin3], has_segwit=True) print("\nTransaction brute :\n" + tx.serialize()) print("\ntxid : " + tx.get_txid()) print("\ntxwid : " + tx.get_wtxid()) # signer l'entrée taproot # pour créer le message de résumé pour se connecter à taproot, nous devons # passer toutes les scriptPubKeys des utxos et leurs montants sig1 = priv1.sign_taproot_input(tx, 0, utxos_script_pubkeys, amount) #sig2 = priv2.sign_input(tx, 1, utxos_script_pubkeys) sig3 = priv3.sign_taproot_input(tx, 2, utxos_script_pubkeys, amount) print("Signature1 : ", sig1) print("\nSignature3 : ", sig3) tx.witnesses.append(TxWitnessInput()) #txin2.script_sig = Script([sig2, pub2.to_hex()]) # la deuxième entrée n'est pas segwit mais nous devons quand même ajouter un script d'entrée témoin vide #tx.witnesses.append(TxWitnessInput([])) tx.témoins.append(TxWitnessInput()) # imprimer la transaction brute signée prête à être diffusée print("\nTransaction brute signée :\n" + tx.serialize()) print("\nTxId :", tx.get_txid()) print("\nTxwId :", tx.get_wtxid()) print("\nTaille :", tx.get_size()) print("\nvTaille :", tx.get_vsize()) # print("\nCore vSize :", 160) if __name__ == "__main__": main()

Il s'agit du résultat brut de la transaction signée Merci pour votre aide.