FIP-05: 难度调节
作者: Thiniboy
状态: 已定稿 (Final)
创建日期: 2025-07-18
摘要
采用每区块、Digishield 风格的难度重新调整,使用朝向一分钟目标间隔的指数移动平均 (EMA)。该算法提高了对算力冲击的响应速度,同时抑制了震荡并降低了方差。
动机
过长的重新调整窗口会导致可预测的震荡,并使难度长期偏离目标。每区块 EMA 能在保持稳定性的同时快速响应变化。
规格
- 目标间隔 T = 60 秒。
- 在每个区块 n,使用振幅除数 8 更新观察到的间隔的 EMA(实际上是 8 个样本的 EWMA)。
- 在每一步应用有界的阻尼,将有效间隔的影响限制在 [0.75·T, 1.5·T] 范围内。
- 通过将前一个目标乘以钳位间隔与 T 的比率来计算下一个目标,并受共识限制约束。
- 当观察到的间隔超过链参数化阈值时(在启用此功能的链上),允许产生最低难度区块。
important
激活 (主网): 区块高度 115,000。
原理
与长窗口重新调整相比,每区块 EMA 减少了延迟,而钳位机制防止了对异常值的过度反应。类似的方法在“Digishield”系列的其它 UTXO 链中得到了验证。
参考实现
在 go-flokicoin 中实现,并通过链参数启用。参见发布版 0.25.7-beta 及其中的共识更改。
输入:
T := 60 秒 (目标间隔)
Divisor := DigishieldAmplitudeDivisor (Flokicoin 中为 8)
ClampMin := 0.75 × T
ClampMax := 1.50 × T
prevTarget := 上一个难度目标 (整数)
actualSpan := timestamp_n - timestamp_{n-1}
算法:
1. modulatedSpan ← T + (actualSpan - T) / Divisor
2. modulatedSpan ← clamp(modulatedSpan, ClampMin, ClampMax)
3. nextTarget ← prevTarget × modulatedSpan / T
4. nextTarget ← min(nextTarget, PowLimit)
结果:
将 nextTarget 转换回区块头的紧凑字节格式 (compact bits)。
注: 当启用 ReduceMinDifficulty 时,如果 actualSpan 超过
DigishieldLateBlockMultiple × T,则另一条规则会铸造一个最低难度区块。
该快捷方式与上述每区块 EMA 是正交的。