Un parcours précis de l'historique d'ajustement de difficulté de Parallax — DAA à la BTC depuis le genesis, mise à jour ASERT au bloc 17 560 (PIP-0002) et règle Nakamoto de choix de fork fondée sur le travail cumulé.
| Paramètre | Symbole | Valeur | Notes |
|---|---|---|---|
| Intervalle de bloc cible | τ | 600 s | Cible à la Bitcoin |
| Borne de dérive temporelle future | — | 300 s | 5 minutes |
| Taille d'échantillon MTP | — | 11 blocs | Médiane des 11 derniers horodatages |
| Historique de l'algorithme de difficulté | — | DAA à la BTC → ASERT | Fenêtres de 2016 blocs à la BTC du genesis au bloc 17 559 ; ASERT (aserti3-2d) pour les blocs ≥ 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)
Les en-têtes sont vérifiés quant à la taille d'Extra, au temps (MTP et dérive future), aux règles de difficulté spécifiques à l'ère (DAA à la BTC pour les premiers blocs, ASERT pour une hauteur ≥ 17 560), aux limites de gas et EIP, à l'incrément de hauteur et au seal PoW. Les blocs valides étendent ChainWork, et la tête la plus lourde est canonique.