美文网首页
每个区块哈希值是如何计算出来的

每个区块哈希值是如何计算出来的

作者: quchangTJU | 来源:发表于2022-12-15 21:35 被阅读0次

    查看特定的比特币区块信息,以区块482737为例:


    区块信息

    从网页中可以获取该区块的信息,但是很多信息比如时间经过了处理,无法直接使用,我们需要获取原始数据,方法如下,首先复制网页中Hash的值,也就是该区块的哈希值:000000000000000000fd0c220a0a8c3bc5a7b487e8c8de0dfa2373b12894c38e,然后打开以下网址https://blockchain.info/rawblock/000000000000000000fd0c220a0a8c3bc5a7b487e8c8de0dfa2373b12894c38e,得到该区块所有数据,为json格式:

    区块482737数据
    知道如何获取json数据后,进行以下几步:
    1. 解析json数据,得到区块版本号,前一个区块哈希值,默克尔根,时间戳,目标难度,随机数
    2. 进行数据预处理,将数据转化为字节流并改为小端序
    3. 进行数据拼接,顺序为版本号+上一区块哈希值+默克尔根+utc时间戳+目标难度+随机数
    4. 进行两次sha256运算

    代码如下:

    import requests
    from json import dumps
    import binascii
    from hashlib import sha256 as s
    
    #字节翻转函数,用于将字符串转为小端序
    def strchange(a):
        return bytes().fromhex(a)[::-1]
    
    # 获取区块482737json数据,命名为data
    url = 'https://blockchain.info/rawblock/000000000000000000fd0c220a0a8c3bc5a7b487e8c8de0dfa2373b12894c38e'
    response = requests.get(url)
    data = response.json()
    
    #区块482737的原始数据
    #版本号,整形
    ver = data['ver']
    #区块哈希值,字符串格式
    hash = data['hash']
    #上一区块哈希值,字符串格式
    prev_block = data['prev_block']
    #默克尔根,字符串格式
    mrkl_root = data['mrkl_root']
    #utc时间戳,整形
    time = data['time']
    #目标难度,字符串格式
    bits = data['bits']
    #随机数,字符串格式
    nonce = data['nonce']
    
    # 数据预处理,将数据转化为字节流并改为小端序
    ver = bytes.fromhex(str(hex(ver))[2:])[::-1]
    prev_block = strchange(prev_block)
    mrkl_root = strchange(mrkl_root)
    time = bytes.fromhex(str(hex(time))[2:])[::-1]
    bits = bytes.fromhex(str(hex(bits))[2:])[::-1]
    nonce = bytes.fromhex(str(hex(nonce))[2:])[::-1]
    
    # 进行数据拼接,顺序为版本号+上一区块哈希值+默克尔根+utc时间戳+目标难度+随机数
    k = ver+prev_block+mrkl_root+time+bits+nonce
    
    # 两次sha256运算,结果转成大端序,方便显示
    res = binascii.hexlify(s(s(k).digest()).digest()[::-1])
    
    # bytes解码为str
    res = res.decode()
    
    # 经验证,与区块数据中的哈希值一致
    print(res == hash)
    # True
    

    相关文章

      网友评论

          本文标题:每个区块哈希值是如何计算出来的

          本文链接:https://www.haomeiwen.com/subject/cavrqdtx.html