深入理解以太坊系列(10): 难度更新算法

以太坊中也设有难度系数,并需要在每生成一个区块时对区块难度做出调整。按照以太坊设计原则中介绍,其难度更新规则的设计目标是:简单、更新快速、波动性低、占用内存低且可以避免矿工利用篡改数据而获利。

以太坊设计原则中描述的难度更新规则如下:

diff(genesis) = 2^32
diff(block) = diff.block.parent + floor(diff.block.parent / 1024) *
    1 if block.timestamp - block.parent.timestamp < 9 else
    -1 if block.timestamp - block.parent.timestamp >= 9

如果查看其具体实现,我们可以看到Homestead版本的规则如下:

diff(block) = parent_diff +(parent_diff / 2048 * max(1 - (block_timestamp - parent_timestamp) // 10, -99))+ 2^(periodCount - 2)

还有最新的Byzantium版本的规则更新:

diff(block) = parent_diff +(parent_diff / 2048 * max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // 9), -99))+ 2^(periodCount - 2)

可以看出,难度系数调整工作还在不断更新中。正如以太坊设计原则中所说,其当前算法在低波动性及防范矿工通过数据篡改而获利方面还有所欠缺。