¿Por qué este script no es válido y cómo puedo generar pares válidos de clave pública/firma digital?

¿Por qué la transacción P2PKH predeterminada en http://bitcoin-script-debugger.visvirial.com/ devuelve NULL en lugar de verdadero? Todavía no he tratado de tragarme los detalles sangrientos de OP_CHECKSIG, pero todo lo demás parece sólido.

¿Hay alguna forma de verificar manualmente que el par de clave pública/firma digital de ejemplo coincida, o de generar pares coincidentes que no contengan ni se vinculen a mis direcciones de Bitcoin reales, para experimentar con el depurador de Script?

Respuestas (2)

He jugado con la herramienta durante algunas horas, pero no pude hacer que funcionara una sola firma. Esto es lo que ingresé para la famosa transacción de PIZZA :

# <sig>
OP_PUSHDATA1 71 0x30450221009908144CA6539E09512B9295C8A27050D478FBB96F8ADDBC3D075544DC41328702201AA528BE2B907D316D2DA068DD9EB1E23243D97E444D59290D2FDDF25269EE0E
# <pubKey>
OP_PUSHDATA1 65 0x042E930F39BA62C6534EE98ED20CA98959D34AA9E057CDA01CFD422C6BAB3667B76426529382C23F42B9B08D7832D4FEE1D6B437A8526E59667CE9C4E9DCEBCABB

OP_DUP OP_HASH160
# <pubkeyHash>
20 0x46af3fb481837fadbb421727f9959c2d32a36829
OP_EQUALVERIFY OP_CHECKSIG

El contenido del script ejecutaría correctamente OP_DUP y OP_HASH160, por lo que los resultados en la pila coinciden con OP_EQUALVERIFY. Entonces OP_CHECKSIG devuelve falso... Verificar con openssl devuelve verdadero.

¿Hay alguna forma de verificar manualmente que el par de clave pública/firma digital de ejemplo coincida, o de generar pares coincidentes que no contengan ni se vinculen a mis direcciones de Bitcoin reales, para experimentar con el depurador de Script?

sí, normalmente tengo OPENSSL para darme una mano amiga. Pero cualquier biblioteca ECDSA debería servir. Un tx P2PKH normal se convierte a un formato sin firmar, y el script de entrada se reemplaza con el script de salida tx anterior (y se adaptan las longitudes). A continuación, este tx en bruto se sombrea dos veces y el resultado se firma. Este valor hash se puede verificar fácilmente con openssl, la firma y la clave pública. Publiqué esto hace ~2 años y obtuve ayuda de Dave.

La respuesta de @amaclin en el primer enlace explica cómo llegar a la transacción sin firmar (--> ¿Cómo funciona la verificación ECDSA...). Openssl requiere una clave PEM para verificar, por lo que se realiza una conversión de clave pública a formato PEM. Y luego, bitcoin funciona con datos sin procesar (hexadecimales), no con cadenas. De ahí los esfuerzos por convertir con xxd en sistemas Linux, o con sed y [:xdigit:] en sistemas tipo BSD. Si está en sistemas unixoide, puedo proporcionarle un script.

¿Cómo puedo generar pares válidos de clave pública/firma digital?

Tal vez "generar" no sea la palabra correcta aquí, pero uno puede tomar cualquier tx de la cadena de bloques y extraer los elementos (transmisión sin procesar, firma, clave de publicación, hash de clave de publicación de transmisión previa) y pasarlo por el proceso descrito anteriormente.

AFAICT, el script no es inválido. Más bien, el sitio web no valida el script correctamente.

OP_CHECKSIG compara la firma digital (interpretada como el primer elemento de la pila) con la clave pública (el segundo elemento de la pila). Sin embargo, una firma digital requiere un tercer componente: el mensaje que se firma. En Bitcoin, ese mensaje es la transacción en sí (con alguna modificación).

El problema aquí es que el intérprete de secuencias de comandos en el sitio web no tiene ningún lugar donde pueda ingresar la transacción o el mensaje que se está firmando. Por lo tanto, sin un mensaje, OP_CHECKSIG siempre se verificará como falso para cualquier script de Bitcoin válido con OP_CHECKSIG.