最新消息:

比特币源码剖析(六)之难度(difficulty)

Bitcoin justnode 421浏览

比特币的区块中并没有专门的位置保存挖矿的难度值,取而代之保存的是挖矿的目标值(target),该值保存在区块头的bits字段中。

Field Purpose Updated when… Size (Bytes)
Version Block version number You upgrade the software and it specifies a new version 4
hashPrevBlock 256-bit hash of the previous block header A new block comes in 32
hashMerkleRoot 256-bit hash based on all of the transactions in the block A transaction is accepted 32
Time Current timestamp as seconds since 1970-01-01T00:00 UTC Every few seconds 4
Bits Current target in compact format The difficulty is adjusted 4
Nonce 32-bit number (starts at 0) A hash is tried (increments) 4

bits值是压缩存储的,通过bits得到target的计算公式是  target = coefficient * 256^(exponent – 3)。以bits等于0x1903a30c为例,coefficient是03a30c,exponent是0x19。

在创世区块中,bits值为0x1d00ffff,根据公式计算可得target为:0x00000000ffff0000000000000000000000000000000000000000000000000000,其中前32位为0。

我们以创世区块的target为参照物,同时定义创世区块的difficult为1,其余的区块的difficult计算公式为:当前区块_difficult = target_创世区块/taget_当前区块。

由此可见,当前区块的target值越小,区块的difficult越大,也就是难度越高。

根据difficult的计算公式进一步推算   difficult = 0xffff*2^208/(2^256/2^x),其中x为当前区块target前导0的个数。于是可得2^x = difficult*(2^32)。所以为了打包一个区块,我们需计算哈希值的次数为:difficult*(2^32)。

 

难度(difficulty)的调整

难度调整逻辑被写在代码中,在每个全节点中独立自动发生。每产生2016个区块,网络中的所有全节点都会调整难度。难度的调整公式是由产生最新2016个区块的花费时长与20160分钟(两周,即这些区块以10分钟一个的速率产生所期望花费的时长)比较得出的。难度是根据实际时长与期望时长的比值进行相应调整的(或变难或变易),简单来说,如果网络发现区块产生速率比10分钟要快时会增加难度。如果发现比10分钟慢时则降低难度。

这个逻辑可以简单表示为

Difficulty_新 = Difficulty_原 * ( 20160分钟 / 产生2016个区块的实际花费时长 )