Taproot - non-mandatory-script-verify-flag (signature Schnorr invalide)
fonction asynchrone inscribeTransfer(tick, montant, réseau = 'testnet') { const seed = bip39.mnemonicToSeedSync(mnemonic); const root = bip32.fromSeed(seed); const child = root.derivePath(`m/86'/${network == "testnet" ? 1 : 0}'/0'/0/0`); const pubkey = toXOnly(child.publicKey); const = Tap.getPubKey(pubkey); let adresse = Adresse.p2tr.encode(tpubkey, réseau); console.log("Adresse :", adresse); let utxos = (attendre fetchNonInscriptionUtxo(adresse, réseau)).data.utxo; laissez utxo; pour (laissez u de utxos) { if (u.satoshi > 546 + frais) { utxo = u; casser; } } const ec = new TextEncoder(); const content = ec.encode(`{"p":"brc-20","op":"transfer","tick":${tick},"amt":"${montant}"}`); const mimetype = ec.encode("text/plain;charset=utf-8"); script const = [
pubkey.toString("hex"),
"OP_CHECKSIG",
"OP_0",
"OP_IF",
toHexString(ec.encode("ord")),
"01",
toHexString(mimetype),
"OP_0",
toHexString(content),
"OP_ENDIF",
].rejoindre(" "); const leafScript = bitcoin.script.fromASM(script); const scriptTree = { sortie : leafScript, } ; const racheter = { sortie : leafScript, racheterVersion : 0xc0 // LEAF_VERSION_TAPSCRIPT, } ; const {sortie, témoin, hachage } = bitcoin.payments.p2tr({ internalPubkey : pubkey, scriptTree, rachat, réseau : réseau == "testnet" ? bitcoin.networks.testnet : bitcoin.networks.bitcoin }); const psbt = nouveau bitcoin.Psbt({ réseau : réseau == "testnet" ? bitcoin.networks.testnet : bitcoin.networks.bitcoin }); const tapLeafScript = { leafVersion : redempt.redeemVersion, script : rachet.output, controlBlock : témoin[witness.length - 1], }; psbt.addInput({ hachage : utxo.txid, index : utxo.vout, témoinUtxo : { script : sortie, valeur : utxo.satoshi }, tapInternalKey : pubkey, tapMerkleRoot : hachage, tapLeafScript : [
tapLeafScript
], }); psbt.addOutput({ valeur : 546, adresse : adresse, // tapInternalKey : pubkey, tapTree : { feuilles : tapTreeToList(scriptTree) }, }); psbt.addOutput({ valeur : utxo.satoshi - frais - 546, adresse : adresse, }); const tweakedSigner = child.tweak( bitcoin.crypto.taggedHash( 'TapTweak', Buffer.concat([pubkey, hash]), ), ); attendre psbt.signInputAsync(0, tweakedSigner); psbt.finalizeAllInputs(); const tx = psbt.extractTransaction(); const rawTx = tx.toBuffer(); const txHex = rawTx.toString('hex'); const txHash = wait BroadcastTx(txHex, réseau); console.log(txHash); // ERREUR : erreur RPC de sendrawtransaction : {"code":-26,"message": "non-mandatory-script-verify-flag (signature Schnorr invalide)"}
Essayez déjà de comparer ligne à ligne avec divers exemples et effectuez quelques ajustements, en restant bloqué sur une erreur de signature Invalid Schnorr. A pu effectuer une transaction UTXO normale mais a échoué avec le script Taproot. J'essaie d'inscrire un transfert de BRC-20 depuis et vers une seule adresse. Est-ce que cela serait possible ?
