• About Us
  • Privacy Policy
  • Disclaimer
  • Contact Us
Coin Snap
  • Home
  • Bitcoin
  • Defi
  • Crypto Mining
  • Crypto News
No Result
View All Result
  • Home
  • Bitcoin
  • Defi
  • Crypto Mining
  • Crypto News
No Result
View All Result
Coin Snap
No Result
View All Result
Home Bitcoin

“Firma Schnorr no válida” con gasto en script Taproot

luiselduque22 by luiselduque22
November 22, 2025
in Bitcoin
0
“Firma Schnorr no válida” con gasto en script Taproot
189
SHARES
1.5k
VIEWS
Share on FacebookShare on Twitter


Estoy intentando retirar fondos de una dirección generada con el siguiente descriptor:

tr(ff13a3311d3e14239bcbb9dfd5d304f4b57c32c0b35d313cb5255f93d7b2dc68,and_v(v:pk(b064bd37b71b7c39355f866e022287097757b05bb1790ecffc5de5fbf07cff69),sha256(a02e93b3dce9cb6031055905d94b04516819ef8fdae4c498777350469e6352dd)))#pygtzret

Configuré los fondos en una prueba de registro native usando nigiri para probar esta situación y estoy usando rust-bitcoin para construir la transacción. Hasta donde puedo decir, estoy construyendo correctamente el testigo para la entrada. Sin embargo, al verificar la transacción de salida usando testmempoolacceptcontinuamente recibo mandatory-script-verify-flag-failed (Invalid Schnorr signature). La clave que estoy usando parece ser correcta. Vi el comentario debajo esta respuesta sugiriendo que fue la serialización de mi firma aunque estoy usando la predeterminada. Sin embargo, usando lo que ahora parece estar en bitcoin::taproot::Signature no resuelve mi problema.

Estoy seguro de que estoy haciendo algo sutilmente mal aquí. Por lo tanto, cualquier empujón en la dirección correcta sería muy apreciado. Mi programa en su totalidad está a continuación:

use std::str::FromStr;

use anyhow::{Outcome, anyhow, bail};
use bitcoin::absolute::LockTime;
use bitcoin::consensus::Encodable;
use bitcoin::hashes::{Hash, sha256};
use bitcoin::hex::prelude::*;
use bitcoin::key::Keypair;
use bitcoin::secp256k1::{Message, Secp256k1};
use bitcoin::sighash::{Prevouts, SighashCache};
use bitcoin::transaction::Model;
use bitcoin::{
    Deal with, Quantity, Community, OutPoint, TapSighashType, Transaction, TxIn, TxOut, Witness,
    XOnlyPublicKey, taproot,
};
use miniscript::Descriptor;

const DESCRIPTOR: &str = "tr(ff13a3311d3e14239bcbb9dfd5d304f4b57c32c0b35d313cb5255f93d7b2dc68,and_v(v:pk(b064bd37b71b7c39355f866e022287097757b05bb1790ecffc5de5fbf07cff69),sha256(a02e93b3dce9cb6031055905d94b04516819ef8fdae4c498777350469e6352dd)))#pygtzret";
const PREIMAGE: &str = "366d2eff102fd290e7be0226f3dd746f4657bce85f08eeef55d0a7777d1a313f";
const PRIVATE_KEY: &str = "0301e0480b374b32851a9462db29dc19fe830a7f7d7a88b81612b9d42099c0ae";

fn foremost() -> Outcome<()> {
    let Descriptor::Tr(taproot) = Descriptor::::from_str(DESCRIPTOR)? else {
        bail!("not a taproot descriptor");
    };
    assert_eq!(
        taproot.deal with(Community::Regtest).to_string(),
        "bcrt1prg82xfnv265zvl0mt6q2rr39mpmskrf2nyum4hqnmdwen3kzsn3slts4sh"
    );
    let complete = Quantity::from_str("0.0025 BTC")?;
    let previous_output =
        OutPoint::from_str("44afabb1b631d2cd265910dc6befef7e3962df486ad4a4a12f83668c58c9c22c:0")?;
    let txin = TxIn {
        previous_output,
        ..Default::default()
    };

    let to_address = Deal with::from_str("bcrt1q9th3z6mknxp60avl9xq8vac05q4xgvygx7r7jz")?
        .require_network(Community::Regtest)?;
    let txout = TxOut {
        worth: Quantity::ZERO,
        script_pubkey: to_address.script_pubkey(),
    };

    let outputs = vec!(txout);
    let mut tx = Transaction {
        model: Model::TWO,
        lock_time: LockTime::ZERO,
        enter: vec!(txin),
        output: outputs.clone(),
    };
    // Fundamental 5 sats/vbyte price
    let price = Quantity::from_sat(tx.vsize() as u64 * 5);
    tx.output(0).worth = complete - price;

    let preimage: (u8; 32) = FromHex::from_hex(PREIMAGE)?;
    let preimage_hash = sha256::Hash::hash(&preimage);
    assert!(
        preimage_hash.to_string()
            == "a02e93b3dce9cb6031055905d94b04516819ef8fdae4c498777350469e6352dd"
    );

    let secp = Secp256k1::new();
    let keypair = Keypair::from_seckey_str(&secp, PRIVATE_KEY)?;
    let public_key = XOnlyPublicKey::from(keypair.public_key());
    assert_eq!(
        public_key.to_string(),
        "b064bd37b71b7c39355f866e022287097757b05bb1790ecffc5de5fbf07cff69"
    );

    let spend_info = taproot.spend_info();
    let leaf = spend_info
        .leaves()
        .subsequent()
        .ok_or(anyhow!("taptree leaf lacking"))?;

    let mut sighash_cache = SighashCache::new(&tx);
    let prevouts = Prevouts::All(&outputs);
    let sighash = sighash_cache.taproot_script_spend_signature_hash(
        0,
        &prevouts,
        leaf.leaf_hash(),
        TapSighashType::Default,
    )?;
    let message = Message::from_digest(*sighash.as_ref());
    let signature = taproot::Signature {
        signature: secp.sign_schnorr(&message, &keypair),
        sighash_type: TapSighashType::Default,
    };

    let mut witness = Witness::new();
    witness.push(preimage);
    witness.push(signature.serialize());
    witness.push(leaf.script());
    witness.push(leaf.into_control_block().serialize());
    tx.enter(0).witness = witness;

    let mut bytes = Vec::new();
    tx.consensus_encode(&mut bytes)?;
    println!("{}", bytes.to_lower_hex_string());

    Okay(())
}

Related articles

El cofundador de Samourai Pockets condenado a 4 años de prisión

El cofundador de Samourai Pockets condenado a 4 años de prisión

November 22, 2025
El índice de miedo a las criptomonedas alcanza el nivel de pánico

El índice de miedo a las criptomonedas alcanza el nivel de pánico

November 21, 2025


Estoy intentando retirar fondos de una dirección generada con el siguiente descriptor:

tr(ff13a3311d3e14239bcbb9dfd5d304f4b57c32c0b35d313cb5255f93d7b2dc68,and_v(v:pk(b064bd37b71b7c39355f866e022287097757b05bb1790ecffc5de5fbf07cff69),sha256(a02e93b3dce9cb6031055905d94b04516819ef8fdae4c498777350469e6352dd)))#pygtzret

Configuré los fondos en una prueba de registro native usando nigiri para probar esta situación y estoy usando rust-bitcoin para construir la transacción. Hasta donde puedo decir, estoy construyendo correctamente el testigo para la entrada. Sin embargo, al verificar la transacción de salida usando testmempoolacceptcontinuamente recibo mandatory-script-verify-flag-failed (Invalid Schnorr signature). La clave que estoy usando parece ser correcta. Vi el comentario debajo esta respuesta sugiriendo que fue la serialización de mi firma aunque estoy usando la predeterminada. Sin embargo, usando lo que ahora parece estar en bitcoin::taproot::Signature no resuelve mi problema.

Estoy seguro de que estoy haciendo algo sutilmente mal aquí. Por lo tanto, cualquier empujón en la dirección correcta sería muy apreciado. Mi programa en su totalidad está a continuación:

use std::str::FromStr;

use anyhow::{Outcome, anyhow, bail};
use bitcoin::absolute::LockTime;
use bitcoin::consensus::Encodable;
use bitcoin::hashes::{Hash, sha256};
use bitcoin::hex::prelude::*;
use bitcoin::key::Keypair;
use bitcoin::secp256k1::{Message, Secp256k1};
use bitcoin::sighash::{Prevouts, SighashCache};
use bitcoin::transaction::Model;
use bitcoin::{
    Deal with, Quantity, Community, OutPoint, TapSighashType, Transaction, TxIn, TxOut, Witness,
    XOnlyPublicKey, taproot,
};
use miniscript::Descriptor;

const DESCRIPTOR: &str = "tr(ff13a3311d3e14239bcbb9dfd5d304f4b57c32c0b35d313cb5255f93d7b2dc68,and_v(v:pk(b064bd37b71b7c39355f866e022287097757b05bb1790ecffc5de5fbf07cff69),sha256(a02e93b3dce9cb6031055905d94b04516819ef8fdae4c498777350469e6352dd)))#pygtzret";
const PREIMAGE: &str = "366d2eff102fd290e7be0226f3dd746f4657bce85f08eeef55d0a7777d1a313f";
const PRIVATE_KEY: &str = "0301e0480b374b32851a9462db29dc19fe830a7f7d7a88b81612b9d42099c0ae";

fn foremost() -> Outcome<()> {
    let Descriptor::Tr(taproot) = Descriptor::::from_str(DESCRIPTOR)? else {
        bail!("not a taproot descriptor");
    };
    assert_eq!(
        taproot.deal with(Community::Regtest).to_string(),
        "bcrt1prg82xfnv265zvl0mt6q2rr39mpmskrf2nyum4hqnmdwen3kzsn3slts4sh"
    );
    let complete = Quantity::from_str("0.0025 BTC")?;
    let previous_output =
        OutPoint::from_str("44afabb1b631d2cd265910dc6befef7e3962df486ad4a4a12f83668c58c9c22c:0")?;
    let txin = TxIn {
        previous_output,
        ..Default::default()
    };

    let to_address = Deal with::from_str("bcrt1q9th3z6mknxp60avl9xq8vac05q4xgvygx7r7jz")?
        .require_network(Community::Regtest)?;
    let txout = TxOut {
        worth: Quantity::ZERO,
        script_pubkey: to_address.script_pubkey(),
    };

    let outputs = vec!(txout);
    let mut tx = Transaction {
        model: Model::TWO,
        lock_time: LockTime::ZERO,
        enter: vec!(txin),
        output: outputs.clone(),
    };
    // Fundamental 5 sats/vbyte price
    let price = Quantity::from_sat(tx.vsize() as u64 * 5);
    tx.output(0).worth = complete - price;

    let preimage: (u8; 32) = FromHex::from_hex(PREIMAGE)?;
    let preimage_hash = sha256::Hash::hash(&preimage);
    assert!(
        preimage_hash.to_string()
            == "a02e93b3dce9cb6031055905d94b04516819ef8fdae4c498777350469e6352dd"
    );

    let secp = Secp256k1::new();
    let keypair = Keypair::from_seckey_str(&secp, PRIVATE_KEY)?;
    let public_key = XOnlyPublicKey::from(keypair.public_key());
    assert_eq!(
        public_key.to_string(),
        "b064bd37b71b7c39355f866e022287097757b05bb1790ecffc5de5fbf07cff69"
    );

    let spend_info = taproot.spend_info();
    let leaf = spend_info
        .leaves()
        .subsequent()
        .ok_or(anyhow!("taptree leaf lacking"))?;

    let mut sighash_cache = SighashCache::new(&tx);
    let prevouts = Prevouts::All(&outputs);
    let sighash = sighash_cache.taproot_script_spend_signature_hash(
        0,
        &prevouts,
        leaf.leaf_hash(),
        TapSighashType::Default,
    )?;
    let message = Message::from_digest(*sighash.as_ref());
    let signature = taproot::Signature {
        signature: secp.sign_schnorr(&message, &keypair),
        sighash_type: TapSighashType::Default,
    };

    let mut witness = Witness::new();
    witness.push(preimage);
    witness.push(signature.serialize());
    witness.push(leaf.script());
    witness.push(leaf.into_control_block().serialize());
    tx.enter(0).witness = witness;

    let mut bytes = Vec::new();
    tx.consensus_encode(&mut bytes)?;
    println!("{}", bytes.to_lower_hex_string());

    Okay(())
}

Tags: confirmagastoSchnorrscriptTaprootválida
Share76Tweet47

Related Posts

El cofundador de Samourai Pockets condenado a 4 años de prisión

El cofundador de Samourai Pockets condenado a 4 años de prisión

by luiselduque22
November 22, 2025
0

El 19 de noviembre, William “Invoice” Hill, de 67 años, cofundador del servicio de mezcla de Bitcoin Samourai Pockets, fue...

El índice de miedo a las criptomonedas alcanza el nivel de pánico

El índice de miedo a las criptomonedas alcanza el nivel de pánico

by luiselduque22
November 21, 2025
0

Únase a nuestro Telegrama canal para mantenerse actualizado sobre la cobertura de noticias de última hora El índice Crypto Worry...

¿Se eliminará MicroStrategy de los índices bursátiles si el BTC USD alcanza los 75.000 dólares?

¿Se eliminará MicroStrategy de los índices bursátiles si el BTC USD alcanza los 75.000 dólares?

by luiselduque22
November 21, 2025
0

La pregunta en la mente de todo inversor en este momento es easy: si BTC USD sigue cayendo, ¿la estrategia...

Bitcoin Core obtiene la primera auditoría de seguridad de terceros

Bitcoin Core obtiene la primera auditoría de seguridad de terceros

by luiselduque22
November 21, 2025
0

Editorial confiable contenido, revisado por los principales expertos de la industria y editores experimentados. Divulgación de anuncios Bitcoin Core, la...

Abu Dhabi triplicó el valor de Bitcoin en el tercer trimestre de 2025 antes del colapso

Abu Dhabi triplicó el valor de Bitcoin en el tercer trimestre de 2025 antes del colapso

by luiselduque22
November 20, 2025
0

El Consejo de Inversiones de Abu Dhabi (ADIC) amplió su exposición a Bitcoin antes de la fuerte caída de la...

Load More
  • Trending
  • Comments
  • Latest
Ethereum en la cúspide de una gran ruptura en el primer trimestre de 2025, se espera que las altcoins sigan su ejemplo

Ethereum en la cúspide de una gran ruptura en el primer trimestre de 2025, se espera que las altcoins sigan su ejemplo

December 28, 2024
Raoul Pal califica el patrón gráfico de Ethereum como “uno de los más poderosos en criptografía”, lo que indica que se avecina una gran ruptura ⋆ ZyCrypto

Raoul Pal califica el patrón gráfico de Ethereum como “uno de los más poderosos en criptografía”, lo que indica que se avecina una gran ruptura ⋆ ZyCrypto

December 27, 2024

¿Por qué mi transacción no se confirma y qué puedo hacer al respecto?

July 30, 2025
El impulso alcista impulsa el impulso hacia los $6

El impulso alcista impulsa el impulso hacia los $6

January 7, 2025
¿Ha terminado la temporada de Memecoin? PEPE y SHIB luchan mientras Lunex se eleva

¿Ha terminado la temporada de Memecoin? PEPE y SHIB luchan mientras Lunex se eleva

0
Comprensión de los rendimientos y la economía de las apuestas en Ethereum y Solana

Comprensión de los rendimientos y la economía de las apuestas en Ethereum y Solana

0
Calienta tu hogar mientras ganas Bitcoin con Heatbit

Calienta tu hogar mientras ganas Bitcoin con Heatbit

0
Líderes de IcomTech sentenciados a una década tras las rejas

Líderes de IcomTech sentenciados a una década tras las rejas

0
El cofundador de Samourai Pockets condenado a 4 años de prisión

El cofundador de Samourai Pockets condenado a 4 años de prisión

November 22, 2025
Estados Unidos, Corea y Brasil contemplan medidas enérgicas contra los impuestos a las criptomonedas

Estados Unidos, Corea y Brasil contemplan medidas enérgicas contra los impuestos a las criptomonedas

November 22, 2025
Bitmain investigado por autoridades estadounidenses por preocupaciones de seguridad

Bitmain investigado por autoridades estadounidenses por preocupaciones de seguridad

November 22, 2025
¡CHECK está disponible para negociar!

¡CHECK está disponible para negociar!

November 22, 2025

Coinsnap-Pro

Welcome to CoinSnap Pro, your ultimate destination for everything related to decentralized finance (DeFi), cryptocurrency news, Bitcoin, and crypto mining. Our mission is to keep you informed and empowered in the ever-evolving world of digital assets and blockchain technology.

Categories

  • Bitcoin
  • Crypto Mining
  • Crypto News
  • Defi
  • Economía

Recent News

El cofundador de Samourai Pockets condenado a 4 años de prisión

El cofundador de Samourai Pockets condenado a 4 años de prisión

November 22, 2025
Estados Unidos, Corea y Brasil contemplan medidas enérgicas contra los impuestos a las criptomonedas

Estados Unidos, Corea y Brasil contemplan medidas enérgicas contra los impuestos a las criptomonedas

November 22, 2025
  • About Us
  • Privacy Policy
  • Disclaimer
  • Contact Us

© 2024 Coinsnap.pro. All rights reserved.

No Result
View All Result
  • Home
  • Bitcoin
  • Defi
  • Crypto Mining
  • Crypto News

© 2024 Coinsnap.pro. All rights reserved.