主页 > imtoken官方app > 开胃菜常识——区块链难度值

开胃菜常识——区块链难度值

imtoken官方app 2023-04-14 06:10:34

矿工调整区块头字段的值以构造一个有效的新区块。

对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字段来实现的。

理解和计算比特币难度的难度值