Javascript - bitcoinjs - obligatoire-script-verify-flag-failed (la signature doit être nulle en cas d'échec de l'opération CHECK(MULTI)SIG)

J'essaie de suivre l'exemple de transaction ci-dessous par Magic Eden et de l'étendre pour prendre en charge plusieurs acheteurs et vendeurs (en rouge). Cependant j'ai des difficultés lorsque j'ajoute plus d'une signature d'un autre parti (avec un vendeur ça diffuse bien). La transaction se construit et se signe correctement, mais lorsque j'essaie de la diffuser sur le réseau, cela entraîne l'erreur obligatoire-script-verify-flag-failed (la signature doit être nulle en cas d'échec de l'opération CHECK(MULTI)SIG). Utiliser des adresses segwit natives pour cela (no-tr).

Qu'est-ce que je manque ou que je fais de mal ?

En utilisant la bibliothèque bitcoinjs, voici ce que j'ai jusqu'à présent (uniquement le rouge) :

Signature du vendeur :

let psbt = new bitcoin.Psbt({ réseau }); const [ordinalUtxoTxId, ordinalUtxoVout] = ordinalOutput.split(":"); const tx = bitcoin.Transaction.fromHex(attendre getTxHexById(ordinalUtxoTxId)); essayez {tx.setWitness(parseInt(ordinalUtxoVout), []); } catch {} const input = { hash : ordinalUtxoTxId, index : parseInt (ordinalUtxoVout), nonWitnessUtxo : tx.toBuffer(), témoinUtxo : tx.outs, soupirType : bitcoin.Transaction.SIGHASH_SINGLE | bitcoin.Transaction.SIGHASH_ANYONECANPAY, }; psbt.addInput(entrée); psbt.addOutput({adresse : paymentAddress, valeur : prix, });

Signature de l'acheteur (en ignorant les entrées et sorties de remplissage) :

// Ajouter des entrées et sorties d'inscriptions pour (const signéPsbt de sellerSignedPsbts) { // Ajouter une sortie d'inscription psbt.addOutput({ adresse : récepteurAddress, valeur : signéPsbt.data.inputs.witnessUtxo.value, }); // Ajouter une entrée signée par le payeur psbt.addInput({ ...signedPsbt.data.globalMap.unsignedTx.tx.ins// ... signéPsbt.data.inputstémoinUtxo : signéPsbt.data.inputs.witnessUtxo, nonWitnessUtxo : signéPsbt.data.inputs.nonWitnessUtxo, // finalScriptWitness : signéPsbt.data.inputs.finalScriptWitness, }); entrée++ ; } // Ajouter les sorties de paiement du vendeur pour le bénéficiaire pour (const signéPsbt de sellerSignedPsbts) { // Ajouter la sortie du payeur psbt.addOutput({ ...signedPsbt.data.globalMap.unsignedTx.tx.outs, }); }

Fusionner les psbts signés par le vendeur et l'acheteur :

const acheteurSignedPsbt = bitcoin.Psbt.fromBase64(signedBuyingPSBTBase64); pour (soit index = 0 ; index