OP_CHECKSIG firma hash tipo 0

En la documentación OP_CHECKSIG de Bitcoin Wiki :

En primer lugar, siempre se aplica este procedimiento (el predeterminado):

  1. la clave pública y la firma se extraen de la pila, en ese orden. Si el valor de tipo hash es 0, se reemplaza por el último byte de la firma. Luego, el último byte de la firma siempre se elimina.

El formato de la firma es:

0x30 [longitud total] 0x02 [longitud R] [R] 0x02 [longitud S] [S] [sighash]

En caso de que el tipo de hash sea 0, entonces deberíamos obtener el último byte de [S] y eliminarlo, ¡creo que corromperá la firma !

Tal vez no entiendo correctamente esta documentación. ¿Alguien podría explicar el comportamiento correcto en este caso?

Creo que debería decir copiar, no reemplazar.
I este error en la especificación?
@ user15358 Ya no veo este texto en en.bitcoin.it/wiki/OP_CHECKSIG .
Advertencia justa, la wiki de bitcoin es a menudo la suma de años de volcados de cerebros no verificados. Una parte no despreciable está desactualizada o nunca fue correcta para empezar.
Tengo curiosidad por saber cómo funciona esto, ya que hay un vector de prueba con un SIGHASH de 00 que no puedo verificar usando pybitcointools. Parece que cambiar el 0 por un 1 no funcionará; no hay ninguna razón real por qué está allí?
@WizardOfOzzie, cambiar el tipo SIGHASH invalidará la firma, ya que cambia el hash que está firmado.
@StephenM347 De acuerdo, eso se debe a que el formulario Tx firmado tiene el tipo hash adjunto; pero si el tipo SIGHASH es 0, por qué actúa como 1?
@WizardOfOzzie, no estoy seguro de cuál es exactamente el comportamiento de Bitcoin Core con los tipos de sighash no estándar.
He realizado algunas pruebas con pybitcointools y uno de los vectores de prueba de BitcoinCore con un SIGHASH de cero. Ver Pastebin aquí . No tengo idea de cómo funciona esto, ya que estamos procesando la transacción final (es decir, incluida la firma), que devuelve el TxID c99c49da4c38af669dea436d3e73780dfdb6c1ecf9958baa52960e8baee30e73. Esto no tiene ningún sentido en absoluto, ¿alguien sabe lo que está pasando aquí?
@sipa ¿Puede comentar sobre el comentario mío anterior?

Respuestas (1)

He realizado algunas pruebas con pybitcointools y uno de los vectores de prueba de BitcoinCore con un SIGHASH de cero.

Para SIGHASH =0, el Tx que se firma

Es solo cuestión de agregar 4 bytes nulos, en lugar de 01000000, a la transacción de firma.

El software Core verifica este tipo de hash no estándar ahora, sin embargo, podemos ver que no hay problema en validar estas transacciones raras ya que el código solo verifica SIGHASH ACP, SINGLE & NONE. Vea el código de Python-Bitcoinlib para una interpretación de Python

Vea este vector de prueba , donde está el hash que se está validando 11743b220e9e24e89abd4ff124a2740531fe7d7f9b4e26de14710a532fd543e2.

FWIW, Pybitcointools necesita txhasheditar la función para que en lugar de if hashcode:, lea if hashcode is not None:. La cláusula else en esa función me estaba confundiendo, pero parece ser para transacciones firmadas hash (es decir, para devolver el TxID)