zoukankan      html  css  js  c++  java
  • 比特币PoW

    比特币区块头结构

    字段 大小(Byte) 说明
    nVersion 4 区块版本号,表示本区块遵守的验证规则
    hashPrevBlock 32 前一区块的哈希值,使用SHA256(SHA256(父区块头))计算
    hashMerkleRoot 32 该区块中交易的Merkle树根的哈希值,同样采用SHA256(SHA256())计算
    nTime 4 时间戳 该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11个区块时间的中值,同时全节点也会拒绝那些超出自己2个小时时间戳的区块
    nBits 4 该区块工作量证明算法的难度目标,已经使用特定算法编码
    nNonce 4 为了找到满足难度目标所设定的随机数,为了解决32位随机数在算力飞升的情况下不够用的问题,规定时间戳和coinbase交易信息均可更改,以此扩展nonce的位数

    比特币PoW算法

    比特币挖矿的算法就是不断区块头的哈希值,使得其满足下面的式子:
    SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + nNonce)) <= TARGET
    所以挖矿就是不断尝试不同的nonce,使得上式成立,由于32位的nonce域太小,这时也可以微调时间戳nTime,还可以调整铸币交易coinbase(铸币交易是交易列表中第一笔交易,用于给矿工比特币奖励)。

    TARGET调整

    比特币为了维持每10分钟出一个块的稳定,每2016个区块(理论上两周时间的出块量)会重新计算TARGET:
    新难度值 = 旧难度值 * (最近2016个区块的真正时间 / 最近2016个区块的预期时间)
    同时还有“涨停跌停”限制,新难度值最大不能不过当前难度值的4倍,最小不能小于当前难度值的4分之1。

    为什么要判断时间戳是否合法

    为了防止有些矿工恶意修改时间戳,比如将时间戳的值设的很大,让系统以为当前难度过高,从而降低挖矿难度

    为什么要计算两次哈希值

    这是因为SHA1在2017年被攻破,采用的方法是birthday collision attack。社区觉得SHA2被攻破也是时间的问题,而抵御birthday collision attack的有效方法为双重哈希算法

  • 相关阅读:
    spring boot 在SpringMVC中使用Jackson并格式化时间
    MUI 同一个页面初始化多个pullrefresh 下拉刷新/上拉加载组件的问题
    Fixflow引擎解析(五)(内核)
    Fixflow引擎解析(四)(模型)
    Fixflow引擎解析(三)(模型)
    Fixflow引擎解析(二)(模型)
    Fixflow引擎解析(一)(介绍)
    Raspberry Pi 摄像头模块应用程序文档翻译
    js 继承如何让对象instanceof 当前类及父类均返回true?
    zabbix邮件脚本报警
  • 原文地址:https://www.cnblogs.com/HachikoT/p/13603266.html
Copyright © 2011-2022 走看看