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的有效方法为双重哈希算法

  • 相关阅读:
    对象的访问定位——如何找到对象
    对象的结构
    对象在内存中的布局-对象的创建
    java的内存模型--jmm
    redis 持久化之rdb总结
    简单说springmvc的工作原理
    抽象类和接口的区别
    hashcode和equals的作用区别及联系
    DBC物品中打包物品参数设置
    关于GOM引擎启动时显示:windows socket error: 在其上下文中,该请求的地址无效。 (10049), on API 'bind'
  • 原文地址:https://www.cnblogs.com/HachikoT/p/13603266.html
Copyright © 2011-2022 走看看