比特币区块的sha256

sha256 of bitcoin block

如何验证比特币区块的哈希#123456

from hashlib import sha256
header = "010000009500c43a25c624520b5100adf82cb9f9da72fd2447a496bc600b0000000000006cd862370395dedf1da2841ccda0fc489e3039de5f1ccddef0e834991a65600ea6c8cb4db3936a1ae3143991";
print sha256(sha256(header).digest()).digest().encode('hex') 

输出:

d59eced1ded07f84c145592f65bdf854358e009c5cd705f5215bf18697fed103

但实际哈希是:

0000000000002917ed80650c6174aac8dfc46f5fe36480aaef682ff6cd83c3ca

这里出了什么问题?

此 python 代码将计算截至 2011 年 6 月具有最小散列的块的散列,块 #125552。 header 由六个字段构成,这些字段以十六进制表示法连接在一起作为 little-endian 值

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

当我运行你的代码时,我得到:

f8ac6baf0ac904d520de5287055bfd0f61775d0fc0699ffacff9f0d7271a021b 不是 d59eced1ded07f84c145592f65bdf854358e009c5cd705f5215bf18697fed103

但是,您需要将其哈希为字节,而不是字符串(如果您使用字符串,它将被 ascii 编码):

Python 2

from hashlib import sha256
header = '\x01\x00\x00\x00\x95\x00\xc4\x3a\x25\xc6\x24\x52\x0b\x51\x00\xad\xf8\x2c\xb9\xf9\xda\x72\xfd\x24\x47\xa4\x96\xbc\x60\x0b\x00\x00\x00\x00\x00\x00\x6c\xd8\x62\x37\x03\x95\xde\xdf\x1d\xa2\x84\x1c\xcd\xa0\xfc\x48\x9e\x30\x39\xde\x5f\x1c\xcd\xde\xf0\xe8\x34\x99\x1a\x65\x60\x0e\xa6\xc8\xcb\x4d\xb3\x93\x6a\x1a\xe3\x14\x39\x91'
print sha256(sha256(header).digest()).digest().encode('hex')
cac383cdf62f68efaa8064e35f6fc4dfc8aa74610c6580ed1729000000000000

然后,您需要将字节序反转为大端。

Python 3

from hashlib import sha256
header = bytes.fromhex('010000009500c43a25c624520b5100adf82cb9f9da72fd2447a496bc600b0000000000006cd862370395dedf1da2841ccda0fc489e3039de5f1ccddef0e834991a65600ea6c8cb4db3936a1ae3143991')
print(sha256(sha256(header).digest()).digest().hex())
cac383cdf62f68efaa8064e35f6fc4dfc8aa74610c6580ed1729000000000000