Bitcoin—块散列算法

1. BTC Block

BTC Block

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

2. Block hash算法

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'
posted @ 2020-11-24 16:07  _Mind  阅读(246)  评论(0编辑  收藏  举报