主页 > imtoken官方app > 开胃菜常识——区块链难度值
开胃菜常识——区块链难度值
矿工调整区块头字段的值以构造一个有效的新区块。
对header进行SHA256运算=结果≤目标值target,则新区块构建成功,广播到全网,接下来的计算竞赛开始。
否则,调整区块头中字段的值(修改Nonce或通过调整交易修改Merkle Root),重新计算。
struct header_structure { // BYTES NAME
uint32_t nVersion; // 4 version
uint8_t hashPrevBlock[32]; // 32 previous block header hash
uint8_t hashMerkleRoot[32]; // 32 merkle root hash
uint32_t nTime; // 4 time
uint32_t nBits; // 4 target
uint32_t nNonce; // 4 nonce
};
位 -> 目标
区块头中的位比特币难度值计算公式,识别出当前区块头的哈希值(必须满足)小于等于目标值target。
块头的SHA256结果有256位,而Bits只有32位(4字节)。
高度为 277316 的有效区块的 Bits 值为:
十进制的Bits值为0x1903a30c/ 419668748
前2位16进制数为幂,后6位为系数比特币难度值计算公式,0x19为指数(exponent),0x03a30c为系数(系数)。位通过以下操作获取目标:
target = coefficient * 256^(exponent – 3)
target = 0x03a30c * 256^(0x19 - 3)
= 238,348 * 256^22
= 22,829,202,948,393,929,850,749,706,076,701
,368,331,072,452,018,388,575,715,328
十六进制
0x0000000000000003a30c00000000000000000000000000000000000000000000
0x0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4
第一行是Bits得到的Target值。
第二行是高度为277316的有效区块头信息的实际hash值,小于等于第一行的目标值。
从中本聪的创世区块可以看出
Bits为0x1d00ffff(十进制486604799),难度为1(注意区块头没有存放难度的字段)
中本聪的创世区块:
difficulty = 1
// 不在区块头显示
Bits = 0x1d00ffff
target = coefficient * 256^(exponent – 3)
target = 0x00ffff * 256^(0x1d - 3)
= 0x00ffff * 256^26
= 0x00000000ffff0000000000000000000000000000000000000000000000000000
构建下一个合法区块,需要不断地对区块头进行SHA256运算,直到找到区块头的Hash结果。前 32 位的值为 0(小于目标值)。
满足以上条件,前32位的值为0。概率为1 / (2^32),平均需要2^32次运算才能找到这个值。
difficulty ≈ 2^32次 = 4294967296次 ≈ 4.2 * 10^9次 ≈ 4G次运算
Block #501509 = (0x00ffff * 256 ^ 26)
Block #0 = (0x009645 * 256 ^ 21)
difficulty_current = target_block #0 / target_current
= (0x00ffff * 256 ^ 26)/ (0x009645 * 256 ^ 21)
= 65535/38469 * (256^5)
= 1.703579505575918 * 2^40
= 1873105475221.611
≈ 1.87 * 10^12
average time = difficulty_current * 2**32 / hash_rate
difficulty_current = 1.93 T,
hash_rate (全网算力) = 15.32 EH/s
= 1.93T * 2^32 / 15.32EH/s
= 1.93 * 10^12 * 4.295 * 10^9 / 15.32 * 10^18
= 8289.35 * 10^18 / 15.32 * 10^18
≈ 541 sec
难度反映了矿工找到下一个有效区块的难度,难度随着区块头目标哈希值(target)的变化而变化,目标值越小难度越大。在难度不变的情况下,理论上全网算力越大出块时间越快。
比特币每10分钟的出块速度是新比特币发行和交易完成的基础,需要长期保持相对稳定。每产生 2016 个区块,网络中的所有全节点都会调整难度。难度 调整公式是通过比较生成最新的 2016 个区块所需的时间与 20160 分钟(两周,即以 10 分钟的速率生成这些区块的预期时间)来计算的。难度取决于实际时间和预期时间。持续时间的比例相应调整(更难或更容易),简单来说,如果网络发现出块速度快于 10 分钟,就会增加难度。如果发现出块速度快于 10 分钟,就会降低难度。
难度的调整是通过调整区块头中的Bits字段来实现的。
理解和计算比特币难度的难度值