docs/spec/01 to 06 and the README index, alongside the existing overview. Section 1 is the normative definition of the lottery hash with test vectors copied from the igneum-genesis-mh pack (cache fingerprint 48c4f5bf24166b2e, 96 hashes, mixer constants) and every prototype value marked with the measurement that fixes it at gate 1. Sections 2 to 5 are the design as decided on 3 October 2026, labelled Designed. Section 6 lists 60 open items with the experiment or decision that closes each and its gate. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
16 KiB
Igneum protocol specification, section 3: sustained-mining finality, version 2
Spec version 0.1, 3 October 2026. Status of this section: Designed. Simulated at the checkpoint level with latency, partitions and eclipses but without a DAG (sim/finality_v2.py, sim/results_v2.md, docs/bench-log.md entry "sim/finality_v2.py"). Not implemented. Not externally reviewed. Gate 3 is the external review that tries to break it.
The rule is exactly the design document's "Finality rule, version 2, after the second hostile review" with the quorum floor added on 3 October 2026 after the second simulation. CLAUDE.md's FINALITY RULE V2 paragraph is the short form. Every quantity is in blue score or DAA seconds, never wall-clock (section 0.6).
Two statements frame everything below. Finality is miner-only and self-contained: no stake, no bond, no other chain, no committee that is not the set of recent miners. Equivocation costs history, not coins, because there are no coins to slash.
3.1 Weight
- W1. Every block header names a vote key by
vote_key_hash(section 2.4): the hash of a BLS12-381 G1 compressed public key. The first block that uses a key reveals the key in its coinbase payload. A header whosevote_key_hashhas never been revealed is valid; the key simply cannot vote until it is revealed. - W2. The weight of key k at checkpoint block C is the number of blue blocks in C's past whose header names k and whose DAA score is in
(daa(C) - 2,592,000, daa(C)](the trailing 30 days). No damping, no cap, no floor. Blocks are the only thing in proof of work that cannot be forged, so weight is counted in blocks. The damped rule of version 1 was removed because its 2x cap was defeated by splitting into free keys (sim/results.mdtable C;docs/bench-log.mdfinality_sim entry). - W3. Dust: a key with fewer than 100 blocks in the window is not a voter and is in no denominator. Measured consequence (
sim/results_v2.mdA and G): every honest key in a 1,000-key Pareto network clears 100 blocks by day 20 from zero history and the smallest new keys need up to 25 days after a doubling; a 9x renter's victims lose about one point to dust (B). - W4. Steady state: weight equals hashrate. Simulated correlation 1.00000 at day 60, Gini equal to three figures, weight-to-hash ratio within 0.82 to 1.12 for every key (
sim/results_v2.mdA). - W5. Key succession: a message signed by the old key naming a new key, included in any block, moves the old key's weight history to the new key once. The old key is dead thereafter: its later blocks earn nothing and its votes are invalid.
The headline arithmetic (W2 with constant hashrate): an attacker with share a of hashrate for t days holds weight share (t/30) x a/(1+a), verified by simulation to 0.04 points for a = 1 and 2 (sim/results_v2.md B).
| Attacker hashrate relative to honest (a) | Reaches 1/3 (can veto) | Reaches 2/3 (locks alone) |
|---|---|---|
| 1x (50% of blocks) | day 20.0 | never (ceiling 50%) |
| 2x (67%) | day 15.0 | day 30.0 |
| 4x (80%) | day 12.5 | day 25.0 |
| 9x (90%) | day 11.1 | day 22.2 |
| unbounded (100% of blocks, honest miners gone) | day 10 | day 20 |
All in public, on the hashrate charts. 51% never reaches 2/3 while honest miners keep mining.
3.2 Checkpoints
- C1. Checkpoint i is the selected-chain block at blue score 30 i. It is determined once the virtual's blue score reaches 30 i + d. d = 60 at 1 block per second is a placeholder (ledger F7): the gate 3 devnet records the reorg-depth distribution and sets d so that a vote split at one index is rare and self-heals at the next. d scales with block rate. A lock lands about 90 to 120 s after a transaction (Designed; simulated lock latency after the checkpoint block is median 2.5 s, p99 4.6 s at a 2-s inter-region delay,
sim/results_v2.mdA). - C2. A vote is a BLS signature over
(chain_id, i, hash(C_i))under a fixed domain-separation tag. Votes gossip as their own message type. - C3. A lock certificate for index i is an aggregate BLS signature over one checkpoint block hash with a bitmap of signers, whose signed weight meets Q3. Every block carries the highest certificate its producer knows. A block whose selected chain does not pass through every certified checkpoint in its past is invalid (section 2.4).
- C4. A node holding a certificate for index i rejects any other certificate for index i and publishes the pair as evidence (section 3.6).
- C5. No certificate may form in the chain's first 3,600 DAA seconds (design document). See 3.8 for the proposed first-month rule.
3.3 Quorum
- Q1. Presence window P = 240 checkpoint indices (2 hours of blue score at 1 BPS).
- Q2. Participation of key k at index i, "cert reading": the number of indices j in
[i - 240, i - 1]for which a certificate containing k's vote is in the past of C_i, divided by 240, capped at 1. An index with no certificate in C_i's past credits nobody. A key whose first block is fewer than 240 indices old counts 1. This reading is objective (every node computes it from certificates in C_i's past) and self-healing; the "seen" reading is rejected as not objective and the "frozen" reading as total with extra steps (sim/results_v2.md, "Recommended parameters"). - Q3. Active weight at i is the sum over voters of weight x participation. Total weight at i is the sum of weight over all keys above dust. A certificate for index i locks when the unscaled weight of its signers is at least 2/3 of active weight AND at least 56.7% of total weight (the floor 0.85 x 2/3 = 17/30). Both tests use weights and participation computed at C_i, so any node can verify a certificate from C_i's past.
- Q4. Certificate grace: an aggregator closes a certificate at the later of quorum time and
t0 + grace, where grace MUST be at least 3x the worst honest one-way network delay (15 s in the simulation at a 2-s delay; at a 5-s delay the slowest region already lost 1.7 points of participation to a 15-s grace,sim/results_v2.mdA). The value is Open (O-3.4) and does not affect validity, only which votes a certificate carries.
3.3.1 Why the floor, from the simulation
Both denominators alone fail (sim/results_v2.md, seed 7, seed 11 agrees on B and E):
| Scenario | Active alone (cert reading, P = 240) | Total alone | Active + floor 0.85 |
|---|---|---|---|
| E: 50/50 honest partition, no attacker, 150 min | 90 conflicting locks, first at 60 min (240 with instant DAA retarget, first at 30 min) | 0 | 0 |
| E: 60/40 honest partition, 360 min, with retarget | 624 conflicts | 0 | 0; majority side locks from minute 13 |
| E: 33/33/34, 360 min, with retarget | 1,198 conflicts | 0 | 0 |
| F2: 34% attacker poisons one eclipsed 20% pool, 1 / 2 / 4 h | 10 / 65 / 174 conflicts, first at 49 min | 0 | 0 (floor 0.80 gave 10 / 65 / 174, because the eclipsed side's 54% clears 53.3%) |
| C: 34% of weight silent, keeps mining | 0 min to first lock, 0 stalls | never (8,666 stalls in 3 days, and for the whole window) | 0 min |
| C: 40% silent | 13 min, 26 stalls | never | 13 min, 138 intermittent stalls in 3 days |
| C: 45% silent | 20 min | never | never, for as long as they stay silent |
| D: 35% churn (stops mining and signing) | 2 min | 41 h | 2 min, 98 intermittent stalls in 3 days |
| D: 50% churn | 31 min | 10.1 days | 4.1 days (floor 0.80: 2.2 days) |
The mechanism active alone fails by: a side that cannot see the other side's votes sees stalls, stalls shrink its denominator by 1/240 per index, and once the denominator has fallen to 1.5x the side's own weight the side certifies alone, after 240 x (1 - 1.5 s) / s slots for a side of share s (confirmed within 5% across the sweep): 60 min for a 50% side, 120 for 40%, 180 for 33%. The floor makes the second test of Q3 bind before that point: no honest side of any tested split holds 56.7% of total.
What the floor costs: liveness ends between 40% and 45% of weight silent (total alone: 34%; active alone: above 55%), 50% churn stalls 4.1 days, and at 40% silent or 35% churn the margin is one pool outage thin. The safety bound stays at 1/3 of weight for every event tested; the liveness bound moves from 1/3 (total) to about 42% silent.
3.4 Sortition
- S1. At launch every voter signs every checkpoint. A private VRF, keyed to the vote key and the checkpoint, selects 8 aggregators per checkpoint who publish certificates; anyone MAY aggregate and publish. Aggregator failure costs latency, not safety: the simulation's lock latency (median 2.5 s) assumes one aggregator per region and no failures, so it is a lower bound (
sim/results_v2.md, "cannot tell us"). - S2. If the number of voters above dust exceeds 8,192 at a checkpoint, the genesis rules switch, at that checkpoint and without a release, to Algorand-style binomial sub-user sortition with an expected 4,000 sub-users per checkpoint and both Q3 thresholds applied to expected sampled weight. The exact VRF construction, the binomial sampling procedure and the threshold on sampled weight are Open (O-3.5).
Ledger F3 (participation grinding through the bitmap: an aggregator or block producer that drops a rival's votes from certificates lowers that rival's participation) is Open (O-3.3). Candidate fixes: a certificate MUST include every valid vote the aggregator received above a size bound; or participation also counts votes carried in blocks as transactions; or participation falls only on indices where the key's vote appears in no certificate and no block.
3.5 Fork choice
- F1. Candidate tips are tips whose selected chain passes through the highest certified checkpoint the node holds and every lower certified checkpoint.
- F2. Among candidates, GHOSTDAG selects by accumulated blue work under Kaspa's merge-depth bound of 3,600 DAA s (section 2.1). A certified checkpoint removes other tips from candidacy; it does not change how blue work is computed.
- F3. The pruning point never advances past the latest certified checkpoint.
virtual_finality_pointreturns the latest certified checkpoint when it is newer than the depth-based finality point (fork map e2). - F4. There is no hidden-block penalty in consensus. It was removed in review round 2 because it breaks DAG determinism and amplifies eclipse attacks. First-seen MAY break ties in a node's own block template only.
- F5. A node started with a configured trusted certificate follows it. A node started cold selects the DAG with the most accumulated blue work, then follows certificates found in it. A private DAG that out-works the public one over the window is a public 51% event lasting weeks.
What a node does when it holds two valid certificates at one index after a partition heals is not modelled and not defined (sim/results_v2.md, "cannot tell us"; O-3.6). C4 says it publishes the pair. The proposal for gate 3: both certificates are evidence against every key that signed both; the node re-evaluates both against Q3 with those keys' weight struck, and if exactly one still locks it follows that one; if neither or both still lock, F2 decides among the two checkpoint blocks' descendants and the index is treated as uncertified.
3.6 Equivocation evidence
Two votes by one key for different checkpoint blocks at one index are equivocation. The evidence (the two votes) is a transaction that any block MAY include. On inclusion: the key's weight is zero for the rest of the current window and its blocks earn no weight for the next 2,592,000 DAA s. There is no coin penalty. In the simulation, evidence is detected only at the heal and the penalty is forward-looking only; the model does not revoke the conflicting certificates (sim/results_v2.md, "cannot tell us"), which is why 3.5's post-heal proposal strikes the equivocators' weight retroactively for the re-evaluation.
3.7 Residual risks, stated
- Safety holds with under one third of window weight under hostile keys. Reaching a third takes ten days of 100% hashrate or twenty days of 51%, in public. Beyond a third, two locks can coexist under a partition (E: a 34% equivocator across a 50/50 split breaks every variant, 33% + 34% = 67% per side) and equivocation costs history, not coins.
- Liveness pauses after a sudden loss of more than about 42% of weight from signing (3.3.1). During a pause the chain is proof-of-work only in practice, so the node ships a flag that tells exchanges to credit nothing until the next lock (3.9).
- Pools hold their hashers' votes. Vote concentration equals pool concentration, as on Bitcoin, and is public. Stratum v2 job declaration changes transaction choice, not the vote key (ledger F10, G6).
- A 51% owner who drives half the honest miners away and holds for 30 days owns finality thereafter. Same as Bitcoin, with a month's warning.
- The delay function (section 4) is a new dependency. The evaluator ships in every node.
- The dust threshold excludes solo miners under 100 blocks a month from voting, not from rewards.
- New honest miners are under-weighted for the whole window: after an overnight doubling the new cohort holds t/60 of weight on day t and the old cohort can lock without a single new signature for 19 days (
sim/results_v2.mdG). A doubling and a 1x renter are the same event to the rule, by design. - The simulation has no DAG: a partition side's checkpoint block is "the block at blue score 30 i in that view" and conflict counts are index collisions, not reorg depths. Real GHOSTDAG merge under the 3,600-s bound, DAA lag (of the order of an hour, approximate), VRF aggregator noise, uptime (the 0.978 resting participation is a guess), regional silent sets and the cost of keys are all outside the model.
3.8 The first month
W2 gives the chain no weight at genesis. From zero history the honest network holds 3.3% of a full window on day 1, 33.4% on day 10 and 100% on day 30; 905 of 1,000 keys are under dust on day 1 and all are above it by day 20 (sim/results_v2.md A). Ledger F1 shows the consequence: with a one-day honest head start an attacker producing 75% of blocks from day 2 crosses two thirds on day 9 of the chain's life, and the 30-day emission ramp lowers the prize without removing the attack.
Two rules are on the table:
| Rule | Status |
|---|---|
| C5 as written: no certificate in the first 3,600 DAA s | Designed (design document) |
| No certificate may form until the window holds 30 days of history: before DAA second 2,592,000 the chain runs plain GHOSTDAG under the merge-depth bound, exchanges are told so, and the node flag of 3.9 is false | Proposed (ledger F1), Open (O-3.1). This specification recommends it: the first month has no weight to defend with, so a lock in that month is a lock by whoever showed up, and the merge-depth bound already bounds a reorg to one hour |
Gate 3 decides, with the launch-month simulation that does not yet exist. Either way the litepaper states the rule.
3.9 Exchange confirmation guidance
Designed. The node exposes finality_active (true when a certificate has formed within the last 240 indices and the first-month rule of 3.8 has passed) and last_certified (index, block hash, DAA score).
| Situation | Guidance |
|---|---|
finality_active and the deposit's block is in the past of last_certified |
Credit. Expected wait about 90 to 120 s after inclusion |
finality_active, deposit not yet covered |
Wait for the next certificate; do not count blocks |
finality_active false (first month, or a pause under 3.7 item 2) |
Treat the chain as proof of work with a one-hour merge-depth bound. Credit nothing below 3,600 DAA s of depth, and for amounts that matter apply the operator's own hashrate judgement, as for any young proof-of-work chain. Listings are not sought before launch in any case (ledger X8) |
| Two certificates at one index observed (C4 evidence) | Suspend credits until the node's view resolves under 3.5 |
A certified checkpoint overrides the heaviest chain, so fresh hashrate cannot reorganise past last_certified; two thirds of 30-day weight can, and 3.1 says what that costs.