比特币区块的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
如何验证比特币区块的哈希#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