zoukankan      html  css  js  c++  java
  • 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:WindowsSystem32目录下或者将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'
    
  • 相关阅读:
    Solaris 默认Shell 修改
    关系数组
    文件描述符 文件操作 <> open 文件句柄
    IO 双引号 输出 输入
    第五章答案
    子例程 subroutine
    钻石操作符
    花括号的使用 printf %${width}s , 否则会 去找 $widths
    print reverse <> 是打印全部的文件内容 ?
    hihoCoder#1239 Fibonacci
  • 原文地址:https://www.cnblogs.com/coming1890/p/14030821.html
Copyright © 2011-2022 走看看