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.
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".
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" +
Harwood