Um passo a passo preciso do histórico de ajuste de dificuldade do Parallax — DAA no estilo BTC desde o gênesis, a atualização ASERT no bloco 17.560 (PIP-0002) e a regra de escolha de fork Nakamoto baseada em trabalho acumulado.
| Parâmetro | Símbolo | Valor | Notas |
|---|---|---|---|
| Intervalo de bloco alvo | τ | 600 s | Alvo no estilo do Bitcoin |
| Limite de desvio de tempo futuro | — | 300 s | 5 minutos |
| Tamanho da amostra do MTP | — | 11 blocos | Mediana dos últimos 11 timestamps |
| Histórico do algoritmo de dificuldade | — | DAA no estilo BTC → ASERT | Janelas de 2016 blocos no estilo BTC do gênesis até 17.559; ASERT (aserti3-2d) para blocos ≥ 17.560 (PIP-0002). |
// Given difficulty D (big integer)
TWO256M1 = (1n << 256n) - 1n
target = TWO256M1 / D
valid = BigIntFromBytes(result) <= target
// 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)
MTP(n):
ts = timestamps(n, upTo=11) // back from n inclusive
sort(ts)
return ts[len(ts)//2]
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])
OnNewTip(candidate):
if ChainWork[candidate] > ChainWork[currentTip]:
currentTip = candidate
ReorgTo(candidate)
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)
Os cabeçalhos são verificados quanto ao tamanho do Extra, tempo (MTP e desvio futuro), regras de dificuldade específicas da era (DAA no estilo BTC para blocos iniciais, ASERT para altura ≥ 17.560), limites de gas/EIPs, incremento de altura e selo de PoW. Blocos válidos estendem o ChainWork, e a ponta mais pesada é a canônica.