前文中介绍了比特币难度调整是每隔2016个区块调整难度,从而达到维持出块时间15min的目标。而以太坊则与之不同,每个区块都又可能会进行难度调整。以太坊难度调整较为复杂,存在多个版本,网络上存在诸多不一致,这里遵循以代码逻辑为准的原则,从代码中查看以太坊难度调整算法。

以太坊难度调整

以太坊中区块难度调整算法如下图所示:

image-20230117171850132

自适应难度调整:

image-20230117172537301

举例说明

image-20230117172144191

难度炸弹

根据以上以太坊难度调整算法可以看到,该算法可以很好地动态调整挖矿难度,从而保障系统整体出块时间维持在15s左右。但之前在挖矿算法的文章中有介绍到,以太坊在设计之初就计划要逐步从POW(工作量证明)转向POS(权益证明),而权益证明不需要挖矿。

从旁观者角度来看,挖矿消耗了大量电力、资金等,如果转入放弃挖矿,必然是一件好事。但从矿工的角度,花费了很大精力投入成本购买设备,突然被告知“不挖矿了”,这必然是一件很难接受的事情。而以太坊本身为一个分布式系统,其转入POS必须经过系统中大多数矿工认可才行,如果届时矿工联合起来转入POS,那么这一设计初衷就成了一江流水。

因此,以太坊在设计之初便添加了难度炸弹,迫使矿工转入POS。那么如何促使矿工自愿升级软件,而非坚持POW呢?\

image-20230117172319697

可以看到,在以太坊早期时,区块号较小,难度炸弹计算所得值较小,难度调整级别基本上通过难度调整中的自适应难度调整部分决定,而随着越来越多区块被挖出,难度炸弹的威力开始显露出来,这也就使得挖矿变得越来越难,从而迫使矿工愿意转入POS。

难度炸弹的威力

image-20230117173204025

image-20230117173703737

具体代码实现

难度计算公式

bigTime为当前区块时间戳,bigParentTime为当前区块的父区块时间戳。

image-20230117174211320

基础部分计算

image-20230117174304968

难度炸弹计算

image-20230117174335682

为什么不是减去3000000,而是2999999?
因为这里的为父区块号,而公式中的减三百万是根据当前区块来算的。

以太坊实际统计数据(2018年)

挖矿难度变化曲线:

断崖式下跌是由于下调难度炸弹300万个区块

image-20230117174639675

以太坊出块时间变化曲线图

与上图对应,在早期,动态难度调整起到了一定的作用,出块时间稳定在15s,然后难度炸弹让出块时间陡增至30s,经过回调之后,出块时间又稳定在了15s,可见难度调整算法是很有效的。

image-20230117174839370

两个区块信息

所以实际上区块判断最长合法链时,实际判断的是这个区块链的总难度,所以我们提到的最长合法链对于以太坊来说实际上是最难合法链

image-20230117175305036