https://en.bitcoin.it/wiki/Protocol_documentation#Block_Headers
可以直接参考以上链接,当然可以可以直接查看比特币的源码,我们现在把数据列出来。
1 2 3 4 5 6 7 8
|
struct header_structure { uint32_t nVersion; uint8_t hashPrevBlock[32]; uint8_t hashMerkleRoot[32]; uint32_t nTime; uint32_t nBits; uint32_t nNonce; };
|
现在逐条解释block header中的字段。
nVersion 版本号,主要用来跟踪软件版本(bitcoin core)和协议号 现在固定为2
hashPrevBlock 前一个节点的hash值,我们知道区块链的链,大致指的是数据链式存储。我们可以简单粗暴的理解为它是指向前置节点的链表。
hashMerkleRoot 默克尔根,区块中所有交易组合起来生产成本的默克尔树的根。详情可参考数据结构“默克尔树”
nTime 时间戳,标志块生成的时间
nBits 和难度有关,本文讨论的重点
nNonce 随机值,和难度有关,本文讨论的重点
88888
的区块。
1 2
|
bits 454,373,987 注意:这个bits是10进制,我们分析时候需要转16进制 对应为 0x1b153263
|
bit值是按照系数+指数的方式存储的,前两位为幂,后六位为系数。
1 2 3 4 5 6
|
1b为幂(exponent) 153263为系数(coefficient)注意这是16进制 根据公式 target = (0x153263)* 256^(1b - 3) target = 1389155 * 256^(27 - 3) = 8719867261221084516486306056196045840260667577454435863762042880 = 00 00 00 00 00 15 32 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
需要注意的有:计算的时候还是转10进制,计算完之后要转16进制,不够64位的要在高位补零。
实际上我们发现,实际的hash
000000000013a2a3a8f1aaec4690f55fdcb4067d812521a6d55239d8ea1a4dd3
比目标target确实是小的。
看这个
在此之上,我们定义:“使区块头的SHA256结果小于某个目标值(target),平均要尝试的计算次数,这个次数为难度(difficulty)”。创世区块的难度为1!
比特币有这样一个公式
difficulty—current = target-genesis / target-current
随机选取一个幸运高度算一个 选择500000
1 2 3 4 5 6 7 8 9 10 11 12 13
|
bits: 402,691,653 Difficulty: 1,873,105,475,221.61
bit转16进制 18 009645 target = (0x009654) * 256^(18-3) = 38484 * 256^(24-3) 创世块的target = (0x00ffff * 256 ^ 26)
两者相除 = 65535/38484 * 256^5 = 1.70291549735 * 2 ^ 40 = 1,873,105,475,221.61 = 1.87 * 10^12
|
可以看到计算出的难度和区块链浏览器展示的难度一致。大约为1.87T。
此外,还有一个计算公式
出块时间(单位:秒) ≈ difficulty_当前 * 2^32 / 全网算力
有兴趣的话可以去区块链浏览器上计算一下,在当前的难度下,出块时间是不是保持在10分钟左右。
这里
。
注意:实际代码中2015个块就会调整,因为当初写代码写错了。。。