SHA256 * 2 в заголовке - что я делаю не так?

Я экспериментировал с php-кодом здесь: https://en.bitcoin.it/wiki/Block_hashing_algorithm (после исправления небольшой ошибки $x=; to $x=""; )

С этими блоками 0 и 125552 (например) все работает нормально и я получаю ожидаемый хэш.

С блоками 225552 и 300000 получаю:

7a7bb195e8bcc8e73205df7906eb68f26144c6fbc577d59dd4e8a0cfdb8b90df (а не 00000000000001f4f14b09019b23d71c222a2c1245ef3df52875d79ff44887001)

а также

178d6fe6cbf696311e7f46263067eeb688797e4c790060c1f6edf6daec76c59e (вместо 000000000000000082ccf8f1557c5d40b21edabb18d2d691cfbf87118bac7254)

... соответственно, что не соответствует хешу ни одного из блоков.

Что я упускаю или делаю неправильно?

Дополнительное примечание: я подтвердил эти результаты, используя "openssl dgst -sha256 -binary test-input.bin |openssl dgst -sha256"...

В дополнение к этому, используя код Python с той же страницы:

>>> 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'

...работает нормально... но:

>>> 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'

... получает тот же ошибочный результат, что и php-код.

Ответы (2)

У вас неправильный номер версии блока. Блок 300000 — это блок версии 2 , тогда как 125552 — это блок версии 1. Таким образом, первое слово в заголовке блока должно быть «02000000», а не «01000000».

Большое вам спасибо — я думаю, что обновлю вики-страницу биткойнов, чтобы отразить это… Я довольно долго крутил колеса, прежде чем опубликовать свой вопрос, поэтому я действительно ценю ответ.

Это заголовок блока #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

Номер версии 2 (самая первая цифра), но вы жестко запрограммировали его на 1

header_hex = ("01000000" +

Спасибо - информации нет на странице вики. Очень признателен.