BTC Block

BTC Block

点击进入Height为658423的哈希值(000000000000000000014788256270fc5db06737c3cfa3b04d258dbdfaacb45c)

Block hash算法

Block hash算法

它有多强大呢?举个例子:

1
2
3
4
5
>>> from hashlib import sha256
>>> d=bytes.fromhex('01000000'+'81cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000'+'e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122b'+'c7f5d74d'+'f2b9441a'+'42a14695')
>>> h=sha256(d).digest()
>>> sha256(h).hexdigest()
'1dbd981fe6985776b644b173a4d0385ddc1aa2a829688d1e0000000000000000'

通过它构造的消息,其哈希值后面有很长的一段0!想知道上面的消息怎么构造,请往下看:

准备工作

  • 安装pyCryptodome库
1
pip3 install pyCryptodome -i https://pypi.douban.com/simple
  • 安装curl工具

如果你用的Linux系统,curl工具可通过命令行安装;

对于我使用的Windows系统,去官网下载工具包,解压到C:\Windows\System32目录下或者将bin目录下的curl.exe的路径加入环境变量;

获取构造特定哈希值的信息

对我们想要的哈希值000000000000000000014788256270fc5db06737c3cfa3b04d258dbdfaacb45c,在命令行运行:

1
# curl https://blockchain.info/rawblock/000000000000000000014788256270fc5db06737c3cfa3b04d258dbdfaacb45c > data

因为返回的消息太多了,因此输出重定向到文件中存下来;我们主要关注的有:ver、prev_block、mrkl_root、time、bits与nonce;这些值提取出来如下:
1
2
3
4
5
6
data={'ver':541065216,
'prev_block':'00000000000000000009f1410ac69d92199991a699b268d56d99daf6067c8711',
'mrkl_root':'9ad7e80cf4a94f57c36876ab999f3cf23de188d482b8a3af8fb5e08ec1e18a6e',
'time':1606199690,
'bits':386924253,
'nonce':232397866}

注意:ver、time、bits与nonce找最前面的,prev_block与mrkl_root找最后面的,不然算出来的哈希值会不是我们想要的。

接下来,使用我写好的脚本如下,通过将这些信息组合起来就可以构造出消息,其哈希值就是000000000000000000014788256270fc5db06737c3cfa3b04d258dbdfaacb45c!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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]))

程序运行结果如下:

1
2
# python3 Bitcoin.py
b'000000000000000000014788256270fc5db06737c3cfa3b04d258dbdfaacb45c'