SHA256 * 2 en el encabezado: ¿qué estoy haciendo mal?

He estado experimentando con el código php aquí: https://en.bitcoin.it/wiki/Block_hashing_algorithm (después de corregir el pequeño error de $x=; a $x=""; )

Con estos bloques 0 y 125552 (por ejemplo) funciona bien y obtengo el hash esperado.

Con los bloques 225552 y 300000 obtengo:

7a7bb195e8bcc8e73205df7906eb68f26144c6fbc577d59dd4e8a0cfdb8b90df (en lugar de 00000000000001f4f14b09019b23d71c222a2c1245ef3df52875d79ff4488709)

y

178d6fe6cbf696311e7f46263067eeb688797e4c790060c1f6edf6daec76c59e (en lugar de 000000000000000082ccf8f1557c5d40b21edabb18d2d691cfbf87118bac7254)

... respectivamente, que no coincide con el hash de ninguno de los bloques.

¿Qué me estoy perdiendo o haciendo incorrectamente?

Nota adicional: confirmé estos resultados usando "openssl dgst -sha256 -binary test-input.bin |openssl dgst -sha256"...

Además de esto, usando el código python de la misma página:

>>> import hashlib
>>> header_hex = ("01000000" +
...     "81cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000" +
...     "e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122b" +
...     "c7f5d74d" +
...     "f2b9441a" +
...      "42a14695")
>>> header_bin = header_hex.decode('hex')
>>> hash = hashlib.sha256(hashlib.sha256(header_bin).digest()).digest()
>>> hash.encode('hex_codec')
'1dbd981fe6985776b644b173a4d0385ddc1aa2a829688d1e0000000000000000'
>>> hash[::-1].encode('hex_codec')
'00000000000000001e8d6829a8a21adc5d38d0a473b144b6765798e61f98bd1d'

...funciona bien... pero:

>>> import hashlib
>>> header_hex = ("01000000" +
...     "7ef055e1674d2e6551dba41cd214debbee34aeb544c7ec670000000000000000" +
...     "d3998963f80c5bab43fe8c26228e98d030edf4dcbe48a666f5c39e2d7a885c91" +
...     "02c86d53" +
...     "6c890019" +
...     "593a470d")
>>> header_bin = header_hex.decode('hex')
>>> hash = hashlib.sha256(hashlib.sha256(header_bin).digest()).digest()
>>> hash.encode('hex_codec')
'9ec576ecdaf6edf6c16000794c7e7988b6ee673026467f1e3196f6cbe66f8d17'
>>> hash[::-1].encode('hex_codec')
'178d6fe6cbf696311e7f46263067eeb688797e4c790060c1f6edf6daec76c59e'

...obtiene el mismo resultado erróneo que el código php.

Respuestas (2)

Tiene el número de versión de bloque incorrecto. El bloque 300000 es un bloque de la versión 2 , mientras que el 125552 era la versión 1. Por lo tanto, la primera palabra en el encabezado del bloque debe ser "02000000" y no "01000000".

Muchas gracias. Creo que actualizaré la página wiki de bitcoin para reflejar eso... Hice girar mis ruedas durante bastante tiempo antes de publicar mi pregunta, así que realmente aprecio la respuesta.

Este es el encabezado del bloque #300000

02 00 00 00 7E F0 55 E1 │ 67 4D 2E 65 51 DB A4 1C
D2 14 DE BB EE 34 AE B5 │ 44 C7 EC 67 00 00 00 00
00 00 00 00 D3 99 89 63 │ F8 0C 5B AB 43 FE 8C 26
22 8E 98 D0 30 ED F4 DC │ BE 48 A6 66 F5 C3 9E 2D
7A 88 5C 91 02 C8 6D 53 │ 6C 89 00 19 59 3A 47 0D

El número de versión es 2 (el primer dígito), pero lo ha codificado en 1

encabezado_hex = ("01000000" +

Gracias, la información no está presente en la página wiki. Muy apreciado.