docs/analysis/51-percent.md: what a 51 percent attacker can and cannot do on Igneum, with numbers (the selected-chain race over a 90-s hold, the lock as the reorder bound, the veto at 1/3 of weight and its rental cost, the departure case and the LEAVE item, the p2p surface). docs/analysis/horizon/consensus-security.md: the attack catalogue across GHOSTDAG ordering, the difficulty rule, the finality weight, miner signalling, proof records, the exec layer and p2p, each with the bound and the rental cost at the measured USD 11.7 per GH/s-hour; the pruned-node unwrap class with its sibling list in the sync and IBD flows; fourteen ranked defences, three of them not recommended with the reason. Models and results: sim/horizon/consensus-security/ (ghostdag_sim.py, finality_horizon.py, cost_model.py, signalling.py, result files). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
6.2 KiB
6.2 KiB
GHOSTDAG withholding simulator, 10 blocks/s, k 124, 8 honest miners, 20 seeds per cell
Generated by sim/horizon/consensus-security/ghostdag_sim.py on 2026-10-06 19:38 UTC. Every number is this simulator's; the model and its limits are in the file header.
1. Honest parallelism alone: natural selected-chain reorg depth at honest miner 0 (chain blocks), 75 s per episode
| one-way delay d, s | blocks in flight (bps x d) | reorg depth p99 (worst seed) | reorg depth max |
|---|---|---|---|
| 0.35 | 3.50 | 11 | 15 |
| 0.67 | 6.70 | 22 | 26 |
| 2 | 20.00 | 99 | 109 |
2. Withhold for T seconds, then release everything: what the honest selected chain does
won = the attacker's private tip became honest miner 0's selected chain after the release (its earlier-ordered conflicting transaction then precedes the honest copy). reorg = chain blocks removed from miner 0's selected chain (median and max over seeds). fork age = seconds between the fork point and the release: the window a conflicting transaction can reach back. att blue = the attacker's blue blocks over its blocks in miner 0's view (weight and subsidy kept); hon red = honest blocks since the fork turned red by the release.
| d, s | attacker share H | hold T, s | blocks withheld (mean) | won | reorg med / max | fork age if won, s (med) | att blue / att blocks | hon red / hon blocks |
|---|---|---|---|---|---|---|---|---|
| 0.35 | 20% | 10 | 20.4 | 25% | 1 / 33 | 10 | 99% | 2% |
| 0.35 | 20% | 30 | 60.3 | 0% | 1 / 3 | - | 41% | 1% |
| 0.35 | 20% | 60 | 118.0 | 0% | 0 / 11 | - | 18% | 0% |
| 0.35 | 20% | 90 | 176.7 | 0% | 1 / 6 | - | 14% | 0% |
| 0.35 | 34% | 10 | 38.0 | 90% | 26 / 30 | 10 | 99% | 1% |
| 0.35 | 34% | 30 | 104.4 | 85% | 77 / 84 | 30 | 92% | 23% |
| 0.35 | 34% | 60 | 202.9 | 0% | 0 / 2 | - | 32% | 1% |
| 0.35 | 34% | 90 | 304.9 | 0% | 1 / 3 | - | 13% | 0% |
| 0.35 | 45% | 10 | 44.5 | 95% | 23 / 29 | 10 | 99% | 2% |
| 0.35 | 45% | 30 | 132.3 | 95% | 71 / 79 | 30 | 96% | 19% |
| 0.35 | 45% | 60 | 267.9 | 95% | 139 / 152 | 60 | 95% | 49% |
| 0.35 | 45% | 90 | 407.1 | 95% | 208 / 225 | 90 | 95% | 62% |
| 0.35 | 51% | 10 | 53.8 | 100% | 23 / 27 | 10 | 99% | 2% |
| 0.35 | 51% | 30 | 153.8 | 100% | 66 / 74 | 30 | 100% | 19% |
| 0.35 | 51% | 60 | 304.5 | 100% | 132 / 144 | 60 | 100% | 51% |
| 0.35 | 51% | 90 | 458.8 | 100% | 199 / 217 | 90 | 100% | 65% |
| 0.35 | 67% | 10 | 69.3 | 100% | 17 / 22 | 10 | 100% | 2% |
| 0.35 | 67% | 30 | 203.1 | 100% | 52 / 62 | 30 | 100% | 29% |
| 0.35 | 67% | 60 | 399.1 | 100% | 104 / 116 | 60 | 100% | 57% |
| 0.35 | 67% | 90 | 602.6 | 100% | 158 / 174 | 90 | 100% | 69% |
| 0.35 | 90% | 10 | 93.8 | 100% | 7 / 11 | 10 | 100% | 2% |
| 0.35 | 90% | 30 | 273.8 | 100% | 24 / 29 | 30 | 100% | 38% |
| 0.35 | 90% | 60 | 539.6 | 100% | 46 / 54 | 60 | 100% | 63% |
| 0.35 | 90% | 90 | 810.1 | 100% | 70 / 80 | 90 | 100% | 74% |
| 0.67 | 20% | 10 | 20.4 | 45% | 10 / 33 | 11 | 97% | 2% |
| 0.67 | 20% | 30 | 60.3 | 0% | 3 / 13 | - | 47% | 2% |
| 0.67 | 20% | 60 | 118.0 | 0% | 3 / 16 | - | 18% | 1% |
| 0.67 | 20% | 90 | 176.7 | 0% | 3 / 20 | - | 13% | 1% |
| 0.67 | 34% | 10 | 38.0 | 100% | 20 / 32 | 11 | 99% | 2% |
| 0.67 | 34% | 30 | 104.4 | 95% | 59 / 64 | 31 | 98% | 27% |
| 0.67 | 34% | 60 | 202.9 | 0% | 2 / 11 | - | 33% | 2% |
| 0.67 | 34% | 90 | 304.9 | 0% | 2 / 12 | - | 13% | 1% |
| 0.67 | 45% | 10 | 44.5 | 100% | 17 / 22 | 10 | 99% | 2% |
| 0.67 | 45% | 30 | 132.3 | 100% | 52 / 58 | 30 | 99% | 23% |
| 0.67 | 45% | 60 | 267.9 | 100% | 102 / 111 | 60 | 100% | 53% |
| 0.67 | 45% | 90 | 407.1 | 100% | 154 / 166 | 90 | 100% | 66% |
| 0.67 | 51% | 10 | 53.8 | 100% | 16 / 26 | 11 | 99% | 3% |
| 0.67 | 51% | 30 | 153.8 | 100% | 50 / 58 | 31 | 99% | 21% |
| 0.67 | 51% | 60 | 304.5 | 100% | 100 / 109 | 61 | 100% | 53% |
| 0.67 | 51% | 90 | 458.8 | 100% | 146 / 163 | 91 | 100% | 66% |
| 0.67 | 67% | 10 | 69.3 | 100% | 13 / 16 | 10 | 100% | 2% |
| 0.67 | 67% | 30 | 203.1 | 100% | 39 / 47 | 30 | 100% | 32% |
| 0.67 | 67% | 60 | 399.1 | 100% | 78 / 89 | 60 | 100% | 59% |
| 0.67 | 67% | 90 | 602.6 | 100% | 118 / 132 | 90 | 100% | 71% |
| 0.67 | 90% | 10 | 93.8 | 100% | 6 / 9 | 10 | 100% | 5% |
| 0.67 | 90% | 30 | 273.8 | 100% | 19 / 23 | 30 | 100% | 41% |
| 0.67 | 90% | 60 | 539.6 | 100% | 38 / 44 | 60 | 100% | 64% |
| 0.67 | 90% | 90 | 810.1 | 100% | 58 / 66 | 90 | 100% | 76% |
| 2 | 20% | 10 | 20.4 | 90% | 29 / 97 | 21 | 96% | 5% |
| 2 | 20% | 30 | 60.3 | 0% | 17 / 75 | - | 62% | 7% |
| 2 | 20% | 60 | 118.0 | 0% | 16 / 100 | - | 16% | 1% |
| 2 | 20% | 90 | 176.7 | 0% | 32 / 69 | - | 12% | 1% |
| 2 | 34% | 10 | 38.0 | 100% | 16 / 29 | 14 | 98% | 4% |
| 2 | 34% | 30 | 104.4 | 85% | 35 / 51 | 32 | 94% | 32% |
| 2 | 34% | 60 | 202.9 | 0% | 17 / 90 | - | 36% | 5% |
| 2 | 34% | 90 | 304.9 | 0% | 14 / 52 | - | 11% | 1% |
| 2 | 45% | 10 | 44.5 | 100% | 13 / 78 | 12 | 98% | 7% |
| 2 | 45% | 30 | 132.3 | 100% | 32 / 44 | 31 | 99% | 31% |
| 2 | 45% | 60 | 267.9 | 100% | 62 / 77 | 61 | 99% | 59% |
| 2 | 45% | 90 | 407.1 | 90% | 92 / 101 | 91 | 93% | 63% |
| 2 | 51% | 10 | 53.8 | 100% | 10 / 16 | 11 | 99% | 6% |
| 2 | 51% | 30 | 153.8 | 100% | 26 / 33 | 31 | 99% | 32% |
| 2 | 51% | 60 | 304.5 | 100% | 57 / 66 | 61 | 99% | 59% |
| 2 | 51% | 90 | 458.8 | 100% | 85 / 98 | 91 | 100% | 71% |
| 2 | 67% | 10 | 69.3 | 100% | 6 / 13 | 10 | 99% | 7% |
| 2 | 67% | 30 | 203.1 | 100% | 22 / 28 | 30 | 99% | 41% |
| 2 | 67% | 60 | 399.1 | 100% | 44 / 52 | 60 | 100% | 65% |
| 2 | 67% | 90 | 602.6 | 100% | 68 / 75 | 90 | 100% | 76% |
| 2 | 90% | 10 | 93.8 | 100% | 3 / 5 | 10 | 100% | 17% |
| 2 | 90% | 30 | 273.8 | 100% | 12 / 14 | 30 | 100% | 53% |
| 2 | 90% | 60 | 539.6 | 100% | 24 / 27 | 60 | 100% | 71% |
| 2 | 90% | 90 | 810.1 | 100% | 37 / 40 | 90 | 100% | 81% |
3. Selfish withholding (release when about to lose, or at lead L = 6): blue share against hash share over 300 s, d = 0.67 s
| attacker share H | attacker blue blocks / its blocks (weight kept) | attacker share of ALL blue blocks (weight share; honest mining gives H) | private tip is the chain at the end | max reorg depth seen |
|---|---|---|---|---|
| 20% | 100% | 20.3% | 60% | 5 |
| 34% | 100% | 34.1% | 80% | 7 |
| 45% | 100% | 45.4% | 80% | 5 |
| 51% | 100% | 51.0% | 100% | 3 |
| 67% | 100% | 67.7% | 100% | 5 |
| 90% | 100% | 89.9% | 100% | 0 |
(81 cells, 223 s)