难度算法与分叉选择规则

对 Parallax 难度调整历史的精确梳理——从创世开始的 BTC 风格 DAA、在区块 17,560 处启用的 ASERT 升级(PIP-0002),以及基于累积工作量的 Nakamoto 分叉选择规则。

共识参数
参数符号数值说明
目标出块间隔
τ
600 秒
类似 Bitcoin 的目标
未来时间漂移上限
300 秒
5 分钟
MTP 采样数
11 区块
最近 11 个时间戳的中位数
难度算法历史
BTC 风格 DAA → ASERT
创世至 17,559 区块采用 BTC 风格的 2016 区块窗口;区块 ≥ 17,560 改用 ASERT(aserti3-2d,PIP-0002)。
概览
Parallax 以 XHash 工作量证明追求 10 分钟出块;在最初的 BTC 风格 DAA 阶段之后,转为采用每区块更新的 ASERT 难度算法。
  • 从创世至区块 17,559,Parallax 采用 Bitcoin 风格的 2016 区块难度调整窗口(BTC 风格 DAA)。
  • PIP-0002(从 BTC 风格难度调整算法迁移至 ASERT)在区块 17,560 处启用了 ASERT。
  • ASERT(aserti3-2d,与 Bitcoin Cash 所用相同)以固定锚点为基准对每个区块调整难度,在算力波动时也能平滑收敛到 600 秒目标。
  • Median-Time-Past(MTP,最近 11 个时间戳的中位数)守护时间戳的有效性;节点拒绝时间超出当前 +300 秒的区块头,并以 target = ⌊(2^256−1)/D⌋ 验证 PoW。
目标 ↔ 难度
XHash 验证使用的工作量阈值映射(BTC-DAA 与 ASERT 时代通用)。
  • 记 TWO256M1 = 2^256 − 1。当 XHash(header) ≤ target 时区块头有效,其中 target = ⌊TWO256M1 / D⌋。
  • 更高的难度 D ⇒ 更小的目标 ⇒ 区块更难被挖出。
  • Header.MixDigest 必须等于 hashimoto(light 或 full 路径)所计算出的摘要。
  • 难度必须严格为正;零或负值都被视为无效。
目标计算(概念)
伪代码
// Given difficulty D (big integer)
TWO256M1 = (1n << 256n) - 1n
target   = TWO256M1 / D
valid    = BigIntFromBytes(result) <= target
难度调整:BTC 风格 DAA → ASERT
历史上的 2016 区块窗口,与现今相对锚点的逐区块 ASERT。
  • 创世 → 区块 17,559:CalcNakamotoDifficulty() 通过 epoch 锚点实现 Bitcoin 风格的 2016 区块窗口。
  • 区块 17,560 及以后:CalcAsertDifficulty() 以固定锚点 {anchorHeight, anchorParentTime, anchorTarget} 实现 aserti3-2d。
  • ASERT 利用相对锚点的高度偏移 Δh 与流逝时间 Δt,以 2 天的半衰期把难度推向 600 秒的目标。
  • 历史区块继续保留其原本的 BTC 风格 DAA 难度,并按当时的规则进行验证;面向未来的难度调整完全交由 ASERT 完成。
依赖高度的难度选择(概念)
伪代码
// Difficulty selection by era
CalcDifficulty(config, anchor, parent, header):
  if height(header) < 17560:
    // BTC-style DAA: 2016-block window with epoch anchors
    return CalcNakamotoDifficulty(config, parent)
  else:
    // ASERT: per-block retarget relative to fixed anchor
    return CalcAsertDifficulty(config, anchor, parent, header)

// ASERT core idea (fixed-point, aserti3-2d)
CalcAsertDifficulty(config, anchor, parent, header):
  Δh = height(header) - anchor.height
  Δt = header.Time - anchor.parentTime   // seconds
  // τ = 600 s target, T_half = 172800 s (2 days)
  e  = ((Δt - Δh * τ) * RADIX) / T_half  // fixed-point exponent
  target = anchor.target * 2^e           // via cubic approximation in integer math
  target = clamp(target, 1, maxTarget)
  return DifficultyFromTarget(target)
Median-Time-Past(MTP)
用于校验时间戳合理性以及抵御时间扭曲攻击。
  • MTP(parent) = 以 parent 结尾的最近 11 个区块时间戳的中位数。
  • 有效性要求 header.Time > MTP(parent)(严格大于)。
  • 未来漂移上限:header.Time ≤ now + 300 秒。
  • 在 ASERT 下,相对锚点的流逝时间由受 MTP 约束的时间戳驱动,从而抵御针对难度算法的经典长程时间扭曲攻击。
MTP 计算
伪代码
MTP(n):
  ts = timestamps(n, upTo=11) // back from n inclusive
  sort(ts)
  return ts[len(ts)//2]
分叉选择规则
以累积工作量计量的最重有效链,与当前所处的难度时代无关。
  • 维护 ChainWork[tip] = ChainWork[parent] + Work(block)。
  • Work(block) 是关于 target/difficulty 的单调函数;任何一致的定义都会得到等价的排序。
  • 在所有有效链尾中选择 ChainWork 最大者;并列时可按链尾哈希按字典序作为打破平局的方式。
  • 无效区块头(时间戳、PoW、BTC-DAA/ASERT 规则)会在分叉选择之前被剔除。
累积工作量(概念)
伪代码
Work(block):
  target = TWO256M1 / Difficulty(block)
  // Use an approximation that preserves ordering; e.g.,
  return TWO256M1 / (target + 1)

SelectBest(tips):
  return argmax(tips, ChainWork[tip])
链重组与概率性最终性
以确认深度为基础的保证,而非绝对最终性。
  • 确认深度 k 越大,链重组的概率呈指数下降。
  • 钱包与界面可根据风险价值选择 k(例如对高价值交易默认 6 次确认)。
  • 节点可以实施一些务实的防护(例如最大重组深度),以避免来自异常 peer 的 DoS。
  • 相比 BTC 风格 DAA 那样的大窗口,ASERT 更平滑的逐区块难度响应,降低了基于震荡或机会主义的长程链重组动机。
链重组处理(概念)
伪代码
OnNewTip(candidate):
  if ChainWork[candidate] > ChainWork[currentTip]:
    currentTip = candidate
    ReorgTo(candidate)
攻击与缓解
与 Parallax 难度设计相关的关键攻击向量。
  • 时间扭曲:严格的 MTP 强制执行加上 ASERT 的逐区块反馈(不再有长时间静态窗口),缓解了经典 BTC 风格的 2016 区块时间扭曲操纵。
  • 未来时间戳偏差:拒绝时间超出本地时间 +300 秒的区块头。
  • MixDigest 伪造:header.MixDigest 必须与 hashimoto(light/full)的输出一致。
区块头有效性子集
伪代码
ValidHeader(h, parent):
  require(len(h.Extra) <= MaximumExtraDataSize)
  require(h.Time <= now() + 300)
  require(h.Time > MTP(parent))
  require(h.Difficulty > 0)
  // difficulty rules depend on height:
  //   < 17560: BTC-style DAA epoch invariants
  //   ≥ 17560: ASERT anchor-based invariants
  // PoW: MixDigest match & XHash(h) <= targetFrom(D)
流水线

端到端选择流程

区块头会依次通过 Extra 大小、时间(MTP 与未来漂移)、所处时代对应的难度规则(早期采用 BTC 风格 DAA,区块高度 ≥ 17,560 改用 ASERT)、Gas 上限/EIP、高度递增以及 PoW seal 等校验。有效区块会扩展 ChainWork,最重的链尾即为规范链。

1
校验
2
检查锚点 / 时代
3
计算难度(DAA/ASERT)
4
累积工作量
5
选择最重链