跳到主要内容

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 是正交的。