本文是整理好的CIP-86中文介绍,供大家交流讨论。
CIP-86详情链接:https://github.com/Conflux-Chain/CIPs/blob/master/CIPs/cip-86.md
简要总结
缩短难度调整周期并应用移动平均方法。
摘要
将难度调整的周期从每5000个epoch减少至每250个epoch。为了避免短期的剧烈波动,在难度调整上应用了SMA(移动平均)方法。
动机
在过去的几个月里,Conflux共识协议经常会遭遇了持续时间不定的闲散算力切换挖矿。这一情况造成了区块生成速率持续波动,峰值时每0.15秒即可生成一个区块。这增加了树图结构中的分叉,增加了智能合约执行引擎的负担。为了缓解该问题,我们需要缩短难度调整周期,以便对算力的变化做出更及时的调整。
说明
原始版本行为
对于区块高度等于 5000k
的区块,其中 k
为整数,按如下方法计算参数 n
及 T
:
-
n
: 过去5000个epoch中包含的区块数。 -
T
: 经历过去5000个epoch所消耗的实际时间(以秒为单位)。(关于计算T
的更多细节请参考Conflux协议规范)
设置变量 d'
代表调整前的区块链难度,而过去5000epoch的估算算力为 p = n * d' / T
(哈希率/秒)。为了设置区块生成速率为每0.5秒一个区块,目标难度 d
将被定义为 d = p / 2 = n * d' / T / 2
.
调整后的难度 D
将被设置为 d
。特别的,如果 d > 1.5 d'
,则 D
将被设置为 1.5 d'
。如果 d < 0.5d'
,则 D
将被设置为 0.5 d'
。
新版本行为
对于区块高度等于 250k
的区块,其中 k
为整数,参考如下方法计算参数 n
和 T
:
-
n
: 过去250个epoch中包含的区块数。 -
T
: 经历过去5000个epoch所消耗的实际时间(以秒为单位)。
设置变量 d'
代表调整前的区块链难度。同样的,目标难度 d
将被定义为 d = n * d' / T / 2
.
此处我们没有设置 d
作为调整后的区块链难度,而是采用了平均方法。接下来250个epoch的区块链难度将被设置为 0.8 d' + 0.2 d
。特别的,如果 0.8 d' + 0.2 d > 1.5 d'
, 则 D
将被设置为 1.5 d'
。
理论支撑
算力波动的根源是,难度调整算法将会根据 过往多个epoch 估计的算力预测 未来多个epoch 的算力。因此,如果算力持续处于波动变化状态,该算法将会导致错误的预测。
一个更加完整的解决方案是,若实际算力远远大于预测的算力,就减少块的基本奖励。这样,有助于打消矿工进行算力短暂切入及退出积极性。然而,该解决方案将会涉及到经济模型的调整,需要更多的讨论。因此在该提案中我们提出了一个相对简单的解决方案,通过减少难度调整的周期,并使一小时时间窗口内的算力更加稳定。
后向兼容
由于这一调整需要打破当前系统规范,因此需要在一个能够整除5000的区块高度时生效。
安全考虑
更短的难度调整周期,可能会使对参数 T
的估计不准确。但在正常情况下,该误差小于5%。攻击者可以通过一些专门的策略来操纵 T
的结果,但这一行为唯一的效果仅仅是减慢区块生成速率。幸运的是,区块生成速率越低,攻击者操纵 T
的能力就越小。
版权声明
Copyright and related rights waived via CC0.