很多文章或解析将区块里的Bits字段解读成难度值,其实是错误的。Bits的作用是直接和区块头2次sha256()的结果进行比较大小的。比较之前,需要先将两者的类型转换成big.Int型。起初Bits类型是Uint32;hash类型是字节数组。 目标值的产生目标值是怎么产生的呢?目标值是一个变量,中本聪设的初始值是0x1d00ffff。这个目标值以后会每隔2016个区块,根据过去2016个区块花费时长算出的难度值进行调整,保证正常出块的时间在10分钟左右。所有节点都会按统一公式自动调整Bits,调整公式: 新难度值=旧难度值*(过去2016个区块花费时长(分)/20160分钟) 目标值=最大目标值/难度值。 最大目标值是恒定的,即为创始区块的Bits值0x1d00FFFF。这个数的由来是0x00000000FFFF0000000000000000000000000000000000000000000000000000这个64位16进制数通过小端法存储得来。这个64位数字存储需要占32个字节,而Bits在区块头占大小是4个字节,所以通过小端法存储可以把后边的0都抹去,最后得到的数占4个字节。小端法英文表示little-endian,一种是将低序字节存储在起始地址的存储方法。我们经常用到的存储都是大端法,按数据字节顺序从高到低存储。 0x00000000FFFF0000000000000000000000000000000000000000000000000000来自中本聪定义的数字0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF使用浮点编码类型得来的。方法是为满足实现小端法存储,中本聪处理后面F的方法,具体不作分析。真正在代码中出现的最大目标值只是0x1d00FFFF,也就是创始区块的Bits。 每2016个区块完成后,会自动调整新的目标值Bits。从上边公式可以看出新Bits与难度值成反比。因为Bits是小端法存储,所以存储的数据越大说明实际的数字越小,那么挖矿越难;反之越简单。难度值也是个变量,最开始前2016个块数值是1,之后每隔2016个块后都会改变。在矿工挖矿过程中,都会有一个计时器,记录每个区块挖矿的时间,当累加2016次后,将会通过新难度值公式,计算出下一次挖矿的难度值,然后再通过目标值公式得到以后挖矿的目标值。 还原真实目标值在矿工挖矿过程中,产生的hash值与目标值进行比较大小,需要将目标值还原成真实值。目标值由指数(exponent)和系数(coefficient)两部分组成。高位一个字节为指数,低位三个字节为系数。真实目标值用target表示。 真实的目标值的大小计算方式是:target = coefficient?2^(8?(exponent – 3)) 比如:在区块277,316中,nBits字段的值为0x1903a30c,则0x19为指数,而 0x03a30c为系数。计算难度目标的公式为:target = coefficient?2^(8?(exponent – 3)) 由此公式,以及难度位nBits的值 0x1903a30c,可得: target = 0x03a30c?2^(0x08?(0x19 - 0x03))^ =>?target = 0x03a30c * 2^(0x08 * 0x16)^=>target = 0x03a30c * 2^0xB0^ 按十进制计算为: =>target = 238,348 * 2^176^=>?target = 22,829,202,948,393,929,850,749,706,076,701,368,331,072,452,018,388,575,715,328 转化回十六进制后为: =>?target = 0x0000000000000003A30C00000000000000000000000000000000000000000000 也就是说高度为277,316的有效区块的区块头哈希值是小于这个真实目标值的。这个数字的二进制表示中必须超过60位的前导位都是0。在这个级别的难度,一个每秒可以处理1万亿次(1 tera-hash per second 或 1 TH/sec)哈希计算的矿工平均每8,496个区块,或者平均每59天,才能找到一个正确结果。 再看下比特币中创世区块(GenesisBlock)的难度值:nBits字段值为:0x1d00ffff(十进制即为:486604799),表示为十六进制的Target值为:00000000ffff0000000000000000000000000000000000000000000000000000 综上,这个高度为277,316的有效区块的区块头的部分信息如下: A:Bits?=?"0x1903a30c" B:exponent指数,exponent?=?0x19 C:coefficient系数,coefficient?=?0x03a30c D:target?=?coefficient?*?Math.Pow(2,?8?*?(exponent?-?3)) E:Bits真实值(target):0x0000000000000003A30C00000000000000000000000000000000000000000000 F:本区块hash:00000000000000000041ff1cfc5f15f929c1a45d262f88e4db83680d90658c0c 作者:区块链高级工程师、go语言工程师、IPFS早期研究者、IPFS希望社区创始人。网络著书有《IPFS一问一答》、《IPFS操作教程》、《区块链密码学》、《区块链共识算法》;跟踪并翻译报道《IPFS Weekly》,研究并翻译IPFS、Filecoin白皮书,业界知名专家学者——张默默老师! —- 编译者/作者:Online 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
深入学习区块链共识机制(三)POW目标值
2019-11-01 Online 来源:区块链网络
LOADING...
相关阅读:
- 报告:RippleNet预计2020年上半年ODL交易将增长11倍2020-08-04
- 瑞士国有银行将推出加密服务2020-08-04
- DeFi YFI令牌叉Asuka的首席执行官在启动2天后退出骗局; 币安调查2020-08-04
- 【今日币快报】银保监会:鼓励财险公司利用区块链等对传统保险操作2020-08-04
- Travala为其加密预订平台增加了600,000多家酒店2020-08-04