Bitcoin—块散列算法
1. BTC Block
点击进入Height为658423的哈希值(000000000000000000014788256270fc5db06737c3cfa3b04d258dbdfaacb45c)
2. Block hash算法
它有多强大呢?举个例子:
>>> from hashlib import sha256
>>> d=bytes.fromhex('01000000'+'81cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000'+'e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122b'+'c7f5d74d'+'f2b9441a'+'42a14695')
>>> h=sha256(d).digest()
>>> sha256(h).hexdigest()
'1dbd981fe6985776b644b173a4d0385ddc1aa2a829688d1e0000000000000000'
通过它构造的消息,其哈希值后面有很长的一段0!想知道上面的消息怎么构造,请往下看:
2.1. 准备工作
1.安装pyCryptodome库
pip3 install pyCryptodome -i https://pypi.douban.com/simple
2.安装curl工具
如果你用的Linux系统,curl工具可通过命令行安装;
对于我使用的Windows系统,去官网下载工具包,解压到C:\Windows\System32目录下或者将bin目录下的curl.exe的路径加入环境变量;
2.2. 获取构造特定哈希值的信息
对我们想要的哈希值000000000000000000014788256270fc5db06737c3cfa3b04d258dbdfaacb45c,在命令行运行:
# curl https://blockchain.info/rawblock/000000000000000000014788256270fc5db06737c3cfa3b04d258dbdfaacb45c > data
因为返回的消息太多了,因此输出重定向到文件中存下来;我们主要关注的有:ver、prev_block、mrkl_root、time、bits与nonce;这些值提取出来如下:
data={'ver':541065216,
'prev_block':'00000000000000000009f1410ac69d92199991a699b268d56d99daf6067c8711',
'mrkl_root':'9ad7e80cf4a94f57c36876ab999f3cf23de188d482b8a3af8fb5e08ec1e18a6e',
'time':1606199690,
'bits':386924253,
'nonce':232397866}
注意:ver、time、bits与nonce找最前面的,prev_block与mrkl_root找最后面的,不然算出来的哈希值会不是我们想要的。
接下来,使用我写好的脚本如下,通过将这些信息组合起来就可以构造出消息,其哈希值就是000000000000000000014788256270fc5db06737c3cfa3b04d258dbdfaacb45c!
from hashlib import sha256
from binascii import hexlify,unhexlify
from Crypto.Util.number import long_to_bytes
#curl https://blockchain.info/rawblock/000000000000000000014788256270fc5db06737c3cfa3b04d258dbdfaacb45c
data={'ver':541065216,
'prev_block':'00000000000000000009f1410ac69d92199991a699b268d56d99daf6067c8711',
'mrkl_root':'9ad7e80cf4a94f57c36876ab999f3cf23de188d482b8a3af8fb5e08ec1e18a6e',
'time':1606199690,
'bits':386924253,
'nonce':232397866}
def num_to_Bytes(n):
byte_n=long_to_bytes(n,4)
return byte_n[::-1]
def hex_to_Bytes(h):
s=unhexlify(h)
return s[::-1]
def Bitcoin_demo():
d=num_to_Bytes(data['ver'])+hex_to_Bytes(data['prev_block'])+hex_to_Bytes(data['mrkl_root'])+num_to_Bytes(data['time'])+num_to_Bytes(data['bits'])+num_to_Bytes(data['nonce']%pow(2,32))
h=sha256(d).digest()
return sha256(h).digest()
if __name__=='__main__':
ret=Bitcoin_demo()
print(hexlify(ret[::-1]))
程序运行结果如下:
# python3 Bitcoin.py
b'000000000000000000014788256270fc5db06737c3cfa3b04d258dbdfaacb45c'