Merge remote-tracking branch 'box/master' into genesis-forward
# Conflicts: # infra/fast-time/override-60x.json
5
.github/workflows/ci.yml
vendored
|
|
@ -109,6 +109,11 @@ jobs:
|
|||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '22'
|
||||
- name: a headless Chromium for the text-overlap sweep (Playwright outside the tree; the gate finds it through IGNEUM_PLAYWRIGHT_DIR)
|
||||
run: |
|
||||
mkdir -p /tmp/pw && cd /tmp/pw && npm init -y >/dev/null && npm i --no-audit --no-fund playwright@1.56 | tail -1
|
||||
npx playwright install --with-deps chromium | tail -1
|
||||
echo "IGNEUM_PLAYWRIGHT_DIR=/tmp/pw" >> "$GITHUB_ENV"
|
||||
- name: the tree gate, tools/ci/pre-push.sh --ci (the same script the pre-push hook runs; one line per check, a red check prints its output)
|
||||
run: bash tools/ci/pre-push.sh --ci
|
||||
- name: public stats API answers with the documented fields (the live site; master only, the endpoints exist there after the merge)
|
||||
|
|
|
|||
62
docs/analysis/ca3-v4-uniform.md
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
# AP-F8-1 under the windows-union model: the hot set is the load source, not the window (7 October 2026)
|
||||
|
||||
Branch `ca3-v4-uniform` from master b92a5fd4, worker "v4-hash", on the attack-pass finding AP-F8-1 (`docs/analysis/attack-pass/f8-uniform.md`, branch attack-pass; logs `/srv/builds/igneum-wt-attack/target-attack-f8/log/`). Main's rulings bound this file: no generator change to class v4 on the live devnet; the analysis and its harness only. Every GPU-free number here is arithmetic on F8's logged counts or a run of the static census tool `tools/ca3-v4-uniform/` on igneum-build-1 (built through `tools/build-remote.sh`, rule R1); the chip figures are the terms of `docs/analysis/chip-model-v3.md` and are approximate.
|
||||
|
||||
## 1. The null F8's numbers must be read against
|
||||
|
||||
Layer 8 (`docs/plans/era-layout.md` 1.4, spec 01 1.13.1 as proposed) gives every load site a window draw `k_off = below(3)`: the site reads the whole dataset, an aligned half or an aligned quarter, at a 2^26-word floor. A quarter-window site concentrates its reads 4x on its quarter and a half-window site 2x on its half, by design; the union of the 16 windows is the whole dataset. For p1 (the devnet epoch-0 program, id c120d7963abdcd96) the 16 draws `0:2:1 1:1:1 2:1:1 3:1:1 4:0:0 5:1:1 6:0:0 7:2:2 8:1:1 9:1:1 10:2:0 11:0:0 12:0:0 13:0:0 14:2:0 15:1:1` (site:k:offset) give an expected read density by quarter of 3.25 : 2.25 : 5.75 : 4.75 sixteenths of the flat mean, which at 2^26 nonces (512 reads per item flat) is 416, 288, 736 and 608 reads per item. The top-f share of a Poisson mixture with those means (`uniform-model.txt`, exact Poisson for p1, a normal approximation for the census):
|
||||
|
||||
| Share of all reads on the top f of items, 2^26 nonces | Flat Poisson (F8's control) | Windows-union model, p1 | F8 measured, p1 | Beyond the window model |
|
||||
|---|---|---|---|---|
|
||||
| f = 0.1 percent | 0.115 | 0.160 | 0.520 | +0.36 |
|
||||
| f = 0.5 percent | 0.565 | 0.784 | 1.515 | +0.73 |
|
||||
| f = 1 percent | 1.120 | 1.553 | 2.495 | +0.94 |
|
||||
|
||||
So the window model moves the null from 0.115 to 0.160 percent at f = 0.1 percent (1.39x, not F8's 4.05x) and from 1.12 to 1.55 at f = 1 percent; it explains the 64-item-bucket sigma of p2 that F8 already attributed to the window layer, and it explains every per-site attribution row of p1 except one: sites with a half window over the hot region land 0.20 percent of their reads in the top 0.1 percent (sites 1, 2, 3, 5, 9 at 0.201), quarter-window sites 0 or about 0.4 (sites 0, 10, 14 at 0.000, site 7 at 0.241 straddling), whole-dataset sites 0.10. Site 15 lands 6.374 percent. The excess over the model (+0.36 at f = 0.1 percent) is one site.
|
||||
|
||||
## 2. The 153x item is the load source, and the model predicts it to the item
|
||||
|
||||
p1's site 15 is the load at instruction 63 (`load dst=3 src=6`, window half 1). Its source r6 was last written at instruction 61: `or dst=6 src=4` (`r6 |= r4`, `verify.rs` Op::Or), after a fresh dataset load into r6 at 47. An OR of two near-uniform registers sets each bit with probability 3/4, so the source takes the all-ones value with probability (3/4)^32 = 1.0e-4 per read and the values of popcount 31, 30, ... with 32, 496, ... times (3/4)^k (1/4)^(32 - k). The era map `y = rotl(x * 0x9ad30d99, 29)`, the half window and the interleave split (`memhard::Layout::split`, positions 0, 2, 12, 13) send x = 0xffffffff to item 0xca5b92: F8's hottest item exactly. F8's next seven items (0x8a5b92, 0xaa5b92, 0xba5b92, 0x825b92, 0xe65b92, 0x985b92, 0xbcc392) are exactly the seven one-zero-bit sources whose zero bit survives the window mask (bits 29, 28, 27, 26, 25, 24 and 15): 7 of 7. The measured count fixes the bit bias: 78,479 reads of 2^26 x 8 site-15 reads is p^32 at p = 0.7585 (r4 is slightly biased itself), and at that p the popcount model predicts 77,348 all-ones reads and 4.86 percent of site 15's reads into the top 0.1 percent of items (measured 6.37; 3.92 at p = 3/4). Per hash that is 4.86 / 16 = 0.30 percent of all reads, and 0.160 + 0.30 = 0.46 against F8's 0.520 at f = 0.1 percent; at f = 1 percent 14.5 / 16 = 0.90, and 1.55 + 0.90 = 2.46 against 2.495.
|
||||
|
||||
The same arithmetic for the other lossy writers (`uniform-model.txt`): a `mul` last writer zeroes the low bits by the operands' trailing zeros, so 1.07 percent of the site's reads land on the 0.1 percent of values with 10 or more trailing zeros (p2's `mul`-sourced sites 0 and 14 measured 0.971 and 0.966 percent); a `mulhi` last writer is dense near zero, 0.79 percent on the lowest 0.1 percent of values. An `or` whose operand was itself last written by `or` compounds the bias (3/4 to 7/8 to 15/16): p3's site 15 (`or` at 30, the load at 62) puts 72.4 percent of its reads into the top 0.1 percent, 4.6 percent of all reads on 16,777 items.
|
||||
|
||||
This is a fault class, not the window model: the acceptance rule's part (a) (`accept.rs` check_stale_loads) takes any write as a fresh source, and part (c)'s saturation count looks at the 16,384 final register values, not at a load's source mid-program, so an `or`, `mul` or `mulhi` as a load's last writer passes. The per-hash distinct-address check still holds (p1 127.999 items per hash; p3 127.97: a saturated site repeats its item inside a hash), and the acceptance rule's floor of 120 distinct of 128 admits exactly one site repeating its item in all 8 iterations and no more.
|
||||
|
||||
## 3. How common it is: the static census (`tools/ca3-v4-uniform`, 1,024 chain-shaped class v4 programs plus F8's p1 to p3)
|
||||
|
||||
For every load site, the op that last wrote its source in execution order (base instructions before it, else the shadow block of the previous iteration, else the base instructions after it): injecting (add, sub, xor, mad, shfl, load), bijective (rotl, rotr) or lossy (or, mul, mulhi). Run on igneum-build-1 (`uniform-census.txt`, binary sha256 ce9f83fe... then the narrowed chain rule).
|
||||
|
||||
| Census over 1,024 programs | Count | Share |
|
||||
|---|---|---|
|
||||
| Load sites by last writer: injecting / bijective / lossy | 11,368 / 2,121 / 2,943 of 16,432 | 69 / 13 / 18 percent; 2.87 lossy sites per program |
|
||||
| Programs with at least one lossy-sourced load | 992 | 96.6 percent |
|
||||
| ... with an `or`-sourced load (p1's class, 0.30 percent of all reads per site) | 498 | 48.5 percent |
|
||||
| ... with an `or`-of-`or` chain (p3's class, about 4.5 percent of all reads per site) | 50 | 4.9 percent |
|
||||
| ... with a `mul`-sourced load (0.067 percent per site) / a `mulhi`-sourced load (0.049) | 751 / 661 | 73.1 / 64.4 percent |
|
||||
| Predicted S_0.1 percent (window model plus the lossy sites): median / 90th / 99th / max | 0.45 / 0.88 / 5.29 / 9.82 percent | against the window model's 0.115 to 0.251 |
|
||||
| p1 / p2 / p3 predicted against F8 measured | 0.579 / 0.323 / 4.72 | 0.520 / 0.272 / 4.60 |
|
||||
|
||||
F8's proposed gate (the top 0.1 percent within 1.2x of the window-model control on every one of 64 seeds) fails 96.6 percent of today's programs, because any lossy-sourced site alone exceeds it (0.16 + 0.05 at the least); it is a generator change in a gate's clothing. A 2x bound fails 69.7 percent, 3x 48.9 percent; a bound of S_0.1 percent at or under 1 percent of all reads fails 6.9 percent (the `or` chains and the multi-`or` programs). The static rule "no load whose source's last writer is `or`" fails 48.4 percent; "no lossy last writer" 96.6 percent.
|
||||
|
||||
## 4. What the skew is worth to a chip (chip-model-v3.md terms, approximate)
|
||||
|
||||
A hot-set cache of the top 0.1 percent of items is 16,777 items x 64 B = 1.07 MB of SRAM, 0.53 mm^2 and $0.25 at 0.49 mm^2 and $0.23 per MB. It serves 0.52 percent of p1's reads (0.16 of them the window model's), 4.6 percent of p3's. The hash is latency-bound on its dependent reads, so a read served on die is time saved: a chip gains at most 1.005x on p1 and 1.048x on p3 from the cache. The ceiling under the live rule: part (c)'s 120-of-128 floor admits one site repeating its item in all 8 iterations and no more (two saturated sites fail it), so at most 8 of 128 reads, 6.25 percent, can sit on a constant item, and a chip's edge from this whole class is at most 1 / (1 - 0.0625) = 1.067x, in 64 bytes of SRAM, on the hours whose program carries such a site. The public claim rests on 2x margins (chip-model-v3.md); 1.067x does not move it, and the union of the windows is still the whole dataset every hour, so no window-level cache exists. What moves: per tier nothing in rate or watts (the honest card reads the hot item from L2 as the chip would), and the 5 percent rule of 2.0 is untouched.
|
||||
|
||||
## 5. The two options for the flip, priced (main's ruling 3; nothing ships on this without the project lead's word)
|
||||
|
||||
| Option | What changes | Cost | Risk |
|
||||
|---|---|---|---|
|
||||
| A. A class amendment in 0.3.19 before the flip: the generator draws a load's source from the registers whose last writer injects (or rule (a) tightened to the same), class v4 re-pinned | a new program stream: new vectors, the seven gate packs re-exported, the six gates again (the hash side G1 to G3 and the verifier re-run here in about an hour of Mac and PC 2 time; G4 to G6 the node lane), every node before the flip by the one-box-at-a-time fleet rule | hours of gate time, a fleet rollout, the 0.3.19 ship on the line | a node that misses the build splits the chain at the flip; the fix itself is small (one draw rule) |
|
||||
| B. Hold v4 at the floor as it is; the source rule in class v5 | nothing on the devnet; the attack-pass record carries the window null and the bound | a hot set on 48 percent of hours worth up to 1.005x to a chip, on 5 percent of hours up to 1.05x, 1.067x at the rule's ceiling, no chain risk | the public line must state the bound, not "uniform" |
|
||||
|
||||
The number that decides it: 1.067x at the ceiling against the 2x margin of the chip claim. Recommendation: B, with the v5 item below, unless the project lead wants the tail tight now.
|
||||
|
||||
## 6. The acceptance bound for the next class (main's ruling 4)
|
||||
|
||||
Definition: for a program, H = W_0.1(windows) + sum over load sites of h(last writer of the source), with W from the Poisson mixture of the 16 window draws (0.115 to 0.251 percent at 2^26 nonces) and h = 0.30 percent for `or`, 4.5 for an `or` chain, 0.067 for `mul`, 0.049 for `mulhi`, 0 for an injecting or bijective writer (the figures of section 2 at the measured bias). The bound: H at or under 1.2 x W, which is the static rule "every load's source was last written by an injecting op or a rotate" (any lossy writer breaks 1.2x). Its cost as a rejection rule on today's stream: 96.6 percent of candidates, about 30 attempts per seed on average. The cheaper form is a generator draw, not a rejection: draw a load's source from the registers whose last writer injects (today's rule draws from every written register), which costs no attempts and leaves rule (a) as it is. Either way the 64-seed census of F8's phase E is the gate, with the dynamic check extended to count saturated load sources over the 64 units beside the final values.
|
||||
|
||||
## 7. What is unverified
|
||||
|
||||
- The per-site h figures are the popcount and trailing-zeros models at the biases F8 measured on p1 and p2; p3's chain figure is F8's measurement, not a model. F8's phase E (64 seeds, dynamic) is the test of the whole table.
|
||||
- The window model's top-f shares for the census use a normal approximation per quarter (p1's exact Poisson 0.160 against 0.159).
|
||||
- No GPU run and no timing here; every number is a count or arithmetic.
|
||||
86
docs/analysis/era-vdf-2026-10-07.md
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
# The era VDF: built, measured and gated (7 October 2026)
|
||||
|
||||
Era VDF lane, 7 October 2026, from the attack pass's F7 row (`docs/analysis/attack-pass/f7-era.md`, sub-row a: the node's era seed was a plain chain block hash, grindable with one block of hash at no delay, and the 1-hour VDF of spec 04 section 4.4 did not exist in the node). Repository branch `era-vdf` (this record, the spec text, the harness `tools/era-vdf/`, the fast-time fields); node fork branch `era-vdf-node` on the 0.3.19 line (`release-0.3.19-node` dc141409). Every number below names its log on igneum-build-1 under `/srv/builds/igneum-wt-era-vdf/ev-*/`.
|
||||
|
||||
## 1. What was built
|
||||
|
||||
| Piece | Where | What |
|
||||
|---|---|---|
|
||||
| The integer | `consensus/core/src/era_vdf/bigint.rs` | a fixed-width signed integer (40 limbs, 2,560 bits) on the stack: add, sub, mul, shifts, Knuth division with floor, truncated, exact and Euclidean remainders, the extended gcd and the partial extended gcd with Lehmer's word steps (chiavdf `xgcd_partial.c`), modpow, sqrt and the fourth root, Miller-Rabin with the first 30 primes as bases; every operation checked against `num-bigint` on 20,000 random operands of the class group's sizes, the known-failed shapes first |
|
||||
| The class group | `era_vdf/classgroup.rs` | `proto-vdf/src/classgroup.rs` (3 October 2026) on the fixed-width integer: NUDUPL and NUCOMP ported line by line from chiavdf's `qfb_nudupl` and `qfb_nucomp`, the plain duplication and Cohen 5.4.7 kept as the oracles the tests hold them to on random forms at 256, 512 and 1,024 bits; serialization as sign byte plus fixed width, 258 bytes a form |
|
||||
| Wesolowski | `era_vdf/wesolowski.rs` | eval with serialized checkpoints (at most 2^16, 17 MB), the 12-bit-digit block prover bucketed per residue class and parallel over them, the naive prover as the oracle, verify; T + 1, another y, another pi and another input refused |
|
||||
| The hash chain | `era_vdf/hashchain.rs` | scheme 1: T sequential SHA-256 applications from a tagged start; verification by recomputation; one step short refused |
|
||||
| The scheme byte and the seed | `era_vdf/mod.rs` | `vdf_scheme` 0 and 1, `EraVdfProof` and its wire form, `era_vdf_input` (the chain's BLAKE2b keyed `IgneumEraVdfInput` over `chain_id || n || the day's blue hashes`), `era_seed_of` = SHA-256 of the scheme byte, the input, T and y |
|
||||
| The switch | `consensus/core/src/config/params.rs`, `igneum.rs` | `pow_era_blocks` and `pow_era_lead` as override fields (the constants everywhere; in the digest when they differ), `era_vdf_activation_daa` (never), `vdf_scheme` (0), `era_vdf_t` (the reference T); the three in the digest once the activation is set (the 0.3.15 rule); installed with the PoW schedule |
|
||||
| The node side | `consensus/src/processes/era_vdf.rs`, `model/stores/era_vdf.rs` | the cut rule (the chain block below the cut, memoised and re-validated by reachability), the day-of-blues input (memoised per cut block), the evaluator thread started by the virtual processor a quarter of the lead past the cut, the record store (one row per era), the header processor's wait when a header arrives before the record, the template's `era_seed` None while evaluating, `submit` for a record from outside (verified against this chain's input) |
|
||||
| The template and the miner | `PowEpochInfo`, `RpcPowEpochInfo`, `rpc.proto` fields 37 to 44, `igneum-miner` | the era schedule, the VDF's state, scheme, T and input in every template; the miner holds while the node reports no era seed ("era VDF: the node is still evaluating"); `igneum-miner vdf bench|eval|verify` with the node's own code |
|
||||
| The harness | `tools/era-vdf/reroll.mjs` | the F7 re-roll harness against the REAL era cut (era 120 DAA, lead 20 on the merged fast-time file; ports 30100 and up, suffix 1010), `--vdf off` the stand-in, `--vdf on` the VDF at a fast T, the adversary running the node's evaluator over its candidate before publishing |
|
||||
|
||||
## 2. The parameters
|
||||
|
||||
Measured 7 October 2026 on igneum-build-2 (AMD EPYC 9454P, 96 threads, Ubuntu 24.04), one core under `/srv/builds/_bin/lease cores 31` at nice 10 while the box ran other lanes' suites (load 25 to 75), with the node's own code (`igneum-miner vdf bench`, logs `ev-vdf-bench3.log`, `ev-vdf-bench5.log` in this lane's scratch) and chiavdf 7e62ce14 built on the box against GMP 6.3.0 (`ev-chiavdf`).
|
||||
|
||||
| Parameter | Value | Label |
|
||||
|---|---|---|
|
||||
| Group | class group, 1,024-bit prime discriminant `D = -HashPrime("igneum-era-discriminant" \|\| input)`, `\|D\| = 7 mod 8` | Implemented (spec 4.2) |
|
||||
| Generator, Fiat-Shamir prime, proof plan | `(2, 1, (1 - D) / 8)`; 256 bits; 12-bit digits, at most 2^16 serialized checkpoints (17 MB) | Implemented |
|
||||
| Proof on the wire | 529 bytes: scheme (1), T (8), two 258-byte forms with 2-byte lengths; `y` and `pi` 258 bytes each | Measured |
|
||||
| Scheme byte | `vdf_scheme` 0 = class group, 1 = hash chain; genesis 0 everywhere | Implemented |
|
||||
| Reference rate, scheme 0 | 30,589 and 40,117 squarings/s in two 10-s runs on the box core (the spread is the box's load); 30,000 is the reference | Measured |
|
||||
| `T_era`, scheme 0 | 3,600 x 30,000 = 108,000,000 squarings (`ERA_VDF_T_CLASS_GROUP`): 60 min at the reference, 45 at the faster run | Measured, set |
|
||||
| Prove, scheme 0 | eval + prove 11.6 s at T 401,167 (eval 10.0 s): the single-thread block prover is about 14 percent of the evaluation, parallel over residue classes in the node (up to 8) | Measured |
|
||||
| Verify, scheme 0 | 21.9 and 22.6 ms with the group held (mean of 20); 184 ms with the discriminant derived, the derivation being 161 to 167 ms, once per era | Measured (section 5 for the gate) |
|
||||
| Reference rate, scheme 1 | 16.2 and 17.0 million SHA-256/s (SHA-NI); 16,000,000 is the reference; `T_era` = 57,600,000,000 hashes (`ERA_VDF_T_HASH_CHAIN`) | Measured, set |
|
||||
| Verify, scheme 1 | recomputation: 10.1 s for T 170 million, the full hour at `T_era` | Measured |
|
||||
| Discriminant search | 161 to 167 ms per era (Miller-Rabin with the first 30 primes on the fixed-width integer) | Measured |
|
||||
| chiavdf on the same core | 208.8 K squarings/s (`vdf_bench square`, NUDUPL over GMP, 1,000,000 iterations); the AVX-512 IFMA path (`square_asm`) gave 127.3 K at 20,000 iterations and stalled at 300,000 and above in this build (built outside its Makefile's `FAST_MACHINE` flags), so the IFMA number is not established here | Measured; the asm path unestablished |
|
||||
| Delay on the fastest prover measured | 108,000,000 / 208,800 = 517 s against the 1-s block interval (517x) and the 2-s publish window (259x); a prover 10x chiavdf's GMP path (the ceiling Chia's and the EF's hardware efforts aimed at, approximate, from memory) would still take 52 s, 26x the window | Computed from the measurements |
|
||||
| The gate "at least 60x one block interval on the fastest known prover" | 517x on chiavdf's GMP path, the fastest evaluator measured on this hardware; PASS as measured, with the IFMA path unestablished (above) and the 10x hardware ceiling still 52x | PASS (measured), caveat recorded |
|
||||
|
||||
The node's own evaluator is 5.2 to 6.8x slower than chiavdf's GMP path on the same core. That ratio only moves the honest side: `T_era` is set from the node's rate, so an honest node finishes in the hour; the attacker's margin is the delay at the fastest prover, above.
|
||||
|
||||
## 3. The gate: the re-roll harness with the VDF off and on
|
||||
|
||||
`tools/era-vdf/reroll.mjs` on igneum-build-2 (the box under other lanes' suites, nice 10; logs and per-cut JSON under `/srv/builds/igneum-wt-era-vdf/ev-harness-out/reroll-vdf-{on,off}-5.json`), three nodes of the fork at this record's commit on the fast-time file with `skip_proof_of_work`, era 120 DAA and lead 20 (cuts at `S = 120 n - 20`, one every two minutes), ports 30100 and up, suffix 1010; two honest virtual miners share 1 block/s on nodes 0 and 1; the adversary on node 2 holds a block A built on the tip at `S - 1` and tries to make it the era's cut block. With the VDF on, the adversary runs the node's own evaluator (`igneum-miner vdf eval`, the network's T) over its candidate before publishing; T is set from a 3-s bench at the start so the delay is about 5 s on one core of this box, five times the block interval.
|
||||
|
||||
| Run | Switch | Cuts | A accepted | A became the cut block | Known-draw re-rolls (the seed the adversary knew before publishing is the era's seed) | Adversary's evaluation | Nodes agree on the era seed | Gate | Harness |
|
||||
|---|---|---|---|---|---|---|---|---|---|
|
||||
| vdf-off-5 (the stand-in, 15:08 to 15:22 UTC) | `era_vdf_activation_daa` never | 6 (eras 2 to 7) | 6 of 6 | 6 of 6 | 6 of 6: the seed is `hash(A)` every time | none needed: the draw of hash(A) is known the instant A is built | 3 of 3 on every era | FAIL (the known-pass fires) | SOUND |
|
||||
| vdf-on-5 (the era VDF, 14:54 to 15:08 UTC) | activation 0, scheme 0, T 189,650 (5 s on this core) | 6 (eras 2 to 7) | 6 of 6 | 0 of 6 | 0 of 6 | 5.38 to 6.64 s, during which the honest chain advanced 3 to 10 blocks; A arrived behind them and never became the cut block | 3 of 3 on every era, the record ready (state 3) at every era start | PASS (silent) | SOUND |
|
||||
|
||||
What the two runs say. Under the stand-in a miner with one block of hash at the right second owns the era draw outright on this network: holding the block at `S - 1` and publishing it the moment the chain reaches `S - 1` makes it the cut block in every one of six cuts (the attack lane's epoch-cut run saw 1 of 6, with the honest block often landing first; here the adversary is faster to the second), and its draw is known the instant the block is built. Under the VDF the same adversary cannot know any candidate's draw before T steps have run; while it ran them the honest chain moved 3 to 10 blocks, so its block arrived behind the cut and the seed came from the delay over the day of blues ending at the honest cut block, the same on all three nodes. The second half of the written argument of F7 (a) holds in the node, not only on paper: the re-roll needs the draw inside the window, and the window is 1 s against a delay of 5 s here and 517 s at the fastest prover measured on the production T (section 2).
|
||||
|
||||
The known-pass and the known-fail ran on the same binaries, file and ports, the VDF switch the only difference. A first VDF-off run with a lookup defect in the harness (the adversary's block not found, so the verdict read "held") was discarded once the node's own log showed the adversary's hash as the cut block in 5 of 5 cuts; the harness now reads A from that log line. Two runs that overlapped on the box through a stale node of an earlier run were discarded as well (their nodes disagreed because they were two networks); the two runs above ran alone.
|
||||
|
||||
## 4. The cut rule and the certified checkpoint (for the finality lane)
|
||||
|
||||
The node names `C_era(n)` as the last selected-chain block below the cut on the header's own chain (the block the stand-in used), which is the checkpoint block the lead rule names under the O-4.3 decision of 3 October 2026 (certified or not). Three facts decide it:
|
||||
|
||||
1. Determinism. A header's validity must be a function of its own past. "The certificate carried by a block in the header's past, for the highest-index checkpoint with DAA score at most the cut" is such a function, but a certificate that lands after the era starts flips the reading between headers of one era (a header before the carrier reads the fallback, a header after it reads the certificate), so the certified binding needs a second rule: the carrier must sit at most half a lead above the cut (3,600 DAA s, the merge depth) and be a chain ancestor of the header; under that rule every honest header of the era reads the same certificate once the network merged the carrier, and a header on a chain that never merged it reads the fallback, consistently with its own past. The chain-block reading needs no second rule.
|
||||
2. Liveness. A finality pause across the cut (a third of weight leaving in an hour is a 30-day pause under rule v3) leaves the certified binding without a checkpoint for the era; the chain-block reading always has one, which is the reason O-4.3 was decided the way it was for the epoch.
|
||||
3. The defence. The grinding defence is the delay: no candidate's draw is knowable for T steps, whichever block is the cut. The binding moves which block a withholder would have to be the author of, not whether withholding pays; both readings leave the withholder with a coin flip it cannot see.
|
||||
|
||||
The change, if the finality lane wants the certified binding: `EraVdfManager::cut_block` (one function; the input, the delay and the seed are unchanged), plus the second rule above and a test with a certificate carried late.
|
||||
|
||||
## 5. The verify gate on a 2019-class core
|
||||
|
||||
The gate was "the VDF verifies in under 10 ms on a 2019-class core". Measured: 21.9 and 22.6 ms with the group held on the box core (above), which the F6 row's calibration puts at about 1.19x on an i7-9700K (the O-1.14 run: 6.0 ms on the 2019 core against 5.06 ms on the box proxy), so about 26 ms on a 2019 core, labelled a proxy: no 2019 host was rented this lane (Vast rentals are a purchase; not made without the project lead's word). NOT MET, by 2.2x on the box and about 2.6x on the proxy.
|
||||
|
||||
Where the time goes and what closes it: a verification is two 256-bit exponentiations, about 770 group operations at 28 µs each; the operation is NUDUPL on the fixed-width integer, whose cost is the extended gcd (Lehmer rounds on 8-limb numbers) and the reduction. Three rounds of this lane moved it from 345 µs (a Lehmer convention defect that fell back to plain division every round) to 28 µs (the convention, i64 word division, 34 limbs, the x86-64 128-by-64 division); the next 2.2x is chiavdf's Pulmark reducer (reduce only when `a` exceeds 8 limbs, O-4.6) and a limb-level NUDUPL that keeps the partial gcd's intermediates in words, or GMP through `rug` behind a feature on the x86-64 Linux and Windows builds (chiavdf's 208 K/s is 6x this evaluator, which would put the verification near 4 ms as the prototype measured), with the fixed-width path the fallback for wasm and macOS. Owed, not blocking: the verification runs once per era (180 days) on a node that imports a record rather than evaluating; every mining node evaluates and never verifies.
|
||||
|
||||
## 6. Consequences per tier (the standing rule of 5 October 2026)
|
||||
|
||||
| Tier | What the era VDF costs | What it means |
|
||||
|---|---|---|
|
||||
| A home miner, any card (8, 12, 16, 24 or 32 GB), any vendor, Windows, Linux or macOS | one CPU core for about 60 min once per 180 days at the reference rate (a 2019-class desktop core about 72 min by the F6 calibration), 17 MB of host RAM for the prover's checkpoints during it, 0 bytes on the card; the node starts it a quarter of the lead past the cut and holds the record from then | nothing changes on the card or in the hash rate; the 2-hour lead covers a core half the reference speed; a node that was off across the cut evaluates on arrival and its miner holds until the record lands (the miner says so every 10 s) |
|
||||
| A rig (one node, several cards) | the same one core on the rig's host, once per era | nothing per card |
|
||||
| A pool user | the pool's node evaluates; the member's miner takes `era_seed` from the template as today | nothing |
|
||||
| A light client or a syncing node | verifies an imported record in 22 ms (26 ms on a 2019 core, proxy) plus the 165-ms discriminant derivation, once per era; under scheme 1 it recomputes the hour | the 10-ms gate is missed (section 5); operationally one verification per 180 days |
|
||||
| The protocol | the era draw's input is unknowable for 517 s on the fastest prover measured, against a 1-s block interval: the stand-in's one-block grind is closed (section 3) | the freeze of the draw procedure and the C_era cut rule no longer waits on the VDF's existence; it waits on the two decisions of `ledger-decisions.md` |
|
||||
|
||||
## 7. What is owed
|
||||
|
||||
- The P2P relay of an era record to a syncing peer and the RPC import (spec 4.5, O-4.10), before era 1 of any network with the switch set.
|
||||
- The external review of the class-group port (O-4.1): the port is a second implementation checked against the textbook algorithms and `num-bigint`, not a review.
|
||||
- The attack pass's F7 status row (branch `attack-pass`, `docs/analysis/attack-pass-2026-10.md`) reads INCOMPLETE pending this lane; the line for it, from section 3: "F7 (a): the era VDF is in the node (fork `era-vdf-node`); the re-roll harness against the real era cut fires with it off (6 of 6 cuts, the seed the adversary's block) and is silent with it on (0 of 6 across six cuts, the adversary's 5-s evaluation against a 1-s block interval, three nodes agreeing on every era seed); PASS, the delay 517 s on the fastest prover measured at the production T."
|
||||
- The decisions of `docs/plans/ledger-decisions.md` (the activation per network, the cut's binding).
|
||||
|
|
@ -2652,3 +2652,32 @@ in the same shape and reports a box behind its wanted binary.
|
|||
| Rig | the same, and a rig that leaves is itself a weight removal: at 459 MH/s on tonight's devnet it is about 20 percent of the weight, over the hour's budget by itself |
|
||||
| Pool | a pool node is one voter carrying its members' whole weight; a pool restart is the largest single removal on the network and must be sliced like the fleet's |
|
||||
| The network | finality by miner weight is only as steady as the miners' uptime; until public hash dwarfs the fleet, the fleet's supervisor is a consensus component |
|
||||
|
||||
## 7 October 2026, the first 16 GB card: an RTX 5060 Ti in a Thunderbolt enclosure on PC 2 (branch bench-5060ti)
|
||||
|
||||
Machine: PC 2 (`1ccfe586`, Windows 11), an ASUS Dual GeForce RTX 5060 Ti (16 GB GDDR7, Blackwell sm_120, PnP `PCI\VEN_10DE&DEV_2D04&SUBSYS_8A111043`) in a Razer Core X V2 Thunderbolt enclosure ("USB4 Router (2.0), Razer - Core X V2", bus `0B:00.0`), beside the RTX 5090 on its own supply; NVIDIA driver 610.47 (WDDM 32.0.16.1047, the 5090's driver, nothing installed for the new card); the installed app 0.3.19 and its own `igneum-worker-cuda.exe` (NVRTC 12.8). Jobs `fetch-5060ti-packs-20261007` (the kit: `tools/bench-5060ti/make-kit.sh`, the class v4 pack at sub-version 1 and the v3 control, sha256 `fd8393ed...`, 105,892 bytes) and `run-5060ti-bench-20261007-b` (`tools/bench-5060ti/pc2-5060ti-bench.ps1`, 14:44:19Z, ran 14:45:05 to 14:58:11Z, exit 0; the 5060 Ti alone through the runner's `--cards-off`, the 5090 mining throughout; run `-a` died in 1 s on an argument-binding fault in the nvidia-smi query and is void). PC 2 lost power twice that day, so the job WRITES NO POWER LIMIT: it reads `power.limit` against `power.default_limit` (180 W = 180 W, range 150 to 198 W) and the row says `limit_is_stock=yes`. Read back with `node tools/jobs.mjs run-5060ti-bench-20261007-b`.
|
||||
|
||||
**Detection** (the app's first poll after the restart, run `win-1ccfe586-20261007-143611`, 14:36:16Z): `GPUs: NVIDIA GeForce RTX 5090 (CUDA); NVIDIA GeForce RTX 5060 Ti (CUDA); AMD Radeon(TM) Graphics (OpenCL, gfx1036)` and `cards: NVIDIA GeForce RTX 5090 [discrete, off] | NVIDIA GeForce RTX 5060 Ti [discrete, off] | ...`; the app started a miner on it by itself (`nvidia-1ccfe586-2`, `--device 1`, 8 identities, the default). The kind reads `discrete`, not `external`: the app does not know it is an eGPU. nvidia-smi in the job: index 1, 16,311 MiB, PCIe link gen 4 x4 current against gen 4 x16 maximum (the Thunderbolt link: a quarter of the slot's lanes), 43 C idle. The freeze lane's cause class for the 15:10 UK hang on the first boot with the card: not the card (no TDR, no Thunderbolt or PCIe link event; Kernel-Power 41 + 6008, no bugcheck, the power shape again).
|
||||
|
||||
**G1 and the window** (the installed CUDA worker, `--bench --batch-log2 24 --block-warps 1`, the card alone, `CUDA_VISIBLE_DEVICES` on its UUID so every row names the device; nvidia-smi every 2 s on the card, the loaded samples at utilisation 90 percent and over):
|
||||
|
||||
| Pack | Dispatches of 2^24 | Self-test | Fingerprint 2^24 at base 0 | MH/s |
|
||||
|---|---|---|---|---|
|
||||
| mx8-devnet-epoch0 (the class v3 control) | 5 | PASS | 90f794dd556f7a3b (= the control everywhere) | 30.895 |
|
||||
| v4-devnet-epoch0 (class v4, sub-version 1, program id 1a4230699a6b9c60) | 5 | PASS | 867dbc45cfb36b4d (= Metal, Apple OpenCL, the RTX 5090) | 30.879 |
|
||||
| v4-devnet-epoch0, the 10-minute window at the stock limit | 1,105 (602 s) | PASS | 867dbc45cfb36b4d | 30.882 |
|
||||
|
||||
| Row | Value |
|
||||
|---|---|
|
||||
| NVIDIA RTX 5060 Ti 16 GB, class v4, CUDA (NVRTC), driver 610.47, PCIe 4.0 x4 through the enclosure | 30.9 MH/s over 10 minutes on the card alone |
|
||||
| Watts at the stock limit (180 W default, unchanged) | 114.8 W mean, 115 W p50 over the window; 0.269 MH/W; SM 2,753 MHz, memory 13,801 MHz, 60 C maximum |
|
||||
| The class v4 shadow against the control | 0.1 percent (the 5090 paid 0.2, the 9070 XT 3, the B580 0.1) |
|
||||
| The efficient point | OWED to the app's Ember Tune: nothing set by the job; PC 2's Power Helper refused every request since the restart ("the helper did not run sequence 0 within 15 s", 14:39Z), so no ladder ran on either card |
|
||||
| Prove beside the miner (16 GB tier) | BLOCKED, not measured: the shipped WSL2 host (sha `71bc2438...`) carries no `IGNEUM_CUDA_DEVICE` selector, so aimed at anything it proves on CUDA device 0 (the 5090) through the app's own socket `/tmp/sp1-cuda-0.sock`; the selector lives in the prover-floor host (`proof_system.rs`, branch prover-floor) and is the owed cut. The job's inventory: the floor server IS on PC 2 (`/opt/igneum-floor/bin/sp1-gpu-server`, 6.8.1 build `e911facb...`, 166,665,880 bytes) beside the stock one (`~/.sp1/bin`, `c2642ad1...`), WSL sees the card as CUDA device 1 |
|
||||
| Card-picker entry (`site/yourcard.js`) | `['NVIDIA RTX 5060 Ti', 30.9]`, added; the public table row in `site/miner-bench.json` |
|
||||
|
||||
Against the 5090 on the same PC (122 MH/s at 308 W, 0.396 MH/W): 25.3 percent of its hash at 37 percent of its draw, 68 percent of its hash per watt. The dependent-read ceiling was not probed (the memprobe step is not in this job); at 128 loads a hash 30.9 MH/s is 3.95 G dependent reads a second, between the 9070 XT (2.4 to 2.7 G) and the 5090 (16 to 18 G).
|
||||
|
||||
Consequences per tier (the rule of 5 October 2026): a 5060 Ti owner (16 GB, Windows) mines at 30.9 MH/s and 115 W from the box with nothing to set: about 5,100 blocks a day at the 522 MH/s the devnet showed at 14:44Z (one every 17 s, approximate: the network rate moves), about a quarter of a 5090 owner's 20,200, for 2.76 kWh a day (£0.79 at 28.5 p against the 5090's £2.11); through a Thunderbolt enclosure the x4 link costs nothing measurable (the hash is bound by the card's own memory latency, not the link; the 5090's PCIe-slot rows are the comparison), so a laptop with a Thunderbolt 4 port and this enclosure is a 31 MH/s miner. The 8 GB 5060 Ti: the same hash is the expectation (the 1 GiB dataset fits), a line owed. Proving on the 16 GB tier: the fleet's 4060 Ti 16 GB row (9.0 GB peak beside the miner on the patched server) says this card would mine and prove with about 7 GB spare, approximate until the host with the device selector ships; today the app's prover default leaves it off ("a full shard needs a 24 GB card") and the measured read is owed to the prover-floor host cut. Linux and HiveOS take the same CUDA worker (owed a line). What the lane does next: the prover-floor host's selector into the shipped WSL2 bundle, then the prove-beside read on this card; the Power Helper fault on PC 2 to the Ember lane (no efficient point on any PC 2 card until it answers).
|
||||
|
||||
Found on the way: inside a PowerShell `@( ... )` the comma binds before `+`, so `'--query-gpu=' + $f, '--format=csv'` is one argument (run a, void in 1 s; the query string is built first now); a bare string inside a function that also returns a value is swallowed into the caller's variable (the sampler line; `[Console]::Out.WriteLine` now); the app's `kind` for a Thunderbolt card reads `discrete` (a word for the Cards page to earn: `external`, which the state already names).
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ Versions in the table: `igneum-pow` is the Rust crate at `igneum-pow/Cargo.toml`
|
|||
| 14 | Ethereum bytecode runs unchanged, with the documented differences of spec 7.1 | Homepage Build card; litepaper Building | tested by the team | as row 13; fixes `F-exec-A`, `F-exec-B` (spec 7.5) | `tools/evm-smoke/smoke.mjs`: deploy via viem, `increment`, `hashLoop`, `eth_estimateGas`, `eth_getLogs`; `tools/exec-attacks` scenarios 1 and 3; bench-log "execution layer attack fixes" | Deployment, calls, reverts, logs and gas estimates behave as viem expects; chain id 4463; the prototype pgas table gives 0.0095 to 0.028 pgas per gas, below the design's band before calibration, 3 October 2026. 4 October 2026: a transaction that would cross the block's proving budget is refused by the mempool and, if forced in, aborted and charged with its nonce advanced (25 of 25 checks; 30 of 30 malformed cases). Apple M5 Max. The `Prover` precompile, proof records and the shard planner are not in the node | none yet |
|
||||
| 15 | Every block is proven, with the proof landing within about a minute at launch | Homepage stats ("~60 s to a proof"); litepaper Proving; roadmap phase 3 gate | implemented | repo `d7e1f89` (GPU proof), `e01a3cc`, `292e800`, `eedd136` (`proving/igneum-prove`: shard cutter, MPT witnesses, shard and aggregator guests); SP1 6.8.1; spec 7.2, 7.6 | `proving/windows-wsl2` (SETUP-PROVER, PROVE-BLOCK) on the RTX 5090; `igneum-prove-host --mode block` on `proving/fixtures/`; bench-log "proving v0 on the RTX 5090" and "proving: devnet v4 shards" | First GPU proof of an Igneum block, 4 October 2026, RTX 5090 (WSL2, SP1 cuda, mining paused): fixture `block-78-increment` (2 transactions), core proof 1.4 s (7.3 MB, verify 0.221 s), compressed proof 2.7 s (1.27 MB, verify 0.038 s), post-state and receipts roots identical to the node's; 15.7x and 20.6x faster than a loaded M5 Max CPU. The same day on that CPU (load 38 to 47): a three-shard block proved shard by shard and aggregated by recursion, 19 min (1,139 s) end to end, 245 to 337 s per compressed shard proof, every proof verified. What is not there: no proof is produced, carried or checked on the chain (the devnet prover is a stub that signs claims), the proving pool pays nobody (row 21), the block proven is far below one shard, and the 60-second figure remains a design target; the pass mark is the standard in `docs/benchmarks/proving-e2e.md`. Second RTX 5090 run, 4 October 2026 evening (job run-20261004-173115): a full shard at the provisional S_p (6.75 M pgas, 60.8 M cycles) executed in 1.63 s, core proof 8.3 s (18.1 MB), compressed proof 10.9 s (1.27 MB, verify 0.040 s); a two-shard block (13.5 M pgas) proved shard by shard (11.7 s and 10.0 s) and aggregated in 2.2 s, 24 s of GPU stages end to end, every proof verified, six tampered witnesses rejected. The two host defects (an abort after the upload, an idle wait that turned out to be an unbuffered 18 MB proof save through the WSL2 file bridge, 24 minutes) are fixed (ledger P20) 5 October 2026, live devnet with real transactions (bench-log "real transactions, the first non-empty shard proven and paid"): block 72704 shard 0, 29 transfers, 5,800 pgas, proven on PC 2 in 34 s, verified on the Mac in 0.297 s and paid 1.7623 IGN, 53 s after the chain block executed; of about 1,400 blocks in the 20-minute window 36 were proven (the one prover takes the newest shard assigned to it), so "every block" is not yet true; a second content shard (72803, all copies skipped) failed the native-execution veto on the exporter's block structure, fixed with fixtures the same day, the node side pending the 0.3.9 rollout 5 October 2026, evening (bench-log "proving v1"): the aggregated segment record, the chain rule and the unproven rule are implemented behind `proving_v1_activation_daa` (branch proving-v1, not on the devnet before 0.3.11); on the RTX 5090 a chain of 8 consecutive live blocks proved and aggregated by recursion in 135.6 s with the miner on the card (17 s a block, one proof of 1,272,909 bytes attesting all 8, verified in 0.04 s); the 3-node fast-time harness paid a segment record 1.0 s after submission and refused a late one after its deadline (21 checks); the devnet itself, with one prover, carried proofs for 2.4% of blocks over 30 minutes at a block-to-record latency p50 44 s, p99 52 s. The "within about a minute" holds per proven block; "every block" needs 18 mining 5090s or 6 proving-only cards at empty blocks on the measured rates, and the mandatory rule stays off until the share is one | none yet |
|
||||
| 16 | A 12 GB card proves one shard in about 20 s (WITHDRAWN 5 October 2026: a 24 GB card proves a full shard at the adopted size in 4.3 s; 32 GB mines and proves) | Litepaper Proving ("The proving budget"); roadmap gate 2 | designed | spec 5.1 (Target), 7.6 (`S_p` provisional, 7,500,000 pgas = `B_p` / 4) | `PROVE-SHARD.bat` on the RTX 5090 (pending); the end-to-end standard in `docs/benchmarks/proving-e2e.md`; bench-log "proving: devnet v4 shards" | Measured on a 32 GB card, not yet on a 12 GB card. A shard at the provisional `S_p` is 60.8 M SP1 cycles on the prototype pgas table (9 cycles per pgas, 44 per EVM gas; the modexp entry about 100x its SP1 cost); on an RTX 5090 (4 October 2026 evening, job run-20261004-173115) it executed in 1.63 s and its compressed proof took 10.9 s, verified in 0.040 s, so the 32 GB card is inside the 20 s target with margin. Whether a 12 GB card proves it at all, and in what time, is the next measurement (an RTX 3060 and an RTX 5060 Ti 16 GB are on order). A per-shard time can be met by shrinking the shard, so the project does not use it as a pass mark 5 October 2026, evening (bench-log "proving v1", the S_p curve): measured on the RTX 5090 with SP1 6.8.1's GPU prover, the card to itself, 1-s nvidia-smi samples: an empty shard 13,874 MiB and 2.2 s; a full shard at the ADOPTED v1 budget (30,000 pgas, 4.7 M cycles) 20,434 MiB and 4.3 s; the full prototype shard (6.75 M pgas, 60 M cycles) 28,307 MiB and 10.8 s; beside the miner 15,670 and 30,039 MiB. No environment knob of SP1 moves the 13.9 GB floor and the GPU server has no options of its own, so on this build a 12 GB card proves nothing, a 16 GB card only empty shards, a 24 GB card the adopted full shard alone and beside the miner (22,210 MiB and 13.2 s, measured on the 32 GB card: the 5090's allocation pattern, not yet a run on a 24 GB card) and a 32 GB card the prototype shard beside the miner with 2.5 GB spare. The litepaper line now says so; the 12 GB gate returns when a prover build with a smaller floor is measured on a 12 GB card | none yet |
|
||||
| 17 | The chip resistance claim: the strongest chip in the public model reaches 5x to 9x per joule against an RTX 5090 today (modelled); class v4 brings it to 2.1x (k = 1) to 3.9x (k about 0.33, claimed by a withdrawn product) and its second rung to about 2.8x (modelled on measured watts); class v5 makes the dataset the chain's state so a stateless or stale chip is wrong on every item (designed, +0.2 ms verifier); the hot-set cache bounded at 1.067x at the ceiling (measured census of 1,024 programs) and the weak-day FPGA at most 12 percent on 12 days a century (measured census) are bounded and routed to the next class; datacentre silicon (H100 SXM, measured 7 October) does not change the question; a stored-dataset chip pays for itself only at about USD 100 M of market cap in two years (modelled) | The home page's chip line, the litepaper's chip model section, the miner page's line (the texts of `docs/plans/counter-asic-3-public-text-2026-10-07.md`) | tested by the team (every card, the verifier, the two attack-pass censuses, the H100), the chip itself modelled, class v5 and the ladder designed, the X9 core claimed and never measured | `docs/analysis/chip-model-v3.md` 5 and 6; `docs/analysis/latency-shadow-2026-10-06.md`; `docs/plans/counter-asic-3-status.md`; `docs/analysis/attack-pass/f8-uniform.md`, `f4-weakday.md`; `docs/design/class-v5-stored-state.md`; the H100 and market-cap rows of 7 October; `docs/plans/funding.md` (the three lots) | The chip model re-run on the measured class v3 and v4 rates, watts and verifier times; the hot-set census of 1,024 programs and the weak-day census of 2^24 days on the attack-pass branch; the H100 SXM bench row | 136 MH/s at 350 W (5090, bench) and 290 W (app); 27 MH/s at 21 W (M5 Max); 249 MH/s (H100 SXM) at 98 percent of its read ceiling, 1.78x hash, 1.15x MH/W, a third per rented dollar; 2.33 ms per warp; 5.1x to 9.2x; 2.1x, 3.9x, 2.8x; 1.067x at the ceiling; 12 percent on 12 days a century; 10.85 ms at rung 3; USD 100 M; 6 and 7 October 2026 | none yet; the three cryptanalysis lots are the next test |
|
||||
| 17 | The chip resistance claim: at launch the strongest chip in the public model reaches 2.1x (k = 1) to 3.9x (k about 0.33) per joule against an RTX 5090 under class v4, live from genesis on the testnet and the mainnet; the ladder's second rung brings it to about 2.8x; class v5 makes the dataset the chain's state so a stateless or stale chip is wrong on every item; the hot-set cache is bounded at 1.067x at the ceiling and the weak-day FPGA at 12 percent on 12 days a century, both routed to the next class; datacentre silicon does not change the question; a stored-dataset chip pays for itself only at about USD 100 M of market cap in two years; without class v4 the same chip would reach 5x to 9x (the class v3 baseline, the devnet's starting state, never the launch state) | the home page's chip line, the litepaper's chip section (/litepaper#chip-model), the miner page's line | tested by the team (every card, the verifier, the two attack-pass bounds, the H100), the chip itself modelled, class v5 and the ladder designed, the X9 core claimed and never measured | `docs/analysis/chip-model-v3.md` 5 and 6; `docs/analysis/latency-shadow-2026-10-06.md`; `docs/plans/counter-asic-3-status.md`; `docs/analysis/attack-pass/f8-uniform.md`, `f4-weakday.md`, `docs/analysis/ca3-v4-uniform.md`; `docs/design/class-v5-stored-state.md`; the H100 and market-cap rows of 7 October; `docs/plans/cryptanalysis/in-house-pass.md` (the internal adversarial pass) | the chip model's arithmetic in its file; the card rows by the benchmark package; the attack-pass harnesses `tools/attack/f8-uniform` and the F4 census; the verifier by `igneum-pow bench` | 136 MH/s at 350 W (5090, bench) and 290 W (app); 27 MH/s at 21 W (M5 Max); 249 MH/s (H100 SXM) at 98 percent of its read ceiling, 1.78x hash, 1.15x MH/W, a third per rented dollar; 2.33 ms per warp; 2.1x, 3.9x, 2.8x at launch; 1.067x at the ceiling; 12 percent on 12 days a century; 10.85 ms at rung 3; USD 100 M; 5.1x to 9.2x the class v3 baseline; 6 and 7 October 2026, the M5 Max, PC 2's RTX 5090, PC 1's RX 9070 XT and RTX 4070, a rented H100 SXM, igneum-build-1 | none yet; the next test is the internal adversarial pass (three lanes new to the hash code, outsider inputs only, reports published whole), and the one outside check is staged and waits on its escrow and the publish word |
|
||||
| 18 | The chip resistance measurements: the program is latency-bound (random reads), not bandwidth-bound, on every card we own, and sits beyond a card's on-chip cache | Litepaper Mining ("waits on memory latency, not on maths or bandwidth"), vs RandomX; the numbers page | tested by the team | readwidth e752fc7 (`docs/plans/read-width.md`), ca2-era 78c0ee4, ca2-cache 2de19e5 (`docs/plans/hot-table.md`) | The dependent-read probes at 32 to 1,024 MiB and the hash rate per class on the three cards; the latency-bound share = rate over the probe ceiling per load | Latency-bound share at the 1 GiB dataset: RTX 5090 0.96 (v2) and 1.01 (v3), RX 9070 XT 0.87 and 0.95, M5 Max 1.01 and 1.06; wider reads do not close the AMD gap (the 9070 XT does 2.4 G dependent reads per second at every width; the 5090 goes bandwidth-bound at 64 B, share 0.58); a 32 to 96 MiB hot table is not kept resident by any card while the dataset streams (g 0.80 to 0.87 in the added form). 5 October 2026 | none yet |
|
||||
| 19 | The lottery hash is sound as a hash: uniform output, deterministic, no out-of-bounds read, fuzzed; class v3 bit-exact on the three vendors | Litepaper vs RandomX ("Every number above is measured and logged"), the numbers page | tested by the team | ca2-mixer 1ab8b21 (`tests/mixer.rs`, `tests/scratch.rs`), ca2-era 78c0ee4, ca2-soundness a465881 (`docs/analysis/scratch-soundness.md`), `igneum-pow/tests/packs.rs` | The crate suite (53 + 4 + 19 + 7), the Metal fuzz, edge, stats and determinism runs on the v3 construction, the pack vectors and 2^24 fingerprints on Metal, Apple OpenCL, the RTX 5090 and the RX 9070 XT, the 1,024-hash CPU re-check per card | Class v3 (mixer x8 + era): 200-program fuzz 200 of 200 on Metal, every tenth on Apple OpenCL; the pinned v3 packs 3/3 + 3/3 and 96 of 96 lanes on Metal and Apple OpenCL; the six era packs' fingerprints equal on the three vendors (PC 1 job run-ca2-era-pc1-20261005, 5 October 2026); the v2 exports byte-identical on the v3 crate; the final-class PC rows and the G2 re-check: job run-ca2-era-pc1b-20261005 (pending at the time of writing) | none yet |
|
||||
| 20 | No premine, no pre-sale, no allocation: every coin is minted by the schedule and every coin goes to the block producer (80%) and the proving pool (20%) | Homepage stats and Economics tiles; litepaper Supply, Economics | implemented | repo `6ac80a3`; fork "igneum-node devnet v0"; `consensus/core/src/igneum.rs`, `coinbase.rs` | `cargo test -p kaspa-consensus-core igneum` (8 pass: subsidy table, ramp, split, cap) and `cargo test -p kaspa-consensus coinbase` (8 pass); `igneum-miner inspect 40`; bench-log "igneum-node devnet v0" | Coinbases on the devnet: 80/20 exact on 39 of 39 single-payee blocks, the 20% to the `igneum-proving-pool-v0` output; the per-second schedule sums to under the 4,000,000,000 cap by less than 100 coins; 3,168,808,781 units per DAA second in years 0 to 2, halving at 63,115,200 DAA s. 3 October 2026, Apple M5 Max. The devnet genesis carries no allocation; the mainnet genesis does not exist yet, so the claim is about the code and the stated rule, not a launch that has happened | none yet |
|
||||
|
|
|
|||
|
|
@ -299,7 +299,7 @@ Sweep (5 October 2026, evening): stated. `site/litepaper.html`, Finality ends wi
|
|||
### F11. VDFs are exotic
|
||||
"A class-group VDF with Wesolowski proofs in a consensus-critical path, in a project with no cryptographer. Chia needed years and still got timelord ASICs."
|
||||
|
||||
Status: Answered by design, with the dependency conceded.
|
||||
Status: Answered by design, with the dependency conceded. Update 7 October 2026 (era VDF lane): the era VDF is in the node (spec 4.4 Implemented, behind `era_vdf_activation_daa`, never until the project lead sets it per network), on a fixed-width integer with no C library, with the hash-chain fallback behind the genesis scheme byte for the day a class group's order is computable; the attack pass's F7 harness fires against the stand-in (1 of 6 cuts re-rolled at no delay) and is silent against the VDF (0 of 6); the measured rates, prove and verify times and the margin against the fastest known prover (chiavdf's AVX-512 path on the same box) are in `docs/analysis/era-vdf-2026-10-07.md`. The timelord-ASIC point is answered by the margin table of spec 4.6: the delay only has to exceed the 2-s publish window, and it does so by orders of magnitude on the fastest evaluator measured. The external review (O-4.1) is still owed. Was: Answered by design, with the dependency conceded.
|
||||
|
||||
Answer: The VDF is used for one thing: making the hourly program unknowable within the roughly two seconds a miner has to decide whether to publish a block, closing a withhold-or-publish grind the review measured at about 130 to 1 for a 30% miner. The VDF input is a certified checkpoint at least one epoch before the epoch starts, so honest nodes have about 50 minutes of slack to evaluate a 10-minute VDF, and an evaluator 300x faster than reference would still be needed to beat the two-second decision window. Chia has run class-group VDFs in production since 2021, with faster hardware evaluators existing and not breaking it (approximate, from memory). The design doc lists the VDF as a new dependency and ships the evaluator in every node. The grinding simulation with and without the VDF is scheduled before gate 3.
|
||||
|
||||
|
|
@ -2435,6 +2435,35 @@ Same rule as the counts above. 167 entries.
|
|||
The bucket "Decided or closed by rule" counts each entry once: M8, M11 and P16 move there from Answered, so Answered is 28 less those three plus M16 and E17, as the table states; the sum of the rows is 167 with M8, M11, P16 and F3, F17 counted in Decided only.
|
||||
|
||||
|
||||
## Round 5 entry (7 October 2026, afternoon): the class v4 load-source amendment
|
||||
|
||||
### AP-F8-1. A load whose source was last written by `or`, `mul` or `mulhi` makes a cross-hash hot set
|
||||
"The item histogram of class v4 over 2^26 nonces is not uniform: the top 0.1 percent of items take 0.520 percent of reads against 0.115 for a uniform control (4.05x), one item takes 78,479 reads (153x the mean), and site 15 feeds 6.37 percent of its reads into that top 0.1 percent in every iteration." (attack-pass row F8, `docs/analysis/attack-pass/f8-uniform.md`, 7 October 2026)
|
||||
|
||||
Status: Fixed on a branch, pending the 0.3.20 node ship (7 October 2026, afternoon; the project lead's word 15:2x UK: option A, "do this but limit the testing, get it pushed"): `ca3-v4-amend` a0aaca92 (the generator and the packs) and 1748fd1d (the PC 2 playbook), on origin/master 5c08c6e0 plus `ca3-v4-uniform` 095f84a7 (the analysis). The node side rides `release-0.3.20-node`; the stamp is agreed with the node lane (a283f5f0d364ceef0). Was: a finding (7 October 2026, morning).
|
||||
|
||||
Answer: Correct as a fault, wrong as a null. The window layer (spec 01 1.13.1 as proposed, `docs/plans/era-layout.md` 1.4) moves the uniform null from 0.115 to 0.160 percent at the top 0.1 percent (1.39x, not 4.05x) and explains every per-site row of F8's attribution except site 15. Site 15's source r6 was last written by `or r6, r4` (instruction 61, the load at 63), a non-injective op whose output bits are 1 with probability 3/4, so the all-ones source recurs with probability (3/4)^32 per read; the era map sends it to item 0xca5b92, F8's hottest item exactly, and F8's next seven items are exactly the seven one-zero-bit sources whose zero survives the window mask. The popcount model at the measured bias (p = 0.7585) predicts 77,348 all-ones reads against 78,479, and the program's top-0.1-percent share at 0.58 against 0.52. The acceptance rule's part (a) takes any write as a fresh source and part (c) counts saturation on final register values only, so the class of fault passes it: of 1,024 chain-shaped class v4 programs 96.6 percent carry a load whose source's last writer is `or`, `mul` or `mulhi`, 48.5 percent an `or`-sourced one (0.30 percent of all reads per site), 4.9 percent an `or`-of-`or` chain (p3's class: 72 percent of that site's reads, 4.6 percent of all reads, on 0.1 percent of items). The ceiling under rule (c)'s 120-of-128 floor is one site repeating its item in all 8 iterations, 6.25 percent of reads, a chip edge of at most 1.067x in 64 bytes of SRAM; the public claim's 2x margin stands, and the public line says "bounded", not "uniform" (`docs/analysis/ca3-v4-uniform.md` sections 1 to 4).
|
||||
|
||||
The amendment (a0aaca92): in class v4's chain draw a load's source is drawn only from registers whose last writer injects (add, sub, xor, mad, shfl, load) or is a rotate (rotl, rotr), never one last written by `or`, `mul` or `mulhi` (`generator.rs` candidate_from_words_class, keyed on the era-composed V4_CLASS; no attempts lost, rule (a) unchanged; v2, v3 and the generator-2 ladder packs byte-identical). Split protection (the node lane's form): generator stays 4 and a generator-4 program id appends `"sub/" || PROGRAM_SUBVERSION_V4 (= 1) as little-endian u16` inside `program_id()`, so a binary from before the rule and one after it never share a program id for one seed and the node's id check catches a split; packs carry `IGNEUM_PROGRAM_SUBVERSION 1` and `"sub_version": 1`, and packcheck refuses a generator-4 pack whose sub-version is absent or other. The node side (release-0.3.20-node, built to a0aaca92): kaspa-pow's test pins 1a4230699a6b9c60 must-equal and c120d7963abdcd96 must-differ through `generator::program_id` with the suffix, and the amended class signals object byte 5 in the header (CLASS_SIGNAL_V4 = 5; the tally counts byte 5 and above), so a block of the 6 October stream (byte 4) never counts towards the flip and a byte-4 node forks alone at it; object 6 is class v5's. The seven gate packs re-exported (devnet epoch 0 and eras 0 to 5): id 1a4230699a6b9c60 (was c120d7963abdcd96, pinned as the must-differ vector in `tests/recheck.rs`), fingerprints Metal = Apple OpenCL 867dbc45cfb36b4d, 2146ecacc8c75a8e, fe52602393f6d3d4, 3b206471a13912b4, c3f03c4a5d7333aa, f1dfd7209f15bb97, 8c194da64fadf31d; the v3 control 73bcbfe8ccf988f1 / 90f794dd556f7a3b untouched; the zip of the eight packs sha256 889ec99976d2728b4b5035bfa476032e5b6a13b928968fc45236d5f25084aa39.
|
||||
|
||||
Evidence: `docs/analysis/ca3-v4-uniform.md` (the model, the census `tools/ca3-v4-uniform`, the chip pricing); F8's logs under `/srv/builds/igneum-wt-attack/target-attack-f8/log/`; the tests limited by the project lead's word to what prevents a split and proves the fix: the vectors (the seven packs' ids and fingerprints above), the `igneum-pow` crate suite on igneum-build-1 at 8c728ca3 (`tools/build-remote.sh -- test --release`, rc 0, 77 s, 12:1x UTC: 61 lib + 7 derive + 4 mixer + 19 packs + 2 recheck + 7 scratch = 100 passed, 0 failed, the pinned v2 and v3 packs byte-identical and the v4 must-equal and must-differ ids as pinned), the pairing of the fork's kaspa-pow with this igneum-pow on igneum-build-1 (PAIRING-LINE), and one G1 run on the RTX 5090 (PC 2 job run-ca3-v4-amend-g1-pc2-20261007, 09:41:07 to 09:41:28Z, exit 0, the installed 0.3.17 worker sha256 14b6637e..., NVRTC, beside the app's miner, the prover on, the lock held 09:40:22 to 09:41:51Z): self-test PASS on all eight packs and every 2^24 fingerprint equal to the Mac's (the seven above and the control 90f794dd556f7a3b), NVRTC 188 to 332 ms per pack, the 1 GiB build 38 to 49 ms.
|
||||
|
||||
Sub-version 2 (7 October 2026, afternoon; main's ruling B2: 0.3.20 ships sub-version 1 as object byte 5 untouched, and sub-version 2 is object byte 7, built on this branch at 07a809a7): the attack-pass lane's F8 census on sub-version 1 (64 chain-shaped seeds, the window-model control, 2^24 nonces) read 53 of 64 PASS and 11 FAIL at 1.2x, worst p31 at 29.27x, and named three residual classes, all a constant delivered through a writer the one-writer rule admits: saturation or zero preserved through rotl, rotr or a load after a saturated load (p6, p23, p26, p31, p34), zero from mulhi (p45), and the iteration boundary (an `or` at 63 feeding a load at 1, p11); p4, p10 and p25 at 1.28x to 1.57x are the window model's own tail. (An F9 hot-set census read on the same day was withdrawn by its author: its harness drew outside the rule and its metric counted the era's designed windows as hot; F8 is the one re-gate instrument.) Sub-version 2 closes the three: the draw takes a load's source only from a register fresh by dataflow (fresh at the start; a load keeps freshness only from a fresh source; add, sub, xor, mad, shfl from either operand; rotl, rotr from their operand; or, mul, mulhi never), keyed on the class v4 shape on every draw path; rule (a') of the acceptance rule runs that freshness to its fixpoint over the loop (base then shadow block) and rejects a candidate whose load reads an unfresh register in the steady state; rule (c') counts, per load site, the source values equal to 0 or all-ones over the 64 units' 16,384 evaluations and rejects at 164 or more. The devnet epoch-0 seed's attempt 0 is rejected and attempt 1 accepted: id a788661687db4bb3 (c120d7963abdcd96 and 1a4230699a6b9c60 the must-differ pair), fingerprints Metal = Apple OpenCL e370fb2080b7dbb1, b7237555d31fc3cf, b6b167fa15dfe2c9, 28bdf65eff33f2c4, e26d38c46f3f1b16, dd8fdf6ff4f59eed, 8bf40f5cb858d835 (13:01Z), the packs zip sha256 69c36772cd79e44e2ddd589466d9c64a94a13c9e970e9f27bd76feabb9b4581b; the seven 256-block ladder packs of `packs-ca3-shadow` re-exported under the rule (their measured rates stand as the old stream's). Nothing is proposed for sub-version 2 until the attack-pass lane's two gates on 07a809a7 are green (the 64-seed census under 1.2x on every seed, the hot-set census on the chain path); its suite, pairing (after the node lane's re-pin to byte 7) and G1 lines are added below as they land. The static census (`tools/ca3-v4-uniform`, box 2, 13:12Z) over 1,024 chain-shaped seeds plus F8's p1 to p3 at sub-version 2: 0 lossy-sourced load sites of 16,432 (14,329 injecting, 2,103 bijective), 0 programs with an `or`-, `mul`- or `mulhi`-sourced load, the no-era draw path giving the devnet epoch-0 seed the pack's own id a788661687db4bb3 (one stream on every path); the cost of rules (a') and (c'): 1.99 attempts per seed on average against 0.05 before (p2's seed took five), which is 2 ms of generation per rejected attempt on one core, nothing a miner or node notices. The crate suite at 526fa757 on box 2 (`tools/build-remote.sh --box 2 -- test --release`, route line "box 2 for class suite, priority normal", rc 0, 66 s, 13:15Z): 61 lib + 7 derive + 4 mixer + 19 packs + 2 recheck + 7 scratch = 100 passed, 0 failed, the pinned v2 and v3 packs byte-identical and the three v4 ids as pinned (a788661687db4bb3 equal; c120d7963abdcd96 and 1a4230699a6b9c60 differ).
|
||||
|
||||
AP-F8-2 (7 October 2026, 13:xx UTC, the attack-pass lane on sub-version 2 at 07a809a7): chain-shaped seed igneum-f9/331672 exhausted the 32 attempts under rule (a') and the generator panicked, which on the chain is an epoch no node can draw, a liveness halt; the measured (a') plus (c') rejection rate of about two thirds per attempt puts the exhaustion probability at about (2/3)^32, 2e-6 per epoch seed (sub-version 1 exhausted 0 of 10^6). Main's ruling: the draw is total and no consensus path panics. Fixed at 8bdcbdd8 with the stream unchanged (re-export diff 0; the id a788661687db4bb3 and the fingerprints stand, so sub-version 2 keeps its number and the running censuses): the attempt cap of the class v4 shape is 256 (`MAX_ATTEMPTS_V4`; v2 and v3 keep 32), which puts the exhaustion probability under 1e-45 at a worst-case draw of about half a second on one core; after the cap the seed takes the last-resort program, deterministic and accepted as drawn, the candidate at attempt 256 with every `or`, `mul` and `mulhi` of the base program and the shadow block rewritten to `xor`, so every register stays fresh from the init words on and rule (a') holds by construction. The spec text for class v4 therefore reads: attempts 0 to 255 under rules (a), (b), (a'), (c) and (c'), then the last-resort program; the probability of reaching it is (r)^256 for a per-attempt rejection rate r, under 1e-45 at the measured r of about 2/3. Tests: `class_v4_draw_is_total_with_the_last_resort` (the last resort on real (a')-rejected candidates, every load fresh after it, no lossy op left, the chain path over 64 seeds without a panic, the cap per class). The 10^6-seed exhaustion count at the fixed commit is the attack-pass lane's measurement (its re-gate string is 8bdcbdd8); the 4,096-seed census with the attempt histogram (box 2, 13:33Z, `tools/ca3-v4-uniform --n 4096 --f8` at 8bdcbdd8): 4,099 chain-shaped programs, 0 lossy-sourced load sites of 65,584 (57,304 injecting, 8,280 bijective), 0 exhaustions, the accepted attempt geometric with ratio 0.674 (1,338 at attempt 0, 921, 620, 408, 274, 189, 127, 75, 55, 40, 16, 11, 12, 6, 5, then one each at 16 and 17; mean 1.98), so the measured per-attempt rejection rate is r = 0.674 and the exhaustion probability is 0.674^32 = 3e-6 under the old cap and 0.674^256 = 1e-44 under the class v4 cap. The crate suite at 8bdcbdd8 on box 2 (route line "box 2 for class suite, priority normal", rc 0, 80 s, 13:31Z): 62 lib + 7 derive + 4 mixer + 19 packs + 2 recheck + 7 scratch = 101 passed, 0 failed, the total-draw test included. G1 for sub-version 2 on a fleet RTX 5090 (main's order; the fleet lane, p1-5090, driver 580.173.02, sm_120, the box's Linux NVRTC worker `igneum-worker-cuda 1.0 (4 October 2026)` sha256 97e036e2..., which carries no program and compiles each pack's own text; the kit zip sha256 asserted before the put; 13:43:22 to 13:44:07Z): `--bench --batches 5 --batch-log2 24 --block-warps 1` on all eight packs, self-test PASS on every pack with the cache FNV 448274a57f508cbc and every 2^24 fingerprint equal to the Mac's (the control 90f794dd556f7a3b and the seven above); the rates (120 to 142 MH/s beside the box's own miner loop) are a reference only. The Windows G1 on PC 2 (job run-ca3-v4-sub2-g1-pc2-20261007b, published 13:46:33Z under the PC 2 lock, ran 13:46:36 to 13:46:50Z, exit 0; app 0.3.19, the installed worker sha256 14b6637e..., the RTX 5090 switched off by the runner's --cards-off before the script and restored on exit, igneum-worker-cuda running 0 before and after, the prover untouched): self-test PASS on all eight packs with the cache FNV 448274a57f508cbc, every 2^24 fingerprint equal to the Mac's and the fleet's (the control 90f794dd556f7a3b and the seven above), NVRTC 197 to 317 ms per pack, the 1 GiB build 22 to 34 ms, 115 to 130 MH/s with the card alone (a reference, 5 batches).
|
||||
|
||||
AP-F8-2, the exhaustion half, FIXED-AND-PASSED at 8bdcbdd8 on the attack-pass lane's 10^6 chain-shaped seeds through the chain path (14:03:53Z): 0 exhausted, 0 panics, 4 seeds past attempt 31 (three at 32, one at 35; 4e-6, inside (2/3)^32), max attempt 35, no seed at the last resort; r = 0.67, mean 2.0 attempts per seed.
|
||||
|
||||
Sub-version 2's hot-set half did not read green: F8's 64-seed gate at 39 of 64 had 8 over 1.2x of the window model (p23 4.82x, p19 3.32x, p15 2.57x, p18 2.50x, p34 1.25x; p4, p8, p10 unattributed at 1.22x to 1.50x). AP-F8-3 (7 October 2026, 14:0x UTC, the hash lane): the cause of the whole residual is that `accept.rs` never executed the latency-shadow block. Its interpreter (`run_unit`) was written for class v2 and v3 and ran the 64 base instructions per iteration and nothing after instruction 63, while the hash (`verify.rs`, the kernels) runs the shadow 27 times at the end of every iteration; so every dynamic acceptance test (c), (c') judged a class v4 program the chain never hashes. Main's word (14:1x UTC): 0.3.21 ships object byte 5 (sub-version 1); sub-version 3 is 0.3.22's and starts with this fix. Sub-version 3, first commit: `run_unit` executes the shadow block after instruction 63 of every iteration, `reps` times with the iteration's sel, as the hash does; the test `acceptance_executes_the_shadow_block_as_the_verifier_does` pins the acceptance's execution to `verify.rs` on the devnet epoch-0 program and the six test eras (the output bit counts over the 64 units equal, and different with the shadow stripped), so the two paths cannot diverge silently again; `PROGRAM_SUBVERSION_V4` = 3 (a new acceptance verdict is a new stream); the devnet epoch-0 seed still accepts at attempt 1, so its program and fingerprint are sub-version 2's (e370fb2080b7dbb1) under the new id a785001687d8688a (the must-differ set: c120d7963abdcd96, 1a4230699a6b9c60, a788661687db4bb3); the packs zip sha256 4f2445c50c58d76a5544023492d8b858d0b07c5e372d31f9c90c4ce51f829154. The class behind p23, localised from its program and reproduced in the acceptance's own execution: site 7 (instruction 38) reads r6 after 25 `mulhi r6`, 31 `or r6 |= r4`, 35 `xor r6 ^= r4`, which is `r6 & ~r4`, an AND mask the lineage rule counted as fresh because the xor's operand is the or's; over 2^20 evaluations on the closed-form words site 7 reads 874,953 distinct word indices against about 1,046,500 for every other site (0.84 of uniform; 2.2 s on one core), over 2^24 8,979,203 against about 16,260,000 (0.55; 35 s). The second sub-version 3 commit (held, prepared in the worktree) is a per-site distinct-index ratio against the uniform expectation of the site's window, its threshold set from the clean seeds' spread and its sample size from the cost line above; the dynamic bounds as first specified (a most-repeated-value bound at 16,384 and a distinct floor at 2^19.5 over 2^20) do not reach p23 and are not committed. The crate suite at ddacfbd3 on box 2 (route "box 2 for class suite, priority normal", rc 0, 41 s, 14:20Z): 63 lib + 7 derive + 4 mixer + 19 packs + 2 recheck + 7 scratch = 102 passed, 0 failed, the agreement test included. F8's final 64-seed table on sub-version 2 (the attack-pass lane, 14:2x UTC): 9 over 1.2x (p23 4.82x, p19 3.32x, p15 2.57x, p18 2.50x, p56 2.01x, p10 1.50x, p8 1.38x, p34 1.25x, p4 1.22x), the 55 clean seeds at 0.9915x to 1.144x; the 256-item bucket entropy over the window separates the strong four only (0.637 to 0.974 against a clean minimum of 0.9865 over 848 site rows), so the threshold of the second commit's distinct-index ratio comes from a run of that ratio on the 55 clean seeds at 2^20. The static census at ddacfbd3 (box 2, 14:22Z, 4,096 chain-shaped seeds plus F8's p1 to p3): 4,099 programs, 0 lossy-sourced load sites of 65,584, 0 exhaustions, the accepted attempt geometric as before (1,328 at attempt 0, 917, 622, 409, 284, ... one each at 16 and 17; mean 1.998, max 17), so the shadow-executed verdicts move a handful of seeds' attempts and nothing else; the devnet epoch-0 seed at attempt 1, id a785001687d8688a.
|
||||
|
||||
Sub-version 3, second commit (7 October 2026, 14:44 UTC, the hash lane; the sub-version number stays 3 and the stream is unchanged: re-export diff 0 on the eight packs, the id a785001687d8688a, the seven fingerprints and the zip sha256 stand), two rules. The shared-operand rule, in the draw's source rule and in the acceptance's (a') pass: or-then-xor or or-then-sub on one operand is `d & ~s`, xor-then-or is `d | s`, so the second write leaves the register lossy although either op alone injects; any write to either register clears the relation. On p23 the chain's attempt 1 (id d65122675f16a1c7) now draws site 7 (instruction 38) from r5 and passes; the devnet epoch-0 seed still draws attempt 1, the same program. Rule (c''), the distinct-index ratio: over 4,096 units (2^20 evaluations per site, the closed-form words, the shadow executed) every load site's count of distinct word indices against the uniform expectation on its window (N - N^2 / 2W, the window 2^28 >> min(win, 2)) must reach 0.98 (`MIN_DISTINCT_RATIO_V4`), the last test of the chosen candidate; a candidate under it is rejected and the next attempt drawn under the 256 cap and the last resort. The floor from the 64-seed run at 2^20 (box 2): the 55 clean seeds' minimum over their site rows 0.9960 (p1 0.9990, median 1.0000); the strong five p23 0.8361, p18 0.9274, p19 0.9335, p15 0.9432, p56 0.9654; 0.98 sits 0.015 from each side. The chain's own candidates it refuses (the test `class_v4_distinct_ratio_rejects_the_low_entropy_band`, box 2, 2.1 to 2.2 s each): p15 attempt 3 id 52638ea2e8b0fd68 site 2 at 0.943, p18 attempt 2 id 9a37e9489d8ba698 site 6 at 0.927, p19 attempt 0 id 79d7441de0689223 site 15 at 0.933, p56 attempt 2 id 486a8ad2701ec3b5 site 2 at 0.965; p23's attempt 1 with site 7 put back to r6 is refused by (a') (`UnfreshLoadSource`) and, run anyway, by the ratio at 0.836 (874,928 distinct of 1,048,576). Main's rule for a staged 2^24 pass (taken only if 2^24 separates the weak four from the clean seeds by at least the 2^20 gap) was decided by the 2^24 lines (box 2, 35 s per seed on one core): the weak four p34 0.9181, p4 0.9614, p8 0.9630, p10 0.9612; the clean seeds p44 0.9612, p52 0.9613, p3 0.9971, p2 and p5 1.0004; p23's attempt 1 1.0004. Two clean seeds sit on the weak four's value, so a 2^24 floor that reaches the weak four rejects clean seeds, and the 0.961 that recurs on both sides is a band the ratio reads at 2^24 that F8's hot-set gate did not flag on p44 or p52. Committed: the ratio at 0.98 over 2^20 alone (`ACCEPT_UNITS_DISTINCT_V4` = 4096), no 2^24 stage. Open tail: p4, p8, p10 and p34 (1.22x to 1.50x on F8's gate) read 0.9927 to 0.9963 at 2^20, inside the clean spread; unattributed and chased. The (B) most-repeated-value bound stays in the file unwired (`MAX_SOURCE_REPEAT_V4`, `most_repeated`). Cost: the chosen candidate's acceptance gains one 2^20 pass, 2.1 to 2.2 s on one box-2 core, once per epoch draw per node.
|
||||
|
||||
The second sub-version 3 commit is 017e70376489251e18564c0abce7e466e606c8b3 (pushed 15:10 UTC's preceding hour, pre-push gate GREEN, CI run 37639406567 success). The crate suite at 017e7037 on box 2 (rc 0, 184 s): 64 lib + 7 derive + 4 mixer + 19 packs + 2 recheck + 7 scratch = 103 passed, 0 failed, 3 diagnostics ignored; the lib tests took 140.8 s against ddacfbd3's 41 s for the whole suite, because every class v4 draw in the tests now pays the 2^20 pass on its chosen candidate (2.2 s each); that is CI time, not node time. The static census at 017e7037 (box 2, 15:1x UTC, 4,096 chain-shaped seeds plus F8's p1 to p3, the draws in parallel over the box's cores since the ratio pass makes the serial run a four-hour job): 4,099 programs, 0 lossy-sourced load sites of 65,584 (57,322 inject, 8,262 bijective), 0 exhaustions; the accepted attempt 1,297 at attempt 0, 899, 609, 416, 298, 197, 125, 92, 54, 46, 21, 14, 13, 9, 6, 0, 2, 1 (mean 2.086, max 17) against ddacfbd3's 1,328, 917, 622, 409, 284, ... (mean 1.998, max 17): the ratio refuses about 4 percent of the candidates that pass every other test, one more attempt on about one seed in twelve; the devnet epoch-0 seed at attempt 1, id a785001687d8688a; F8's p2 at attempt 5, p3 at attempt 1. The attack-pass lane's class check of ddacfbd3's shadow-executed verdicts against 8bdcbdd8 (598,678 chain-shaped seeds): 11,990 (2.0 percent) accept at a different attempt, 0 exhausted, max attempt 32; on 017e7037 the pairing holds (the devnet epoch-0 program draws as a785001687d8688a) and its 64-seed gate at 2^24 and 10^6 exhaustion count were running at 15:1x UTC (finish about 16:05 UTC).
|
||||
|
||||
F8's 64-seed gate on 017e7037 (the attack-pass lane, box 2, last seed 16:00:20 UTC): 60 of 64 under 1.2x; the four over are the named tail and nothing else (p10 1.5036x, p8 1.3776x, p34 1.2505x, p4 1.2167x; hottest items 355 to 541 reads of 2^31, unattributed, inside the ratio's clean spread); p23, p19, p15, p18 and p56 under the line; the clean spread 0.9915x to 1.144x. Exhaustion on 017e7037: 0 in the attack-pass lane's 20,532 chain-shaped seeds (max attempt 29) plus this lane's 4,099 (max 17); the 10^6 count continues as a strengthening line. Cost line for the node: the chain's epoch draw now pays the 2^20 ratio pass on every candidate that reaches it (the accepted one, and the about 4 percent that fail there), 2.2 s per pass on one box-2 core, so about 2.3 s per epoch draw on that core and, by the attack-pass lane's reading, about 4 to 5 s per epoch per node on slower cores; the earlier rejections cost milliseconds. From the attack-pass lane sub-version 3 at 017e7037 reads green on both gates with the named tail; its close line went to the plan, main and the Counter ASIC lane. This row stays open on the tail (p4, p8, p10, p34) until it is attributed or ruled accepted.
|
||||
|
||||
Owed (recorded, not run, by the project lead's word): G2 (the CPU verifier on 1,024 hashes per card) on the amended stream; G3 (the Metal fuzz, edge, stats and determinism runs) on the amended stream; the hash-rate ladder re-measure on the M5 Max and the RTX 5090 (the amendment changes the base program's source draws, not the op mix or the load count, so the latency-bound rows of `docs/analysis/latency-shadow-2026-10-06.md` are expected to hold within their spread; unmeasured); AMD (the RX 9070 XT, PC 1); the 2019-class verifier core (O-1.14); F8's phase E (the 64-seed dynamic census) on the amended stream, which is the attack-pass lane's and the test of the per-op table. The row reads FIXED-AND-PASSED only after phase E passes against the amended class.
|
||||
|
||||
## Genesis forward-compatibility entries (7 October 2026, mission item 8, branch `genesis-forward`)
|
||||
|
||||
The three genesis fields of `docs/analysis/mission/mission.md` section 2.8, built on the node fork branch `genesis-forward` (from release-0.3.19-node dc141409) and the repo branch `genesis-forward`; the design and the gates in `docs/design/genesis-forward.md`. Every switch is never on the devnet (its digest c562d70e... does not move); the testnet genesis sets all three (the testnet lane re-pins and re-digests).
|
||||
|
|
|
|||
|
|
@ -1,33 +1,33 @@
|
|||
# The chip claim, public text (7 October 2026, 14:3x UK, on the project lead's "this needs updating with all of our updates"; served since 11:03 UK on master 9162c847 with main's two cuts: no mention of the disclosure prize until the publish word, and row 17 in evidence.md's eight-column shape)
|
||||
# The chip claim, public text (7 October 2026; REWRITTEN LAUNCH-FIRST 18:3x UK on the project lead's "I thought we were making it 2.1 from launch?": the testnet and mainnet objects set program_class_v4_activation_daa to 0, so class v4 is live from genesis and the launch number is 2.1x to 3.9x on day one; the 5x to 9x is the class v3 baseline the work started from, stated only as that; the devnet's own activation height is a devnet fact only. Served since 11:03 UK on master 9162c847 with main's two cuts: no mention of the disclosure prize until the publish word, and row 17 in evidence.md's eight-column shape)
|
||||
|
||||
Three texts and one ledger row, written by the Counter ASIC lane, which owns the chip model. Every number carries its label: measured (a card or a chain we ran, with the date), modelled (arithmetic on cited parts), claimed (a vendor's figure, never measured by us), designed (a rule in a class, not yet measured). Sources: `docs/analysis/chip-model-v3.md` sections 5 and 6, `docs/analysis/latency-shadow-2026-10-06.md`, `docs/plans/counter-asic-3-status.md`, `docs/analysis/attack-pass/f8-uniform.md` and `f4-weakday.md` (branch attack-pass), `docs/design/class-v5-stored-state.md`, the datacentre and market-cap rows of 7 October (lanes 3 and the fleet), the cryptanalysis plan in `docs/plans/funding.md`.
|
||||
|
||||
## 1. The home page's chip line (replaces the hero sentence served since 6 October 16:21Z)
|
||||
|
||||
Built for graphics cards. In our public model the strongest chip reaches 5x to 9x per joule against an RTX 5090 today; class v4, now on the vote, brings that to 2.1x to 3.9x, and class v5 makes the dataset the chain's own state, so a chip that stores it or recomputes it is wrong on every item. The model and every measurement are public.
|
||||
Built for graphics cards. At launch the strongest chip in our public model reaches 2.1x to 3.9x per joule against an RTX 5090, under class v4 from the first block. Class v5 then makes the dataset the chain's own state, so a chip that stores it or recomputes it is wrong on every item. Without class v4 the same chip would reach 5x to 9x. The model and every measurement are public.
|
||||
|
||||
## 2. The litepaper's chip section (replaces the paragraph that begins "The chip model: 5x to 9x per joule")
|
||||
|
||||
The chip model. We price the strongest chip we can design against an RTX 5090 and publish the arithmetic. The honest card: an RTX 5090 mines class v3 at 136 MH/s on 350 W in the bench and 290 W in the app (measured, 6 October 2026); an Apple M5 Max at 27 MH/s on 21 W (measured, 6 October 2026); an H100 SXM at 249 MH/s, 98 percent of its random-read ceiling like the 5090, 1.78x the 5090's hash at 1.15x the tuned 5090's hash per watt and a third of the hash per rented dollar (measured, 7 October 2026), so datacentre silicon does not change the chip question. The CPU verifier takes 2.33 ms per warp of 32 hashes on one M5 Max core under class v4 (measured, 6 October 2026), against a gate of 10 ms.
|
||||
The chip model. We price the strongest chip we can design against an RTX 5090 and publish the arithmetic. Class v4 is live from the first block on the testnet and the mainnet (the ladder's rung 0 at genesis), so the launch number is the class v4 row. The honest card: an RTX 5090 mines class v3 at 136 MH/s on 350 W in the bench and 290 W in the app (measured, 6 October 2026); an Apple M5 Max at 27 MH/s on 21 W (measured, 6 October 2026); an H100 SXM at 249 MH/s, 98 percent of its random-read ceiling like the 5090, 1.78x the 5090's hash at 1.15x the tuned 5090's hash per watt and a third of the hash per rented dollar (measured, 7 October 2026), so datacentre silicon does not change the chip question. The CPU verifier takes 2.33 ms per warp of 32 hashes on one M5 Max core under class v4 (measured, 6 October 2026), against a gate of 10 ms.
|
||||
|
||||
| The chip and the class | Edge over an RTX 5090 per joule | Label and date |
|
||||
|---|---|---|
|
||||
| A memory-controller chip that stores the whole dataset (the Ethash class), class v3 | 5x to 9x (5.1x on GDDR7, 9.2x on eight HBM3 stacks; the Ethash chips of this class reached 2.1x to 4.8x) | modelled, 6 October 2026; the precedent measured by others, 2020 to 2022 |
|
||||
| The same chip under class v4 (about 100,000 integer ops per hash in the latency shadow, so the chip carries a GPU-class datapath beside its memory) | 2.1x with a core as costly per op as the GPU's (k = 1); 3.9x with the core Bitmain claimed for its Antminer X9 (k about 0.33), a product withdrawn before any unit shipped | modelled on measured card watts, 6 October 2026; the X9 figure claimed, never measured |
|
||||
| The same chip at the ladder's second rung (about 200,000 ops per hash) | about 2.8x | modelled, 7 October 2026 |
|
||||
| At launch: a memory-controller chip that stores the whole dataset, under class v4 (about 100,000 integer ops per hash in the latency shadow, so the chip carries a GPU-class datapath beside its memory) | 2.1x with a core as costly per op as the GPU's (k = 1); 3.9x with the core Bitmain claimed for its Antminer X9 (k about 0.33), a product withdrawn before any unit shipped | modelled on measured card watts, 6 October 2026; the X9 figure claimed, never measured |
|
||||
| The same chip at the ladder's second rung (about 200,000 ops per hash), reached by miner signal | about 2.8x | modelled, 7 October 2026 |
|
||||
| Any chip under class v5, where the dataset is the chain's own state | a stateless or stale chip is wrong on every item, so the stored-dataset chip and the recompute chip are removed as categories; the verifier pays 0.2 ms more per warp | designed, 7 October 2026 |
|
||||
| A chip caching the hottest 0.1 percent of items (about 1 MB of SRAM) | bounded at 1.067x at the ceiling, 1.005x on about half the hours and 1.048x on 5 percent | measured census of 1,024 programs, 7 October 2026; the source rule in the next class |
|
||||
| A per-day FPGA that recomputes the dataset with cheap multipliers on a weak day | at most 12 percent more hash rate on 12 days a century, nothing on the other days and nothing for any chip | measured census of 2^24 days, 7 October 2026; the rule in the next class |
|
||||
| When a stored-dataset chip pays for itself | at about USD 100 M of market cap in the first two years, not before | modelled, 7 October 2026 |
|
||||
| The baseline the work started from: the same chip under class v3, without the shadow (the Ethash class) | 5x to 9x (5.1x on GDDR7, 9.2x on eight HBM3 stacks; the Ethash chips of this class reached 2.1x to 4.8x) | modelled, 6 October 2026; the precedent measured by others, 2020 to 2022; never the launch state |
|
||||
|
||||
What a miner sees from this. Class v4 costs a 5090 about 80 W more for 0.2 percent of rate, an M5 Max 16 W more for 1.5 percent, an RX 9070 XT and an RTX 4070 nothing (all measured, 6 October 2026). The ladder that sets how much work rides in the shadow starts at rung 0 at the testnet genesis and climbs by miner signal; its third rung is inadmissible today because a server core verifies it in 10.85 ms, over the gate (measured, 7 October 2026). The next test of the model is not ours: the cryptanalysis plan buys three external lots against the mixer, the chained cache and the acceptance rule.
|
||||
What a miner sees from this. Class v4 costs a 5090 about 80 W more for 0.2 percent of rate, an M5 Max 16 W more for 1.5 percent, an RX 9070 XT and an RTX 4070 nothing (all measured, 6 October 2026). The ladder that sets how much work rides in the shadow starts at rung 0 at genesis and climbs by miner signal; its third rung is inadmissible today because a server core verifies it in 10.85 ms, over the gate (measured, 7 October 2026). On the devnet, which started on class v3, class v4 arrives by miner signal at a published height (a devnet fact, not a launch one). The next test of the model is an internal adversarial pass, not an independent review: three lanes that have never worked on the hash code attack the mixer, the chained cache and the acceptance rule with only what an outsider has (the public kit, the frozen object, the spec, the harnesses) and publish the break or the bound they reach. The one outside check is staged and waits on its escrow and the publish word.
|
||||
|
||||
## 3. The miner page's line
|
||||
|
||||
Your card against the strongest chip we can price: an RTX 5090 at 136 MH/s on 350 W (measured 6 October 2026), the chip 5x to 9x per joule in the public model today, 2.1x to 3.9x under class v4 (modelled on measured watts), and under class v5 wrong on every item because the dataset is the chain's own state (designed); the model and the measurements are public.
|
||||
Your card against the strongest chip we can price: an RTX 5090 at 136 MH/s on 350 W (measured 6 October 2026); at launch the chip reaches 2.1x to 3.9x per joule under class v4 (modelled on measured watts), and under class v5 it is wrong on every item because the dataset is the chain's own state (designed). Without class v4 it would be 5x to 9x. The model and the measurements are public.
|
||||
|
||||
## 4. The ledger row (docs/evidence.md row 17, in the table's eight columns as served)
|
||||
|
||||
| # | Claim | Where it is made | Status | Version or commit | Reproducible test | Result, date, machine | Independent verification |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 17 | The chip resistance claim: the strongest chip in the public model reaches 5x to 9x per joule against an RTX 5090 today; class v4 brings it to 2.1x (k = 1) to 3.9x (k about 0.33) and its second rung to about 2.8x; class v5 makes the dataset the chain's state so a stateless or stale chip is wrong on every item; the hot-set cache is bounded at 1.067x at the ceiling and the weak-day FPGA at 12 percent on 12 days a century, both routed to the next class; datacentre silicon does not change the question; a stored-dataset chip pays for itself only at about USD 100 M of market cap in two years | the home page's chip line, the litepaper's chip section (/litepaper#chip-model), the miner page's line | tested by the team (every card, the verifier, the two attack-pass bounds, the H100), the chip itself modelled, class v5 and the ladder designed, the X9 core claimed and never measured | `docs/analysis/chip-model-v3.md` 5 and 6; `docs/analysis/latency-shadow-2026-10-06.md`; `docs/plans/counter-asic-3-status.md`; `docs/analysis/attack-pass/f8-uniform.md`, `f4-weakday.md`, `docs/analysis/ca3-v4-uniform.md`; `docs/design/class-v5-stored-state.md`; the H100 and market-cap rows of 7 October; `docs/plans/funding.md` (the three lots) | the chip model's arithmetic in its file; the card rows by the benchmark package; the attack-pass harnesses `tools/attack/f8-uniform` and the F4 census; the verifier by `igneum-pow bench` | 136 MH/s at 350 W (5090, bench) and 290 W (app); 27 MH/s at 21 W (M5 Max); 249 MH/s (H100 SXM) at 98 percent of its read ceiling, 1.78x hash, 1.15x MH/W, a third per rented dollar; 2.33 ms per warp; 5.1x to 9.2x; 2.1x, 3.9x, 2.8x; 1.067x at the ceiling; 12 percent on 12 days a century; 10.85 ms at rung 3; USD 100 M; 6 and 7 October 2026, the M5 Max, PC 2's RTX 5090, PC 1's RX 9070 XT and RTX 4070, a rented H100 SXM, igneum-build-1 | none yet; the three cryptanalysis lots are the next test |
|
||||
| 17 | The chip resistance claim: at launch the strongest chip in the public model reaches 2.1x (k = 1) to 3.9x (k about 0.33) per joule against an RTX 5090 under class v4, live from genesis on the testnet and the mainnet; the ladder's second rung brings it to about 2.8x; class v5 makes the dataset the chain's state so a stateless or stale chip is wrong on every item; the hot-set cache is bounded at 1.067x at the ceiling and the weak-day FPGA at 12 percent on 12 days a century, both routed to the next class; datacentre silicon does not change the question; a stored-dataset chip pays for itself only at about USD 100 M of market cap in two years; without class v4 the same chip would reach 5x to 9x (the class v3 baseline, the devnet's starting state, never the launch state) | the home page's chip line, the litepaper's chip section (/litepaper#chip-model), the miner page's line | tested by the team (every card, the verifier, the two attack-pass bounds, the H100), the chip itself modelled, class v5 and the ladder designed, the X9 core claimed and never measured | `docs/analysis/chip-model-v3.md` 5 and 6; `docs/analysis/latency-shadow-2026-10-06.md`; `docs/plans/counter-asic-3-status.md`; `docs/analysis/attack-pass/f8-uniform.md`, `f4-weakday.md`, `docs/analysis/ca3-v4-uniform.md`; `docs/design/class-v5-stored-state.md`; the H100 and market-cap rows of 7 October; `docs/plans/cryptanalysis/in-house-pass.md` (the internal adversarial pass) | the chip model's arithmetic in its file; the card rows by the benchmark package; the attack-pass harnesses `tools/attack/f8-uniform` and the F4 census; the verifier by `igneum-pow bench` | 136 MH/s at 350 W (5090, bench) and 290 W (app); 27 MH/s at 21 W (M5 Max); 249 MH/s (H100 SXM) at 98 percent of its read ceiling, 1.78x hash, 1.15x MH/W, a third per rented dollar; 2.33 ms per warp; 2.1x, 3.9x, 2.8x at launch; 1.067x at the ceiling; 12 percent on 12 days a century; 10.85 ms at rung 3; USD 100 M; 5.1x to 9.2x the class v3 baseline; 6 and 7 October 2026, the M5 Max, PC 2's RTX 5090, PC 1's RX 9070 XT and RTX 4070, a rented H100 SXM, igneum-build-1 | none yet; the next test is the internal adversarial pass (three lanes new to the hash code, outsider inputs only, reports published whole), and the one outside check is staged and waits on its escrow and the publish word |
|
||||
|
|
|
|||
|
|
@ -171,7 +171,7 @@ Filled from a CPU census over programs (section 6).
|
|||
## 8. What is unverified
|
||||
|
||||
- Everything in section 6 marked pending.
|
||||
- The 1-hour VDF does not exist; the devnet stand-in of section 2 is a proposal.
|
||||
- The 1-hour VDF: BUILT on 7 October 2026 (era VDF lane, after the attack pass's F7 row named it the gating dependency): `kaspa_consensus_core::era_vdf` (the class-group Wesolowski scheme on a fixed-width integer and the hash-chain fallback behind the genesis byte `vdf_scheme`), `kaspa_consensus::processes::era_vdf` (the cut rule, the day-of-blues input, the evaluator thread, the record store), behind `Params::era_vdf_activation_daa` (never on every network until the project lead's word per network); the stand-in of section 2 stands below the activation and is what the VDF reads its input from above it. Verified: the F7 re-roll harness against the real era cut fires with the VDF off and is silent with it on across 6 cuts (`tools/era-vdf/reroll.mjs`, the record `docs/analysis/era-vdf-2026-10-07.md` section 3), the parameters and the measured prove and verify times are in spec 04 section 4.6. Still unverified: the P2P relay of a record to a syncing peer (spec 4.5, owed before era 1 of any network with the switch set), the binding of the cut to the certified checkpoint (left at the O-4.3 reading, one function to change), an external review of the class-group port (O-4.1), and the 2019-class-core verify time, which is measured on a proxy until a 2019 host is rented (record section 5).
|
||||
- The interleave's value against a chip with a programmable address decoder is nil (1.2); the claim is limited to hard-wired layouts.
|
||||
- The window floor of 2^26 words is set by the 5090's L2 (96 MiB) and the 9070 XT's Infinity Cache (64 MB, vendor figures); a future card with a larger cache moves the floor, which is a genesis constant.
|
||||
- No cryptanalysis of the stride (a multiply and a rotate before the mask); it is a bijection, so the address distribution is that of the register value, as today.
|
||||
|
|
|
|||
|
|
@ -112,3 +112,10 @@ Standing rulings of the same hour: "We dont want to penalise holders" (dormant-c
|
|||
| 3 | The latency ladder | Approved | The six rungs (27, 35, 53, 88, 173, 267 passes), rungs 0 to 2 admissible, rung 3 re-measured on a quiet core before genesis, 4 and 5 inadmissible until verifiers allow; every step by 90 percent in each of seven windows, never unconditional; `latency_ladder_activation_daa` = 0 on the testnet at rung 0. |
|
||||
| 4 | Cryptanalysis | Approved, "make sure they find ZERO flaws, also cut costs if possible" | The engagement runs at the low point (about USD 80,000) unless a quote forces more; an internal attack pass precedes it so the firms find nothing new; every finding is fixed before the testnet go. The contracting entity and the prize are still the project lead's to confirm. |
|
||||
| 5 | Re-cut the testnet genesis | Approved | One cut with 18 decimals, `TESTNET_1`, and the switches on from genesis: proof verification, the leave item, the signing bonus, finality v3, the ladder at rung 0. Nothing live is touched; the go checklist decides the date. |
|
||||
|
||||
## Era VDF (7 October 2026, 12:xx UK, era VDF lane): two decisions for the project lead
|
||||
|
||||
Question 1, the activation. The era VDF (spec 04 section 4.4) is in the node behind `era_vdf_activation_daa`, never on every network, with the genesis scheme byte `vdf_scheme` 0 (the class group) and `era_vdf_t` at the reference rate of igneum-build-1's core (spec 4.6). Facts: the F7 harness shows the stand-in grindable with one block of hash at no delay and the VDF closing it; the first era with a VDF is era 1, 180 days after a network's genesis; the P2P record relay (O-4.10) is owed before then. Recommendation: igneum-testnet-1 and mainnet carry `era_vdf_activation_daa: 0` in their genesis objects (the switch costs nothing before era 1 and the digest then pins it from the start); the live devnet keeps never (it will not reach era 1). Unblocks: the freeze of the era draw procedure and the C_era cut rule, which the attack pass's F7 row holds open on the VDF.
|
||||
|
||||
Question 2, the cut's binding (O-4.11). The node names the cut block as the chain block the lead rule names, certified or not (the O-4.3 reading of 3 October 2026), so a finality pause across the cut never leaves an era without a seed and the rule is a function of the header's past alone. The design document's wording binds the era draw to the last certified checkpoint. Facts: the grinding defence does not depend on the binding (the delay makes any candidate's draw unknowable); the certified binding couples the era seed to finality liveness and needs a rule for a certificate that lands after the cut (`docs/analysis/era-vdf-2026-10-07.md` section 4). Recommendation: keep the O-4.3 reading for the era as for the epoch; one function (`EraVdfManager::cut_block`) changes if the finality lane wants the certified binding. Unblocks: the sentence in spec 4.4 step 1 stops carrying "under the O-4.3 reading" once decided.
|
||||
|
||||
|
|
|
|||
21
docs/plans/mission-item-12-gate/case-off-eight.log
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
13:27:58.207 pd1 case switch-off-expect-eight: switch off, 10 listing nodes, joint 200 s, watch 180 s, expect eight
|
||||
13:27:59.744 pd1 n0 up pid 690270 json 31292 p2p 31291
|
||||
13:28:01.258 pd1 n1 up pid 690864 json 31302 p2p 31301 addpeer 31291,31291
|
||||
13:28:02.766 pd1 n2 up pid 691561 json 31312 p2p 31311 addpeer 31291,31301
|
||||
13:28:04.272 pd1 n3 up pid 692232 json 31322 p2p 31321 addpeer 31291,31311
|
||||
13:28:05.777 pd1 n4 up pid 692823 json 31332 p2p 31331 addpeer 31291,31321
|
||||
13:28:07.281 pd1 n5 up pid 693470 json 31342 p2p 31341 addpeer 31291,31331
|
||||
13:28:08.785 pd1 n6 up pid 694063 json 31352 p2p 31351 addpeer 31291,31341
|
||||
13:28:10.290 pd1 n7 up pid 694656 json 31362 p2p 31361 addpeer 31291,31351
|
||||
13:28:11.797 pd1 n8 up pid 695316 json 31372 p2p 31371 addpeer 31291,31361
|
||||
13:28:13.304 pd1 n9 up pid 695947 json 31382 p2p 31381 addpeer 31291,31371
|
||||
13:31:35.437 pd1 phase 1 done at 200.1 s: node 0 at 243 blocks DAA 243; 0 directory listing line(s) on node 0
|
||||
13:31:36.962 pd1 fresh up pid 705981 json 31392 p2p 31391 addpeer 31291
|
||||
13:32:07.031 pd1 t=231.7 s fresh: 1 outbound, 0 inbound, 272 blocks, 0 draw line(s), 0 directory connection(s)
|
||||
13:32:37.109 pd1 t=261.8 s fresh: 1 outbound, 0 inbound, 314 blocks, 0 draw line(s), 0 directory connection(s)
|
||||
13:33:07.190 pd1 t=291.9 s fresh: 1 outbound, 0 inbound, 332 blocks, 0 draw line(s), 0 directory connection(s)
|
||||
13:33:37.273 pd1 t=322.0 s fresh: 1 outbound, 0 inbound, 359 blocks, 0 draw line(s), 0 directory connection(s)
|
||||
13:34:07.348 pd1 t=352.0 s fresh: 1 outbound, 0 inbound, 379 blocks, 0 draw line(s), 0 directory connection(s)
|
||||
13:34:37.426 pd1 t=382.1 s fresh: 1 outbound, 0 inbound, 420 blocks, 0 draw line(s), 0 directory connection(s)
|
||||
13:34:37.428 pd1 SUMMARY FAIL (switch-off-expect-eight): node 0 logged 0 listings; the fresh node never reached 8 outbound (last 1), 0 connection(s) from the directory, 0 draw line(s), 420 blocks; FAILED CHECK listing_lines_on_node_0, fresh_reached_eight_outbound, fresh_connected_from_directory
|
||||
13:34:37.428 pd1 summary: /srv/builds/igneum-wt-peer-directory/docs/plans/mission-item-12-gate/peer-directory-switch-off-expect-eight.json
|
||||
21
docs/plans/mission-item-12-gate/case-off-one.log
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
13:27:58.206 pd0 case switch-off-expect-one: switch off, 10 listing nodes, joint 200 s, watch 180 s, expect one
|
||||
13:27:59.744 pd0 n0 up pid 690269 json 31092 p2p 31091
|
||||
13:28:01.255 pd0 n1 up pid 690863 json 31102 p2p 31101 addpeer 31091,31091
|
||||
13:28:02.763 pd0 n2 up pid 691557 json 31112 p2p 31111 addpeer 31091,31101
|
||||
13:28:04.270 pd0 n3 up pid 692228 json 31122 p2p 31121 addpeer 31091,31111
|
||||
13:28:05.775 pd0 n4 up pid 692819 json 31132 p2p 31131 addpeer 31091,31121
|
||||
13:28:07.280 pd0 n5 up pid 693466 json 31142 p2p 31141 addpeer 31091,31131
|
||||
13:28:08.786 pd0 n6 up pid 694058 json 31152 p2p 31151 addpeer 31091,31141
|
||||
13:28:10.292 pd0 n7 up pid 694658 json 31162 p2p 31161 addpeer 31091,31151
|
||||
13:28:11.800 pd0 n8 up pid 695318 json 31172 p2p 31171 addpeer 31091,31161
|
||||
13:28:13.306 pd0 n9 up pid 695955 json 31182 p2p 31181 addpeer 31091,31171
|
||||
13:31:35.436 pd0 phase 1 done at 200.1 s: node 0 at 250 blocks DAA 250; 0 directory listing line(s) on node 0
|
||||
13:31:36.969 pd0 fresh up pid 705982 json 31192 p2p 31191 addpeer 31091
|
||||
13:32:07.034 pd0 t=231.7 s fresh: 1 outbound, 0 inbound, 288 blocks, 0 draw line(s), 0 directory connection(s)
|
||||
13:32:37.118 pd0 t=261.8 s fresh: 1 outbound, 0 inbound, 308 blocks, 0 draw line(s), 0 directory connection(s)
|
||||
13:33:07.199 pd0 t=291.9 s fresh: 1 outbound, 0 inbound, 349 blocks, 0 draw line(s), 0 directory connection(s)
|
||||
13:33:37.276 pd0 t=322.0 s fresh: 1 outbound, 0 inbound, 377 blocks, 0 draw line(s), 0 directory connection(s)
|
||||
13:34:07.351 pd0 t=352.0 s fresh: 1 outbound, 0 inbound, 405 blocks, 0 draw line(s), 0 directory connection(s)
|
||||
13:34:37.431 pd0 t=382.1 s fresh: 1 outbound, 0 inbound, 448 blocks, 0 draw line(s), 0 directory connection(s)
|
||||
13:34:37.432 pd0 SUMMARY PASS (switch-off-expect-one): node 0 logged 0 listings; the fresh node never reached 8 outbound (last 1), 0 connection(s) from the directory, 0 draw line(s), 448 blocks
|
||||
13:34:37.432 pd0 summary: /srv/builds/igneum-wt-peer-directory/docs/plans/mission-item-12-gate/peer-directory-switch-off-expect-one.json
|
||||
22
docs/plans/mission-item-12-gate/case-on-eight.log
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
13:27:58.204 pd2 case switch-on-expect-eight: switch on, 10 listing nodes, joint 200 s, watch 180 s, expect eight
|
||||
13:27:59.743 pd2 n0 up pid 690268 json 31492 p2p 31491
|
||||
13:28:01.254 pd2 n1 up pid 690860 json 31502 p2p 31501 addpeer 31491,31491
|
||||
13:28:02.762 pd2 n2 up pid 691556 json 31512 p2p 31511 addpeer 31491,31501
|
||||
13:28:04.268 pd2 n3 up pid 692227 json 31522 p2p 31521 addpeer 31491,31511
|
||||
13:28:05.773 pd2 n4 up pid 692818 json 31532 p2p 31531 addpeer 31491,31521
|
||||
13:28:07.279 pd2 n5 up pid 693462 json 31542 p2p 31541 addpeer 31491,31531
|
||||
13:28:08.787 pd2 n6 up pid 694062 json 31552 p2p 31551 addpeer 31491,31541
|
||||
13:28:10.291 pd2 n7 up pid 694659 json 31562 p2p 31561 addpeer 31491,31551
|
||||
13:28:11.800 pd2 n8 up pid 695317 json 31572 p2p 31571 addpeer 31491,31561
|
||||
13:28:13.304 pd2 n9 up pid 695954 json 31582 p2p 31581 addpeer 31491,31571
|
||||
13:31:35.435 pd2 phase 1 done at 200.1 s: node 0 at 233 blocks DAA 233; 10 directory listing line(s) on node 0
|
||||
13:31:36.954 pd2 fresh up pid 705980 json 31592 p2p 31591 addpeer 31491
|
||||
13:32:07.025 pd2 the fresh node holds 10 outbound peers at 231.7 s (9 from the directory)
|
||||
13:32:07.025 pd2 t=231.7 s fresh: 10 outbound, 0 inbound, 262 blocks, 1 draw line(s), 9 directory connection(s)
|
||||
13:32:37.102 pd2 t=261.8 s fresh: 10 outbound, 0 inbound, 290 blocks, 1 draw line(s), 9 directory connection(s)
|
||||
13:33:07.182 pd2 t=291.9 s fresh: 10 outbound, 0 inbound, 323 blocks, 1 draw line(s), 9 directory connection(s)
|
||||
13:33:37.265 pd2 t=322.0 s fresh: 10 outbound, 0 inbound, 357 blocks, 1 draw line(s), 9 directory connection(s)
|
||||
13:34:07.342 pd2 t=352.0 s fresh: 10 outbound, 0 inbound, 391 blocks, 1 draw line(s), 9 directory connection(s)
|
||||
13:34:37.418 pd2 t=382.1 s fresh: 10 outbound, 0 inbound, 414 blocks, 1 draw line(s), 9 directory connection(s)
|
||||
13:34:37.418 pd2 SUMMARY PASS (switch-on-expect-eight): node 0 logged 10 listings; the fresh node reached 8 outbound at 231.7 s, 9 connection(s) from the directory, 1 draw line(s), 414 blocks
|
||||
13:34:37.419 pd2 summary: /srv/builds/igneum-wt-peer-directory/docs/plans/mission-item-12-gate/peer-directory-switch-on-expect-eight.json
|
||||
|
|
@ -0,0 +1,370 @@
|
|||
{
|
||||
"pass": false,
|
||||
"expect": "eight",
|
||||
"case": "switch-off-expect-eight",
|
||||
"switch": "off",
|
||||
"listing": 10,
|
||||
"joint": 200,
|
||||
"watch": 180,
|
||||
"node0": {
|
||||
"blocks": 243,
|
||||
"daa": 243
|
||||
},
|
||||
"listing_lines_on_node_0": 0,
|
||||
"eight_outbound_at_s": null,
|
||||
"last": {
|
||||
"t": 382.1,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 420,
|
||||
"daa": 420,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
"checks": {
|
||||
"listing_lines_on_node_0": false,
|
||||
"fresh_synced": true,
|
||||
"fresh_reached_eight_outbound": false,
|
||||
"fresh_connected_from_directory": false,
|
||||
"fresh_held_one_outbound": true,
|
||||
"no_directory_line_on_fresh": true
|
||||
},
|
||||
"failed_checks": [
|
||||
"listing_lines_on_node_0",
|
||||
"fresh_reached_eight_outbound",
|
||||
"fresh_connected_from_directory"
|
||||
],
|
||||
"samples": [
|
||||
{
|
||||
"t": 206.7,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 250,
|
||||
"daa": 250,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 211.7,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 255,
|
||||
"daa": 255,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 216.7,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 258,
|
||||
"daa": 258,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 221.7,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 264,
|
||||
"daa": 264,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 226.7,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 271,
|
||||
"daa": 271,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 231.7,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 272,
|
||||
"daa": 272,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 236.7,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 276,
|
||||
"daa": 276,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 241.8,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 284,
|
||||
"daa": 284,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 246.8,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 289,
|
||||
"daa": 289,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 251.8,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 292,
|
||||
"daa": 292,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 256.8,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 302,
|
||||
"daa": 302,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 261.8,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 314,
|
||||
"daa": 314,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 266.8,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 317,
|
||||
"daa": 317,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 271.8,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 321,
|
||||
"daa": 321,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 276.9,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 322,
|
||||
"daa": 322,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 281.9,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 326,
|
||||
"daa": 326,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 286.9,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 331,
|
||||
"daa": 331,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 291.9,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 332,
|
||||
"daa": 332,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 296.9,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 338,
|
||||
"daa": 338,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 301.9,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 341,
|
||||
"daa": 341,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 306.9,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 344,
|
||||
"daa": 344,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 311.9,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 349,
|
||||
"daa": 349,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 317,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 355,
|
||||
"daa": 355,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 322,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 359,
|
||||
"daa": 359,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 327,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 361,
|
||||
"daa": 361,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 332,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 369,
|
||||
"daa": 369,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 337,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 371,
|
||||
"daa": 371,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 342,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 374,
|
||||
"daa": 374,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 347,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 378,
|
||||
"daa": 378,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 352,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 379,
|
||||
"daa": 379,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 357.1,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 389,
|
||||
"daa": 389,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 362.1,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 400,
|
||||
"daa": 400,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 367.1,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 406,
|
||||
"daa": 406,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 372.1,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 410,
|
||||
"daa": 410,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 377.1,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 416,
|
||||
"daa": 416,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 382.1,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 420,
|
||||
"daa": 420,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
}
|
||||
],
|
||||
"node": "/srv/builds/igneum-wt-peer-directory/vendor/igneum-node-pd/target/release/igneumd",
|
||||
"miner": "/srv/builds/igneum-wt-peer-directory/vendor/igneum-node-pd/target/release/igneum-miner",
|
||||
"slot": 1,
|
||||
"ports": {
|
||||
"base": 31290,
|
||||
"suffix": 976
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,366 @@
|
|||
{
|
||||
"pass": true,
|
||||
"expect": "one",
|
||||
"case": "switch-off-expect-one",
|
||||
"switch": "off",
|
||||
"listing": 10,
|
||||
"joint": 200,
|
||||
"watch": 180,
|
||||
"node0": {
|
||||
"blocks": 250,
|
||||
"daa": 250
|
||||
},
|
||||
"listing_lines_on_node_0": 0,
|
||||
"eight_outbound_at_s": null,
|
||||
"last": {
|
||||
"t": 382.1,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 448,
|
||||
"daa": 448,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
"checks": {
|
||||
"listing_lines_on_node_0": false,
|
||||
"fresh_synced": true,
|
||||
"fresh_reached_eight_outbound": false,
|
||||
"fresh_connected_from_directory": false,
|
||||
"fresh_held_one_outbound": true,
|
||||
"no_directory_line_on_fresh": true
|
||||
},
|
||||
"failed_checks": [],
|
||||
"samples": [
|
||||
{
|
||||
"t": 206.7,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 261,
|
||||
"daa": 261,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 211.7,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 271,
|
||||
"daa": 271,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 216.7,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 276,
|
||||
"daa": 276,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 221.7,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 278,
|
||||
"daa": 278,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 226.7,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 282,
|
||||
"daa": 282,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 231.7,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 288,
|
||||
"daa": 288,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 236.8,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 294,
|
||||
"daa": 294,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 241.8,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 296,
|
||||
"daa": 296,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 246.8,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 303,
|
||||
"daa": 303,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 251.8,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 305,
|
||||
"daa": 305,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 256.8,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 307,
|
||||
"daa": 307,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 261.8,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 308,
|
||||
"daa": 308,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 266.8,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 311,
|
||||
"daa": 311,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 271.8,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 315,
|
||||
"daa": 315,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 276.9,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 322,
|
||||
"daa": 322,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 281.9,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 331,
|
||||
"daa": 331,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 286.9,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 341,
|
||||
"daa": 341,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 291.9,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 349,
|
||||
"daa": 349,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 296.9,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 357,
|
||||
"daa": 357,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 301.9,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 364,
|
||||
"daa": 364,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 306.9,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 369,
|
||||
"daa": 369,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 311.9,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 372,
|
||||
"daa": 372,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 317,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 374,
|
||||
"daa": 374,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 322,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 377,
|
||||
"daa": 377,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 327,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 384,
|
||||
"daa": 384,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 332,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 393,
|
||||
"daa": 393,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 337,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 396,
|
||||
"daa": 396,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 342,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 397,
|
||||
"daa": 397,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 347,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 402,
|
||||
"daa": 402,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 352,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 405,
|
||||
"daa": 405,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 357.1,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 413,
|
||||
"daa": 413,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 362.1,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 422,
|
||||
"daa": 422,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 367.1,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 428,
|
||||
"daa": 428,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 372.1,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 433,
|
||||
"daa": 433,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 377.1,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 440,
|
||||
"daa": 440,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 382.1,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 448,
|
||||
"daa": 448,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
}
|
||||
],
|
||||
"node": "/srv/builds/igneum-wt-peer-directory/vendor/igneum-node-pd/target/release/igneumd",
|
||||
"miner": "/srv/builds/igneum-wt-peer-directory/vendor/igneum-node-pd/target/release/igneum-miner",
|
||||
"slot": 0,
|
||||
"ports": {
|
||||
"base": 31090,
|
||||
"suffix": 975
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,366 @@
|
|||
{
|
||||
"pass": true,
|
||||
"expect": "eight",
|
||||
"case": "switch-on-expect-eight",
|
||||
"switch": "on",
|
||||
"listing": 10,
|
||||
"joint": 200,
|
||||
"watch": 180,
|
||||
"node0": {
|
||||
"blocks": 233,
|
||||
"daa": 233
|
||||
},
|
||||
"listing_lines_on_node_0": 10,
|
||||
"eight_outbound_at_s": 231.7,
|
||||
"last": {
|
||||
"t": 382.1,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 414,
|
||||
"daa": 414,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
"checks": {
|
||||
"listing_lines_on_node_0": true,
|
||||
"fresh_synced": true,
|
||||
"fresh_reached_eight_outbound": true,
|
||||
"fresh_connected_from_directory": true,
|
||||
"fresh_held_one_outbound": false,
|
||||
"no_directory_line_on_fresh": false
|
||||
},
|
||||
"failed_checks": [],
|
||||
"samples": [
|
||||
{
|
||||
"t": 206.7,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 242,
|
||||
"daa": 242,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 211.7,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 246,
|
||||
"daa": 246,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 216.7,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 253,
|
||||
"daa": 253,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 221.7,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 256,
|
||||
"daa": 256,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 226.7,
|
||||
"outbound": 1,
|
||||
"inbound": 0,
|
||||
"blocks": 260,
|
||||
"daa": 260,
|
||||
"drawn": 0,
|
||||
"connected_from_directory": 0
|
||||
},
|
||||
{
|
||||
"t": 231.7,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 262,
|
||||
"daa": 262,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 236.7,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 269,
|
||||
"daa": 269,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 241.7,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 277,
|
||||
"daa": 277,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 246.8,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 280,
|
||||
"daa": 280,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 251.8,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 283,
|
||||
"daa": 283,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 256.8,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 286,
|
||||
"daa": 286,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 261.8,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 290,
|
||||
"daa": 290,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 266.8,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 298,
|
||||
"daa": 298,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 271.8,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 303,
|
||||
"daa": 303,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 276.8,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 311,
|
||||
"daa": 311,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 281.8,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 316,
|
||||
"daa": 316,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 286.9,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 317,
|
||||
"daa": 317,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 291.9,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 323,
|
||||
"daa": 323,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 296.9,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 334,
|
||||
"daa": 334,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 301.9,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 337,
|
||||
"daa": 337,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 306.9,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 342,
|
||||
"daa": 342,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 311.9,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 348,
|
||||
"daa": 348,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 316.9,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 350,
|
||||
"daa": 350,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 322,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 357,
|
||||
"daa": 357,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 327,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 359,
|
||||
"daa": 359,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 332,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 362,
|
||||
"daa": 362,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 337,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 364,
|
||||
"daa": 364,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 342,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 368,
|
||||
"daa": 368,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 347,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 380,
|
||||
"daa": 380,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 352,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 391,
|
||||
"daa": 391,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 357.1,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 393,
|
||||
"daa": 393,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 362.1,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 399,
|
||||
"daa": 399,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 367.1,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 401,
|
||||
"daa": 401,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 372.1,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 403,
|
||||
"daa": 403,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 377.1,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 409,
|
||||
"daa": 409,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
},
|
||||
{
|
||||
"t": 382.1,
|
||||
"outbound": 10,
|
||||
"inbound": 0,
|
||||
"blocks": 414,
|
||||
"daa": 414,
|
||||
"drawn": 1,
|
||||
"connected_from_directory": 9
|
||||
}
|
||||
],
|
||||
"node": "/srv/builds/igneum-wt-peer-directory/vendor/igneum-node-pd/target/release/igneumd",
|
||||
"miner": "/srv/builds/igneum-wt-peer-directory/vendor/igneum-node-pd/target/release/igneum-miner",
|
||||
"slot": 2,
|
||||
"ports": {
|
||||
"base": 31490,
|
||||
"suffix": 977
|
||||
}
|
||||
}
|
||||
112
docs/plans/mission-item-12-peer-directory.md
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
# Mission item 12: the weight-backed peer directory, prototype (status log)
|
||||
|
||||
Lane: horizon (mission items 4 and 12), 7 October 2026, after item 4's gate line. Branches: `peer-directory` (this repo, on
|
||||
master) and `peer-directory-node` (the fork, on release-0.3.20-node dc141409; targets 0.3.21). Times UK (BST) unless marked Z.
|
||||
|
||||
The item (mission.md 2.12, invent.md 7.1): a coinbase section where a key above dust may publish its node's address; a fresh
|
||||
node dials from that list weighted by 30-day weight, beside the DNS seeds. Gate: a fresh node with genesis peers only reaches 8
|
||||
outbound from the directory; a 34 percent attacker eclipses under 0.1 percent of 1,000 fresh starts (simulation is fine); the NAT
|
||||
fraction measured on the fleet (owed to the fleet lane, asked 7 October 13:0x UK; nothing rented). Dropped if the NAT fraction
|
||||
makes the list useless: this lane reports, it does not decide.
|
||||
|
||||
## 1. What exists to build on (read before writing)
|
||||
|
||||
| Where | What | Used how |
|
||||
|---|---|---|
|
||||
| fork `consensus/core/src/finality.rs` `FinalityItem` (tags 1 vote, 2 certificate, 3 evidence, 4 leave), `encode_section` / `decode_section` (`items || len || "IGNF"` at the end of the coinbase payload), `Leave` (W7: `daa || pubkey || signature`, signed by the vote key, carried LAST so a decoder from before its tag stops at it) | the section codec and the item shape to copy | the address item is tag 5 with the same carriage rule: last, after leaves, and only once its switch is on |
|
||||
| fork `consensus/src/processes/finality.rs` `ingest_leave` (block-carried, dated by the lowest carrier), `template_candidates` / `section_from` (what a template carries), `leave_active` (switch by DAA), `FinalityState.leaves` (persisted) | the ingest, the carriage and the switch pattern | the directory is a map key hash to (address, carrier DAA), persisted in the state the same way |
|
||||
| fork `components/connectionmanager/src/lib.rs` `handle_outbound_connections` | dials from the address manager's prioritised random iterator, then the DNS seeders when connections are still missing | the directory draw goes between the two: addresses drawn by weight from the directory are fed to the address manager and dialled before the seeders are asked |
|
||||
| fork `components/addressmanager/src/lib.rs` `add_address`, `iterate_prioritized_random_addresses` (weighted by failure count and prefix bucket) | the store a dialled address lives in | directory addresses enter it like seeder answers; the weight decides which enter, the store's own rule decides the order |
|
||||
| fork `consensus/core/src/config/params.rs` `consensus_digest` (a switch at never is outside the digest; set, it is in) | the activation pattern every 0.3.16 switch follows | `peer_directory_activation_daa`, never on every network |
|
||||
|
||||
## 2. Design, as built (prototype; fork branch peer-directory-node on release-0.3.20-node dc141409, commits 0cad5106 and db28d331 (tests); repo branch peer-directory on master 819d536b, commits 9a64d18c and 3e0dfa17 (gate), pushed to origin)
|
||||
|
||||
| Item | Rule |
|
||||
|---|---|
|
||||
| Wire | `AddressAnnounce { daa, ip: [u8; 16], port, pubkey, signature }` (core `finality.rs`), 171 B, signed by the vote key the header names under `IGNEUM_ADDR_V1` over `"igneum-addr-v1/" || chain_id || 0 || daa || ip || port` |
|
||||
| Carriage | in the MINER's extra data as `IGNP || hex(body)`, the key reveal's form (`IGNA` is already the EVM payout tag), never in the finality section: no switch for carriage, a node without the tag never meets it; `igneum-miner mine --announce <ip:port>` puts one in every template of every identity (`announced`, dated at the sink's DAA score when the run began) |
|
||||
| Reading | `FinalityManager::on_block_body` at or above `peer_directory_activation_daa`: the announcement must be by the block's own key, verify, and name a routable-in-form address; one node-local entry per key, the newest carrier wins (not persisted: a restarted node refills it from the blocks it sees; a prototype's gap) |
|
||||
| Report | `ConsensusApi::peer_directory()` rows with each key's weight at the latest determined checkpoint (0 under dust); entries older than a weight window dropped on the way |
|
||||
| Draw | `ConsensusApi::peer_directory_draw(n, exclude)`: without replacement, proportional to weight, keys under dust never drawn |
|
||||
| Dialling | `ConnectionManager::handle_outbound_connections`: after the address store's own iterator and before the DNS seeders, when connections are still missing, 2 x missing addresses from the draw enter the address store and are dialled at once (`DirectoryDraw` closure wired in `protocol/flows/src/service.rs` through the consensus's blocking session) |
|
||||
| Switch | `peer_directory_activation_daa`, never on every network (the four network constants), in the digest once set, in `OverrideParams` and the 60x file |
|
||||
| Not done | the RPC that lists the directory (the harness reads `getConnectedPeerInfo` and the node log instead); persistence across restarts; Ember and the phone's use of the list (invent.md 7.1's third hour) |
|
||||
|
||||
## 3. Gate plan
|
||||
|
||||
| Gate | How |
|
||||
|---|---|
|
||||
| a fresh node with genesis peers only reaches 8 outbound from the directory | fast-time network of 10 listing nodes (each announcing its loopback address) plus one fresh node started with `--outpeers=8`, `--nodnsseed` and one `--addpeer` to a genesis peer that serves blocks only; the fresh node's `getConnectedPeerInfo` shows 8 outbound within 5 min, all from the directory |
|
||||
| a 34 percent attacker eclipses under 0.1 percent of 1,000 fresh starts | `sim/peer-directory/eclipse.py`: the draw as implemented (weighted, without replacement, 8 peers) over a table where the attacker's keys hold 34 percent of the weight and list 34 percent of the addresses; 1,000 starts; expected 1.8e-4 at 8 peers (invent.md model E); also 16 peers and the honest-majority-of-peers reading |
|
||||
| the NAT fraction | RECEIVED from the fleet lane (ac055d60427caab99) at 13:1x UK, read at 12:06Z from each standing live-devnet node's own log, nothing rented: reachable from outside 2 of 14 (hub-1, RunPod, 26611 mapped: 2,844 inbound peer connections against 86 outbound; pool-1, RunPod, mapped 4463: 1,692 against 99); not reachable 12 of 14 (every Vast box: 0 inbound peer connections each, 96 to 542 outbound, no `--externalip`, no mapped port). So 86 percent of the fleet's nodes sit behind NAT and hold their 4 to 5 peers by dialling out; the two reachable nodes carry every inbound connection. Caveat (theirs): a rented fleet overstates the NAT share for datacentre operators and understates it for home miners; a fair read for "a node started with the defaults". Left out: the four Devnet 2 pods and the Hetzner seed. The marker was "Connected to incoming peer" against "Connected to outgoing peer" (the RPC server's local accepts are not peers). |
|
||||
|
||||
## 4. Runs
|
||||
|
||||
### The eclipse simulation (`sim/peer-directory/eclipse.py`, box 2, nice 10, 13:5x to 14:0x UK)
|
||||
|
||||
The draw as implemented (without replacement, proportional to weight at the latest checkpoint), 200 honest keys with Zipf
|
||||
weights, the attacker at 34 percent of the weight split over `m` keys of equal weight, seed 7.
|
||||
|
||||
| starts | peers | attacker keys | eclipsed | rate | model E a^n | attacker majority of the peers |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 1,000 | 8 | 8 | 0 | 0 | 1.79e-4 | 4.0 percent |
|
||||
| 1,000 | 8 | 64 | 1 | 1.0e-3 | 1.79e-4 | 9.8 percent |
|
||||
| 1,000 | 8 | 1,000 | 0 | 0 | 1.79e-4 | 10.7 percent |
|
||||
| 1,000 | 16 | 8, 64, 1,000 | 0, 0, 0 | 0 | 3.19e-8 | 0, 9.2, 9.2 percent |
|
||||
| 100,000 | 8 | 8 | 0 | 0 | 1.79e-4 | 4.8 percent |
|
||||
| 100,000 | 8 | 64 | 14 | 1.4e-4 | 1.79e-4 | 10.7 percent |
|
||||
| 100,000 | 8 | 1,000 | 22 | 2.2e-4 | 1.79e-4 | 11.6 percent |
|
||||
|
||||
The gate's line (under 0.1 percent of 1,000 fresh starts) is met at 100,000 starts: 1.4e-4 and 2.2e-4, where 1,000 starts
|
||||
cannot resolve it (1 in 1,000 is exactly the line). Two readings beyond model E: with fewer attacker keys than peers an eclipse
|
||||
is impossible under the draw without replacement (the dust threshold, 100 blocks a window on mainnet, prices each attacker
|
||||
key at 100 blocks), and the attacker holds a MAJORITY of a fresh node's peers in about 11 percent of starts at 8 peers, which
|
||||
is the number that matters for a relay-level attack rather than a full eclipse; 16 peers takes that to 9 percent and the
|
||||
eclipse to zero in 1,000.
|
||||
|
||||
### Unit tests (box 2)
|
||||
|
||||
| Test | Result |
|
||||
|---|---|
|
||||
| core `address_announce_round_trips_and_verifies_under_its_key_only` | 1 of 1 |
|
||||
| node `the_peer_directory_lists_a_blocks_own_key_at_its_newest_address_only_when_switched_on` (known-failed first: the switch at never lists nothing) | 1 of 1 |
|
||||
| `cargo check -p kaspad -p igneum-miner --features kaspad/igneum-pow` on the branch | ok |
|
||||
|
||||
### The fast-time gate (box 2, `tools/fast-time-remote.sh --box 2`, binary of peer-directory-node 0cad5106, 13:27 to 13:34 UK)
|
||||
|
||||
`infra/fast-time/peer-directory.mjs`: ten listing nodes at one CPU thread each, every miner announcing its node's loopback
|
||||
p2p address, every node advertising an unroutable external ip (10.255.0.0/16) so ordinary address gossip hands a fresh node
|
||||
dead addresses only; after 200 s a fresh node starts with `--outpeers=8` and one `--addpeer` to node 0 and is watched 180 s.
|
||||
|
||||
| Case | Must | Got | Numbers |
|
||||
|---|---|---|---|
|
||||
| switch off, expect one (the known-failed case) | PASS | PASS | node 0 logged 0 listings; the fresh node held 1 outbound (node 0) for the whole watch, 0 draw lines, synced 448 blocks |
|
||||
| switch off, expect eight (the harness's own failed shape) | FAIL | FAIL | 1 outbound, 0 from the directory |
|
||||
| switch on, expect eight (THE GATE LINE) | PASS | PASS | node 0 logged 10 listings; the fresh node reached 8 outbound at 231.7 s (about 30 s after it started), 9 connections from the directory in one draw, synced 414 blocks |
|
||||
|
||||
Three harness faults on the way, each fixed: the log directory missing on the box (every case died at the redirect); the
|
||||
peer count read `isOutbound` where the fork's `RpcPeerInfo` is `is_outbound`; and the wrapper's first run checking the
|
||||
worktree root out on the box (fixed on horizon, 10140f9f, carried here).
|
||||
|
||||
## 5. Verdict line for main
|
||||
|
||||
The prototype does what invent.md 7.1 asked, on the numbers: a fresh node with one genesis peer and dead gossip reached 8
|
||||
outbound from the directory in about 30 s; the eclipse by a 34 percent attacker is 1.4e-4 to 2.2e-4 at 8 peers over 100,000
|
||||
starts (under the 0.1 percent line; 0 with 8 or fewer attacker keys, since the draw is without replacement), and the attacker
|
||||
holds a majority of a fresh node's peers in about 11 percent of starts, which is the number to watch. The NAT reading (2 of 14
|
||||
standing nodes reachable, 86 percent behind NAT with no inbound path) makes the list a SEED SUPPLEMENT, not a replacement:
|
||||
today it would list the two reachable fleet nodes beside the seeds, and a home miner's node (the 12-of-14 class unless the app
|
||||
maps a port) is a reader of the list, never a listing. Per tier: a home miner's node gains weight-backed peers beside the seeds
|
||||
at no cost and lists nothing by default; a rig or a pool node with a mapped port opts in with `--announce` and 171 bytes a block;
|
||||
the phone and Ember verify mode are not wired (not done). Listed as useful or dropped is main's and the project lead's call; this lane's
|
||||
reading is "keep as a seed supplement behind its switch", which costs 1.7 MB a day per node at 10,000 listing keys (approximate,
|
||||
from the item size) and nothing while the switch is never.
|
||||
|
||||
Open: an RPC that lists the directory; persistence across restarts; Ember and the phone; the testnet object and every network
|
||||
file carry no `peer_directory` field (the switch stays never until a cut sets it).
|
||||
|
||||
## 6. Rebase for 0.3.21 (14:0x UK, the shipper's order)
|
||||
|
||||
peer-directory-node rebased onto release-0.3.20-node c4459193 in one round, no conflict: tip 2e32d5f6, on both box mirrors under its name. Suite on build-2 at 2e32d5f6: igneum-miner 19 of 19, connectionmanager 0 tests, consensus lib 116 of 117 (the ban flake only; cargo stopped before consensus-core's target). Digest on tools/fleet/override.json: 7bd98cc4..., the same as the pin's binary. Handed to the node lane a283f5f0d364ceef0.
|
||||
|
||||
Digest on the file hub-1 runs (/root/fleet/override.json, sixteen fields, the copy at /tmp/igneum-devnet/override-v3-live.json on build-1): eada4bda8aa8368c2b2c3d17744bc7a70a0ff0e996dad681884d3ac5de1207eb, the shipper's string, read 14:1x UK from the branch binary on build-2; 7bd98cc4 was master's tools/fleet/override.json, another file. The live digest is unchanged by this branch.
|
||||
142
docs/plans/mission-item-4-fork-gate.md
Normal file
|
|
@ -0,0 +1,142 @@
|
|||
# Mission item 4: weight-gated deep fork choice, the gate (status log)
|
||||
|
||||
Lane: horizon (mission items 4 and 12), started 7 October 2026, 12:41 UK, on main's brief. Branches: `horizon` (this repo, on master
|
||||
d1285cef) and `horizon-node` (the fork, on release-0.3.20-node dc141409, the 0.3.20 line; this work targets 0.3.21). Worktrees
|
||||
`igneum-wt-horizon` and `igneum-wt-horizon/vendor/igneum-node-horizon`. Times are UK (BST) unless marked Z.
|
||||
|
||||
The item (mission.md 2.4): a tip whose fork point is older than D (10 min of past-median time) is a fork-choice candidate only
|
||||
if the keys that built it hold at least a third of the weight table at the fork point. Gate, fast time: a 51 percent fresh-key
|
||||
fork from 15 min back is refused by every honest node; a one-third-weight fork is accepted; partition heal unchanged. Known-failed
|
||||
cases first.
|
||||
|
||||
## 1. What already existed (read before writing anything)
|
||||
|
||||
| Where | What | State |
|
||||
|---|---|---|
|
||||
| fork `consensus/src/processes/finality.rs` `deep_fork_refusal`, asked by `sink_search_algorithm` for every popped candidate | the rule, behind `fork_gate_activation_daa` (never on every network; in the digest once set) with `fork_gate_window_daa` 600 s; the fork point is the highest chain ancestor of the candidate on the sink's chain; depth = the larger of sink minus fork and candidate minus fork; builders = the vote keys of every block of the candidate's chain since the fork (chain blocks and mergesets); the table = `voters_at(fork)`; refused under `3 x weight < total`; node-local memo per refused block | on the 0.3.20 line since 61b22057 (6 October), fixes 3301cf32 (depth along both chains) and aa0182aa (no extension shortcut) |
|
||||
| fork unit tests | `without_the_fork_gate_a_minor_keys_deep_fork_wins` (known-failed), `the_fork_gate_refuses_a_deep_fork_under_a_third_and_passes_the_rest` (25 percent refused, 75 percent passes, inside the window passes) | green on that line |
|
||||
| `infra/fast-time/fork-gate.mjs` on branch ca3-v4-node (never on master) | a TWO-node harness: A at 75 percent, B at 25 percent, A IDLE through the split; cases gate-on hold (PASS 23:45Z 6 Oct), gate-off reorg (PASS), gate-off hold (FAIL as it must); run on the Mac; a `pkill -f` on the devnet suffix | the record in `docs/plans/counter-asic-3-node.md` 7.5 |
|
||||
| the live devnet and Devnet 2 override files, the testnet object | no `fork_gate` field anywhere: the switch is never on every network | unchanged by this lane |
|
||||
|
||||
What the mission gate asks beyond that record: a FRESH key (0 of the table, not 25 percent), the honest side MINING through the
|
||||
split (the record idled it), EVERY honest node (two, not one), the one-third case accepted, and the partition heal shown unchanged
|
||||
with the gate on and off. Nothing in the rule needed to change for any of these; this lane adds the proof.
|
||||
|
||||
## 2. What this lane added
|
||||
|
||||
| Piece | Where | What |
|
||||
|---|---|---|
|
||||
| Fresh-key unit test | fork `a_fresh_keys_deep_fork_wins_only_with_the_gate_off` | known-failed first: at never a key with no block in the table wins by blue work; at 0 it is refused with weight 0 of the table |
|
||||
| One-third line unit test | fork `the_gate_passes_at_one_third_of_the_table_and_refuses_under_it` | eight (honest mix, fork height) pairs; each outcome equals `3 x weight >= total` read from the table the gate reads; both sides seen |
|
||||
| Three-node harness | `infra/fast-time/fork-gate.mjs` (new on master's line) | H1 and H2 honest and mining through every phase, B the third node; modes attack (B fresh, 3 of 5 threads), third (B at about half of the table), partition (H1 against H2); a reorg is read from the chain (`getVirtualChainFromBlock` of the pre-cut tip lists removed blocks), never from a key; blue work compared as BigInt; leftovers stopped by pid file |
|
||||
| The six-case runner | `infra/fast-time/fork-gate-gate.mjs` | known-failed cases first, then the gate line, the one-third case, the two partition heals; GREEN only when every case gives the verdict it must and the two heals agree |
|
||||
| Box wrapper | `tools/fast-time-remote.sh` (whole-body block; listed in `tools/ci/whole-body-check.sh`) | runs a harness on a box under a slot with a holder line and a JSONL row, the node binaries from a fork worktree's target on the box, results fetched back |
|
||||
|
||||
## 2a. The hole the known-failed cases found (13:1x to 13:3x UK)
|
||||
|
||||
The one-third unit test failed on box 2 at its second pair: B on every fourth block, fork at height 50, B holding 12 of 49 at
|
||||
the fork, and the private tip WON. A probe test (temporary, since removed) read the gate's own answer at fork heights 40, 45,
|
||||
48, 50, 55, 60 and 65: refused at 40, 48 and 60; let through at 45, 50 and 55 (65 is inside the window, a legitimate pass).
|
||||
The let-through rows read "keys 2, signed 44 of 44": the honest key A was in the attacker's builders. The pattern is the fork
|
||||
block's own key: heights that are multiples of 4 sit on B's blocks and were refused; the others sit on A's blocks and passed.
|
||||
|
||||
Cause: `collect_builders` took each chain block's mergeset (blues and reds) and GHOSTDAG's `mergeset_blues[0]` is the block's
|
||||
selected parent, so the first private block above the fork carried the FORK block into the builders, and the fork block was
|
||||
A's. A 25 percent key forking right after a 75 percent key's block walked through the gate with A's weight on its side. The
|
||||
same reading let a private chain that merges honest blocks as side parents inherit every merged key. The 6 October harness
|
||||
PASS (23:45Z) was luck: its pre-cut sink was B-built, so the leaked key was B's own.
|
||||
|
||||
Fix (fork, `collect_builders(block, sink, keys)`): a builder is the key of a block the sink does NOT have (not a DAG ancestor
|
||||
of the sink, the sink itself included). The fork block is the sink's; honest blocks the attacker merged are the sink's; a
|
||||
partition side's own blocks are not, so a heal is unchanged. New unit test, known-failed shape first:
|
||||
`a_deep_fork_counts_only_the_blocks_the_sink_lacks_as_builders` (B from A's block at 45 refused; a private chain merging
|
||||
honest blocks 46 to 80 wins at never and is refused at 0).
|
||||
|
||||
Also seen: `ban_is_decided_by_the_carrying_block_so_nodes_agree_on_every_voter_list` died with `UnexpectedDifficulty` in the
|
||||
full crate run (box 2 under load 65) and passed alone (1 of 1, 13:1x UK); not this lane's change, noted for the suite count.
|
||||
|
||||
## 3. Runs
|
||||
|
||||
### Commits
|
||||
|
||||
| Repo | Branch | Commit | What |
|
||||
|---|---|---|---|
|
||||
| fork | horizon-node (on release-0.3.20-node dc141409) | eb32d2e0 | the builders fix (`collect_builders` skips every block the sink has) and the fork-gate tests on the two-instance lab |
|
||||
| fork | horizon-node | a6a71ac2 | the lab inserts into the judge first and rebuilds a block refused on `UnexpectedDifficulty` (the suite's flake class) |
|
||||
| repo | horizon (on master d1285cef) | 0dc2adff | the three-node harness, the six-case runner, the box wrapper, the whole-body check row |
|
||||
|
||||
### Suites (box 2, igneum-build-2, nice 10 on 32 cores)
|
||||
|
||||
| Run (UK) | Command | Result |
|
||||
|---|---|---|
|
||||
| 12:5x | `-- test --release -p kaspa-consensus` (the first test version, no fix) | 111 of 113: my one-third test FAIL (the hole), `ban_is_decided_by_the_carrying_block...` FAIL on `UnexpectedDifficulty` (load 65; passes alone 13:1x, 1 of 1) |
|
||||
| 13:2x | `-- test --release -p kaspa-consensus --lib processes::finality::tests` (the fix, the lab) | 24 of 24 |
|
||||
| 13:3x | `-- test --release -p kaspa-consensus` (eb32d2e0 content) | 112 of 114: two lab tests FAIL on `UnexpectedDifficulty` (the same flake class, now reachable by the lab's second instance) |
|
||||
| 13:3x | `-- test --release -p kaspa-consensus` at a6a71ac2, 0dcaf4c5, ca7acb99 (the lab's rebuild, a pause between rebuilds, salted hashes) | 111 or 112 of 114 each: the two labs whose instances share one config still FAIL at block 61 under load; the probes showed `UnexpectedDifficulty` thirty times over 7.5 s, so neither clock nor hash memo |
|
||||
| 13:38 | `-- test --release -p kaspa-consensus` at 6eb21fc9 (the lab on `DifficultyRule::KaspaSampled`, DAG-only bits) | 113 of 114 in the lib target, 3 ignored; the one FAIL is the pre-existing `ban_is_decided_by_the_carrying_block_so_nodes_agree_on_every_voter_list` (the same class: the dual rule's template bits and header stamp disagree at block 61, the first retarget, under load; passes alone). The lib target failing stops cargo before the integration targets. |
|
||||
|
||||
Fork commits after eb32d2e0, test-only: a6a71ac2, 0dcaf4c5, ca7acb99, f225ed9f, 6eb21fc9 (the lab inserts into the judge first and rebuilds on the flake; a pause between rebuilds; every lab its own hash words; the DAG-only difficulty rule; the import). The binary content of kaspad and igneum-miner is the same from eb32d2e0 on; the gate binary carries 6eb21fc9.
|
||||
|
||||
### Build (box 1, igneum-build-1)
|
||||
|
||||
| Run (UK) | Command | Result |
|
||||
|---|---|---|
|
||||
| (pending) | `tools/build-remote.sh --no-fetch -- build --release -p kaspad -p igneum-miner --features kaspad/igneum-pow` from the fork worktree at a6a71ac2 (igneum-pow at 8c728ca3 through an untracked paths override to `igneum-pow-amend`, the 0.3.20 pairing); two earlier submissions of the uncommitted tree were stopped by pid so the gate binary carries the commit | |
|
||||
|
||||
### Tree checks (the Mac, checks only)
|
||||
|
||||
`tools/ci/pre-push.sh --ci` on horizon 0dc2adff: GREEN, 43 checks in 31 s (13:3x UK).
|
||||
|
||||
### The gate (box 2, igneum-build-2, by main's word at 13:4x UK: box 1's slots stay with the 0.3.20 pin)
|
||||
|
||||
Binary: `igneumd` and `igneum-miner` of horizon-node 6eb21fc9 (igneum-pow 8c728ca3), built on box 2 at 13:5x UK
|
||||
(`tools/build-remote.sh --box 2`, 113 s); run through `tools/fast-time-remote.sh --box 2` (one slot, the bounded class, 583 s
|
||||
for the six cases side by side), case summaries and logs in `docs/plans/mission-item-4-gate/`. Window 60 DAA, joint 240 s,
|
||||
split 180 s, watch 150 s; honest nodes H1 and H2 at one CPU thread each through every phase; the attacker at 3 threads in
|
||||
the split (60 percent of the CPU hash: the refusal reads weight, not how much heavier the chain is).
|
||||
|
||||
| Case | Must | Got | Side 2 at the fork | Fork depth (DAA) | Blue work at the heal, side 2 against H1 | Honest nodes after the heal |
|
||||
|---|---|---|---|---|---|---|
|
||||
| attack, gate off, expect reorg (the rule's known-failed case) | PASS | PASS | 0 bps (fresh key) | 191 | 17,470,131 against 14,893,198 | H1 and H2 reorged at 510 s, 0 refusal lines |
|
||||
| attack, gate off, expect hold (the harness's own failed shape) | FAIL | FAIL | 0 bps | 179 | 19,683,187 against 17,459,678 | H1 and H2 reorged at 480 s, 0 refusal lines |
|
||||
| attack, gate on, expect hold (THE GATE LINE) | PASS | PASS | 0 bps | 197 | 20,297,242 against 14,807,915 | H1 and H2 HELD for the whole watch, 177 refusal lines each, both know side 2's tip; side 2 kept its chain |
|
||||
| third, gate on, expect reorg (a one-third-weight fork accepted) | PASS | PASS | 6,000 bps | 166 | 28,969,222 against 24,628,833 | H1 and H2 reorged at 477 s, 0 refusal lines |
|
||||
| partition, gate on, expect reorg | PASS | PASS | 3,719 bps | 194 | 18,089,683 against 11,490,863 | H1 reorged at 507 s, 0 refusal lines; H2 kept its chain |
|
||||
| partition, gate off, expect reorg (the same outcome) | PASS | PASS | 5,583 bps | 191 | 19,576,159 against 12,270,631 | H1 reorged at 507 s, 0 refusal lines; H2 kept its chain |
|
||||
|
||||
GATE GREEN, 13:58 UK: 6 of 6 cases gave the verdict they must; the partition heal is the same with the gate on and off
|
||||
(both reorg H1 onto the heavier side, 0 refusals). Reading "15 min back" at fast time: the devnet window is 600 s and the
|
||||
mission's 15 min is one and a half windows; the harness keeps the window at 60 DAA and the split at 180 s, three windows
|
||||
deep, so the refusal was asked from 61 s of the split on and held for its whole second half.
|
||||
|
||||
## 4. Consequences per tier
|
||||
|
||||
One sentence: with the fix, a renter's or a chain-splitter's deep reorg is bounded by weight for every tier alike, and an
|
||||
honest key's own blocks are never refused.
|
||||
|
||||
| Tier | What the number means |
|
||||
|---|---|
|
||||
| Home miner (one card, any size, Windows, Linux or macOS, any vendor) | its node refuses the same tips a rig's or a pool's node refuses; a fresh-key chain from more than ten minutes back never becomes its sink while the key that built it holds under a third of the window; nothing to configure, nothing to pay; the memo costs one mergeset per refused block |
|
||||
| Rig | the same; a rig's own blocks after a connectivity gap are built by its own keys and pass on share |
|
||||
| Pool user | the pool's node holds the chain the pool mined; a renter cannot reorganise the pool's payouts past ten minutes without a third of the weight |
|
||||
| Exchange and holder | a 12-hour double spend during a pause or in the first month (51-percent.md section 5 rank 2, USD 146 at 1 GH/s) is gone: the deep fork is refused at every honest node, lock or no lock |
|
||||
| The rule's cost | none for certificates; a partition side under a third cannot reorg the other past the window (the intended outcome, unchanged by the fix) |
|
||||
|
||||
Before the fix the bound held only when the fork sat on a block of a small key; a renter forking right after a large
|
||||
miner's block, or merging honest blocks into its chain, walked through on every tier.
|
||||
|
||||
## 5. Open
|
||||
|
||||
| Item | Owner |
|
||||
|---|---|
|
||||
| Merge: horizon-node is on release-0.3.20-node dc141409; main's word is to rebase onto the 0.3.20 pin once named (c4459193 the candidate) for 0.3.21; never a push to a release branch | this lane, when main names the pin |
|
||||
| The difficulty red: `ban_is_decided_by_the_carrying_block...` and, before the lab moved to the DAG-only rule, two lab tests, on `UnexpectedDifficulty` at block 61 (the first retarget) under the full suite's load; the dual rule's template bits come from a virtual resolved at one instant and the header is stamped at a later one | the node lane for 0.3.21 (main's word: logged, not fixed here) |
|
||||
| The fork's test block builder asks the gate (it runs the sink search from the parents it is given): any future test that builds a private chain on a gated instance builds it on the fork block instead; the lab's two-instance shape is the pattern | the node lane; a note in `consensus/src/consensus/test_consensus.rs` is owed |
|
||||
| `tools/box` named in the brief does not exist; the box tooling is `tools/build-remote.sh` on `infra/build-server/lib.sh`, which `tools/fast-time-remote.sh` uses; the wrapper's first run checked the worktree root out on box 2 and took the fork sources with it (fixed the same hour: overlay only, 10140f9f) | main's reading |
|
||||
| The devnet, Devnet 2 and the testnet object carry no `fork_gate` field: the switch stays never everywhere until a cut sets it (in the digest once set) | the shipper and the project lead |
|
||||
|
||||
## 6. Rebase for 0.3.21 (14:0x UK, the shipper's order)
|
||||
|
||||
horizon-node rebased onto release-0.3.20-node c4459193 (the 0.3.20 pin) in one round, no conflict: tip 437f0438, on both box mirrors under its name. Suite on build-2 at 437f0438: `-p kaspa-consensus` lib 117 of 119, 3 ignored (the ban difficulty flake and `a_chain_that_misses_an_adopted_lock_never_locks_here`, which passes alone 1 of 1 and passed in every earlier full run; load 113). Digest on tools/fleet/override.json (origin/master): 7bd98cc4..., the same as the pin's own binary on that file. Handed to the node lane a283f5f0d364ceef0 for the 0.3.21 merge after 55768f88, miner-reliability-20 and pool-finish-node.
|
||||
|
||||
Digest on the file hub-1 runs (/root/fleet/override.json, sixteen fields, the copy at /tmp/igneum-devnet/override-v3-live.json on build-1): eada4bda8aa8368c2b2c3d17744bc7a70a0ff0e996dad681884d3ac5de1207eb, the shipper's string, read 14:1x UK from the branch binary on build-2; 7bd98cc4 was master's tools/fleet/override.json, another file. The live digest is unchanged by this branch.
|
||||
|
|
@ -0,0 +1,933 @@
|
|||
{
|
||||
"pass": false,
|
||||
"expect": "hold",
|
||||
"case": "attack-gate-off-expect-hold",
|
||||
"mode": "attack",
|
||||
"gate": "off",
|
||||
"window": 60,
|
||||
"joint": 240,
|
||||
"split": 180,
|
||||
"watch": 150,
|
||||
"threads": {
|
||||
"honest_each": 1,
|
||||
"attacker_split": 3,
|
||||
"attacker_joint": 0
|
||||
},
|
||||
"keys": {
|
||||
"h1": "8da9ddee…",
|
||||
"h2": "eda9cde4…",
|
||||
"side2": "0e2c6fe2…"
|
||||
},
|
||||
"share_at_fork": {
|
||||
"side2": 0,
|
||||
"others": 120,
|
||||
"side2_bps": 0
|
||||
},
|
||||
"fork_daa": 247,
|
||||
"fork_depth_daa_at_heal": 179,
|
||||
"sinks": {
|
||||
"joint": {
|
||||
"h1": {
|
||||
"hash": "0535d8ae67287238ee528bae5ab1f366273bd1c65c6a94342ec3879a40b81c88",
|
||||
"blocks": 248,
|
||||
"daa": 247,
|
||||
"blue": 248,
|
||||
"blueWork": "11209205",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "0535d8ae67287238ee528bae5ab1f366273bd1c65c6a94342ec3879a40b81c88",
|
||||
"blocks": 248,
|
||||
"daa": 247,
|
||||
"blue": 248,
|
||||
"blueWork": "11209205",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "0535d8ae67287238ee528bae5ab1f366273bd1c65c6a94342ec3879a40b81c88",
|
||||
"blocks": 248,
|
||||
"daa": 247,
|
||||
"blue": 248,
|
||||
"blueWork": "11209205",
|
||||
"key": "8da9ddee…"
|
||||
}
|
||||
},
|
||||
"split": {
|
||||
"h1": {
|
||||
"hash": "d5347d2cd3468901fda8e5a1caffe0be55d45eb12739577fadb0141d2291c2ba",
|
||||
"blocks": 412,
|
||||
"daa": 411,
|
||||
"blue": 412,
|
||||
"blueWork": "17459678",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "d5347d2cd3468901fda8e5a1caffe0be55d45eb12739577fadb0141d2291c2ba",
|
||||
"blocks": 412,
|
||||
"daa": 411,
|
||||
"blue": 412,
|
||||
"blueWork": "17459678",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "bfdb75e384417228a85f4098f8f2bb65d40c271ce674bea2d1cc8a3c6c335f53",
|
||||
"blocks": 427,
|
||||
"daa": 426,
|
||||
"blue": 427,
|
||||
"blueWork": "19683187",
|
||||
"key": "0e2c6fe2…"
|
||||
}
|
||||
}
|
||||
},
|
||||
"per_node": {
|
||||
"h1": {
|
||||
"held": false,
|
||||
"reorged": true,
|
||||
"reorg_at_s": 480.3,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 0
|
||||
},
|
||||
"h2": {
|
||||
"held": false,
|
||||
"reorged": true,
|
||||
"reorg_at_s": 480.3,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 0
|
||||
}
|
||||
},
|
||||
"checks": {
|
||||
"side2_under_a_third_at_fork": true,
|
||||
"fork_deeper_than_window": true,
|
||||
"side2_heavier_at_heal": true,
|
||||
"every_honest_node_learned_side2_chain": true,
|
||||
"every_honest_node_held": false,
|
||||
"every_honest_node_reorged": true,
|
||||
"every_honest_node_logged_a_refusal": false,
|
||||
"no_honest_node_logged_a_refusal": true,
|
||||
"side2_kept_its_chain": true
|
||||
},
|
||||
"failed_checks": [
|
||||
"every_honest_node_held",
|
||||
"every_honest_node_logged_a_refusal"
|
||||
],
|
||||
"refusal_example": null,
|
||||
"samples": [
|
||||
{
|
||||
"t": 425.2,
|
||||
"h1": {
|
||||
"blocks": 416,
|
||||
"sink": "7b85c0879ec1a3f0",
|
||||
"daa": 414,
|
||||
"blue": 415,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 416,
|
||||
"sink": "7b85c0879ec1a3f0",
|
||||
"daa": 414,
|
||||
"blue": 415,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 435,
|
||||
"sink": "8bb7e69cea95ecaa",
|
||||
"blue": 435,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 430.2,
|
||||
"h1": {
|
||||
"blocks": 423,
|
||||
"sink": "44ee221996bf6519",
|
||||
"daa": 422,
|
||||
"blue": 423,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 423,
|
||||
"sink": "44ee221996bf6519",
|
||||
"daa": 422,
|
||||
"blue": 423,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 441,
|
||||
"sink": "46ee56ca78abcfa4",
|
||||
"blue": 441,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 435.2,
|
||||
"h1": {
|
||||
"blocks": 430,
|
||||
"sink": "fe81d0b598b34760",
|
||||
"daa": 429,
|
||||
"blue": 430,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 430,
|
||||
"sink": "fe81d0b598b34760",
|
||||
"daa": 429,
|
||||
"blue": 430,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 445,
|
||||
"sink": "bf71c714df908384",
|
||||
"blue": 445,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 440.2,
|
||||
"h1": {
|
||||
"blocks": 440,
|
||||
"sink": "acab21ca95900afc",
|
||||
"daa": 439,
|
||||
"blue": 440,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 440,
|
||||
"sink": "acab21ca95900afc",
|
||||
"daa": 439,
|
||||
"blue": 440,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 448,
|
||||
"sink": "b8fccb90e479e8a5",
|
||||
"blue": 448,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 445.3,
|
||||
"h1": {
|
||||
"blocks": 443,
|
||||
"sink": "d9051d6139ae8afa",
|
||||
"daa": 442,
|
||||
"blue": 443,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 443,
|
||||
"sink": "d9051d6139ae8afa",
|
||||
"daa": 442,
|
||||
"blue": 443,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 456,
|
||||
"sink": "2cc48c7a2084d5e4",
|
||||
"blue": 456,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 450.3,
|
||||
"h1": {
|
||||
"blocks": 450,
|
||||
"sink": "cea4dc9c673bd13a",
|
||||
"daa": 449,
|
||||
"blue": 450,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 450,
|
||||
"sink": "cea4dc9c673bd13a",
|
||||
"daa": 449,
|
||||
"blue": 450,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 466,
|
||||
"sink": "4f46263c45d1d32a",
|
||||
"blue": 466,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 455.3,
|
||||
"h1": {
|
||||
"blocks": 452,
|
||||
"sink": "1a8679962a368c21",
|
||||
"daa": 451,
|
||||
"blue": 452,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 452,
|
||||
"sink": "1a8679962a368c21",
|
||||
"daa": 451,
|
||||
"blue": 452,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 472,
|
||||
"sink": "12dcc825edc2fa17",
|
||||
"blue": 472,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 460.3,
|
||||
"h1": {
|
||||
"blocks": 454,
|
||||
"sink": "2a7c0240cfe56042",
|
||||
"daa": 453,
|
||||
"blue": 454,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 454,
|
||||
"sink": "2a7c0240cfe56042",
|
||||
"daa": 453,
|
||||
"blue": 454,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 480,
|
||||
"sink": "bbb6cf12cfd7419f",
|
||||
"blue": 480,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 465.3,
|
||||
"h1": {
|
||||
"blocks": 454,
|
||||
"sink": "2a7c0240cfe56042",
|
||||
"daa": 453,
|
||||
"blue": 454,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 454,
|
||||
"sink": "2a7c0240cfe56042",
|
||||
"daa": 453,
|
||||
"blue": 454,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 488,
|
||||
"sink": "f443140c40db1ff4",
|
||||
"blue": 488,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 470.3,
|
||||
"h1": {
|
||||
"blocks": 456,
|
||||
"sink": "2c2bf05b3992cb6b",
|
||||
"daa": 455,
|
||||
"blue": 456,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 456,
|
||||
"sink": "2c2bf05b3992cb6b",
|
||||
"daa": 455,
|
||||
"blue": 456,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 493,
|
||||
"sink": "0dd0e90fa5bb4330",
|
||||
"blue": 493,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 475.3,
|
||||
"h1": {
|
||||
"blocks": 458,
|
||||
"sink": "cde3915508aeb008",
|
||||
"daa": 457,
|
||||
"blue": 458,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 458,
|
||||
"sink": "cde3915508aeb008",
|
||||
"daa": 457,
|
||||
"blue": 458,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 496,
|
||||
"sink": "7adc2714fa7a10c9",
|
||||
"blue": 496,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 480.3,
|
||||
"h1": {
|
||||
"blocks": 505,
|
||||
"sink": "f08f99c6711510d7",
|
||||
"daa": 504,
|
||||
"blue": 505,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 505,
|
||||
"sink": "f08f99c6711510d7",
|
||||
"daa": 504,
|
||||
"blue": 505,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 505,
|
||||
"sink": "f08f99c6711510d7",
|
||||
"blue": 505,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 485.3,
|
||||
"h1": {
|
||||
"blocks": 509,
|
||||
"sink": "9dfb826d38e1f6a4",
|
||||
"daa": 508,
|
||||
"blue": 509,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 509,
|
||||
"sink": "9dfb826d38e1f6a4",
|
||||
"daa": 508,
|
||||
"blue": 509,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 509,
|
||||
"sink": "9dfb826d38e1f6a4",
|
||||
"blue": 509,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 490.4,
|
||||
"h1": {
|
||||
"blocks": 511,
|
||||
"sink": "a9bdeeb2148190f1",
|
||||
"daa": 510,
|
||||
"blue": 511,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 511,
|
||||
"sink": "a9bdeeb2148190f1",
|
||||
"daa": 510,
|
||||
"blue": 511,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 511,
|
||||
"sink": "a9bdeeb2148190f1",
|
||||
"blue": 511,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 495.4,
|
||||
"h1": {
|
||||
"blocks": 522,
|
||||
"sink": "fa5aefefc31e1c4c",
|
||||
"daa": 521,
|
||||
"blue": 522,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 522,
|
||||
"sink": "fa5aefefc31e1c4c",
|
||||
"daa": 521,
|
||||
"blue": 522,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 522,
|
||||
"sink": "fa5aefefc31e1c4c",
|
||||
"blue": 522,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 500.4,
|
||||
"h1": {
|
||||
"blocks": 525,
|
||||
"sink": "3f659b8355cf6fb8",
|
||||
"daa": 524,
|
||||
"blue": 525,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 525,
|
||||
"sink": "3f659b8355cf6fb8",
|
||||
"daa": 524,
|
||||
"blue": 525,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 525,
|
||||
"sink": "3f659b8355cf6fb8",
|
||||
"blue": 525,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 505.4,
|
||||
"h1": {
|
||||
"blocks": 528,
|
||||
"sink": "2b00a2431aecf64d",
|
||||
"daa": 527,
|
||||
"blue": 528,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 528,
|
||||
"sink": "2b00a2431aecf64d",
|
||||
"daa": 527,
|
||||
"blue": 528,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 528,
|
||||
"sink": "2b00a2431aecf64d",
|
||||
"blue": 528,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 510.4,
|
||||
"h1": {
|
||||
"blocks": 534,
|
||||
"sink": "f10f202f1b8adf79",
|
||||
"daa": 533,
|
||||
"blue": 534,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 534,
|
||||
"sink": "f10f202f1b8adf79",
|
||||
"daa": 533,
|
||||
"blue": 534,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 534,
|
||||
"sink": "f10f202f1b8adf79",
|
||||
"blue": 534,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 515.4,
|
||||
"h1": {
|
||||
"blocks": 541,
|
||||
"sink": "d70cd34944d6d565",
|
||||
"daa": 540,
|
||||
"blue": 541,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 541,
|
||||
"sink": "d70cd34944d6d565",
|
||||
"daa": 540,
|
||||
"blue": 541,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 541,
|
||||
"sink": "d70cd34944d6d565",
|
||||
"blue": 541,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 520.4,
|
||||
"h1": {
|
||||
"blocks": 546,
|
||||
"sink": "35d62b928d603bac",
|
||||
"daa": 545,
|
||||
"blue": 546,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 546,
|
||||
"sink": "35d62b928d603bac",
|
||||
"daa": 545,
|
||||
"blue": 546,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 546,
|
||||
"sink": "35d62b928d603bac",
|
||||
"blue": 546,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 525.4,
|
||||
"h1": {
|
||||
"blocks": 552,
|
||||
"sink": "11ee723145434436",
|
||||
"daa": 551,
|
||||
"blue": 552,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 552,
|
||||
"sink": "11ee723145434436",
|
||||
"daa": 551,
|
||||
"blue": 552,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 552,
|
||||
"sink": "11ee723145434436",
|
||||
"blue": 552,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 530.4,
|
||||
"h1": {
|
||||
"blocks": 561,
|
||||
"sink": "096fe4e02ba023a4",
|
||||
"daa": 560,
|
||||
"blue": 561,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 561,
|
||||
"sink": "096fe4e02ba023a4",
|
||||
"daa": 560,
|
||||
"blue": 561,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 561,
|
||||
"sink": "096fe4e02ba023a4",
|
||||
"blue": 561,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 535.4,
|
||||
"h1": {
|
||||
"blocks": 566,
|
||||
"sink": "58b6d24c4920da55",
|
||||
"daa": 565,
|
||||
"blue": 566,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 566,
|
||||
"sink": "58b6d24c4920da55",
|
||||
"daa": 565,
|
||||
"blue": 566,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 566,
|
||||
"sink": "58b6d24c4920da55",
|
||||
"blue": 566,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 540.4,
|
||||
"h1": {
|
||||
"blocks": 567,
|
||||
"sink": "3a757d2721963b97",
|
||||
"daa": 566,
|
||||
"blue": 567,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 567,
|
||||
"sink": "3a757d2721963b97",
|
||||
"daa": 566,
|
||||
"blue": 567,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 567,
|
||||
"sink": "3a757d2721963b97",
|
||||
"blue": 567,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 545.4,
|
||||
"h1": {
|
||||
"blocks": 572,
|
||||
"sink": "40cb1b5ff6ffa6e2",
|
||||
"daa": 571,
|
||||
"blue": 572,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 572,
|
||||
"sink": "40cb1b5ff6ffa6e2",
|
||||
"daa": 571,
|
||||
"blue": 572,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 572,
|
||||
"sink": "40cb1b5ff6ffa6e2",
|
||||
"blue": 572,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 550.4,
|
||||
"h1": {
|
||||
"blocks": 577,
|
||||
"sink": "e3f1416a5521d05a",
|
||||
"daa": 576,
|
||||
"blue": 577,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 577,
|
||||
"sink": "e3f1416a5521d05a",
|
||||
"daa": 576,
|
||||
"blue": 577,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 577,
|
||||
"sink": "e3f1416a5521d05a",
|
||||
"blue": 577,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 555.5,
|
||||
"h1": {
|
||||
"blocks": 584,
|
||||
"sink": "38b6a8056ad74b9d",
|
||||
"daa": 583,
|
||||
"blue": 584,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 584,
|
||||
"sink": "38b6a8056ad74b9d",
|
||||
"daa": 583,
|
||||
"blue": 584,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 584,
|
||||
"sink": "38b6a8056ad74b9d",
|
||||
"blue": 584,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 560.5,
|
||||
"h1": {
|
||||
"blocks": 589,
|
||||
"sink": "69c3e39a47332124",
|
||||
"daa": 588,
|
||||
"blue": 589,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 589,
|
||||
"sink": "69c3e39a47332124",
|
||||
"daa": 588,
|
||||
"blue": 589,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 589,
|
||||
"sink": "69c3e39a47332124",
|
||||
"blue": 589,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 565.5,
|
||||
"h1": {
|
||||
"blocks": 592,
|
||||
"sink": "6fe943b09aa71ffa",
|
||||
"daa": 591,
|
||||
"blue": 592,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 592,
|
||||
"sink": "6fe943b09aa71ffa",
|
||||
"daa": 591,
|
||||
"blue": 592,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 592,
|
||||
"sink": "6fe943b09aa71ffa",
|
||||
"blue": 592,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 570.5,
|
||||
"h1": {
|
||||
"blocks": 595,
|
||||
"sink": "b5217027de64f1a2",
|
||||
"daa": 594,
|
||||
"blue": 595,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 595,
|
||||
"sink": "b5217027de64f1a2",
|
||||
"daa": 594,
|
||||
"blue": 595,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 595,
|
||||
"sink": "b5217027de64f1a2",
|
||||
"blue": 595,
|
||||
"reorged": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"node": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneumd",
|
||||
"miner": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneum-miner",
|
||||
"slot": 1,
|
||||
"ports": {
|
||||
"base": 30730,
|
||||
"suffix": 981
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
12:48:26.701 fg1 case attack-gate-off-expect-hold: mode attack, gate off (window 60 DAA), joint 240 s, split 180 s, watch 150 s, honest 1 thread(s) each, attacker 3 (joint 0), expect hold
|
||||
12:48:28.281 fg1 h1 up pid 480222 json 30732 p2p 30731
|
||||
12:48:29.791 fg1 h2 up pid 481550 json 30742 p2p 30741 addpeer 30731
|
||||
12:48:31.307 fg1 b up pid 482808 json 30752 p2p 30751 addpeer 30761,30762
|
||||
12:52:34.325 fg1 phase 1 done at 240.0 s: H1 248 blocks sink 0535d8ae daa 247; H2 248 sink 0535d8ae; side 2 (b) 248 sink 0535d8ae; keys H1 8da9ddee H2 eda9cde4 side2 fresh (none yet)
|
||||
12:52:34.384 fg1 weight at the fork (last 120 blue blocks of H1's chain): side 2 0, others 120, side 2 0 bps
|
||||
12:52:34.387 fg1 links cut at 240.1 s; side 2 (b) now mines with 3 thread(s), the honest side with 1 each
|
||||
12:55:34.491 fg1 phase 2 done at 420.2 s: H1 412 blocks sink d5347d2c daa 411 blue 412 work 17459678; side 2 427 sink bfdb75e3 daa 426 blue 427 work 19683187 (side 2 heavier: true); fork depth 179 DAA against window 60
|
||||
12:55:34.491 fg1 links restored at 420.2 s; watching H1 and H2 for 150 s
|
||||
12:56:04.581 fg1 t=450.3 s H1 450 blocks sink cea4dc9c held; H2 450 blocks sink cea4dc9c held; side 2 466 blocks sink 4f46263c
|
||||
12:56:34.656 fg1 H1 left its pre-cut chain at 480.3 s: sink f08f99c6711510d7 by 0e2c6fe2
|
||||
12:56:34.659 fg1 H2 left its pre-cut chain at 480.3 s: sink f08f99c6711510d7 by 0e2c6fe2
|
||||
12:56:34.661 fg1 t=480.3 s H1 505 blocks sink f08f99c6 REORGED; H2 505 blocks sink f08f99c6 REORGED; side 2 505 blocks sink f08f99c6
|
||||
12:57:04.702 fg1 t=510.4 s H1 534 blocks sink f10f202f REORGED; H2 534 blocks sink f10f202f REORGED; side 2 534 blocks sink f10f202f
|
||||
12:57:34.751 fg1 t=540.4 s H1 567 blocks sink 3a757d27 REORGED; H2 567 blocks sink 3a757d27 REORGED; side 2 567 blocks sink 3a757d27
|
||||
12:58:04.813 fg1 t=570.5 s H1 595 blocks sink b5217027 REORGED; H2 595 blocks sink b5217027 REORGED; side 2 595 blocks sink b5217027
|
||||
12:58:04.825 fg1 SUMMARY FAIL (attack-gate-off-expect-hold): side 2 held 0 bps of the blue blocks at the fork; fork depth 179 DAA against window 60; side 2 blue work 19683187 against H1 17459678 at the heal; H1 reorged at 480.3 s (0 refusal lines, knows side 2's tip: true); H2 reorged at 480.3 s (0 refusal lines, knows side 2's tip: true); side 2 kept its chain: true; FAILED CHECK every_honest_node_held, every_honest_node_logged_a_refusal
|
||||
12:58:04.825 fg1 summary: /srv/builds/igneum-wt-horizon/docs/plans/mission-item-4-gate/fork-gate-attack-gate-off-expect-hold.json
|
||||
|
|
@ -0,0 +1,930 @@
|
|||
{
|
||||
"pass": true,
|
||||
"expect": "reorg",
|
||||
"case": "attack-gate-off-expect-reorg",
|
||||
"mode": "attack",
|
||||
"gate": "off",
|
||||
"window": 60,
|
||||
"joint": 240,
|
||||
"split": 180,
|
||||
"watch": 150,
|
||||
"threads": {
|
||||
"honest_each": 1,
|
||||
"attacker_split": 3,
|
||||
"attacker_joint": 0
|
||||
},
|
||||
"keys": {
|
||||
"h1": "8da9ddee…",
|
||||
"h2": "eda9cde4…",
|
||||
"side2": "0e2c6fe2…"
|
||||
},
|
||||
"share_at_fork": {
|
||||
"side2": 0,
|
||||
"others": 120,
|
||||
"side2_bps": 0
|
||||
},
|
||||
"fork_daa": 240,
|
||||
"fork_depth_daa_at_heal": 191,
|
||||
"sinks": {
|
||||
"joint": {
|
||||
"h1": {
|
||||
"hash": "e66998c63f8f5d2f3f9108a5c61730f3d5ee06a0553f47e3bce314a0e4d7228e",
|
||||
"blocks": 242,
|
||||
"daa": 240,
|
||||
"blue": 241,
|
||||
"blueWork": "8689541",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "e66998c63f8f5d2f3f9108a5c61730f3d5ee06a0553f47e3bce314a0e4d7228e",
|
||||
"blocks": 242,
|
||||
"daa": 240,
|
||||
"blue": 241,
|
||||
"blueWork": "8689541",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "e66998c63f8f5d2f3f9108a5c61730f3d5ee06a0553f47e3bce314a0e4d7228e",
|
||||
"blocks": 242,
|
||||
"daa": 240,
|
||||
"blue": 241,
|
||||
"blueWork": "8689541",
|
||||
"key": "8da9ddee…"
|
||||
}
|
||||
},
|
||||
"split": {
|
||||
"h1": {
|
||||
"hash": "6e932c389f2ad01a39873317f9549f0a336e66a7c840669dd5bcb44a979a19ad",
|
||||
"blocks": 421,
|
||||
"daa": 420,
|
||||
"blue": 421,
|
||||
"blueWork": "14893198",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "6e932c389f2ad01a39873317f9549f0a336e66a7c840669dd5bcb44a979a19ad",
|
||||
"blocks": 421,
|
||||
"daa": 420,
|
||||
"blue": 421,
|
||||
"blueWork": "14893198",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "d93a1238a397f68337f4bc28d6197a61a32fbca176f3e7f4248b6b330e239cc8",
|
||||
"blocks": 432,
|
||||
"daa": 431,
|
||||
"blue": 432,
|
||||
"blueWork": "17470131",
|
||||
"key": "0e2c6fe2…"
|
||||
}
|
||||
}
|
||||
},
|
||||
"per_node": {
|
||||
"h1": {
|
||||
"held": false,
|
||||
"reorged": true,
|
||||
"reorg_at_s": 510.4,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 0
|
||||
},
|
||||
"h2": {
|
||||
"held": false,
|
||||
"reorged": true,
|
||||
"reorg_at_s": 510.4,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 0
|
||||
}
|
||||
},
|
||||
"checks": {
|
||||
"side2_under_a_third_at_fork": true,
|
||||
"fork_deeper_than_window": true,
|
||||
"side2_heavier_at_heal": true,
|
||||
"every_honest_node_learned_side2_chain": true,
|
||||
"every_honest_node_held": false,
|
||||
"every_honest_node_reorged": true,
|
||||
"every_honest_node_logged_a_refusal": false,
|
||||
"no_honest_node_logged_a_refusal": true,
|
||||
"side2_kept_its_chain": true
|
||||
},
|
||||
"failed_checks": [],
|
||||
"refusal_example": null,
|
||||
"samples": [
|
||||
{
|
||||
"t": 425.2,
|
||||
"h1": {
|
||||
"blocks": 426,
|
||||
"sink": "719c3c11c14e54ed",
|
||||
"daa": 425,
|
||||
"blue": 426,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 426,
|
||||
"sink": "719c3c11c14e54ed",
|
||||
"daa": 425,
|
||||
"blue": 426,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 438,
|
||||
"sink": "c704e731f479e045",
|
||||
"blue": 438,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 430.2,
|
||||
"h1": {
|
||||
"blocks": 432,
|
||||
"sink": "fe308e06a3529e00",
|
||||
"daa": 431,
|
||||
"blue": 432,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 432,
|
||||
"sink": "fe308e06a3529e00",
|
||||
"daa": 431,
|
||||
"blue": 432,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 442,
|
||||
"sink": "7ca72d6ee8a28b46",
|
||||
"blue": 442,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 435.2,
|
||||
"h1": {
|
||||
"blocks": 436,
|
||||
"sink": "ba7e8b5f41caf493",
|
||||
"daa": 435,
|
||||
"blue": 436,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 436,
|
||||
"sink": "ba7e8b5f41caf493",
|
||||
"daa": 435,
|
||||
"blue": 436,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 446,
|
||||
"sink": "5459e40a1e9137e0",
|
||||
"blue": 446,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 440.2,
|
||||
"h1": {
|
||||
"blocks": 438,
|
||||
"sink": "19432a8a37b593ad",
|
||||
"daa": 437,
|
||||
"blue": 438,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 438,
|
||||
"sink": "19432a8a37b593ad",
|
||||
"daa": 437,
|
||||
"blue": 438,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 455,
|
||||
"sink": "5fdf67fc248f6500",
|
||||
"blue": 455,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 445.3,
|
||||
"h1": {
|
||||
"blocks": 446,
|
||||
"sink": "aada7bf1e3d16b25",
|
||||
"daa": 445,
|
||||
"blue": 446,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 446,
|
||||
"sink": "aada7bf1e3d16b25",
|
||||
"daa": 445,
|
||||
"blue": 446,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 466,
|
||||
"sink": "85ccafa8a9d39de0",
|
||||
"blue": 466,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 450.3,
|
||||
"h1": {
|
||||
"blocks": 447,
|
||||
"sink": "1761d6112c00d161",
|
||||
"daa": 446,
|
||||
"blue": 447,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 447,
|
||||
"sink": "1761d6112c00d161",
|
||||
"daa": 446,
|
||||
"blue": 447,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 475,
|
||||
"sink": "594fe7ff929c559f",
|
||||
"blue": 475,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 455.3,
|
||||
"h1": {
|
||||
"blocks": 455,
|
||||
"sink": "3d694806975e096e",
|
||||
"daa": 454,
|
||||
"blue": 455,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 455,
|
||||
"sink": "3d694806975e096e",
|
||||
"daa": 454,
|
||||
"blue": 455,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 480,
|
||||
"sink": "bf92fbb2a472d205",
|
||||
"blue": 480,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 460.3,
|
||||
"h1": {
|
||||
"blocks": 461,
|
||||
"sink": "4c2da8fcb362f14d",
|
||||
"daa": 460,
|
||||
"blue": 461,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 461,
|
||||
"sink": "4c2da8fcb362f14d",
|
||||
"daa": 460,
|
||||
"blue": 461,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 482,
|
||||
"sink": "90cc4fd0fac9bef2",
|
||||
"blue": 482,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 465.3,
|
||||
"h1": {
|
||||
"blocks": 467,
|
||||
"sink": "4cd5d4fda0703837",
|
||||
"daa": 466,
|
||||
"blue": 467,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 467,
|
||||
"sink": "4cd5d4fda0703837",
|
||||
"daa": 466,
|
||||
"blue": 467,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 484,
|
||||
"sink": "8d822c253a2939d6",
|
||||
"blue": 484,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 470.3,
|
||||
"h1": {
|
||||
"blocks": 473,
|
||||
"sink": "beeb70fa234a9a4b",
|
||||
"daa": 472,
|
||||
"blue": 473,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 473,
|
||||
"sink": "beeb70fa234a9a4b",
|
||||
"daa": 472,
|
||||
"blue": 473,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 487,
|
||||
"sink": "ed057653dec1d416",
|
||||
"blue": 487,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 475.3,
|
||||
"h1": {
|
||||
"blocks": 480,
|
||||
"sink": "47c9ab35c01f2f7d",
|
||||
"daa": 479,
|
||||
"blue": 480,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 480,
|
||||
"sink": "47c9ab35c01f2f7d",
|
||||
"daa": 479,
|
||||
"blue": 480,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 495,
|
||||
"sink": "072c31cf3c13877b",
|
||||
"blue": 495,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 480.3,
|
||||
"h1": {
|
||||
"blocks": 486,
|
||||
"sink": "918c05c7a79ce8ed",
|
||||
"daa": 485,
|
||||
"blue": 486,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 486,
|
||||
"sink": "918c05c7a79ce8ed",
|
||||
"daa": 485,
|
||||
"blue": 486,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 504,
|
||||
"sink": "6ab8526912a92786",
|
||||
"blue": 504,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 485.4,
|
||||
"h1": {
|
||||
"blocks": 491,
|
||||
"sink": "5b94825a96af8031",
|
||||
"daa": 490,
|
||||
"blue": 491,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 491,
|
||||
"sink": "5b94825a96af8031",
|
||||
"daa": 490,
|
||||
"blue": 491,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 511,
|
||||
"sink": "e5d2d2cf5ca14138",
|
||||
"blue": 511,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 490.4,
|
||||
"h1": {
|
||||
"blocks": 494,
|
||||
"sink": "7d0fd0b857ad553d",
|
||||
"daa": 493,
|
||||
"blue": 494,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 494,
|
||||
"sink": "7d0fd0b857ad553d",
|
||||
"daa": 493,
|
||||
"blue": 494,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 518,
|
||||
"sink": "6acadef70d9d2b7e",
|
||||
"blue": 518,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 495.4,
|
||||
"h1": {
|
||||
"blocks": 500,
|
||||
"sink": "4e35f238846e9802",
|
||||
"daa": 499,
|
||||
"blue": 500,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 500,
|
||||
"sink": "4e35f238846e9802",
|
||||
"daa": 499,
|
||||
"blue": 500,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 524,
|
||||
"sink": "a0e5e0544388677b",
|
||||
"blue": 524,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 500.4,
|
||||
"h1": {
|
||||
"blocks": 502,
|
||||
"sink": "1f3cf87f97e6661c",
|
||||
"daa": 501,
|
||||
"blue": 502,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 502,
|
||||
"sink": "1f3cf87f97e6661c",
|
||||
"daa": 501,
|
||||
"blue": 502,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 530,
|
||||
"sink": "f0ba9826edcf48e7",
|
||||
"blue": 530,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 505.4,
|
||||
"h1": {
|
||||
"blocks": 509,
|
||||
"sink": "532a873c7ad783c5",
|
||||
"daa": 508,
|
||||
"blue": 509,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 509,
|
||||
"sink": "532a873c7ad783c5",
|
||||
"daa": 508,
|
||||
"blue": 509,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 537,
|
||||
"sink": "b138a9d8ba0b3454",
|
||||
"blue": 537,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 510.4,
|
||||
"h1": {
|
||||
"blocks": 545,
|
||||
"sink": "b878077d471c2a73",
|
||||
"daa": 544,
|
||||
"blue": 545,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 545,
|
||||
"sink": "b878077d471c2a73",
|
||||
"daa": 544,
|
||||
"blue": 545,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 545,
|
||||
"sink": "b878077d471c2a73",
|
||||
"blue": 545,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 515.4,
|
||||
"h1": {
|
||||
"blocks": 556,
|
||||
"sink": "95bd60b5bf755ef1",
|
||||
"daa": 555,
|
||||
"blue": 556,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 556,
|
||||
"sink": "95bd60b5bf755ef1",
|
||||
"daa": 555,
|
||||
"blue": 556,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 556,
|
||||
"sink": "95bd60b5bf755ef1",
|
||||
"blue": 556,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 520.4,
|
||||
"h1": {
|
||||
"blocks": 569,
|
||||
"sink": "258f2c477b49756d",
|
||||
"daa": 568,
|
||||
"blue": 569,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 569,
|
||||
"sink": "258f2c477b49756d",
|
||||
"daa": 568,
|
||||
"blue": 569,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 569,
|
||||
"sink": "258f2c477b49756d",
|
||||
"blue": 569,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 525.4,
|
||||
"h1": {
|
||||
"blocks": 571,
|
||||
"sink": "e8cc9969d5d1dc10",
|
||||
"daa": 570,
|
||||
"blue": 571,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 571,
|
||||
"sink": "e8cc9969d5d1dc10",
|
||||
"daa": 570,
|
||||
"blue": 571,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 571,
|
||||
"sink": "e8cc9969d5d1dc10",
|
||||
"blue": 571,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 530.5,
|
||||
"h1": {
|
||||
"blocks": 573,
|
||||
"sink": "da3da53755578a2d",
|
||||
"daa": 572,
|
||||
"blue": 573,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 573,
|
||||
"sink": "da3da53755578a2d",
|
||||
"daa": 572,
|
||||
"blue": 573,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 573,
|
||||
"sink": "da3da53755578a2d",
|
||||
"blue": 573,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 535.5,
|
||||
"h1": {
|
||||
"blocks": 576,
|
||||
"sink": "65ba87e325c66754",
|
||||
"daa": 575,
|
||||
"blue": 576,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 576,
|
||||
"sink": "65ba87e325c66754",
|
||||
"daa": 575,
|
||||
"blue": 576,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 576,
|
||||
"sink": "65ba87e325c66754",
|
||||
"blue": 576,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 540.5,
|
||||
"h1": {
|
||||
"blocks": 580,
|
||||
"sink": "11e564345e74f2cb",
|
||||
"daa": 579,
|
||||
"blue": 580,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 580,
|
||||
"sink": "11e564345e74f2cb",
|
||||
"daa": 579,
|
||||
"blue": 580,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 580,
|
||||
"sink": "11e564345e74f2cb",
|
||||
"blue": 580,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 545.5,
|
||||
"h1": {
|
||||
"blocks": 585,
|
||||
"sink": "b1d2689648b6d765",
|
||||
"daa": 584,
|
||||
"blue": 585,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 585,
|
||||
"sink": "b1d2689648b6d765",
|
||||
"daa": 584,
|
||||
"blue": 585,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 585,
|
||||
"sink": "b1d2689648b6d765",
|
||||
"blue": 585,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 550.5,
|
||||
"h1": {
|
||||
"blocks": 594,
|
||||
"sink": "0856bc8c348725e9",
|
||||
"daa": 593,
|
||||
"blue": 594,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 594,
|
||||
"sink": "0856bc8c348725e9",
|
||||
"daa": 593,
|
||||
"blue": 594,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 594,
|
||||
"sink": "0856bc8c348725e9",
|
||||
"blue": 594,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 555.5,
|
||||
"h1": {
|
||||
"blocks": 597,
|
||||
"sink": "b0b25422dae4fab7",
|
||||
"daa": 596,
|
||||
"blue": 597,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 597,
|
||||
"sink": "b0b25422dae4fab7",
|
||||
"daa": 596,
|
||||
"blue": 597,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 597,
|
||||
"sink": "b0b25422dae4fab7",
|
||||
"blue": 597,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 560.5,
|
||||
"h1": {
|
||||
"blocks": 606,
|
||||
"sink": "733de568ec588157",
|
||||
"daa": 605,
|
||||
"blue": 606,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 606,
|
||||
"sink": "733de568ec588157",
|
||||
"daa": 605,
|
||||
"blue": 606,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 606,
|
||||
"sink": "733de568ec588157",
|
||||
"blue": 606,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 565.5,
|
||||
"h1": {
|
||||
"blocks": 608,
|
||||
"sink": "ad3c86d071a93e75",
|
||||
"daa": 607,
|
||||
"blue": 608,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 608,
|
||||
"sink": "ad3c86d071a93e75",
|
||||
"daa": 607,
|
||||
"blue": 608,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 608,
|
||||
"sink": "ad3c86d071a93e75",
|
||||
"blue": 608,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 570.5,
|
||||
"h1": {
|
||||
"blocks": 613,
|
||||
"sink": "a38c3c8af9f6290d",
|
||||
"daa": 612,
|
||||
"blue": 613,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 613,
|
||||
"sink": "a38c3c8af9f6290d",
|
||||
"daa": 612,
|
||||
"blue": 613,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 613,
|
||||
"sink": "a38c3c8af9f6290d",
|
||||
"blue": 613,
|
||||
"reorged": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"node": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneumd",
|
||||
"miner": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneum-miner",
|
||||
"slot": 0,
|
||||
"ports": {
|
||||
"base": 30690,
|
||||
"suffix": 980
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
12:48:26.701 fg0 case attack-gate-off-expect-reorg: mode attack, gate off (window 60 DAA), joint 240 s, split 180 s, watch 150 s, honest 1 thread(s) each, attacker 3 (joint 0), expect reorg
|
||||
12:48:28.258 fg0 h1 up pid 480223 json 30692 p2p 30691
|
||||
12:48:29.769 fg0 h2 up pid 481517 json 30702 p2p 30701 addpeer 30691
|
||||
12:48:31.285 fg0 b up pid 482726 json 30712 p2p 30711 addpeer 30721,30722
|
||||
12:52:34.300 fg0 phase 1 done at 240.0 s: H1 242 blocks sink e66998c6 daa 240; H2 242 sink e66998c6; side 2 (b) 242 sink e66998c6; keys H1 8da9ddee H2 eda9cde4 side2 fresh (none yet)
|
||||
12:52:34.368 fg0 weight at the fork (last 120 blue blocks of H1's chain): side 2 0, others 120, side 2 0 bps
|
||||
12:52:34.370 fg0 links cut at 240.1 s; side 2 (b) now mines with 3 thread(s), the honest side with 1 each
|
||||
12:55:34.480 fg0 phase 2 done at 420.2 s: H1 421 blocks sink 6e932c38 daa 420 blue 421 work 14893198; side 2 432 sink d93a1238 daa 431 blue 432 work 17470131 (side 2 heavier: true); fork depth 191 DAA against window 60
|
||||
12:55:34.481 fg0 links restored at 420.2 s; watching H1 and H2 for 150 s
|
||||
12:56:04.569 fg0 t=450.3 s H1 447 blocks sink 1761d611 held; H2 447 blocks sink 1761d611 held; side 2 475 blocks sink 594fe7ff
|
||||
12:56:34.644 fg0 t=480.4 s H1 486 blocks sink 918c05c7 held; H2 486 blocks sink 918c05c7 held; side 2 504 blocks sink 6ab85269
|
||||
12:57:04.714 fg0 H1 left its pre-cut chain at 510.4 s: sink b878077d471c2a73 by eda9cde4
|
||||
12:57:04.717 fg0 H2 left its pre-cut chain at 510.4 s: sink b878077d471c2a73 by eda9cde4
|
||||
12:57:04.719 fg0 t=510.4 s H1 545 blocks sink b878077d REORGED; H2 545 blocks sink b878077d REORGED; side 2 545 blocks sink b878077d
|
||||
12:57:34.769 fg0 t=540.5 s H1 580 blocks sink 11e56434 REORGED; H2 580 blocks sink 11e56434 REORGED; side 2 580 blocks sink 11e56434
|
||||
12:58:04.814 fg0 t=570.5 s H1 613 blocks sink a38c3c8a REORGED; H2 613 blocks sink a38c3c8a REORGED; side 2 613 blocks sink a38c3c8a
|
||||
12:58:04.822 fg0 SUMMARY PASS (attack-gate-off-expect-reorg): side 2 held 0 bps of the blue blocks at the fork; fork depth 191 DAA against window 60; side 2 blue work 17470131 against H1 14893198 at the heal; H1 reorged at 510.4 s (0 refusal lines, knows side 2's tip: true); H2 reorged at 510.4 s (0 refusal lines, knows side 2's tip: true); side 2 kept its chain: true
|
||||
12:58:04.822 fg0 summary: /srv/builds/igneum-wt-horizon/docs/plans/mission-item-4-gate/fork-gate-attack-gate-off-expect-reorg.json
|
||||
|
|
@ -0,0 +1,930 @@
|
|||
{
|
||||
"pass": true,
|
||||
"expect": "hold",
|
||||
"case": "attack-gate-on-expect-hold",
|
||||
"mode": "attack",
|
||||
"gate": "on",
|
||||
"window": 60,
|
||||
"joint": 240,
|
||||
"split": 180,
|
||||
"watch": 150,
|
||||
"threads": {
|
||||
"honest_each": 1,
|
||||
"attacker_split": 3,
|
||||
"attacker_joint": 0
|
||||
},
|
||||
"keys": {
|
||||
"h1": "8da9ddee…",
|
||||
"h2": "eda9cde4…",
|
||||
"side2": "0e2c6fe2…"
|
||||
},
|
||||
"share_at_fork": {
|
||||
"side2": 0,
|
||||
"others": 121,
|
||||
"side2_bps": 0
|
||||
},
|
||||
"fork_daa": 233,
|
||||
"fork_depth_daa_at_heal": 197,
|
||||
"sinks": {
|
||||
"joint": {
|
||||
"h1": {
|
||||
"hash": "7ed68743f22e711490406bd380cf66fff94579fcc981344c317a46c18cbc61bb",
|
||||
"blocks": 234,
|
||||
"daa": 233,
|
||||
"blue": 234,
|
||||
"blueWork": "8862250",
|
||||
"key": "eda9cde4…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "7ed68743f22e711490406bd380cf66fff94579fcc981344c317a46c18cbc61bb",
|
||||
"blocks": 234,
|
||||
"daa": 233,
|
||||
"blue": 234,
|
||||
"blueWork": "8862250",
|
||||
"key": "eda9cde4…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "7ed68743f22e711490406bd380cf66fff94579fcc981344c317a46c18cbc61bb",
|
||||
"blocks": 234,
|
||||
"daa": 233,
|
||||
"blue": 234,
|
||||
"blueWork": "8862250",
|
||||
"key": "eda9cde4…"
|
||||
}
|
||||
},
|
||||
"split": {
|
||||
"h1": {
|
||||
"hash": "036cfe568f3d403351b338ea41b7069ad4eae0ce95308436a25b6c7aa4c1372a",
|
||||
"blocks": 396,
|
||||
"daa": 395,
|
||||
"blue": 396,
|
||||
"blueWork": "14807915",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "036cfe568f3d403351b338ea41b7069ad4eae0ce95308436a25b6c7aa4c1372a",
|
||||
"blocks": 396,
|
||||
"daa": 395,
|
||||
"blue": 396,
|
||||
"blueWork": "14807915",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "abb93c2318f6c2ebdbd4e14a50b3d73ba7f483b8b06b18666e1015d038d4011a",
|
||||
"blocks": 431,
|
||||
"daa": 430,
|
||||
"blue": 431,
|
||||
"blueWork": "20297242",
|
||||
"key": "0e2c6fe2…"
|
||||
}
|
||||
}
|
||||
},
|
||||
"per_node": {
|
||||
"h1": {
|
||||
"held": true,
|
||||
"reorged": false,
|
||||
"reorg_at_s": null,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 177
|
||||
},
|
||||
"h2": {
|
||||
"held": true,
|
||||
"reorged": false,
|
||||
"reorg_at_s": null,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 177
|
||||
}
|
||||
},
|
||||
"checks": {
|
||||
"side2_under_a_third_at_fork": true,
|
||||
"fork_deeper_than_window": true,
|
||||
"side2_heavier_at_heal": true,
|
||||
"every_honest_node_learned_side2_chain": true,
|
||||
"every_honest_node_held": true,
|
||||
"every_honest_node_reorged": false,
|
||||
"every_honest_node_logged_a_refusal": true,
|
||||
"no_honest_node_logged_a_refusal": false,
|
||||
"side2_kept_its_chain": true
|
||||
},
|
||||
"failed_checks": [],
|
||||
"refusal_example": "Fork choice: block 41225a00fb38b6394540a5707443bd70e678484cbd20aa3fa8e807bb24df8d4a forks 252 DAA back from the sink's chain and its builders hold 0.00% of the weight table at the fork (under one third); not a sink candidate (ledger 51-percent rank 2)",
|
||||
"samples": [
|
||||
{
|
||||
"t": 425.2,
|
||||
"h1": {
|
||||
"blocks": 407,
|
||||
"sink": "b9b5fef0daea5b74",
|
||||
"daa": 406,
|
||||
"blue": 407,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 407,
|
||||
"sink": "b9b5fef0daea5b74",
|
||||
"daa": 406,
|
||||
"blue": 407,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 436,
|
||||
"sink": "b87c6327c3fc8298",
|
||||
"blue": 436,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 430.2,
|
||||
"h1": {
|
||||
"blocks": 412,
|
||||
"sink": "cd9991f248c9bf46",
|
||||
"daa": 411,
|
||||
"blue": 412,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 412,
|
||||
"sink": "cd9991f248c9bf46",
|
||||
"daa": 411,
|
||||
"blue": 412,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 439,
|
||||
"sink": "4c1b609fad53a391",
|
||||
"blue": 439,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 435.2,
|
||||
"h1": {
|
||||
"blocks": 417,
|
||||
"sink": "b2bb0dc00c197917",
|
||||
"daa": 416,
|
||||
"blue": 417,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 417,
|
||||
"sink": "b2bb0dc00c197917",
|
||||
"daa": 416,
|
||||
"blue": 417,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 444,
|
||||
"sink": "e382cbd3ac4dcf26",
|
||||
"blue": 444,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 440.2,
|
||||
"h1": {
|
||||
"blocks": 422,
|
||||
"sink": "b711c4c23605870d",
|
||||
"daa": 421,
|
||||
"blue": 422,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 422,
|
||||
"sink": "b711c4c23605870d",
|
||||
"daa": 421,
|
||||
"blue": 422,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 446,
|
||||
"sink": "c35dab954cd4acf4",
|
||||
"blue": 446,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 445.2,
|
||||
"h1": {
|
||||
"blocks": 428,
|
||||
"sink": "f99b9d3dbc93d6c8",
|
||||
"daa": 427,
|
||||
"blue": 428,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 428,
|
||||
"sink": "f99b9d3dbc93d6c8",
|
||||
"daa": 427,
|
||||
"blue": 428,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 449,
|
||||
"sink": "d92f53e2d140db35",
|
||||
"blue": 449,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 450.3,
|
||||
"h1": {
|
||||
"blocks": 431,
|
||||
"sink": "1e9a17dfc27a2670",
|
||||
"daa": 430,
|
||||
"blue": 431,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 431,
|
||||
"sink": "1e9a17dfc27a2670",
|
||||
"daa": 430,
|
||||
"blue": 431,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 456,
|
||||
"sink": "162c5de6d4f74ea9",
|
||||
"blue": 456,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 455.3,
|
||||
"h1": {
|
||||
"blocks": 438,
|
||||
"sink": "65be332f457b64e0",
|
||||
"daa": 437,
|
||||
"blue": 438,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 438,
|
||||
"sink": "65be332f457b64e0",
|
||||
"daa": 437,
|
||||
"blue": 438,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 461,
|
||||
"sink": "6b7998086b33a85d",
|
||||
"blue": 461,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 460.3,
|
||||
"h1": {
|
||||
"blocks": 446,
|
||||
"sink": "5ee05b91ff342422",
|
||||
"daa": 445,
|
||||
"blue": 446,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 446,
|
||||
"sink": "5ee05b91ff342422",
|
||||
"daa": 445,
|
||||
"blue": 446,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 468,
|
||||
"sink": "2ef3594b2514a766",
|
||||
"blue": 468,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 465.3,
|
||||
"h1": {
|
||||
"blocks": 451,
|
||||
"sink": "faad0b35cf941017",
|
||||
"daa": 450,
|
||||
"blue": 451,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 451,
|
||||
"sink": "faad0b35cf941017",
|
||||
"daa": 450,
|
||||
"blue": 451,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 471,
|
||||
"sink": "e57eb146c13fa041",
|
||||
"blue": 471,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 470.3,
|
||||
"h1": {
|
||||
"blocks": 454,
|
||||
"sink": "b5f88fdf5097139b",
|
||||
"daa": 453,
|
||||
"blue": 454,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 454,
|
||||
"sink": "b5f88fdf5097139b",
|
||||
"daa": 453,
|
||||
"blue": 454,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 479,
|
||||
"sink": "bac0a7b389fb2418",
|
||||
"blue": 479,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 475.3,
|
||||
"h1": {
|
||||
"blocks": 463,
|
||||
"sink": "e93acb17237cc9b3",
|
||||
"daa": 462,
|
||||
"blue": 463,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 463,
|
||||
"sink": "e93acb17237cc9b3",
|
||||
"daa": 462,
|
||||
"blue": 463,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 481,
|
||||
"sink": "7a533b847de36a0c",
|
||||
"blue": 481,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 480.3,
|
||||
"h1": {
|
||||
"blocks": 467,
|
||||
"sink": "ea2b7270dba4deba",
|
||||
"daa": 466,
|
||||
"blue": 467,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 467,
|
||||
"sink": "ea2b7270dba4deba",
|
||||
"daa": 466,
|
||||
"blue": 467,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 485,
|
||||
"sink": "5f36be5a27dc4f1f",
|
||||
"blue": 485,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 485.3,
|
||||
"h1": {
|
||||
"blocks": 470,
|
||||
"sink": "caab7c55e1185c44",
|
||||
"daa": 469,
|
||||
"blue": 470,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 470,
|
||||
"sink": "caab7c55e1185c44",
|
||||
"daa": 469,
|
||||
"blue": 470,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 490,
|
||||
"sink": "9b058d11e4a8a864",
|
||||
"blue": 490,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 490.4,
|
||||
"h1": {
|
||||
"blocks": 472,
|
||||
"sink": "19057874449c22ea",
|
||||
"daa": 471,
|
||||
"blue": 472,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 472,
|
||||
"sink": "19057874449c22ea",
|
||||
"daa": 471,
|
||||
"blue": 472,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 493,
|
||||
"sink": "422c79a9ec4780dd",
|
||||
"blue": 493,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 495.4,
|
||||
"h1": {
|
||||
"blocks": 475,
|
||||
"sink": "b6f0161d81faa3e9",
|
||||
"daa": 474,
|
||||
"blue": 475,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 475,
|
||||
"sink": "b6f0161d81faa3e9",
|
||||
"daa": 474,
|
||||
"blue": 475,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 497,
|
||||
"sink": "33c53267da1c7bd5",
|
||||
"blue": 497,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 500.4,
|
||||
"h1": {
|
||||
"blocks": 482,
|
||||
"sink": "6e821ff35e24b700",
|
||||
"daa": 481,
|
||||
"blue": 482,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 482,
|
||||
"sink": "6e821ff35e24b700",
|
||||
"daa": 481,
|
||||
"blue": 482,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 501,
|
||||
"sink": "6536fa666794da92",
|
||||
"blue": 501,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 505.4,
|
||||
"h1": {
|
||||
"blocks": 486,
|
||||
"sink": "bee5af11ed677228",
|
||||
"daa": 485,
|
||||
"blue": 486,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 486,
|
||||
"sink": "bee5af11ed677228",
|
||||
"daa": 485,
|
||||
"blue": 486,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 510,
|
||||
"sink": "be1419603638e1fb",
|
||||
"blue": 510,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 510.4,
|
||||
"h1": {
|
||||
"blocks": 491,
|
||||
"sink": "ed71ec00678a9e10",
|
||||
"daa": 490,
|
||||
"blue": 491,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 491,
|
||||
"sink": "ed71ec00678a9e10",
|
||||
"daa": 490,
|
||||
"blue": 491,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 515,
|
||||
"sink": "7b32f850c803ef02",
|
||||
"blue": 515,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 515.4,
|
||||
"h1": {
|
||||
"blocks": 499,
|
||||
"sink": "ed904ccbc28c9980",
|
||||
"daa": 498,
|
||||
"blue": 499,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 499,
|
||||
"sink": "ed904ccbc28c9980",
|
||||
"daa": 498,
|
||||
"blue": 499,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 519,
|
||||
"sink": "a26ebf100dcba0c2",
|
||||
"blue": 519,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 520.4,
|
||||
"h1": {
|
||||
"blocks": 503,
|
||||
"sink": "462b0c2c35c67c54",
|
||||
"daa": 502,
|
||||
"blue": 503,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 503,
|
||||
"sink": "462b0c2c35c67c54",
|
||||
"daa": 502,
|
||||
"blue": 503,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 526,
|
||||
"sink": "aaaebc1389fe11fd",
|
||||
"blue": 526,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 525.4,
|
||||
"h1": {
|
||||
"blocks": 504,
|
||||
"sink": "87f25e6a386a8165",
|
||||
"daa": 503,
|
||||
"blue": 504,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 504,
|
||||
"sink": "87f25e6a386a8165",
|
||||
"daa": 503,
|
||||
"blue": 504,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 529,
|
||||
"sink": "c096bda65c99e6f8",
|
||||
"blue": 529,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 530.4,
|
||||
"h1": {
|
||||
"blocks": 510,
|
||||
"sink": "6c5d1398a7445010",
|
||||
"daa": 509,
|
||||
"blue": 510,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 510,
|
||||
"sink": "6c5d1398a7445010",
|
||||
"daa": 509,
|
||||
"blue": 510,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 533,
|
||||
"sink": "3341a65b2b284f17",
|
||||
"blue": 533,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 535.4,
|
||||
"h1": {
|
||||
"blocks": 514,
|
||||
"sink": "0d661c0b8cc34ab8",
|
||||
"daa": 513,
|
||||
"blue": 514,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 514,
|
||||
"sink": "0d661c0b8cc34ab8",
|
||||
"daa": 513,
|
||||
"blue": 514,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 542,
|
||||
"sink": "7c3a8038df112ee7",
|
||||
"blue": 542,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 540.4,
|
||||
"h1": {
|
||||
"blocks": 525,
|
||||
"sink": "f2b83fc149654b8d",
|
||||
"daa": 524,
|
||||
"blue": 525,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 525,
|
||||
"sink": "f2b83fc149654b8d",
|
||||
"daa": 524,
|
||||
"blue": 525,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 545,
|
||||
"sink": "36e6ba6e49e7c6f2",
|
||||
"blue": 545,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 545.5,
|
||||
"h1": {
|
||||
"blocks": 533,
|
||||
"sink": "8f1d9ad77edf47d0",
|
||||
"daa": 532,
|
||||
"blue": 533,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 533,
|
||||
"sink": "8f1d9ad77edf47d0",
|
||||
"daa": 532,
|
||||
"blue": 533,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 554,
|
||||
"sink": "857f2b7d99ddcba6",
|
||||
"blue": 554,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 550.5,
|
||||
"h1": {
|
||||
"blocks": 537,
|
||||
"sink": "4cd35471c65af8ff",
|
||||
"daa": 536,
|
||||
"blue": 537,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 537,
|
||||
"sink": "4cd35471c65af8ff",
|
||||
"daa": 536,
|
||||
"blue": 537,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 560,
|
||||
"sink": "5ed4bc501713930a",
|
||||
"blue": 560,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 555.5,
|
||||
"h1": {
|
||||
"blocks": 544,
|
||||
"sink": "1174f796fda59e3e",
|
||||
"daa": 543,
|
||||
"blue": 544,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 544,
|
||||
"sink": "1174f796fda59e3e",
|
||||
"daa": 543,
|
||||
"blue": 544,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 565,
|
||||
"sink": "f7d136350536fa6b",
|
||||
"blue": 565,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 560.5,
|
||||
"h1": {
|
||||
"blocks": 548,
|
||||
"sink": "f6ed678d1b0a96f8",
|
||||
"daa": 547,
|
||||
"blue": 548,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 548,
|
||||
"sink": "f6ed678d1b0a96f8",
|
||||
"daa": 547,
|
||||
"blue": 548,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 568,
|
||||
"sink": "37ac0328bf8f53e4",
|
||||
"blue": 568,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 565.5,
|
||||
"h1": {
|
||||
"blocks": 556,
|
||||
"sink": "86f4c28c6ba82275",
|
||||
"daa": 555,
|
||||
"blue": 556,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 556,
|
||||
"sink": "86f4c28c6ba82275",
|
||||
"daa": 555,
|
||||
"blue": 556,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 572,
|
||||
"sink": "9d9ec576b2742464",
|
||||
"blue": 572,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 570.5,
|
||||
"h1": {
|
||||
"blocks": 560,
|
||||
"sink": "3210de1f85cbfc76",
|
||||
"daa": 559,
|
||||
"blue": 560,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 560,
|
||||
"sink": "3210de1f85cbfc76",
|
||||
"daa": 559,
|
||||
"blue": 560,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 574,
|
||||
"sink": "3496b576346db4bb",
|
||||
"blue": 574,
|
||||
"reorged": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"node": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneumd",
|
||||
"miner": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneum-miner",
|
||||
"slot": 2,
|
||||
"ports": {
|
||||
"base": 30770,
|
||||
"suffix": 982
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
12:48:26.709 fg2 case attack-gate-on-expect-hold: mode attack, gate on (window 60 DAA), joint 240 s, split 180 s, watch 150 s, honest 1 thread(s) each, attacker 3 (joint 0), expect hold
|
||||
12:48:28.273 fg2 h1 up pid 480230 json 30772 p2p 30771
|
||||
12:48:29.784 fg2 h2 up pid 481529 json 30782 p2p 30781 addpeer 30771
|
||||
12:48:31.299 fg2 b up pid 482751 json 30792 p2p 30791 addpeer 30801,30802
|
||||
12:52:34.314 fg2 phase 1 done at 240.0 s: H1 234 blocks sink 7ed68743 daa 233; H2 234 sink 7ed68743; side 2 (b) 234 sink 7ed68743; keys H1 8da9ddee H2 eda9cde4 side2 fresh (none yet)
|
||||
12:52:34.371 fg2 weight at the fork (last 121 blue blocks of H1's chain): side 2 0, others 121, side 2 0 bps
|
||||
12:52:34.375 fg2 links cut at 240.1 s; side 2 (b) now mines with 3 thread(s), the honest side with 1 each
|
||||
12:55:34.483 fg2 phase 2 done at 420.2 s: H1 396 blocks sink 036cfe56 daa 395 blue 396 work 14807915; side 2 431 sink abb93c23 daa 430 blue 431 work 20297242 (side 2 heavier: true); fork depth 197 DAA against window 60
|
||||
12:55:34.484 fg2 links restored at 420.2 s; watching H1 and H2 for 150 s
|
||||
12:56:04.568 fg2 t=450.3 s H1 431 blocks sink 1e9a17df held; H2 431 blocks sink 1e9a17df held; side 2 456 blocks sink 162c5de6
|
||||
12:56:34.640 fg2 t=480.3 s H1 467 blocks sink ea2b7270 held; H2 467 blocks sink ea2b7270 held; side 2 485 blocks sink 5f36be5a
|
||||
12:57:04.717 fg2 t=510.4 s H1 491 blocks sink ed71ec00 held; H2 491 blocks sink ed71ec00 held; side 2 515 blocks sink 7b32f850
|
||||
12:57:34.757 fg2 t=540.5 s H1 525 blocks sink f2b83fc1 held; H2 525 blocks sink f2b83fc1 held; side 2 545 blocks sink 36e6ba6e
|
||||
12:58:04.809 fg2 t=570.5 s H1 560 blocks sink 3210de1f held; H2 560 blocks sink 3210de1f held; side 2 574 blocks sink 3496b576
|
||||
12:58:04.822 fg2 SUMMARY PASS (attack-gate-on-expect-hold): side 2 held 0 bps of the blue blocks at the fork; fork depth 197 DAA against window 60; side 2 blue work 20297242 against H1 14807915 at the heal; H1 held (177 refusal lines, knows side 2's tip: true); H2 held (177 refusal lines, knows side 2's tip: true); side 2 kept its chain: true
|
||||
12:58:04.822 fg2 summary: /srv/builds/igneum-wt-horizon/docs/plans/mission-item-4-gate/fork-gate-attack-gate-on-expect-hold.json
|
||||
|
|
@ -0,0 +1,653 @@
|
|||
{
|
||||
"pass": true,
|
||||
"expect": "reorg",
|
||||
"case": "partition-gate-off-expect-reorg",
|
||||
"mode": "partition",
|
||||
"gate": "off",
|
||||
"window": 60,
|
||||
"joint": 240,
|
||||
"split": 180,
|
||||
"watch": 150,
|
||||
"threads": {
|
||||
"honest_each": 1,
|
||||
"attacker_split": 3,
|
||||
"attacker_joint": 1
|
||||
},
|
||||
"keys": {
|
||||
"h1": "8da9ddee…",
|
||||
"h2": null,
|
||||
"side2": "eda9cde4…"
|
||||
},
|
||||
"share_at_fork": {
|
||||
"side2": 67,
|
||||
"others": 53,
|
||||
"side2_bps": 5583
|
||||
},
|
||||
"fork_daa": 244,
|
||||
"fork_depth_daa_at_heal": 191,
|
||||
"sinks": {
|
||||
"joint": {
|
||||
"h1": {
|
||||
"hash": "58126c351aa6324a992a47fa66cca22369450c9835d312772c87d3e1aeb409a0",
|
||||
"blocks": 245,
|
||||
"daa": 244,
|
||||
"blue": 245,
|
||||
"blueWork": "9558440",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "58126c351aa6324a992a47fa66cca22369450c9835d312772c87d3e1aeb409a0",
|
||||
"blocks": 245,
|
||||
"daa": 244,
|
||||
"blue": 245,
|
||||
"blueWork": "9558440",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "58126c351aa6324a992a47fa66cca22369450c9835d312772c87d3e1aeb409a0",
|
||||
"blocks": 245,
|
||||
"daa": 244,
|
||||
"blue": 245,
|
||||
"blueWork": "9558440",
|
||||
"key": "8da9ddee…"
|
||||
}
|
||||
},
|
||||
"split": {
|
||||
"h1": {
|
||||
"hash": "a27a341c694aacf22b1a78f44d433e4104f58b23533afb73b7ee6fb9aa37afe4",
|
||||
"blocks": 405,
|
||||
"daa": 404,
|
||||
"blue": 405,
|
||||
"blueWork": "12270631",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "f9181a06c0db716fe4ed200f6f0046c9cb8fae2eb57dd7da4697a268c434a232",
|
||||
"blocks": 436,
|
||||
"daa": 435,
|
||||
"blue": 436,
|
||||
"blueWork": "19576159",
|
||||
"key": "eda9cde4…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "f9181a06c0db716fe4ed200f6f0046c9cb8fae2eb57dd7da4697a268c434a232",
|
||||
"blocks": 436,
|
||||
"daa": 435,
|
||||
"blue": 436,
|
||||
"blueWork": "19576159",
|
||||
"key": "eda9cde4…"
|
||||
}
|
||||
}
|
||||
},
|
||||
"per_node": {
|
||||
"h1": {
|
||||
"held": false,
|
||||
"reorged": true,
|
||||
"reorg_at_s": 507.4,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 0
|
||||
}
|
||||
},
|
||||
"checks": {
|
||||
"side2_under_a_third_at_fork": false,
|
||||
"fork_deeper_than_window": true,
|
||||
"side2_heavier_at_heal": true,
|
||||
"every_honest_node_learned_side2_chain": true,
|
||||
"every_honest_node_held": false,
|
||||
"every_honest_node_reorged": true,
|
||||
"every_honest_node_logged_a_refusal": false,
|
||||
"no_honest_node_logged_a_refusal": true,
|
||||
"side2_kept_its_chain": true
|
||||
},
|
||||
"failed_checks": [],
|
||||
"refusal_example": null,
|
||||
"samples": [
|
||||
{
|
||||
"t": 427.2,
|
||||
"h1": {
|
||||
"blocks": 411,
|
||||
"sink": "d783538ac11687a9",
|
||||
"daa": 410,
|
||||
"blue": 411,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 439,
|
||||
"sink": "aa3da0091db61498",
|
||||
"blue": 439,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 432.2,
|
||||
"h1": {
|
||||
"blocks": 416,
|
||||
"sink": "5084ccaac5b21e34",
|
||||
"daa": 415,
|
||||
"blue": 416,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 448,
|
||||
"sink": "c98585f0a1f24913",
|
||||
"blue": 448,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 437.2,
|
||||
"h1": {
|
||||
"blocks": 421,
|
||||
"sink": "950f8b1c7d4cac21",
|
||||
"daa": 420,
|
||||
"blue": 421,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 452,
|
||||
"sink": "c4ad3925b38e9285",
|
||||
"blue": 452,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 442.2,
|
||||
"h1": {
|
||||
"blocks": 424,
|
||||
"sink": "767cbc91083a48b0",
|
||||
"daa": 423,
|
||||
"blue": 424,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 455,
|
||||
"sink": "c91b500a6d256eb3",
|
||||
"blue": 455,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 447.3,
|
||||
"h1": {
|
||||
"blocks": 429,
|
||||
"sink": "d36268f977a04b6a",
|
||||
"daa": 428,
|
||||
"blue": 429,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 465,
|
||||
"sink": "c5a91c0c5352b0d6",
|
||||
"blue": 465,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 452.3,
|
||||
"h1": {
|
||||
"blocks": 438,
|
||||
"sink": "a7ecf244074b481d",
|
||||
"daa": 437,
|
||||
"blue": 438,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 468,
|
||||
"sink": "cd8cfb427f0c78e4",
|
||||
"blue": 468,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 457.3,
|
||||
"h1": {
|
||||
"blocks": 441,
|
||||
"sink": "29f8733c4ec6fa4b",
|
||||
"daa": 440,
|
||||
"blue": 441,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 473,
|
||||
"sink": "277bfdb7682804f9",
|
||||
"blue": 473,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 462.3,
|
||||
"h1": {
|
||||
"blocks": 451,
|
||||
"sink": "ae072b1106d34635",
|
||||
"daa": 450,
|
||||
"blue": 451,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 476,
|
||||
"sink": "d0f88a7c220ff170",
|
||||
"blue": 476,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 467.3,
|
||||
"h1": {
|
||||
"blocks": 458,
|
||||
"sink": "9fcfa1edabf60dd7",
|
||||
"daa": 457,
|
||||
"blue": 458,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 486,
|
||||
"sink": "9f66b943e3b972b7",
|
||||
"blue": 486,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 472.3,
|
||||
"h1": {
|
||||
"blocks": 462,
|
||||
"sink": "8dcef0d603690a6e",
|
||||
"daa": 461,
|
||||
"blue": 462,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 493,
|
||||
"sink": "a70a07e96280ab1e",
|
||||
"blue": 493,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 477.3,
|
||||
"h1": {
|
||||
"blocks": 464,
|
||||
"sink": "c6dceb1dfe662639",
|
||||
"daa": 463,
|
||||
"blue": 464,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 495,
|
||||
"sink": "1b6074e848285a01",
|
||||
"blue": 495,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 482.4,
|
||||
"h1": {
|
||||
"blocks": 468,
|
||||
"sink": "97b7a7a0a8248207",
|
||||
"daa": 467,
|
||||
"blue": 468,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 500,
|
||||
"sink": "a4045188d0e6fb97",
|
||||
"blue": 500,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 487.4,
|
||||
"h1": {
|
||||
"blocks": 472,
|
||||
"sink": "2326f1a0ffea21d8",
|
||||
"daa": 471,
|
||||
"blue": 472,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 504,
|
||||
"sink": "813c0c0f3fe0d62b",
|
||||
"blue": 504,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 492.4,
|
||||
"h1": {
|
||||
"blocks": 476,
|
||||
"sink": "2e8644b1907a9120",
|
||||
"daa": 475,
|
||||
"blue": 476,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 508,
|
||||
"sink": "9345acb132973ee6",
|
||||
"blue": 508,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 497.4,
|
||||
"h1": {
|
||||
"blocks": 481,
|
||||
"sink": "04a443536671ab8f",
|
||||
"daa": 480,
|
||||
"blue": 481,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 512,
|
||||
"sink": "0db73c40f531667d",
|
||||
"blue": 512,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 502.4,
|
||||
"h1": {
|
||||
"blocks": 487,
|
||||
"sink": "9afd673d306dc43c",
|
||||
"daa": 486,
|
||||
"blue": 487,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 519,
|
||||
"sink": "e749191f14932323",
|
||||
"blue": 519,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 507.4,
|
||||
"h1": {
|
||||
"blocks": 527,
|
||||
"sink": "afed1d222ea7304d",
|
||||
"daa": 526,
|
||||
"blue": 527,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 527,
|
||||
"sink": "afed1d222ea7304d",
|
||||
"blue": 527,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 512.4,
|
||||
"h1": {
|
||||
"blocks": 538,
|
||||
"sink": "54deb8450401f863",
|
||||
"daa": 537,
|
||||
"blue": 538,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 538,
|
||||
"sink": "54deb8450401f863",
|
||||
"blue": 538,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 517.4,
|
||||
"h1": {
|
||||
"blocks": 543,
|
||||
"sink": "089737446a988ecf",
|
||||
"daa": 542,
|
||||
"blue": 543,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 543,
|
||||
"sink": "089737446a988ecf",
|
||||
"blue": 543,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 522.4,
|
||||
"h1": {
|
||||
"blocks": 547,
|
||||
"sink": "fddba72379711067",
|
||||
"daa": 546,
|
||||
"blue": 547,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 547,
|
||||
"sink": "fddba72379711067",
|
||||
"blue": 547,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 527.4,
|
||||
"h1": {
|
||||
"blocks": 553,
|
||||
"sink": "d090e72490be6b7a",
|
||||
"daa": 552,
|
||||
"blue": 553,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 553,
|
||||
"sink": "d090e72490be6b7a",
|
||||
"blue": 553,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 532.4,
|
||||
"h1": {
|
||||
"blocks": 561,
|
||||
"sink": "1caf40533f6a2857",
|
||||
"daa": 560,
|
||||
"blue": 561,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 561,
|
||||
"sink": "1caf40533f6a2857",
|
||||
"blue": 561,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 537.4,
|
||||
"h1": {
|
||||
"blocks": 573,
|
||||
"sink": "e5b85c33b2b6aa09",
|
||||
"daa": 572,
|
||||
"blue": 573,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 573,
|
||||
"sink": "e5b85c33b2b6aa09",
|
||||
"blue": 573,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 542.4,
|
||||
"h1": {
|
||||
"blocks": 578,
|
||||
"sink": "317e329b8505cf1e",
|
||||
"daa": 577,
|
||||
"blue": 578,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 578,
|
||||
"sink": "317e329b8505cf1e",
|
||||
"blue": 578,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 547.5,
|
||||
"h1": {
|
||||
"blocks": 581,
|
||||
"sink": "e19cd0330c3cdf25",
|
||||
"daa": 580,
|
||||
"blue": 581,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 581,
|
||||
"sink": "e19cd0330c3cdf25",
|
||||
"blue": 581,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 552.5,
|
||||
"h1": {
|
||||
"blocks": 586,
|
||||
"sink": "38f228d7ffc3d0c1",
|
||||
"daa": 585,
|
||||
"blue": 586,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 586,
|
||||
"sink": "38f228d7ffc3d0c1",
|
||||
"blue": 586,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 557.5,
|
||||
"h1": {
|
||||
"blocks": 592,
|
||||
"sink": "ae515bf3d13e4865",
|
||||
"daa": 591,
|
||||
"blue": 592,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 592,
|
||||
"sink": "ae515bf3d13e4865",
|
||||
"blue": 592,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 562.5,
|
||||
"h1": {
|
||||
"blocks": 595,
|
||||
"sink": "eeade53e9149c05a",
|
||||
"daa": 594,
|
||||
"blue": 595,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 595,
|
||||
"sink": "eeade53e9149c05a",
|
||||
"blue": 595,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 567.5,
|
||||
"h1": {
|
||||
"blocks": 597,
|
||||
"sink": "a939e8caebf875d6",
|
||||
"daa": 596,
|
||||
"blue": 597,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 597,
|
||||
"sink": "a939e8caebf875d6",
|
||||
"blue": 597,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 572.5,
|
||||
"h1": {
|
||||
"blocks": 605,
|
||||
"sink": "1e585f80dc1050fa",
|
||||
"daa": 604,
|
||||
"blue": 605,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 605,
|
||||
"sink": "1e585f80dc1050fa",
|
||||
"blue": 605,
|
||||
"reorged": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"node": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneumd",
|
||||
"miner": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneum-miner",
|
||||
"slot": 5,
|
||||
"ports": {
|
||||
"base": 30890,
|
||||
"suffix": 985
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
12:48:26.732 fg5 case partition-gate-off-expect-reorg: mode partition, gate off (window 60 DAA), joint 240 s, split 180 s, watch 150 s, honest 1 thread(s) each, attacker 3 (joint 1), expect reorg
|
||||
12:48:28.310 fg5 h1 up pid 480280 json 30892 p2p 30891
|
||||
12:48:29.828 fg5 h2 up pid 481840 json 30902 p2p 30901 addpeer 30921
|
||||
12:52:32.849 fg5 phase 1 done at 240.0 s: H1 245 blocks sink 58126c35 daa 244; H2 245 sink 58126c35; side 2 (h2) 245 sink 58126c35; keys H1 8da9ddee H2 undefined side2 eda9cde4
|
||||
12:52:32.909 fg5 weight at the fork (last 120 blue blocks of H1's chain): side 2 67, others 53, side 2 5583 bps
|
||||
12:52:34.922 fg5 links cut at 242.1 s; side 2 (h2) now mines with 3 thread(s), the honest side with 1 each
|
||||
12:55:35.025 fg5 phase 2 done at 422.2 s: H1 405 blocks sink a27a341c daa 404 blue 405 work 12270631; side 2 436 sink f9181a06 daa 435 blue 436 work 19576159 (side 2 heavier: true); fork depth 191 DAA against window 60
|
||||
12:55:35.026 fg5 links restored at 422.2 s; watching H1 for 150 s
|
||||
12:56:05.117 fg5 t=452.3 s H1 438 blocks sink a7ecf244 held; side 2 468 blocks sink cd8cfb42
|
||||
12:56:35.193 fg5 t=482.4 s H1 468 blocks sink 97b7a7a0 held; side 2 500 blocks sink a4045188
|
||||
12:57:00.247 fg5 H1 left its pre-cut chain at 507.4 s: sink afed1d222ea7304d by eda9cde4
|
||||
12:57:05.255 fg5 t=512.4 s H1 538 blocks sink 54deb845 REORGED; side 2 538 blocks sink 54deb845
|
||||
12:57:35.285 fg5 t=542.5 s H1 578 blocks sink 317e329b REORGED; side 2 578 blocks sink 317e329b
|
||||
12:58:05.313 fg5 t=572.5 s H1 605 blocks sink 1e585f80 REORGED; side 2 605 blocks sink 1e585f80
|
||||
12:58:05.317 fg5 SUMMARY PASS (partition-gate-off-expect-reorg): side 2 held 5583 bps of the blue blocks at the fork; fork depth 191 DAA against window 60; side 2 blue work 19576159 against H1 12270631 at the heal; H1 reorged at 507.4 s (0 refusal lines, knows side 2's tip: true); side 2 kept its chain: true
|
||||
12:58:05.318 fg5 summary: /srv/builds/igneum-wt-horizon/docs/plans/mission-item-4-gate/fork-gate-partition-gate-off-expect-reorg.json
|
||||
|
|
@ -0,0 +1,653 @@
|
|||
{
|
||||
"pass": true,
|
||||
"expect": "reorg",
|
||||
"case": "partition-gate-on-expect-reorg",
|
||||
"mode": "partition",
|
||||
"gate": "on",
|
||||
"window": 60,
|
||||
"joint": 240,
|
||||
"split": 180,
|
||||
"watch": 150,
|
||||
"threads": {
|
||||
"honest_each": 1,
|
||||
"attacker_split": 3,
|
||||
"attacker_joint": 1
|
||||
},
|
||||
"keys": {
|
||||
"h1": "8da9ddee…",
|
||||
"h2": null,
|
||||
"side2": "eda9cde4…"
|
||||
},
|
||||
"share_at_fork": {
|
||||
"side2": 45,
|
||||
"others": 76,
|
||||
"side2_bps": 3719
|
||||
},
|
||||
"fork_daa": 245,
|
||||
"fork_depth_daa_at_heal": 194,
|
||||
"sinks": {
|
||||
"joint": {
|
||||
"h1": {
|
||||
"hash": "5c4cb584dc015892ddff89337412ed0883d9f97b4e791e7af2f7f64764f4f1e8",
|
||||
"blocks": 246,
|
||||
"daa": 245,
|
||||
"blue": 246,
|
||||
"blueWork": "8723556",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "5c4cb584dc015892ddff89337412ed0883d9f97b4e791e7af2f7f64764f4f1e8",
|
||||
"blocks": 246,
|
||||
"daa": 245,
|
||||
"blue": 246,
|
||||
"blueWork": "8723556",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "5c4cb584dc015892ddff89337412ed0883d9f97b4e791e7af2f7f64764f4f1e8",
|
||||
"blocks": 246,
|
||||
"daa": 245,
|
||||
"blue": 246,
|
||||
"blueWork": "8723556",
|
||||
"key": "8da9ddee…"
|
||||
}
|
||||
},
|
||||
"split": {
|
||||
"h1": {
|
||||
"hash": "753507c15705f4ea8ed19bc2697a11c489a052a45f28c64f9ac3d8400fa66647",
|
||||
"blocks": 412,
|
||||
"daa": 411,
|
||||
"blue": 412,
|
||||
"blueWork": "11490863",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "32b7c1757fa288eed0a8ab709e49fd86f72be531db19c58e63d0aeca7a34c4f6",
|
||||
"blocks": 440,
|
||||
"daa": 439,
|
||||
"blue": 440,
|
||||
"blueWork": "18089683",
|
||||
"key": "eda9cde4…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "32b7c1757fa288eed0a8ab709e49fd86f72be531db19c58e63d0aeca7a34c4f6",
|
||||
"blocks": 440,
|
||||
"daa": 439,
|
||||
"blue": 440,
|
||||
"blueWork": "18089683",
|
||||
"key": "eda9cde4…"
|
||||
}
|
||||
}
|
||||
},
|
||||
"per_node": {
|
||||
"h1": {
|
||||
"held": false,
|
||||
"reorged": true,
|
||||
"reorg_at_s": 507.4,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 0
|
||||
}
|
||||
},
|
||||
"checks": {
|
||||
"side2_under_a_third_at_fork": false,
|
||||
"fork_deeper_than_window": true,
|
||||
"side2_heavier_at_heal": true,
|
||||
"every_honest_node_learned_side2_chain": true,
|
||||
"every_honest_node_held": false,
|
||||
"every_honest_node_reorged": true,
|
||||
"every_honest_node_logged_a_refusal": false,
|
||||
"no_honest_node_logged_a_refusal": true,
|
||||
"side2_kept_its_chain": true
|
||||
},
|
||||
"failed_checks": [],
|
||||
"refusal_example": null,
|
||||
"samples": [
|
||||
{
|
||||
"t": 427.2,
|
||||
"h1": {
|
||||
"blocks": 420,
|
||||
"sink": "3c08068c8a93e490",
|
||||
"daa": 419,
|
||||
"blue": 420,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 443,
|
||||
"sink": "5058df4580954747",
|
||||
"blue": 443,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 432.2,
|
||||
"h1": {
|
||||
"blocks": 424,
|
||||
"sink": "de896377901e94a8",
|
||||
"daa": 423,
|
||||
"blue": 424,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 455,
|
||||
"sink": "a07d00aee9d3376d",
|
||||
"blue": 455,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 437.2,
|
||||
"h1": {
|
||||
"blocks": 435,
|
||||
"sink": "eaff2cb616a46c0e",
|
||||
"daa": 434,
|
||||
"blue": 435,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 461,
|
||||
"sink": "4783198d038613db",
|
||||
"blue": 461,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 442.2,
|
||||
"h1": {
|
||||
"blocks": 439,
|
||||
"sink": "103fa3b3ea629ad7",
|
||||
"daa": 438,
|
||||
"blue": 439,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 465,
|
||||
"sink": "91ba868ec4f84eef",
|
||||
"blue": 465,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 447.3,
|
||||
"h1": {
|
||||
"blocks": 448,
|
||||
"sink": "8437327aa78561ba",
|
||||
"daa": 447,
|
||||
"blue": 448,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 474,
|
||||
"sink": "bb9ac90349a213e3",
|
||||
"blue": 474,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 452.3,
|
||||
"h1": {
|
||||
"blocks": 450,
|
||||
"sink": "03bd0f5a924e03ee",
|
||||
"daa": 449,
|
||||
"blue": 450,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 478,
|
||||
"sink": "eca80f2c1a2106d5",
|
||||
"blue": 478,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 457.3,
|
||||
"h1": {
|
||||
"blocks": 461,
|
||||
"sink": "3fc505f8af71ea5f",
|
||||
"daa": 460,
|
||||
"blue": 461,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 481,
|
||||
"sink": "017216a3976533dd",
|
||||
"blue": 481,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 462.3,
|
||||
"h1": {
|
||||
"blocks": 463,
|
||||
"sink": "a1b1d645d944446d",
|
||||
"daa": 462,
|
||||
"blue": 463,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 488,
|
||||
"sink": "3ade2bb97b8e7548",
|
||||
"blue": 488,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 467.3,
|
||||
"h1": {
|
||||
"blocks": 466,
|
||||
"sink": "5b046e8c04baa74e",
|
||||
"daa": 465,
|
||||
"blue": 466,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 494,
|
||||
"sink": "179ad98b8bcc4ea5",
|
||||
"blue": 494,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 472.3,
|
||||
"h1": {
|
||||
"blocks": 470,
|
||||
"sink": "aaf64f90ccac9c8a",
|
||||
"daa": 469,
|
||||
"blue": 470,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 498,
|
||||
"sink": "1970740c1d9b0f6c",
|
||||
"blue": 498,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 477.3,
|
||||
"h1": {
|
||||
"blocks": 473,
|
||||
"sink": "b557fc4c16174c35",
|
||||
"daa": 472,
|
||||
"blue": 473,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 506,
|
||||
"sink": "078df046b3a9953f",
|
||||
"blue": 506,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 482.3,
|
||||
"h1": {
|
||||
"blocks": 480,
|
||||
"sink": "7d7d5f6734e2c727",
|
||||
"daa": 479,
|
||||
"blue": 480,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 510,
|
||||
"sink": "9e0f40b6766308e8",
|
||||
"blue": 510,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 487.4,
|
||||
"h1": {
|
||||
"blocks": 485,
|
||||
"sink": "6d3ff10f4556a1ca",
|
||||
"daa": 484,
|
||||
"blue": 485,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 512,
|
||||
"sink": "aecf9f8ea6485764",
|
||||
"blue": 512,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 492.4,
|
||||
"h1": {
|
||||
"blocks": 489,
|
||||
"sink": "1196cd92a2989963",
|
||||
"daa": 488,
|
||||
"blue": 489,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 518,
|
||||
"sink": "0a3a90068c2d74c0",
|
||||
"blue": 518,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 497.4,
|
||||
"h1": {
|
||||
"blocks": 494,
|
||||
"sink": "27ca83564fbe47ce",
|
||||
"daa": 493,
|
||||
"blue": 494,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 524,
|
||||
"sink": "42b2b2dc9f1e4be2",
|
||||
"blue": 524,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 502.4,
|
||||
"h1": {
|
||||
"blocks": 498,
|
||||
"sink": "3f2c6e34b36b890e",
|
||||
"daa": 497,
|
||||
"blue": 498,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 531,
|
||||
"sink": "d19320eebc86c66d",
|
||||
"blue": 531,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 507.4,
|
||||
"h1": {
|
||||
"blocks": 535,
|
||||
"sink": "126029df2f9caa4a",
|
||||
"daa": 534,
|
||||
"blue": 535,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 535,
|
||||
"sink": "126029df2f9caa4a",
|
||||
"blue": 535,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 512.4,
|
||||
"h1": {
|
||||
"blocks": 543,
|
||||
"sink": "533898421902f564",
|
||||
"daa": 542,
|
||||
"blue": 543,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 543,
|
||||
"sink": "533898421902f564",
|
||||
"blue": 543,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 517.4,
|
||||
"h1": {
|
||||
"blocks": 546,
|
||||
"sink": "85a43553233cf34b",
|
||||
"daa": 545,
|
||||
"blue": 546,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 546,
|
||||
"sink": "85a43553233cf34b",
|
||||
"blue": 546,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 522.4,
|
||||
"h1": {
|
||||
"blocks": 554,
|
||||
"sink": "bed61271f9a8252d",
|
||||
"daa": 553,
|
||||
"blue": 554,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 554,
|
||||
"sink": "bed61271f9a8252d",
|
||||
"blue": 554,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 527.4,
|
||||
"h1": {
|
||||
"blocks": 560,
|
||||
"sink": "9e91960a30057229",
|
||||
"daa": 559,
|
||||
"blue": 560,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 560,
|
||||
"sink": "9e91960a30057229",
|
||||
"blue": 560,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 532.4,
|
||||
"h1": {
|
||||
"blocks": 564,
|
||||
"sink": "cd6d1240dc30d2e4",
|
||||
"daa": 563,
|
||||
"blue": 564,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 564,
|
||||
"sink": "cd6d1240dc30d2e4",
|
||||
"blue": 564,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 537.4,
|
||||
"h1": {
|
||||
"blocks": 570,
|
||||
"sink": "0208b9cbd8adfa78",
|
||||
"daa": 569,
|
||||
"blue": 570,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 570,
|
||||
"sink": "0208b9cbd8adfa78",
|
||||
"blue": 570,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 542.4,
|
||||
"h1": {
|
||||
"blocks": 573,
|
||||
"sink": "627692d65f09e879",
|
||||
"daa": 572,
|
||||
"blue": 573,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 573,
|
||||
"sink": "627692d65f09e879",
|
||||
"blue": 573,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 547.5,
|
||||
"h1": {
|
||||
"blocks": 576,
|
||||
"sink": "84b34763f034804b",
|
||||
"daa": 575,
|
||||
"blue": 576,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 576,
|
||||
"sink": "84b34763f034804b",
|
||||
"blue": 576,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 552.5,
|
||||
"h1": {
|
||||
"blocks": 580,
|
||||
"sink": "4ce7dce8da22296a",
|
||||
"daa": 579,
|
||||
"blue": 580,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 580,
|
||||
"sink": "4ce7dce8da22296a",
|
||||
"blue": 580,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 557.5,
|
||||
"h1": {
|
||||
"blocks": 585,
|
||||
"sink": "f8c7fb1089532dde",
|
||||
"daa": 584,
|
||||
"blue": 585,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 585,
|
||||
"sink": "f8c7fb1089532dde",
|
||||
"blue": 585,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 562.5,
|
||||
"h1": {
|
||||
"blocks": 590,
|
||||
"sink": "07d408946584e422",
|
||||
"daa": 589,
|
||||
"blue": 590,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 590,
|
||||
"sink": "07d408946584e422",
|
||||
"blue": 590,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 567.5,
|
||||
"h1": {
|
||||
"blocks": 598,
|
||||
"sink": "3ffc006b66a221b9",
|
||||
"daa": 597,
|
||||
"blue": 598,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 598,
|
||||
"sink": "3ffc006b66a221b9",
|
||||
"blue": 598,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 572.5,
|
||||
"h1": {
|
||||
"blocks": 602,
|
||||
"sink": "b3827232c44b06d2",
|
||||
"daa": 601,
|
||||
"blue": 602,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 602,
|
||||
"sink": "b3827232c44b06d2",
|
||||
"blue": 602,
|
||||
"reorged": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"node": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneumd",
|
||||
"miner": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneum-miner",
|
||||
"slot": 4,
|
||||
"ports": {
|
||||
"base": 30850,
|
||||
"suffix": 984
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
12:48:26.723 fg4 case partition-gate-on-expect-reorg: mode partition, gate on (window 60 DAA), joint 240 s, split 180 s, watch 150 s, honest 1 thread(s) each, attacker 3 (joint 1), expect reorg
|
||||
12:48:28.322 fg4 h1 up pid 480248 json 30852 p2p 30851
|
||||
12:48:29.844 fg4 h2 up pid 481994 json 30862 p2p 30861 addpeer 30881
|
||||
12:52:32.858 fg4 phase 1 done at 240.0 s: H1 246 blocks sink 5c4cb584 daa 245; H2 246 sink 5c4cb584; side 2 (h2) 246 sink 5c4cb584; keys H1 8da9ddee H2 undefined side2 eda9cde4
|
||||
12:52:32.918 fg4 weight at the fork (last 121 blue blocks of H1's chain): side 2 45, others 76, side 2 3719 bps
|
||||
12:52:34.929 fg4 links cut at 242.1 s; side 2 (h2) now mines with 3 thread(s), the honest side with 1 each
|
||||
12:55:35.033 fg4 phase 2 done at 422.2 s: H1 412 blocks sink 753507c1 daa 411 blue 412 work 11490863; side 2 440 sink 32b7c175 daa 439 blue 440 work 18089683 (side 2 heavier: true); fork depth 194 DAA against window 60
|
||||
12:55:35.035 fg4 links restored at 422.2 s; watching H1 for 150 s
|
||||
12:56:05.124 fg4 t=452.3 s H1 450 blocks sink 03bd0f5a held; side 2 478 blocks sink eca80f2c
|
||||
12:56:35.198 fg4 t=482.4 s H1 480 blocks sink 7d7d5f67 held; side 2 510 blocks sink 9e0f40b6
|
||||
12:57:00.246 fg4 H1 left its pre-cut chain at 507.4 s: sink 126029df2f9caa4a by eda9cde4
|
||||
12:57:05.255 fg4 t=512.4 s H1 543 blocks sink 53389842 REORGED; side 2 543 blocks sink 53389842
|
||||
12:57:35.298 fg4 t=542.5 s H1 573 blocks sink 627692d6 REORGED; side 2 573 blocks sink 627692d6
|
||||
12:58:05.330 fg4 t=572.5 s H1 602 blocks sink b3827232 REORGED; side 2 602 blocks sink b3827232
|
||||
12:58:05.334 fg4 SUMMARY PASS (partition-gate-on-expect-reorg): side 2 held 3719 bps of the blue blocks at the fork; fork depth 194 DAA against window 60; side 2 blue work 18089683 against H1 11490863 at the heal; H1 reorged at 507.4 s (0 refusal lines, knows side 2's tip: true); side 2 kept its chain: true
|
||||
12:58:05.334 fg4 summary: /srv/builds/igneum-wt-horizon/docs/plans/mission-item-4-gate/fork-gate-partition-gate-on-expect-reorg.json
|
||||
|
|
@ -0,0 +1,930 @@
|
|||
{
|
||||
"pass": true,
|
||||
"expect": "reorg",
|
||||
"case": "third-gate-on-expect-reorg",
|
||||
"mode": "third",
|
||||
"gate": "on",
|
||||
"window": 60,
|
||||
"joint": 240,
|
||||
"split": 180,
|
||||
"watch": 150,
|
||||
"threads": {
|
||||
"honest_each": 1,
|
||||
"attacker_split": 3,
|
||||
"attacker_joint": 2
|
||||
},
|
||||
"keys": {
|
||||
"h1": "8da9ddee…",
|
||||
"h2": "eda9cde4…",
|
||||
"side2": "0e2c6fe2…"
|
||||
},
|
||||
"share_at_fork": {
|
||||
"side2": 72,
|
||||
"others": 48,
|
||||
"side2_bps": 6000
|
||||
},
|
||||
"fork_daa": 268,
|
||||
"fork_depth_daa_at_heal": 166,
|
||||
"sinks": {
|
||||
"joint": {
|
||||
"h1": {
|
||||
"hash": "037edd2a2976af7aec3f6b00d0532706f2c4bc48a2ace2d4e92f027492aa42af",
|
||||
"blocks": 269,
|
||||
"daa": 268,
|
||||
"blue": 269,
|
||||
"blueWork": "17483286",
|
||||
"key": "0e2c6fe2…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "037edd2a2976af7aec3f6b00d0532706f2c4bc48a2ace2d4e92f027492aa42af",
|
||||
"blocks": 269,
|
||||
"daa": 268,
|
||||
"blue": 269,
|
||||
"blueWork": "17483286",
|
||||
"key": "0e2c6fe2…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "037edd2a2976af7aec3f6b00d0532706f2c4bc48a2ace2d4e92f027492aa42af",
|
||||
"blocks": 269,
|
||||
"daa": 268,
|
||||
"blue": 269,
|
||||
"blueWork": "17483286",
|
||||
"key": "0e2c6fe2…"
|
||||
}
|
||||
},
|
||||
"split": {
|
||||
"h1": {
|
||||
"hash": "06f666ba3c449f2fab804e75612a00c748a8d56568806c30a7006aae175bb27d",
|
||||
"blocks": 426,
|
||||
"daa": 425,
|
||||
"blue": 426,
|
||||
"blueWork": "24628833",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "06f666ba3c449f2fab804e75612a00c748a8d56568806c30a7006aae175bb27d",
|
||||
"blocks": 426,
|
||||
"daa": 425,
|
||||
"blue": 426,
|
||||
"blueWork": "24628833",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "71396cf73521295ad0fbeb320de980989ea0788dbc859129d8972a9e091e0a3c",
|
||||
"blocks": 435,
|
||||
"daa": 434,
|
||||
"blue": 435,
|
||||
"blueWork": "28969222",
|
||||
"key": "0e2c6fe2…"
|
||||
}
|
||||
}
|
||||
},
|
||||
"per_node": {
|
||||
"h1": {
|
||||
"held": false,
|
||||
"reorged": true,
|
||||
"reorg_at_s": 477.3,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 0
|
||||
},
|
||||
"h2": {
|
||||
"held": false,
|
||||
"reorged": true,
|
||||
"reorg_at_s": 477.3,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 0
|
||||
}
|
||||
},
|
||||
"checks": {
|
||||
"side2_under_a_third_at_fork": false,
|
||||
"fork_deeper_than_window": true,
|
||||
"side2_heavier_at_heal": true,
|
||||
"every_honest_node_learned_side2_chain": true,
|
||||
"every_honest_node_held": false,
|
||||
"every_honest_node_reorged": true,
|
||||
"every_honest_node_logged_a_refusal": false,
|
||||
"no_honest_node_logged_a_refusal": true,
|
||||
"side2_kept_its_chain": true
|
||||
},
|
||||
"failed_checks": [],
|
||||
"refusal_example": null,
|
||||
"samples": [
|
||||
{
|
||||
"t": 427.2,
|
||||
"h1": {
|
||||
"blocks": 431,
|
||||
"sink": "9a61020b8d49143a",
|
||||
"daa": 430,
|
||||
"blue": 431,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 431,
|
||||
"sink": "9a61020b8d49143a",
|
||||
"daa": 430,
|
||||
"blue": 431,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 441,
|
||||
"sink": "05e6f9d4ef677d31",
|
||||
"blue": 441,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 432.2,
|
||||
"h1": {
|
||||
"blocks": 439,
|
||||
"sink": "a4130e66a3d4a3df",
|
||||
"daa": 438,
|
||||
"blue": 439,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 439,
|
||||
"sink": "a4130e66a3d4a3df",
|
||||
"daa": 438,
|
||||
"blue": 439,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 449,
|
||||
"sink": "f7d08aee6cf90b41",
|
||||
"blue": 449,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 437.2,
|
||||
"h1": {
|
||||
"blocks": 442,
|
||||
"sink": "e1cc039c584559d7",
|
||||
"daa": 441,
|
||||
"blue": 442,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 442,
|
||||
"sink": "e1cc039c584559d7",
|
||||
"daa": 441,
|
||||
"blue": 442,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 455,
|
||||
"sink": "fa56a0ac4e5fb99c",
|
||||
"blue": 455,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 442.2,
|
||||
"h1": {
|
||||
"blocks": 444,
|
||||
"sink": "6904c2a75c7344fe",
|
||||
"daa": 443,
|
||||
"blue": 444,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 444,
|
||||
"sink": "6904c2a75c7344fe",
|
||||
"daa": 443,
|
||||
"blue": 444,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 459,
|
||||
"sink": "04b09f8a190c4051",
|
||||
"blue": 459,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 447.2,
|
||||
"h1": {
|
||||
"blocks": 449,
|
||||
"sink": "d55f8f3f03247788",
|
||||
"daa": 448,
|
||||
"blue": 449,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 449,
|
||||
"sink": "d55f8f3f03247788",
|
||||
"daa": 448,
|
||||
"blue": 449,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 462,
|
||||
"sink": "a6fa74e0833a3e0c",
|
||||
"blue": 462,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 452.2,
|
||||
"h1": {
|
||||
"blocks": 454,
|
||||
"sink": "feb2905b292ab9c7",
|
||||
"daa": 453,
|
||||
"blue": 454,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 454,
|
||||
"sink": "feb2905b292ab9c7",
|
||||
"daa": 453,
|
||||
"blue": 454,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 464,
|
||||
"sink": "093014496d558f65",
|
||||
"blue": 464,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 457.3,
|
||||
"h1": {
|
||||
"blocks": 462,
|
||||
"sink": "b10ed98591f50ec6",
|
||||
"daa": 461,
|
||||
"blue": 462,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 462,
|
||||
"sink": "b10ed98591f50ec6",
|
||||
"daa": 461,
|
||||
"blue": 462,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 469,
|
||||
"sink": "7a00df10d8b78e18",
|
||||
"blue": 469,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 462.3,
|
||||
"h1": {
|
||||
"blocks": 467,
|
||||
"sink": "ebf8c4bd560f2ccf",
|
||||
"daa": 466,
|
||||
"blue": 467,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 467,
|
||||
"sink": "ebf8c4bd560f2ccf",
|
||||
"daa": 466,
|
||||
"blue": 467,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 474,
|
||||
"sink": "ade976380c06a8d8",
|
||||
"blue": 474,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 467.3,
|
||||
"h1": {
|
||||
"blocks": 471,
|
||||
"sink": "311bf74ecfb1cb33",
|
||||
"daa": 470,
|
||||
"blue": 471,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 471,
|
||||
"sink": "311bf74ecfb1cb33",
|
||||
"daa": 470,
|
||||
"blue": 471,
|
||||
"key": "8da9ddee",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 482,
|
||||
"sink": "a1dc4abe41431122",
|
||||
"blue": 482,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 472.3,
|
||||
"h1": {
|
||||
"blocks": 476,
|
||||
"sink": "0fc8726976801d2b",
|
||||
"daa": 475,
|
||||
"blue": 476,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 476,
|
||||
"sink": "0fc8726976801d2b",
|
||||
"daa": 475,
|
||||
"blue": 476,
|
||||
"key": "eda9cde4",
|
||||
"reorged": false,
|
||||
"knows_side2_tip": false
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 487,
|
||||
"sink": "c2c737c0d473f009",
|
||||
"blue": 487,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 477.3,
|
||||
"h1": {
|
||||
"blocks": 492,
|
||||
"sink": "df2ecca49796b69c",
|
||||
"daa": 491,
|
||||
"blue": 492,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 492,
|
||||
"sink": "df2ecca49796b69c",
|
||||
"daa": 491,
|
||||
"blue": 492,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 492,
|
||||
"sink": "df2ecca49796b69c",
|
||||
"blue": 492,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 482.3,
|
||||
"h1": {
|
||||
"blocks": 498,
|
||||
"sink": "33ab64dbbd41433e",
|
||||
"daa": 497,
|
||||
"blue": 498,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 498,
|
||||
"sink": "33ab64dbbd41433e",
|
||||
"daa": 497,
|
||||
"blue": 498,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 498,
|
||||
"sink": "33ab64dbbd41433e",
|
||||
"blue": 498,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 487.3,
|
||||
"h1": {
|
||||
"blocks": 506,
|
||||
"sink": "4fa4f31a124990c1",
|
||||
"daa": 505,
|
||||
"blue": 506,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 506,
|
||||
"sink": "4fa4f31a124990c1",
|
||||
"daa": 505,
|
||||
"blue": 506,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 506,
|
||||
"sink": "4fa4f31a124990c1",
|
||||
"blue": 506,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 492.3,
|
||||
"h1": {
|
||||
"blocks": 510,
|
||||
"sink": "4121ec5f7e04b3a2",
|
||||
"daa": 509,
|
||||
"blue": 510,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 510,
|
||||
"sink": "4121ec5f7e04b3a2",
|
||||
"daa": 509,
|
||||
"blue": 510,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 510,
|
||||
"sink": "4121ec5f7e04b3a2",
|
||||
"blue": 510,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 497.3,
|
||||
"h1": {
|
||||
"blocks": 518,
|
||||
"sink": "217d584ac3d48f32",
|
||||
"daa": 517,
|
||||
"blue": 518,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 518,
|
||||
"sink": "217d584ac3d48f32",
|
||||
"daa": 517,
|
||||
"blue": 518,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 518,
|
||||
"sink": "217d584ac3d48f32",
|
||||
"blue": 518,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 502.3,
|
||||
"h1": {
|
||||
"blocks": 527,
|
||||
"sink": "d14ed2e5f11c7df7",
|
||||
"daa": 526,
|
||||
"blue": 527,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 527,
|
||||
"sink": "d14ed2e5f11c7df7",
|
||||
"daa": 526,
|
||||
"blue": 527,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 527,
|
||||
"sink": "d14ed2e5f11c7df7",
|
||||
"blue": 527,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 507.3,
|
||||
"h1": {
|
||||
"blocks": 533,
|
||||
"sink": "23cf4405d058110e",
|
||||
"daa": 532,
|
||||
"blue": 533,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 533,
|
||||
"sink": "23cf4405d058110e",
|
||||
"daa": 532,
|
||||
"blue": 533,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 533,
|
||||
"sink": "23cf4405d058110e",
|
||||
"blue": 533,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 512.4,
|
||||
"h1": {
|
||||
"blocks": 537,
|
||||
"sink": "ec6ff75c8617a6c0",
|
||||
"daa": 535,
|
||||
"blue": 536,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 537,
|
||||
"sink": "ec6ff75c8617a6c0",
|
||||
"daa": 535,
|
||||
"blue": 536,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 537,
|
||||
"sink": "ec6ff75c8617a6c0",
|
||||
"blue": 536,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 517.4,
|
||||
"h1": {
|
||||
"blocks": 542,
|
||||
"sink": "53152f1d8342a7ba",
|
||||
"daa": 541,
|
||||
"blue": 542,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 542,
|
||||
"sink": "53152f1d8342a7ba",
|
||||
"daa": 541,
|
||||
"blue": 542,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 542,
|
||||
"sink": "53152f1d8342a7ba",
|
||||
"blue": 542,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 522.4,
|
||||
"h1": {
|
||||
"blocks": 548,
|
||||
"sink": "1425827f8f967320",
|
||||
"daa": 547,
|
||||
"blue": 548,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 548,
|
||||
"sink": "1425827f8f967320",
|
||||
"daa": 547,
|
||||
"blue": 548,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 548,
|
||||
"sink": "1425827f8f967320",
|
||||
"blue": 548,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 527.4,
|
||||
"h1": {
|
||||
"blocks": 554,
|
||||
"sink": "12bc21c9e6549a42",
|
||||
"daa": 553,
|
||||
"blue": 554,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 554,
|
||||
"sink": "12bc21c9e6549a42",
|
||||
"daa": 553,
|
||||
"blue": 554,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 554,
|
||||
"sink": "12bc21c9e6549a42",
|
||||
"blue": 554,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 532.4,
|
||||
"h1": {
|
||||
"blocks": 559,
|
||||
"sink": "b17be188847a071b",
|
||||
"daa": 558,
|
||||
"blue": 559,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 559,
|
||||
"sink": "b17be188847a071b",
|
||||
"daa": 558,
|
||||
"blue": 559,
|
||||
"key": "8da9ddee",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 559,
|
||||
"sink": "b17be188847a071b",
|
||||
"blue": 559,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 537.4,
|
||||
"h1": {
|
||||
"blocks": 564,
|
||||
"sink": "bcf3066ae7329fb1",
|
||||
"daa": 563,
|
||||
"blue": 564,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 564,
|
||||
"sink": "bcf3066ae7329fb1",
|
||||
"daa": 563,
|
||||
"blue": 564,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 564,
|
||||
"sink": "bcf3066ae7329fb1",
|
||||
"blue": 564,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 542.4,
|
||||
"h1": {
|
||||
"blocks": 571,
|
||||
"sink": "3c8486f382c004a4",
|
||||
"daa": 570,
|
||||
"blue": 571,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 571,
|
||||
"sink": "3c8486f382c004a4",
|
||||
"daa": 570,
|
||||
"blue": 571,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 571,
|
||||
"sink": "3c8486f382c004a4",
|
||||
"blue": 571,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 547.4,
|
||||
"h1": {
|
||||
"blocks": 573,
|
||||
"sink": "55eb5bc461792e81",
|
||||
"daa": 572,
|
||||
"blue": 573,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 573,
|
||||
"sink": "55eb5bc461792e81",
|
||||
"daa": 572,
|
||||
"blue": 573,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 573,
|
||||
"sink": "55eb5bc461792e81",
|
||||
"blue": 573,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 552.4,
|
||||
"h1": {
|
||||
"blocks": 577,
|
||||
"sink": "c5812db6a85bdadb",
|
||||
"daa": 576,
|
||||
"blue": 577,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 577,
|
||||
"sink": "c5812db6a85bdadb",
|
||||
"daa": 576,
|
||||
"blue": 577,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 577,
|
||||
"sink": "c5812db6a85bdadb",
|
||||
"blue": 577,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 557.4,
|
||||
"h1": {
|
||||
"blocks": 579,
|
||||
"sink": "a43cb662dec21b79",
|
||||
"daa": 578,
|
||||
"blue": 579,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 579,
|
||||
"sink": "a43cb662dec21b79",
|
||||
"daa": 578,
|
||||
"blue": 579,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 579,
|
||||
"sink": "a43cb662dec21b79",
|
||||
"blue": 579,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 562.4,
|
||||
"h1": {
|
||||
"blocks": 586,
|
||||
"sink": "a5490f8482cfcac1",
|
||||
"daa": 585,
|
||||
"blue": 586,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 586,
|
||||
"sink": "a5490f8482cfcac1",
|
||||
"daa": 585,
|
||||
"blue": 586,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 586,
|
||||
"sink": "a5490f8482cfcac1",
|
||||
"blue": 586,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 567.5,
|
||||
"h1": {
|
||||
"blocks": 590,
|
||||
"sink": "85ff280e3c193276",
|
||||
"daa": 589,
|
||||
"blue": 590,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 590,
|
||||
"sink": "85ff280e3c193276",
|
||||
"daa": 589,
|
||||
"blue": 590,
|
||||
"key": "eda9cde4",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 590,
|
||||
"sink": "85ff280e3c193276",
|
||||
"blue": 590,
|
||||
"reorged": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"t": 572.5,
|
||||
"h1": {
|
||||
"blocks": 591,
|
||||
"sink": "eb3dbbc60e30ebba",
|
||||
"daa": 590,
|
||||
"blue": 591,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"h2": {
|
||||
"blocks": 591,
|
||||
"sink": "eb3dbbc60e30ebba",
|
||||
"daa": 590,
|
||||
"blue": 591,
|
||||
"key": "0e2c6fe2",
|
||||
"reorged": true,
|
||||
"knows_side2_tip": true
|
||||
},
|
||||
"side2": {
|
||||
"blocks": 591,
|
||||
"sink": "eb3dbbc60e30ebba",
|
||||
"blue": 591,
|
||||
"reorged": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"node": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneumd",
|
||||
"miner": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneum-miner",
|
||||
"slot": 3,
|
||||
"ports": {
|
||||
"base": 30810,
|
||||
"suffix": 983
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
12:48:26.802 fg3 case third-gate-on-expect-reorg: mode third, gate on (window 60 DAA), joint 240 s, split 180 s, watch 150 s, honest 1 thread(s) each, attacker 3 (joint 2), expect reorg
|
||||
12:48:28.386 fg3 h1 up pid 480989 json 30812 p2p 30811
|
||||
12:48:29.896 fg3 h2 up pid 482351 json 30822 p2p 30821 addpeer 30811
|
||||
12:48:31.410 fg3 b up pid 483327 json 30832 p2p 30831 addpeer 30841,30842
|
||||
12:52:34.426 fg3 phase 1 done at 240.0 s: H1 269 blocks sink 037edd2a daa 268; H2 269 sink 037edd2a; side 2 (b) 269 sink 037edd2a; keys H1 8da9ddee H2 eda9cde4 side2 0e2c6fe2
|
||||
12:52:34.451 fg3 weight at the fork (last 120 blue blocks of H1's chain): side 2 72, others 48, side 2 6000 bps
|
||||
12:52:36.465 fg3 links cut at 242.1 s; side 2 (b) now mines with 3 thread(s), the honest side with 1 each
|
||||
12:55:36.572 fg3 phase 2 done at 422.2 s: H1 426 blocks sink 06f666ba daa 425 blue 426 work 24628833; side 2 435 sink 71396cf7 daa 434 blue 435 work 28969222 (side 2 heavier: true); fork depth 166 DAA against window 60
|
||||
12:55:36.573 fg3 links restored at 422.2 s; watching H1 and H2 for 150 s
|
||||
12:56:06.662 fg3 t=452.2 s H1 454 blocks sink feb2905b held; H2 454 blocks sink feb2905b held; side 2 464 blocks sink 09301449
|
||||
12:56:31.716 fg3 H1 left its pre-cut chain at 477.3 s: sink df2ecca49796b69c by 0e2c6fe2
|
||||
12:56:31.720 fg3 H2 left its pre-cut chain at 477.3 s: sink df2ecca49796b69c by 0e2c6fe2
|
||||
12:56:36.729 fg3 t=482.3 s H1 498 blocks sink 33ab64db REORGED; H2 498 blocks sink 33ab64db REORGED; side 2 498 blocks sink 33ab64db
|
||||
12:57:06.776 fg3 t=512.4 s H1 537 blocks sink ec6ff75c REORGED; H2 537 blocks sink ec6ff75c REORGED; side 2 537 blocks sink ec6ff75c
|
||||
12:57:36.826 fg3 t=542.4 s H1 571 blocks sink 3c8486f3 REORGED; H2 571 blocks sink 3c8486f3 REORGED; side 2 571 blocks sink 3c8486f3
|
||||
12:58:06.880 fg3 t=572.5 s H1 591 blocks sink eb3dbbc6 REORGED; H2 591 blocks sink eb3dbbc6 REORGED; side 2 591 blocks sink eb3dbbc6
|
||||
12:58:06.890 fg3 SUMMARY PASS (third-gate-on-expect-reorg): side 2 held 6000 bps of the blue blocks at the fork; fork depth 166 DAA against window 60; side 2 blue work 28969222 against H1 24628833 at the heal; H1 reorged at 477.3 s (0 refusal lines, knows side 2's tip: true); H2 reorged at 477.3 s (0 refusal lines, knows side 2's tip: true); side 2 kept its chain: true
|
||||
12:58:06.890 fg3 summary: /srv/builds/igneum-wt-horizon/docs/plans/mission-item-4-gate/fork-gate-third-gate-on-expect-reorg.json
|
||||
796
docs/plans/mission-item-4-gate/summary.json
Normal file
|
|
@ -0,0 +1,796 @@
|
|||
{
|
||||
"green": true,
|
||||
"at": "2026-10-07T12:58:08.407Z",
|
||||
"heal_unchanged": true,
|
||||
"node": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneumd",
|
||||
"miner": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneum-miner",
|
||||
"cases": [
|
||||
{
|
||||
"mode": "attack",
|
||||
"gate": "off",
|
||||
"expect": "reorg",
|
||||
"must": "PASS",
|
||||
"line": "the rule's known-failed case: without the gate a fresh key's heavier deep fork wins on every honest node",
|
||||
"slot": 0,
|
||||
"name": "attack-gate-off-expect-reorg",
|
||||
"verdict": "PASS",
|
||||
"as_it_must": true,
|
||||
"secs": 581,
|
||||
"exit": 0,
|
||||
"summary_line": "SUMMARY PASS (attack-gate-off-expect-reorg): side 2 held 0 bps of the blue blocks at the fork; fork depth 191 DAA against window 60; side 2 blue work 17470131 against H1 14893198 at the heal; H1 reorged at 510.4 s (0 refusal lines, knows side 2's tip: true); H2 reorged at 510.4 s (0 refusal lines, knows side 2's tip: true); side 2 kept its chain: true",
|
||||
"summary": {
|
||||
"pass": true,
|
||||
"expect": "reorg",
|
||||
"case": "attack-gate-off-expect-reorg",
|
||||
"mode": "attack",
|
||||
"gate": "off",
|
||||
"window": 60,
|
||||
"joint": 240,
|
||||
"split": 180,
|
||||
"watch": 150,
|
||||
"threads": {
|
||||
"honest_each": 1,
|
||||
"attacker_split": 3,
|
||||
"attacker_joint": 0
|
||||
},
|
||||
"keys": {
|
||||
"h1": "8da9ddee…",
|
||||
"h2": "eda9cde4…",
|
||||
"side2": "0e2c6fe2…"
|
||||
},
|
||||
"share_at_fork": {
|
||||
"side2": 0,
|
||||
"others": 120,
|
||||
"side2_bps": 0
|
||||
},
|
||||
"fork_daa": 240,
|
||||
"fork_depth_daa_at_heal": 191,
|
||||
"sinks": {
|
||||
"joint": {
|
||||
"h1": {
|
||||
"hash": "e66998c63f8f5d2f3f9108a5c61730f3d5ee06a0553f47e3bce314a0e4d7228e",
|
||||
"blocks": 242,
|
||||
"daa": 240,
|
||||
"blue": 241,
|
||||
"blueWork": "8689541",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "e66998c63f8f5d2f3f9108a5c61730f3d5ee06a0553f47e3bce314a0e4d7228e",
|
||||
"blocks": 242,
|
||||
"daa": 240,
|
||||
"blue": 241,
|
||||
"blueWork": "8689541",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "e66998c63f8f5d2f3f9108a5c61730f3d5ee06a0553f47e3bce314a0e4d7228e",
|
||||
"blocks": 242,
|
||||
"daa": 240,
|
||||
"blue": 241,
|
||||
"blueWork": "8689541",
|
||||
"key": "8da9ddee…"
|
||||
}
|
||||
},
|
||||
"split": {
|
||||
"h1": {
|
||||
"hash": "6e932c389f2ad01a39873317f9549f0a336e66a7c840669dd5bcb44a979a19ad",
|
||||
"blocks": 421,
|
||||
"daa": 420,
|
||||
"blue": 421,
|
||||
"blueWork": "14893198",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "6e932c389f2ad01a39873317f9549f0a336e66a7c840669dd5bcb44a979a19ad",
|
||||
"blocks": 421,
|
||||
"daa": 420,
|
||||
"blue": 421,
|
||||
"blueWork": "14893198",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "d93a1238a397f68337f4bc28d6197a61a32fbca176f3e7f4248b6b330e239cc8",
|
||||
"blocks": 432,
|
||||
"daa": 431,
|
||||
"blue": 432,
|
||||
"blueWork": "17470131",
|
||||
"key": "0e2c6fe2…"
|
||||
}
|
||||
}
|
||||
},
|
||||
"per_node": {
|
||||
"h1": {
|
||||
"held": false,
|
||||
"reorged": true,
|
||||
"reorg_at_s": 510.4,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 0
|
||||
},
|
||||
"h2": {
|
||||
"held": false,
|
||||
"reorged": true,
|
||||
"reorg_at_s": 510.4,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 0
|
||||
}
|
||||
},
|
||||
"checks": {
|
||||
"side2_under_a_third_at_fork": true,
|
||||
"fork_deeper_than_window": true,
|
||||
"side2_heavier_at_heal": true,
|
||||
"every_honest_node_learned_side2_chain": true,
|
||||
"every_honest_node_held": false,
|
||||
"every_honest_node_reorged": true,
|
||||
"every_honest_node_logged_a_refusal": false,
|
||||
"no_honest_node_logged_a_refusal": true,
|
||||
"side2_kept_its_chain": true
|
||||
},
|
||||
"failed_checks": [],
|
||||
"refusal_example": null,
|
||||
"node": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneumd",
|
||||
"miner": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneum-miner",
|
||||
"slot": 0,
|
||||
"ports": {
|
||||
"base": 30690,
|
||||
"suffix": 980
|
||||
}
|
||||
},
|
||||
"log": "/srv/builds/igneum-wt-horizon/docs/plans/mission-item-4-gate/fork-gate-attack-gate-off-expect-reorg.log"
|
||||
},
|
||||
{
|
||||
"mode": "attack",
|
||||
"gate": "off",
|
||||
"expect": "hold",
|
||||
"must": "FAIL",
|
||||
"line": "the harness's own failed shape: with the gate off it must not report a hold",
|
||||
"slot": 1,
|
||||
"name": "attack-gate-off-expect-hold",
|
||||
"verdict": "FAIL",
|
||||
"as_it_must": true,
|
||||
"secs": 581,
|
||||
"exit": 1,
|
||||
"summary_line": "SUMMARY FAIL (attack-gate-off-expect-hold): side 2 held 0 bps of the blue blocks at the fork; fork depth 179 DAA against window 60; side 2 blue work 19683187 against H1 17459678 at the heal; H1 reorged at 480.3 s (0 refusal lines, knows side 2's tip: true); H2 reorged at 480.3 s (0 refusal lines, knows side 2's tip: true); side 2 kept its chain: true; FAILED CHECK every_honest_node_held, every_honest_node_logged_a_refusal",
|
||||
"summary": {
|
||||
"pass": false,
|
||||
"expect": "hold",
|
||||
"case": "attack-gate-off-expect-hold",
|
||||
"mode": "attack",
|
||||
"gate": "off",
|
||||
"window": 60,
|
||||
"joint": 240,
|
||||
"split": 180,
|
||||
"watch": 150,
|
||||
"threads": {
|
||||
"honest_each": 1,
|
||||
"attacker_split": 3,
|
||||
"attacker_joint": 0
|
||||
},
|
||||
"keys": {
|
||||
"h1": "8da9ddee…",
|
||||
"h2": "eda9cde4…",
|
||||
"side2": "0e2c6fe2…"
|
||||
},
|
||||
"share_at_fork": {
|
||||
"side2": 0,
|
||||
"others": 120,
|
||||
"side2_bps": 0
|
||||
},
|
||||
"fork_daa": 247,
|
||||
"fork_depth_daa_at_heal": 179,
|
||||
"sinks": {
|
||||
"joint": {
|
||||
"h1": {
|
||||
"hash": "0535d8ae67287238ee528bae5ab1f366273bd1c65c6a94342ec3879a40b81c88",
|
||||
"blocks": 248,
|
||||
"daa": 247,
|
||||
"blue": 248,
|
||||
"blueWork": "11209205",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "0535d8ae67287238ee528bae5ab1f366273bd1c65c6a94342ec3879a40b81c88",
|
||||
"blocks": 248,
|
||||
"daa": 247,
|
||||
"blue": 248,
|
||||
"blueWork": "11209205",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "0535d8ae67287238ee528bae5ab1f366273bd1c65c6a94342ec3879a40b81c88",
|
||||
"blocks": 248,
|
||||
"daa": 247,
|
||||
"blue": 248,
|
||||
"blueWork": "11209205",
|
||||
"key": "8da9ddee…"
|
||||
}
|
||||
},
|
||||
"split": {
|
||||
"h1": {
|
||||
"hash": "d5347d2cd3468901fda8e5a1caffe0be55d45eb12739577fadb0141d2291c2ba",
|
||||
"blocks": 412,
|
||||
"daa": 411,
|
||||
"blue": 412,
|
||||
"blueWork": "17459678",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "d5347d2cd3468901fda8e5a1caffe0be55d45eb12739577fadb0141d2291c2ba",
|
||||
"blocks": 412,
|
||||
"daa": 411,
|
||||
"blue": 412,
|
||||
"blueWork": "17459678",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "bfdb75e384417228a85f4098f8f2bb65d40c271ce674bea2d1cc8a3c6c335f53",
|
||||
"blocks": 427,
|
||||
"daa": 426,
|
||||
"blue": 427,
|
||||
"blueWork": "19683187",
|
||||
"key": "0e2c6fe2…"
|
||||
}
|
||||
}
|
||||
},
|
||||
"per_node": {
|
||||
"h1": {
|
||||
"held": false,
|
||||
"reorged": true,
|
||||
"reorg_at_s": 480.3,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 0
|
||||
},
|
||||
"h2": {
|
||||
"held": false,
|
||||
"reorged": true,
|
||||
"reorg_at_s": 480.3,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 0
|
||||
}
|
||||
},
|
||||
"checks": {
|
||||
"side2_under_a_third_at_fork": true,
|
||||
"fork_deeper_than_window": true,
|
||||
"side2_heavier_at_heal": true,
|
||||
"every_honest_node_learned_side2_chain": true,
|
||||
"every_honest_node_held": false,
|
||||
"every_honest_node_reorged": true,
|
||||
"every_honest_node_logged_a_refusal": false,
|
||||
"no_honest_node_logged_a_refusal": true,
|
||||
"side2_kept_its_chain": true
|
||||
},
|
||||
"failed_checks": [
|
||||
"every_honest_node_held",
|
||||
"every_honest_node_logged_a_refusal"
|
||||
],
|
||||
"refusal_example": null,
|
||||
"node": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneumd",
|
||||
"miner": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneum-miner",
|
||||
"slot": 1,
|
||||
"ports": {
|
||||
"base": 30730,
|
||||
"suffix": 981
|
||||
}
|
||||
},
|
||||
"log": "/srv/builds/igneum-wt-horizon/docs/plans/mission-item-4-gate/fork-gate-attack-gate-off-expect-hold.log"
|
||||
},
|
||||
{
|
||||
"mode": "attack",
|
||||
"gate": "on",
|
||||
"expect": "hold",
|
||||
"must": "PASS",
|
||||
"line": "the gate line: a fresh-key fork from three windows back, heavier by blue work, refused by every honest node",
|
||||
"slot": 2,
|
||||
"name": "attack-gate-on-expect-hold",
|
||||
"verdict": "PASS",
|
||||
"as_it_must": true,
|
||||
"secs": 581,
|
||||
"exit": 0,
|
||||
"summary_line": "SUMMARY PASS (attack-gate-on-expect-hold): side 2 held 0 bps of the blue blocks at the fork; fork depth 197 DAA against window 60; side 2 blue work 20297242 against H1 14807915 at the heal; H1 held (177 refusal lines, knows side 2's tip: true); H2 held (177 refusal lines, knows side 2's tip: true); side 2 kept its chain: true",
|
||||
"summary": {
|
||||
"pass": true,
|
||||
"expect": "hold",
|
||||
"case": "attack-gate-on-expect-hold",
|
||||
"mode": "attack",
|
||||
"gate": "on",
|
||||
"window": 60,
|
||||
"joint": 240,
|
||||
"split": 180,
|
||||
"watch": 150,
|
||||
"threads": {
|
||||
"honest_each": 1,
|
||||
"attacker_split": 3,
|
||||
"attacker_joint": 0
|
||||
},
|
||||
"keys": {
|
||||
"h1": "8da9ddee…",
|
||||
"h2": "eda9cde4…",
|
||||
"side2": "0e2c6fe2…"
|
||||
},
|
||||
"share_at_fork": {
|
||||
"side2": 0,
|
||||
"others": 121,
|
||||
"side2_bps": 0
|
||||
},
|
||||
"fork_daa": 233,
|
||||
"fork_depth_daa_at_heal": 197,
|
||||
"sinks": {
|
||||
"joint": {
|
||||
"h1": {
|
||||
"hash": "7ed68743f22e711490406bd380cf66fff94579fcc981344c317a46c18cbc61bb",
|
||||
"blocks": 234,
|
||||
"daa": 233,
|
||||
"blue": 234,
|
||||
"blueWork": "8862250",
|
||||
"key": "eda9cde4…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "7ed68743f22e711490406bd380cf66fff94579fcc981344c317a46c18cbc61bb",
|
||||
"blocks": 234,
|
||||
"daa": 233,
|
||||
"blue": 234,
|
||||
"blueWork": "8862250",
|
||||
"key": "eda9cde4…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "7ed68743f22e711490406bd380cf66fff94579fcc981344c317a46c18cbc61bb",
|
||||
"blocks": 234,
|
||||
"daa": 233,
|
||||
"blue": 234,
|
||||
"blueWork": "8862250",
|
||||
"key": "eda9cde4…"
|
||||
}
|
||||
},
|
||||
"split": {
|
||||
"h1": {
|
||||
"hash": "036cfe568f3d403351b338ea41b7069ad4eae0ce95308436a25b6c7aa4c1372a",
|
||||
"blocks": 396,
|
||||
"daa": 395,
|
||||
"blue": 396,
|
||||
"blueWork": "14807915",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "036cfe568f3d403351b338ea41b7069ad4eae0ce95308436a25b6c7aa4c1372a",
|
||||
"blocks": 396,
|
||||
"daa": 395,
|
||||
"blue": 396,
|
||||
"blueWork": "14807915",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "abb93c2318f6c2ebdbd4e14a50b3d73ba7f483b8b06b18666e1015d038d4011a",
|
||||
"blocks": 431,
|
||||
"daa": 430,
|
||||
"blue": 431,
|
||||
"blueWork": "20297242",
|
||||
"key": "0e2c6fe2…"
|
||||
}
|
||||
}
|
||||
},
|
||||
"per_node": {
|
||||
"h1": {
|
||||
"held": true,
|
||||
"reorged": false,
|
||||
"reorg_at_s": null,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 177
|
||||
},
|
||||
"h2": {
|
||||
"held": true,
|
||||
"reorged": false,
|
||||
"reorg_at_s": null,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 177
|
||||
}
|
||||
},
|
||||
"checks": {
|
||||
"side2_under_a_third_at_fork": true,
|
||||
"fork_deeper_than_window": true,
|
||||
"side2_heavier_at_heal": true,
|
||||
"every_honest_node_learned_side2_chain": true,
|
||||
"every_honest_node_held": true,
|
||||
"every_honest_node_reorged": false,
|
||||
"every_honest_node_logged_a_refusal": true,
|
||||
"no_honest_node_logged_a_refusal": false,
|
||||
"side2_kept_its_chain": true
|
||||
},
|
||||
"failed_checks": [],
|
||||
"refusal_example": "Fork choice: block 41225a00fb38b6394540a5707443bd70e678484cbd20aa3fa8e807bb24df8d4a forks 252 DAA back from the sink's chain and its builders hold 0.00% of the weight table at the fork (under one third); not a sink candidate (ledger 51-percent rank 2)",
|
||||
"node": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneumd",
|
||||
"miner": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneum-miner",
|
||||
"slot": 2,
|
||||
"ports": {
|
||||
"base": 30770,
|
||||
"suffix": 982
|
||||
}
|
||||
},
|
||||
"log": "/srv/builds/igneum-wt-horizon/docs/plans/mission-item-4-gate/fork-gate-attack-gate-on-expect-hold.log"
|
||||
},
|
||||
{
|
||||
"mode": "third",
|
||||
"gate": "on",
|
||||
"expect": "reorg",
|
||||
"must": "PASS",
|
||||
"line": "a fork whose builder holds at least a third of the table at the fork is accepted",
|
||||
"slot": 3,
|
||||
"name": "third-gate-on-expect-reorg",
|
||||
"verdict": "PASS",
|
||||
"as_it_must": true,
|
||||
"secs": 583,
|
||||
"exit": 0,
|
||||
"summary_line": "SUMMARY PASS (third-gate-on-expect-reorg): side 2 held 6000 bps of the blue blocks at the fork; fork depth 166 DAA against window 60; side 2 blue work 28969222 against H1 24628833 at the heal; H1 reorged at 477.3 s (0 refusal lines, knows side 2's tip: true); H2 reorged at 477.3 s (0 refusal lines, knows side 2's tip: true); side 2 kept its chain: true",
|
||||
"summary": {
|
||||
"pass": true,
|
||||
"expect": "reorg",
|
||||
"case": "third-gate-on-expect-reorg",
|
||||
"mode": "third",
|
||||
"gate": "on",
|
||||
"window": 60,
|
||||
"joint": 240,
|
||||
"split": 180,
|
||||
"watch": 150,
|
||||
"threads": {
|
||||
"honest_each": 1,
|
||||
"attacker_split": 3,
|
||||
"attacker_joint": 2
|
||||
},
|
||||
"keys": {
|
||||
"h1": "8da9ddee…",
|
||||
"h2": "eda9cde4…",
|
||||
"side2": "0e2c6fe2…"
|
||||
},
|
||||
"share_at_fork": {
|
||||
"side2": 72,
|
||||
"others": 48,
|
||||
"side2_bps": 6000
|
||||
},
|
||||
"fork_daa": 268,
|
||||
"fork_depth_daa_at_heal": 166,
|
||||
"sinks": {
|
||||
"joint": {
|
||||
"h1": {
|
||||
"hash": "037edd2a2976af7aec3f6b00d0532706f2c4bc48a2ace2d4e92f027492aa42af",
|
||||
"blocks": 269,
|
||||
"daa": 268,
|
||||
"blue": 269,
|
||||
"blueWork": "17483286",
|
||||
"key": "0e2c6fe2…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "037edd2a2976af7aec3f6b00d0532706f2c4bc48a2ace2d4e92f027492aa42af",
|
||||
"blocks": 269,
|
||||
"daa": 268,
|
||||
"blue": 269,
|
||||
"blueWork": "17483286",
|
||||
"key": "0e2c6fe2…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "037edd2a2976af7aec3f6b00d0532706f2c4bc48a2ace2d4e92f027492aa42af",
|
||||
"blocks": 269,
|
||||
"daa": 268,
|
||||
"blue": 269,
|
||||
"blueWork": "17483286",
|
||||
"key": "0e2c6fe2…"
|
||||
}
|
||||
},
|
||||
"split": {
|
||||
"h1": {
|
||||
"hash": "06f666ba3c449f2fab804e75612a00c748a8d56568806c30a7006aae175bb27d",
|
||||
"blocks": 426,
|
||||
"daa": 425,
|
||||
"blue": 426,
|
||||
"blueWork": "24628833",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "06f666ba3c449f2fab804e75612a00c748a8d56568806c30a7006aae175bb27d",
|
||||
"blocks": 426,
|
||||
"daa": 425,
|
||||
"blue": 426,
|
||||
"blueWork": "24628833",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "71396cf73521295ad0fbeb320de980989ea0788dbc859129d8972a9e091e0a3c",
|
||||
"blocks": 435,
|
||||
"daa": 434,
|
||||
"blue": 435,
|
||||
"blueWork": "28969222",
|
||||
"key": "0e2c6fe2…"
|
||||
}
|
||||
}
|
||||
},
|
||||
"per_node": {
|
||||
"h1": {
|
||||
"held": false,
|
||||
"reorged": true,
|
||||
"reorg_at_s": 477.3,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 0
|
||||
},
|
||||
"h2": {
|
||||
"held": false,
|
||||
"reorged": true,
|
||||
"reorg_at_s": 477.3,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 0
|
||||
}
|
||||
},
|
||||
"checks": {
|
||||
"side2_under_a_third_at_fork": false,
|
||||
"fork_deeper_than_window": true,
|
||||
"side2_heavier_at_heal": true,
|
||||
"every_honest_node_learned_side2_chain": true,
|
||||
"every_honest_node_held": false,
|
||||
"every_honest_node_reorged": true,
|
||||
"every_honest_node_logged_a_refusal": false,
|
||||
"no_honest_node_logged_a_refusal": true,
|
||||
"side2_kept_its_chain": true
|
||||
},
|
||||
"failed_checks": [],
|
||||
"refusal_example": null,
|
||||
"node": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneumd",
|
||||
"miner": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneum-miner",
|
||||
"slot": 3,
|
||||
"ports": {
|
||||
"base": 30810,
|
||||
"suffix": 983
|
||||
}
|
||||
},
|
||||
"log": "/srv/builds/igneum-wt-horizon/docs/plans/mission-item-4-gate/fork-gate-third-gate-on-expect-reorg.log"
|
||||
},
|
||||
{
|
||||
"mode": "partition",
|
||||
"gate": "on",
|
||||
"expect": "reorg",
|
||||
"must": "PASS",
|
||||
"line": "partition heal with the gate on: the heavier side wins",
|
||||
"slot": 4,
|
||||
"name": "partition-gate-on-expect-reorg",
|
||||
"verdict": "PASS",
|
||||
"as_it_must": true,
|
||||
"secs": 581,
|
||||
"exit": 0,
|
||||
"summary_line": "SUMMARY PASS (partition-gate-on-expect-reorg): side 2 held 3719 bps of the blue blocks at the fork; fork depth 194 DAA against window 60; side 2 blue work 18089683 against H1 11490863 at the heal; H1 reorged at 507.4 s (0 refusal lines, knows side 2's tip: true); side 2 kept its chain: true",
|
||||
"summary": {
|
||||
"pass": true,
|
||||
"expect": "reorg",
|
||||
"case": "partition-gate-on-expect-reorg",
|
||||
"mode": "partition",
|
||||
"gate": "on",
|
||||
"window": 60,
|
||||
"joint": 240,
|
||||
"split": 180,
|
||||
"watch": 150,
|
||||
"threads": {
|
||||
"honest_each": 1,
|
||||
"attacker_split": 3,
|
||||
"attacker_joint": 1
|
||||
},
|
||||
"keys": {
|
||||
"h1": "8da9ddee…",
|
||||
"h2": null,
|
||||
"side2": "eda9cde4…"
|
||||
},
|
||||
"share_at_fork": {
|
||||
"side2": 45,
|
||||
"others": 76,
|
||||
"side2_bps": 3719
|
||||
},
|
||||
"fork_daa": 245,
|
||||
"fork_depth_daa_at_heal": 194,
|
||||
"sinks": {
|
||||
"joint": {
|
||||
"h1": {
|
||||
"hash": "5c4cb584dc015892ddff89337412ed0883d9f97b4e791e7af2f7f64764f4f1e8",
|
||||
"blocks": 246,
|
||||
"daa": 245,
|
||||
"blue": 246,
|
||||
"blueWork": "8723556",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "5c4cb584dc015892ddff89337412ed0883d9f97b4e791e7af2f7f64764f4f1e8",
|
||||
"blocks": 246,
|
||||
"daa": 245,
|
||||
"blue": 246,
|
||||
"blueWork": "8723556",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "5c4cb584dc015892ddff89337412ed0883d9f97b4e791e7af2f7f64764f4f1e8",
|
||||
"blocks": 246,
|
||||
"daa": 245,
|
||||
"blue": 246,
|
||||
"blueWork": "8723556",
|
||||
"key": "8da9ddee…"
|
||||
}
|
||||
},
|
||||
"split": {
|
||||
"h1": {
|
||||
"hash": "753507c15705f4ea8ed19bc2697a11c489a052a45f28c64f9ac3d8400fa66647",
|
||||
"blocks": 412,
|
||||
"daa": 411,
|
||||
"blue": 412,
|
||||
"blueWork": "11490863",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "32b7c1757fa288eed0a8ab709e49fd86f72be531db19c58e63d0aeca7a34c4f6",
|
||||
"blocks": 440,
|
||||
"daa": 439,
|
||||
"blue": 440,
|
||||
"blueWork": "18089683",
|
||||
"key": "eda9cde4…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "32b7c1757fa288eed0a8ab709e49fd86f72be531db19c58e63d0aeca7a34c4f6",
|
||||
"blocks": 440,
|
||||
"daa": 439,
|
||||
"blue": 440,
|
||||
"blueWork": "18089683",
|
||||
"key": "eda9cde4…"
|
||||
}
|
||||
}
|
||||
},
|
||||
"per_node": {
|
||||
"h1": {
|
||||
"held": false,
|
||||
"reorged": true,
|
||||
"reorg_at_s": 507.4,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 0
|
||||
}
|
||||
},
|
||||
"checks": {
|
||||
"side2_under_a_third_at_fork": false,
|
||||
"fork_deeper_than_window": true,
|
||||
"side2_heavier_at_heal": true,
|
||||
"every_honest_node_learned_side2_chain": true,
|
||||
"every_honest_node_held": false,
|
||||
"every_honest_node_reorged": true,
|
||||
"every_honest_node_logged_a_refusal": false,
|
||||
"no_honest_node_logged_a_refusal": true,
|
||||
"side2_kept_its_chain": true
|
||||
},
|
||||
"failed_checks": [],
|
||||
"refusal_example": null,
|
||||
"node": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneumd",
|
||||
"miner": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneum-miner",
|
||||
"slot": 4,
|
||||
"ports": {
|
||||
"base": 30850,
|
||||
"suffix": 984
|
||||
}
|
||||
},
|
||||
"log": "/srv/builds/igneum-wt-horizon/docs/plans/mission-item-4-gate/fork-gate-partition-gate-on-expect-reorg.log"
|
||||
},
|
||||
{
|
||||
"mode": "partition",
|
||||
"gate": "off",
|
||||
"expect": "reorg",
|
||||
"must": "PASS",
|
||||
"line": "partition heal with the gate off: the same outcome, so the heal is unchanged",
|
||||
"slot": 5,
|
||||
"name": "partition-gate-off-expect-reorg",
|
||||
"verdict": "PASS",
|
||||
"as_it_must": true,
|
||||
"secs": 581,
|
||||
"exit": 0,
|
||||
"summary_line": "SUMMARY PASS (partition-gate-off-expect-reorg): side 2 held 5583 bps of the blue blocks at the fork; fork depth 191 DAA against window 60; side 2 blue work 19576159 against H1 12270631 at the heal; H1 reorged at 507.4 s (0 refusal lines, knows side 2's tip: true); side 2 kept its chain: true",
|
||||
"summary": {
|
||||
"pass": true,
|
||||
"expect": "reorg",
|
||||
"case": "partition-gate-off-expect-reorg",
|
||||
"mode": "partition",
|
||||
"gate": "off",
|
||||
"window": 60,
|
||||
"joint": 240,
|
||||
"split": 180,
|
||||
"watch": 150,
|
||||
"threads": {
|
||||
"honest_each": 1,
|
||||
"attacker_split": 3,
|
||||
"attacker_joint": 1
|
||||
},
|
||||
"keys": {
|
||||
"h1": "8da9ddee…",
|
||||
"h2": null,
|
||||
"side2": "eda9cde4…"
|
||||
},
|
||||
"share_at_fork": {
|
||||
"side2": 67,
|
||||
"others": 53,
|
||||
"side2_bps": 5583
|
||||
},
|
||||
"fork_daa": 244,
|
||||
"fork_depth_daa_at_heal": 191,
|
||||
"sinks": {
|
||||
"joint": {
|
||||
"h1": {
|
||||
"hash": "58126c351aa6324a992a47fa66cca22369450c9835d312772c87d3e1aeb409a0",
|
||||
"blocks": 245,
|
||||
"daa": 244,
|
||||
"blue": 245,
|
||||
"blueWork": "9558440",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "58126c351aa6324a992a47fa66cca22369450c9835d312772c87d3e1aeb409a0",
|
||||
"blocks": 245,
|
||||
"daa": 244,
|
||||
"blue": 245,
|
||||
"blueWork": "9558440",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "58126c351aa6324a992a47fa66cca22369450c9835d312772c87d3e1aeb409a0",
|
||||
"blocks": 245,
|
||||
"daa": 244,
|
||||
"blue": 245,
|
||||
"blueWork": "9558440",
|
||||
"key": "8da9ddee…"
|
||||
}
|
||||
},
|
||||
"split": {
|
||||
"h1": {
|
||||
"hash": "a27a341c694aacf22b1a78f44d433e4104f58b23533afb73b7ee6fb9aa37afe4",
|
||||
"blocks": 405,
|
||||
"daa": 404,
|
||||
"blue": 405,
|
||||
"blueWork": "12270631",
|
||||
"key": "8da9ddee…"
|
||||
},
|
||||
"h2": {
|
||||
"hash": "f9181a06c0db716fe4ed200f6f0046c9cb8fae2eb57dd7da4697a268c434a232",
|
||||
"blocks": 436,
|
||||
"daa": 435,
|
||||
"blue": 436,
|
||||
"blueWork": "19576159",
|
||||
"key": "eda9cde4…"
|
||||
},
|
||||
"side2": {
|
||||
"hash": "f9181a06c0db716fe4ed200f6f0046c9cb8fae2eb57dd7da4697a268c434a232",
|
||||
"blocks": 436,
|
||||
"daa": 435,
|
||||
"blue": 436,
|
||||
"blueWork": "19576159",
|
||||
"key": "eda9cde4…"
|
||||
}
|
||||
}
|
||||
},
|
||||
"per_node": {
|
||||
"h1": {
|
||||
"held": false,
|
||||
"reorged": true,
|
||||
"reorg_at_s": 507.4,
|
||||
"knows_side2_tip": true,
|
||||
"refusal_lines": 0
|
||||
}
|
||||
},
|
||||
"checks": {
|
||||
"side2_under_a_third_at_fork": false,
|
||||
"fork_deeper_than_window": true,
|
||||
"side2_heavier_at_heal": true,
|
||||
"every_honest_node_learned_side2_chain": true,
|
||||
"every_honest_node_held": false,
|
||||
"every_honest_node_reorged": true,
|
||||
"every_honest_node_logged_a_refusal": false,
|
||||
"no_honest_node_logged_a_refusal": true,
|
||||
"side2_kept_its_chain": true
|
||||
},
|
||||
"failed_checks": [],
|
||||
"refusal_example": null,
|
||||
"node": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneumd",
|
||||
"miner": "/srv/builds/igneum-wt-horizon/vendor/igneum-node-horizon/target/release/igneum-miner",
|
||||
"slot": 5,
|
||||
"ports": {
|
||||
"base": 30890,
|
||||
"suffix": 985
|
||||
}
|
||||
},
|
||||
"log": "/srv/builds/igneum-wt-horizon/docs/plans/mission-item-4-gate/fork-gate-partition-gate-off-expect-reorg.log"
|
||||
}
|
||||
]
|
||||
}
|
||||
16
docs/plans/relay-deploy-2026-10-07.md
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
# Relay deploy, 7 October 2026 (the X23 tree, MF-11)
|
||||
|
||||
| What | Value |
|
||||
|---|---|
|
||||
| Deployed | 2026-10-07 15:38 BST, from branch update-return bd9b4f4e, relay/ |
|
||||
| Production deployment | https://igneum-relay-iabqarnby-igneum.vercel.app (inspect KHyscUSVKueXueqxvZBRKkaUHwJR), aliased https://relay.igneum.network |
|
||||
| Previous production | https://igneum-relay-bgy767z40-igneum.vercel.app |
|
||||
| Env added | RELAY_RUN_PUB (the public half of ~/.config/igneum/relay-run-key, made by `node tools/relay.mjs keygen` the same hour); RELAY_INTAKE_COMPAT unset |
|
||||
| Read-backs | /wake answers; fn=machines carries the bound field; the console page answers 200 and c/machines carries poll fields; a v1-shaped register by hostname (key tier) answers named:false bound:false; a signed start-app from the Mac answers 200 (item 394); an unsigned run from master's old tool is refused |
|
||||
|
||||
## Rollback
|
||||
|
||||
`cd relay && npx --yes vercel@latest --global-config ~/.config/igneum/vercel --scope igneum rollback https://igneum-relay-bgy767z40-igneum.vercel.app`
|
||||
(or `vercel promote https://igneum-relay-bgy767z40-igneum.vercel.app`). Seconds; nothing to undo in the database: the X23 code adds relay_machines.secret_hash and the
|
||||
table relay_wake_seen, both ignored by the old code. What a rollback loses: signed run verification (the old relay never
|
||||
had it), the start-app kind, the ping; PC 2's new agent registers by hostname on either.
|
||||
|
|
@ -501,3 +501,55 @@ sha256 45be9b02d1b002f5 asserted at the put, igneumd/2.1.0-c4459193 in the node'
|
|||
**PC 2 out of the waves too (main via the Counter lane, 14:5x BST):** the project lead is taking PC 2 down for cable work (PC 1 is back, but it is his desk and no job goes to it); both PCs update on their pollers on return, their lock lines "offline at the sweep, updates on return". The sub-version-2 Windows G1 completed on PC 2 before it went down (13:46:36 to 13:46:50Z, exit 0, eight of eight fingerprints equal to the Mac's). Wave 1 is the Mac, the hands and the fleet.
|
||||
|
||||
**c19-1's last pin lines (the fleet; FORM END rc 0 at 13:50:53Z):** mining at +666 s 34.3 MH/s, mined 66, accepted 66, rejected 0, got_reject 0, wrong_version 0, isSynced true at the tip on every read, the exec follower moving; the hub holds 41 blocks by c19-1's key 2c7cc291d38579e0 in its last 700, rejects naming the pod 0; the restart on the kept datadir 13:47:15Z: the stop and the start inside seven seconds (09124180's poll proving itself against b7cc37e7's LOCK death), synced again 13:48:39Z (157,048 blocks, 4 peers), 84 seconds after the kill, isSynced true on the first read and never false after; 109 templates in the read, max template_ms 3,432, "template fetch timed out" 0; the kept read passed at 13:38Z. Every line the rule reads is in from c19-1; CASES END from c20-1 is the one left (about 14:50Z). c19-1 stays up until the shipper's word. p1-5090 ran the sub-version-2 G1 meanwhile (eight of eight equal to the Mac's) and is back under its supervisor.
|
||||
|
||||
**The prover roll corrected (the fleet, 15:0x BST):** box-prover's "RESULT paid" line read the segment record's `paid` field without comparing its keyHash to the box's own, so a segment paid to ANY prover printed as the box's pay; this morning's PAIRED verdicts rested on it. The truth from hub-1's segment records (157486..164691, 899 segments, 378 paid) by paid.keyHash: p1-4090 94, p2-4090-3 54, hub-1 41, p1-4070 20, p2-4070-1 11, p12-vast 3, two keys the registry does not hold (bb9f9057a373f647 99, the devnet's biggest payer; e809e39672ed32db 56), and ZERO in two hours for p1-5090, p2-4090-1b, p2-3090-1 to 4 and p1-a5000. So: the pair is on 13 of 13 and pairs on every box; 5 of 13 are paid by the chain's record, 7 are not (their logs under read: race or stuck); the 12 GB race reading was half right (p2-4070-1 at 12 GB is paid 11 times while the 3090s and the 5090 are not, so card size is not what holds those six). The 12 GB line, real: p12-vast was paid three segments by its own key on the bare 55768f88 node, each claimed behind the settled floor (164438 claimed 13:41:00Z paid at carrier 164494 5.8388 IGN; 164502 at 13:45:06Z paid 4.8263; 164510 at 13:48:58Z paid 4.5727); on c4459193 with the verifier env (13:31 to 13:37Z) the statement was accepted and no race won in that window: the pin's line is "statement accepted, 0 paid in six minutes", not blocking. box-prover fixed (gpu-fleet 4c872785: a paid line only on its own key, "paid_other" otherwise), on every standing box; running provers take it at their next restart by kill file, which the sweep's prover roll does. Who holds bb9f9057 and e809e396 (PC 2's app, the Mac, the hands' CPU prover) is for main.
|
||||
|
||||
**Docs on master (15:01 BST):** the 0.3.20 plan, release-rules.md and the 0.3.21 plan landed as ship-docs-0320 3ad0c60d through tools/ci/merge-to-master.sh (the full gate green on the branch, 52 checks; the merge 41e0eb45). From here plan rows land the same way.
|
||||
|
||||
**The two paid prover keys outside the fleet's registry (15:3x BST):** e809e39672ed32db (56 segments in two hours) is PC 2's card 1, identity 1 (label win-1ccfe586-1-1; read by the build-server lane's read-only job run-20261007-142054 on PC 2 at 15:38 BST through the installed igneum-miner's key-hash; PC 2 is back since the cable work). bb9f9057a373f647 (99 segments, the devnet's biggest payer) is none of PC 2's seven labels, nor the Mac's (mac-d937c69d-1 = 8fafda27…), and build-1 runs no prover; PC 1 (labels win-ae432dc7-1/-2 and their identities) is the remaining candidate, its key read by the project lead from the Prove page's Details on main's ask (no job on PC 1). For 0.3.21 the app reports its vote key hashes to the intake on every poll, so this is never a hand read again.
|
||||
|
||||
**Devnet 2 (the fleet, 15:4x BST):** dn2-override.json is an eleven-field object without the v4 floor or window, so Devnet 2 has no flip date and the 13 October line does not apply to its lock lines; igneumd-83702a35 and c4459193 both print digest 4a0b8726… on it, so wave 3 is a plain binary swap on the four pods (read-back 4a0b8726) and bps-seed moves at the build-server lane's convenience with no digest step. The cases on c20-1: the poison pod mining from 14:41:25Z, the thirteen polls to about 14:54Z, the restart and the hub read after: CASES END about 14:57Z (15:57 BST); the per-box sweep form rehearsed on w-target meanwhile. The publish about 16:00 BST on it.
|
||||
|
||||
## 38. 0.3.20 LIVE (15:54:17 BST, 7 October 2026)
|
||||
|
||||
**Main's word (15:4x BST):** (b): publish on the dc141409 cases plus the diff argument and the c19-1 relay evidence; the separate-host relay re-run (CASES END about 17:15 BST) is a halt condition: a FAIL stops the sweep after the wave in progress and rolls back by the per-box form; no public Discord card or site version bump until it reads PASS. The cases rerun on c20-1 was void on its relay half: RunPod put the target, the relay and the poison pods on one host and a pod cannot reach another on its own host by the public address (the no-hairpin class); the poison half stood (13 rejected, 0 accepted). The hairpin class is a rent-time host check in the fleet's script.
|
||||
|
||||
**The cut:** live DAA 294,073 at 15:51 BST; the floor-moved file ov16-floor-900000.json (sha256 294f1f80f1c8aecf…): program_class_v4_activation_daa 831600 → 900000, window 86400 unchanged, the fifteen other fields as live; digest on c4459193 4bbbe8162ea9fff277aa5b16b4ffad9e2262ba5e6a5acac7b697ff77211e7328 (the live file reads eada4bda on the same binary). Staged in a scratch copy of the downloads folder (publish-manifest.sh --no-deploy --public with the DMG 73796c5f and the installer 45b2f3fb; publish-public.sh --hive with igneum-hive-0.3.20.tar.gz d9dd12df); the staged manifest differed from the live one in the override object alone; the staged folder's names differed from the live one in the 0.3.20 files added and the 0.3.19 and 0.3.17 public files pruned. The deploy step: the staged folder onto the live one, `vercel deploy --prod` (Production igneum-qu5chjxiq, aliased dl.igneum.network), 15:54:17 BST. Read back: the live manifest version 0.3.20, mac 73796c5f, windows 45b2f3fb, floor 900000; the three public aliases 200 (windows exe, mac dmg, hive tar).
|
||||
|
||||
**The sweep's go (15:55 BST):** the fleet's wave 1 (hub-1 first, pool-1, the eight heaviest; the fleet-native pair a8d08da5 / 474273ce; read-back by commit string c4459193, digest 4bbbe816, synced; the lock line "sweep complete before 13 October 09:00 UK (the margin; the floor is now DAA 900,000)"), the hands in the same minutes (the build-server lane, mode 2 with the object and the digest), wave 2 on the first lock on the new side, wave 3 the Devnet 2 four as a plain swap (4a0b8726), bps-seed at the build-server lane's convenience with no file change; the seeds and the RPC filter untouched (main's (b)); PC 1 and PC 2 on their pollers on return; the Mac on its poller; the Mac mini a fresh install when the project lead has it up. The Discord card and the site's version line held for the relay re-run's PASS.
|
||||
|
||||
**Correction to the sweep's node pair (16:02 BST):** the fleet-native igneumd a8d08da5 named in the go is gone: the shipper's scratch copy was overwritten at 13:55Z by the stopped 55768f88 chain's native step (05016dee, no c4459193 string) and the box's target-0320 path with it. The sweep's node pair for every fleet box is the build-server lane's c4459193 hands pair from the same tree (igneum 00249643, igneum-pow 8c728ca3, build-1, native 2.39, the string read back): igneumd a80ed39caf885d314f97ce88863afcb307cbb4acc45a10828b2443a41e5d27d2 (57,628,576 B), igneum-miner 70a5180f30fab73fde0b3f33cfd37d2d68899eab70290b86c924e02980b09afd (10,214,648 B). The shipped artefacts are unaffected: the hive tar (d9dd12df, smoked with c4459193 ×2), the Windows exes in the installer (49502cc7, c4459193 ×2) and the Mac node in the DMG (b306baba, c4459193 ×2) were verified from their own files. Scratch rule note: a chain writing into a shared --out directory must stop before another candidate starts; the restart on a new candidate reused the same out paths.
|
||||
|
||||
**Wave 1, the hands (the build-server lane, 15:56:09 to 15:57:45 BST, rc 0):** igneumd a80ed39c installed as /srv/hands/bin/igneumd-2.1.0-c4459193, the sixteen-field object written (floor 900000, window 86400). observer-node restarted 15:57:08 from eada4bda: first executing line "exec state loaded from a snapshot: tip 165393", digest 4bbbe816 MATCHES, the commit string present, powEngine igneum-pow, blockrate bps 1, finalityDepth 43200, ghostdagK 18, mergeDepth 3600, pruningDepth 108000. node1 restarted 15:57:30: tip 165348, digest MATCHES, the string present, powEngine igneum-pow. Lock line carried. Seeds and the RPC filter untouched; bps-seed follows.
|
||||
|
||||
**Interface 1.0.1 over the air (main's order, the shipper as publisher; 16:03:37 BST):** the 0.3.20 tree's app/igneum-app/ui packed as igneum-ui-1.0.1.tar.gz (408,212 B, sha256 0749f37c67c028c8cf1052ed099fea0f1cc159ad6cefdc75d74d2f2de1d9fc45), min_engine 0.3.20, signed with the release key (igneum-ota-sign sign-ui; key fingerprint 8f186e37…), staged first in a scratch copy of the downloads folder (the only field differing from the live token manifest: `ui`; the release notes kept by passing them back), then the deploy step (the staged folder onto the live one, vercel deploy, aliased 16:03 BST). `publish.mjs --verify`: the live manifest's ui entry against the bundle in the folder, sha256 matches, signature verifies. Not published to the public manifest: the publisher's --public arm fails on the ui entry ("the public igneum-app-latest.json would still carry the token": the ui URL is under the token path and publish-public.sh has no ui rewrite), so dl/public/ui/ is missing by design today; the apps read the token manifest, which is where the channel lives; the --public ui arm is a 0.3.21 packaging fix. The Mac's app taking 1.0.1 on its poller: read back below when it polls (hourly, or Settings > Check now).
|
||||
|
||||
**Wave 1 (the fleet, 14:59:08Z):** on igneumd a80ed39c (the floor file 294f1f80 read 4bbbe816 on it on the scratch pod at 14:58Z), the lock before at checkpoint 9259, 80.4 percent; hub-1, pool-1, p1-5090, p1-4090, p2-4090-3, p2-4090-1b, p2-3090-1 to -4 moving in parallel; the miner 70a5180f for the prover roll behind the waves. The relay re-run's three pods carried the old file (eada4bda) and would have read a false FAIL beside the swept fleet; the floor file put on c19-1, c21-relay and c21-poison at 15:00:37Z, the run restarted 15:02Z after a script fault of the fleet's (fixed): CASES END about 16:20Z (17:20 BST), a read on the live digest. bps-seed is build-1 itself (a bare process under /home/build/dn2seed), the build-server lane's, the digest unmoved there.
|
||||
|
||||
**Wave 1 read-back (the fleet, 15:04:51Z):** hub-1 on a80ed39c, igneumd/2.1.0-c4459193, digest 4bbbe816, override 294f1f80, the N13 rewrite line once, synced at 162,489 with 6 peers, the miner back; the same read on p1-5090, p1-4090, p2-4090-3, p2-3090-4 (1 to 2 peers, climbing); p2-4090-1b and p2-3090-2 on the new binary and digest with 0 peers yet (the old-digest peers refuse them, the new ones are the boxes landing beside them; miners held by the supervisor's zero-peer rule until they peer); pool-1's daemon stopped and its node starting on the supervisor's next pass; p2-3090-1 and p2-3090-3 not answering that read's ssh in time (the next pass). The panic counts on the first boxes (10 to 20) are the RocksDB LOCK class from the supervisor's retries while the old process still held the datadir, not consensus; every node is up regardless. The certificate line between waves about 15:10Z.
|
||||
|
||||
**bps-seed (the build-server lane, 16:07:49 to 16:08:00 BST):** the Devnet 2 seed is a bare process on build-1 (/home/build/fleet-share/igneumd-83702a35…, --devnet-suffix=2, appdir /home/build/dn2seed, the eleven-field devnet2-override.json b75d1f58); both binaries read 4a0b8726 on that file first; SIGTERM, the native c4459193 (a80ed39c) started with the identical argument line, down 11 s; read back igneumd/2.1.0-c4459193, the string twice, the digest 4a0b8726 unchanged, the N13 line on the kept datadir, GRPC and P2P up, 23 "PoW accepted" in 20 s, no panic.
|
||||
|
||||
**The Mac (this machine, in wave 1 on its poller):** its hourly check at 16:01 BST had read the 0.3.19 manifest (published 10:23Z) though the CDN served 0.3.20 since 15:54 BST, a stale read of seven minutes (the app's own cache or a stale edge; a 0.3.21 note for the ui-ota health ping, which reads the same path); Settings > Check now at 16:04:58 BST read 0.3.20 (published 15:02:36Z), downloaded and ready by 16:05:20; the apply is the app's own (auto_update on), awaited; interface 1.0.1 after it.
|
||||
|
||||
**0.3.21:** update-return-21b a64c193f (the eGPU card kind for a USB4 or Thunderbolt router in the device's parent chain, the Power Helper's fault line and its stale-prefix fix; app tests 255 + 32 + 8, UI 76) is ready on the lane's side; its push to origin is refused by GitHub ("remote: Internal Server Error", three tries 15:08 to 15:10Z), the lane retrying.
|
||||
|
||||
**The Mac's apply is held by the app's own guard (16:12 BST):** update ready, wait = "the network lost 33% of its identities in the last 10 minutes; holding the update": the wave sweep restarts ten fleet nodes at once (each miner off for the 80 s restart, the zero-peer boxes held longer), the app reads that as an identity drop and holds its apply until the count recovers, then applies at its rollout slot (":MM past the hour", the per-machine minute). The guard is right by design (an app must not update into a shedding network); the consequence is that the apps' pollers apply after the fleet's waves settle, not alongside them. For the rules: a wave sweep and the apps' identity-drop guard interact this way; the publish record names the apps' apply times as they land. The Mac's apply time is read back below.
|
||||
|
||||
**Wave 1 complete, wave 2 started (the fleet, 15:12 to 15:22Z):** all ten read back on the pin (a80ed39c, igneumd/2.1.0-c4459193, digest 4bbbe816, the file 294f1f80, the N13 rewrite line once, synced or catching up): hub-1 (10 peers), pool-1 (its node restarted 15:08:27Z), p1-5090, p1-4090, p2-4090-3, p2-3090-4, and p2-4090-1b, p2-3090-1, p2-3090-2, p2-3090-3. The fault behind the last four: the standing nodes run `--addpeer=<the Hetzner seed> --nodnsseed`; the seed's own move refused their handshake and they dialled nothing for 17 minutes at 0 peers (the six others had the hub in their address books); fixed by HUB_PEER (the hub as a second addpeer) in their supervisors and a kill-file restart, all four at 3 peers. The lock: hub-1's last LOCKED at checkpoint 9263 (15:05:03Z, 49.9 percent at the moment of locking; the folded certificate 98.1 percent, 13 of 16 voters, weight 4,954); no LOCKED since, the digest split's expected shape while the four wave-2 voters still vote on the old side; the first new-side lock being read. Wave 2 (p1-a5000, p1-4070, p2-4070-1, p1-3080) started 15:22Z on the 98.1 reading (their move brings weight onto the new side). Rule for the fleet's supervisors (from this): every standing node carries the hub as a second addpeer, so a seed's move never leaves a box peerless.
|
||||
|
||||
**Master re-pinned (16:21 BST):** packaging/windows/node-source.pin on master moved to c4459193 (master-pin-0320 a0b44b48 through merge-to-master.sh, the full gate 55 checks green; the merge 6996ad3f), so master's windows-ci reads green at its payload-inputs step again (red on every master run since 6 October 21:15Z on the stale pin); release rule 14: master is re-pinned at every publish, a named line in the cut list.
|
||||
|
||||
**The Mac on 0.3.20 and interface 1.0.1 (16:23 BST):** the identity-drop guard lifted as wave 1 settled; the app applied 0.3.20 on its own (updated_from 0.3.19), its node log node-20261007-152327.log starting 16:23:27 BST on igneumd/2.1.0-c4459193, digest 4bbbe816 on its own kept datadir (the N13 rewrite line once), synced at 164,411 blocks with 5 peers at 16:25; interface 1.0.1 taken over the air at 16:23:58 BST (source ota, published_version 1.0.1, active_version 1.0.1, embedded 1.0.0, confirmed true, no error). The Mac is in wave 1 as ordered.
|
||||
|
||||
**Wave 2 and the first lock on the new side (the fleet, 15:23 to 15:29Z):** p1-a5000, p1-4070, p2-4070-1, p1-3080 read back on the pin (a80ed39c, c4459193, 4bbbe816, 294f1f80, the rewrite line once, synced); three sat peerless on the seed-only addpeer (wave 1's class) and carry the hub peer since 15:26Z. The lock: the old side's last at 9263 (15:05:03Z); the new side locked from checkpoint 9313 at 15:28:08Z (84.9 percent of active, 70.1 of total), 9315, 9316 (87.5 of active, 74.9 of total); a 23-minute gap while the table's weight split across the two digests, votes accepted at the hub throughout, no certificate at two thirds until all fourteen stood on the new digest with peers; the folded certificate at 9317 78.3 percent (14 to 15 voters). Equivocation warnings on the hub at 9280 and 9292 by four keys that are not fleet vote keys (e15fe94b, a405c3e6, 7b8ef6fd, ea53bd41: the Mac, PC 2 or the hands re-voting across the split); the fleet's keys did not equivocate. The supervisor rule is in: box-standing.sh adds the hub as a second addpeer by default (gpu-fleet 34ef30f8, README item 20, CLAUDE.md), on all fourteen, live at each next kill-file restart (seven already). Wave 3 (the Devnet 2 four, a binary swap, digest 4a0b8726) started 15:29Z; the prover roll runs behind waves 1 and 2 (the 70a5180f miner, the pair under bin-0320, box-prover with the key check and the drift flag). For the rules: a digest-moving sweep costs the chain its locks for the length of the split (23 minutes here); the hub plus the heaviest voters in one wave shortens it, and every node carrying the hub as a peer shortens it further.
|
||||
|
||||
**Known red on the published pin, test-only (the node lane after the era VDF lane's read, 16:3x BST):** two consensus INTEGRATION test targets, consensus/tests/igneum_installed_signals.rs (`block_template_uses_current_block_version`) and consensus/tests/igneum_order_tests.rs, assert the signalled header version 1026 (object 4) while 8097d600 moved the class signal to object 5 and the header carries 1282; red on c4459193 and every commit since 8097d600; outside the suite set the node lane ran (the two installing-test targets were split into their own binaries this morning for the test-order race and left out of the set). The code is right; the tests are stale, 6b94c823's class. The pin stays c4459193 as published and swept (its binaries keep their commit string); the test-only fix (branch signal-tests-fix on the mirror, 1026 → 1282) is the FIRST step of 0.3.21's node order on 55768f88, and the rule from now: the two integration targets are in every suite set (`cargo test -p kaspa-consensus` without --lib). era-vdf-node 394a5902 is 0.3.22's (the shipper's call; every network at never, era 1 at least 180 days past a genesis).
|
||||
|
||||
## 39. SWEEP COMPLETE (15:39Z, 16:39 BST)
|
||||
|
||||
The devnet: hub-1, pool-1 and the twelve voters on igneumd a80ed39c (string c4459193), the floor file 294f1f80, digest 4bbbe816, the N13 rewrite line once each, synced, the miners back (the 70a5180f miner as the prover roll reaches each box); the first new-side lock 9313 at 15:28:08Z after the 23-minute split, locks every 20 to 40 seconds since at 70 to 81 percent of the total, the folded certificate 78 to 82 percent of the table. The hands (observer-node, node1) and the Mac on the pin with 4bbbe816; the Mac on interface 1.0.1. Devnet 2: dn2-seed, dn2-1, dn2-2, dn2-3 and bps-seed on c4459193, digest 4a0b8726 unchanged; a ten-minute four-way split from the fleet's Devnet 2 move (dn2-seed's supervisor env rebuilt without EVM_PORT and P2P_PORT, box-dn2.sh with no defaults, the seed's node refusing "--evm-rpclisten=127.0.0.1:"), healed at 15:36:25Z, all four at block 76,857 and a new lock at checkpoint 2313 at 15:39:38Z. The testnet seeds on 1c19441d by main's (b). PC 1 and PC 2 update on their pollers on return; the Mac mini a fresh install. Every lock line: "sweep complete before 13 October 09:00 UK (the margin; the floor is now DAA 900,000)". The prover roll runs behind the waves (p1-a5000 refused by design on its drift flag; hub-1 claiming on the pin). Open on the sweep: the relay re-run on c19-1 on the live digest, CASES END about 16:25Z (17:25 BST), the halt condition and the Discord card's gate; build-1's port 26621 (the Devnet 2 seed's p2p) reads closed from outside (a firewall rule predating the sweep; the build-server lane reads it); the two PCs' return.
|
||||
|
||||
The fleet's six faults in the sweep, each a rule in its tooling now: the seed-only addpeer (seven peerless boxes, 23 minutes without a lock; the hub as a default second peer, 34ef30f8); the pool kill file's "all" taking pool-1's supervisor; the loop's expected digest and wanted sha left on the old pin; the cases script re-putting the old object (OVERRIDE input); the sweep's pow read-back term; the Devnet 2 env filter. The shipper's: the speculative build chains sharing one --out directory (a candidate's artefacts overwritten by the next chain's; the sweep's pair taken from the build-server lane's copy at /srv/artefacts/0320-c4459193/ instead), and the first order to the seeds with the devnet file (corrected before any box moved).
|
||||
|
||||
**0.3.21 staging word given at 16:39 BST** (the node lane: c631c64b first on 55768f88, then the eight in order; the whole suite set; the candidate's binary with every gate from the build on the warm set). The reliability injector pod rented at the same minute.
|
||||
|
|
|
|||
|
|
@ -12,14 +12,18 @@ Tree: release-0.3.21 on origin, from release-0.3.20's closed tree (the 0.3.20 cu
|
|||
| sub-version 2 (the hash lane's 07a809a7, byte 7, id a788661687db4bb3), pending the F8 census (about 15:00 BST; pass = all 64 seeds under 1.2x of the window model plus the suite and G1 lines); if it fails or slips past 20:00 BST the node ships byte 5 again with the re-pin dropped | the Counter lane, the node lane | held |
|
||||
| the fork gate from horizon-node (6eb21fc9, six commits on finality.rs) | the node lane | dry-merged clean into c4459193 |
|
||||
| the node's own rust-toolchain.toml | the node lane | in place on its worktree |
|
||||
| the under-12 GB prove-instead switch (section 2) | the shipper | to write after the 0.3.20 publish |
|
||||
| the per-architecture prover server (section 3) | the shipper, the fleet | to write after the 0.3.20 publish |
|
||||
| the under-12 GB prove-instead switch (section 2) | the shipper | in: settings.prove_instead, Cmd::ProveHold, the Prove page's row, provedefault helpers and tests; app gate on build-2 230 + 32 + 8, UI 74 |
|
||||
| the per-architecture prover server (section 3) | the reliability lane (the app's capability check, MF-10 in cbd6f3a4), the fleet (the kit's server per arch) | the app half in |
|
||||
| pool-finish 434e8b9b (the pool crate: the TLS 1.3 member port with the authorize binding, the open pool, pool.md 10; fork pool-finish-node b0444f51 off 8097d600: the pool-mode miner, the IGNS/IGNP codec, pool_split_activation_daa at never on every network, so the digest does not move) and pool-mf-row 343dd83b (MF-11 in the register) | the pool lane | main's word 14:2x BST: rides 0.3.21 with the split switch at never; if it reds a 0.3.21 gate or costs more than one rebase round it moves to 0.3.22 |
|
||||
| apps-harmony (the builder's redesign, Overview as the landing tab, the Prove switch fix), then gpu-logos on top of it, then ui-overlap-fixes, then scene-parity, in that order as they land, each with its own gate line | the UI lanes | to come |
|
||||
| the UI branches (apps-harmony parked by the project lead's word, 14:2x BST; the Prove switch fix moved to gpu-logos): gpu-logos-21 in at fee49fc5, earnings-tidy-21 in, scene-parity-21 in, ui-overlap-fixes nothing to merge | the UI lanes | done |
|
||||
| MF-11 (the app not returning after update-now; PC 2 silent since the 0.3.19 update-now at 10:34Z, its relay agent dead with it, so no job or task reaches it): the register row, the UI lane owning the cause, the relay agent as a service surviving the app as the restart path | the reliability lane, the UI lane, the relay lane | the row asked |
|
||||
| the ids commit 55768f88 (`resolve_program_ids`: the override's fields, then the env or the host, then the embedded verifying keys; the exec suite 32 with the bare-node test known-failed first; built 13:35Z sha 279b1b690e854fc9): 0.3.21's FIRST node commit by main's word, with the ids gate (rule 4c) on every candidate | the node lane | on the mirror; its gates run under rule 4a |
|
||||
| the 0.3.21 node order (main, 14:4x BST), each with its own gate line, one rebase round or 0.3.22: on c4459193, 55768f88; miner-reliability-20 f067f7c1 and the late-join commit 70e4601e; pool-finish-node b0444f51; horizon-node 6eb21fc9 (the deep fork-choice fix, fork_gate never set); peer-directory-node db28d331 (the peer directory prototype, peer_directory_activation_daa at never, the IGNP announce only under --announce); the sub-version-2 re-pin held for the census. The horizon lane rebases its two onto c4459193 at the sweep-end word | the node lane, the horizon lane | staged tonight |
|
||||
| pool-finish-21 at 5e557171 on origin (release-0.3.21 5d153892 plus the ten pool commits, the tenth d5265fb3 the `--template-parallel` fix, default 2: the ten-member window's daemon queued ten template calls on one gRPC connection past its own timeout, 1,891 lines, no job for 36 minutes; site/miner.html carries the pool-fee sentence); igneum-pool 28 at 5e557171 on build-2, the app gate 226 + 32 + 8 at 54dd4c06 (the last commit touches pool/ and docs only); merged after the three UI branches with the app gate rerun at the merge | the pool lane | ready to merge |
|
||||
| the genesis-forward lane's f95178a1 (consensus/src/consensus/services.rs, +5 −1: the difficulty manager takes `params.pow_epoch_blocks` instead of the process-wide static; names the lib-suite flake behind the horizon lane's two reds and main's "difficulty flake": two pruning-proof tests install a 60-block schedule process-wide, and a TestConsensus built in that window refuses block 61 with UnexpectedDifficulty; the lib suite 114 of 114 twice on build-2; the daemon unchanged) | the genesis-forward lane, the node lane | taken last in the node order, its own commit, the lib suite as its line |
|
||||
| ui-overlap-fixes: nothing to merge for the miner (tools/ci/overlap-check.mjs read 0 overlaps on 4c89372a and on 50ffa562, the run on 3dc0832a in flight); the wallet's one finding at 927ad832 on ui-overlap-fixes-wallet off wallet-0.1.5 is the wallet's cut; the detector lands on master with the site fixes | the overlap lane | closed for 0.3.21 |
|
||||
| the app reports its vote key hashes to the intake on every poll (main, 15:2x BST: the two paid devnet keys outside the fleet's registry could only be read by hand on the PCs; chainfacts keeps reading the node's keys too): the labels from prover::labels and igneum-miner key-hash once per labels change, a `keys` field on the app's intake row, the console's machine line showing the first eight of each | the shipper | to write after the 0.3.20 publish, before the 19:30 app gate |
|
||||
| update-return (the MF-11 lane, bd9b4f4e off 4c89372a), main's word 15:2x BST: the app half (ota.rs: the Windows helper owns the update's return with the kept exe set, a 120 s api/state poll, a rollback and one intake line either way; engine.rs: the read-back line "update-return: app <v> up after the update from <from>", FAULT pc-restart after a power loss, the tuner ceiling and the refused-cap ladder; ember.rs; jobrun.rs the job-channel ping on wake; bootcheck.rs; platform.rs), app/windows/host.cpp (a dead engine restarted, WM_QUERYENDSESSION answered; about 60 new C++ lines) and the installer (/IGNOTA=2) ride 0.3.21 if they rebase in one round as update-return-21; the cut's windows.yml run compiling host.cpp is a NAMED GATE LINE (no host.cpp ships uncompiled). The relay half (the v3 agent as a service, playbooks, the X23 signed-run lib) lands through master on the relay lane's line with the relay deploy decision, main's | the update-return lane | rebasing |
|
||||
| 0.3.20's version strings moved to 0.3.21 | the shipper | 0d7b9bd0 |
|
||||
| master 819d536b merged (the 51-check gate; build-remote routes by load; the hands script's pgrep in the bracket form) | the shipper | c83ca904, 0b75cf52 |
|
||||
|
||||
|
|
@ -46,3 +50,35 @@ App: the gate on build-2 about 19:30 BST (`build-remote.sh --box 2 -- test --rel
|
|||
sha256 279b1b690e854fc9, the string read back, pairing 8c728ca3 at byte 5. The digest gate 13:35:41 to 13:37:19Z PASS (thirteen fields a89be8a7 on both binaries, sixteen fields db9a85f9 refused with no peer, the live file's digest eada4bda unmoved); the ten-minute mixed-version gate beside the 5899f603 pair 13:37:40 to 13:47:52Z PASS (digest b0afb2ee on all five, 223 new and 381 old blocks accepted, 0 rejected, plain header version 2, counts equal at 319, 486 and 604 through both joins and the restart step, no panic). The fleet's set on the same binary (the kept start with the ids gate, the cases on the warm set, the wipe) runs under rule 4a. Staging at the sweep-end word in main's order: f067f7c1 and 70e4601e, then b0444f51, then the horizon lane's rebased 6eb21fc9 and db28d331, then the re-pin on the Counter lane's word; suites on build-2 and the digest read after every merge; the next candidate's binary with every gate from its build.
|
||||
|
||||
**scene-parity-21 in (14:5x BST), ahead of ui-overlap-fixes-21 in the order because it was green on the exact tip (50ffa562) while ui-overlap-fixes still rebases:** 20c9153b (0d75bc1f the shared scene/ folder and live-dag.js 2.0.3, c1334faf the app side, 20c9153b the parity harness and its gate line). Lines: build-2 app gate 228 + 32 + 8; UI 72; pre-push 56 with four new chain-scene checks (sync byte-equal, the paint-on-push known-failed test, the feed contract, the parity render on build-2: home fold = /live = app Inspect at T+0, +2, +4 s). live-dag.js 2.0.2 → 2.0.3 (paint on every push whatever the visibility, the blank /live fix; the phone rule on the viewport width); proof-core.js unchanged 2.0.0; the site's copies moved on master f7743534 (igneum.network/live-dag.js reads 2.0.3); the source is scene/live-dag.js, both copies written by `node tools/scene/sync.mjs`, the gate refuses drift, so the 0.3.21 pack carries the 2.0.3 bytes. Users see: the light theme's ember at the brand package's #D0420D, the chain feed asking 300 s, Inspect 420 px tall (seven lanes), the phone layout no longer frozen at launch width, api/live keeping the key id in `miner`. Captures: build-2 /srv/builds/scene-parity/igneum-wt-scene-parity/_out and scratchpad/scene/parity-out.
|
||||
|
||||
**scene-parity-21-sizing in (15:0x BST):** 7e15bf2f on 3dc0832a: live-dag.js 2.0.4 (the box's height follows the lanes through onSize and autoHeight, for /live; the app passes neither, its frames byte-identical, the parity test equal on every comparison); scene/, site/ and the app copy byte-equal; no Rust change, the app gate of 20c9153b stands; pre-push 56 green. The same 2.0.4 is on master at b9017422 and served by igneum.network.
|
||||
|
||||
**pool-finish-21 in (15:0x BST):** 2eea335f (the ten pool commits rebased onto 3dc0832a, no conflict; the pool-fee sentence in site/miner.html). Lines at that tip on build-2: igneum-pool 28; the app gate 229 + 32 + 8. Merged after scene-parity-21-sizing (JS only, so the Rust gate stands). The app side of 0.3.21 now carries: driver-check, miner-reliability-21 (cbd6f3a4), gpu-logos-21 with the Prove switch fix, earnings-tidy-21, scene-parity-21 and its sizing (live-dag.js 2.0.4), pool-finish-21; still mine: the under-12 GB prove-instead switch (section 2). The app gate on the final tree runs on build-2 about 19:30 BST or as soon as the switch lands.
|
||||
|
||||
**N15 rides 0.3.21's node line (the node lane, 15:1x BST):** branch numbering-fix at d8bceca5 (a6864e36 then d8bceca5, from 52e96c94): chain_path checks the first added block's selected parent against the tip record before anything is appended and hands the orphan records above the fork point to the reorg unwind (the shape that left p1-5090 two high: a reorg's removed list one short at 15:51Z on 6 October); a start-time self-check once per process walks the records from the restart pin against the DAG's selected parents, names the first break, unwinds above it and lets the follower re-walk (the shape that left p2-3090-3 46 high from a snapshot carrying its source's break); recordsContinuous and continuityBreak on igneum_getProvingStatus and igneum_getExecStatus (null, true, or false with the break's block), box-prover claiming only on true. The number is canonical by construction from the pin; the carrier's refusal by number stands (the statement binds the number). Two unit tests known-failed first; the exec suite 35 and the kaspad check green on build-2 at 14:13Z; the live line is the fleet's restart of p1-5090 and p2-3090-3 on the 0.3.21 candidate (the self-check naming #155958 and #158875, the unwind, offset 0 after). The 0.3.21 node order, final, on byte 5: 52e96c94, f067f7c1, b0444f51, 437f0438, 2e32d5f6, f95178a1, a6864e36, d8bceca5.
|
||||
|
||||
**update-return-21 in (15:3x BST):** 9d838ae5, one commit on b4289c4a (the app half: ota.rs, engine.rs, jobrun.rs, ember.rs, platform.rs, main.rs, bootcheck.rs; app/windows/host.cpp; Igneum-Miner.iss /IGNOTA=2; one round, main.rs's mod list by union). Lines on the tree: build-2 app tests 247 + 32 + 8; UI 74; the Windows cross green on build-1 (igneum-app.exe 4,172,288 B sha256 5b0598ad…, system DLLs only). host.cpp compiles in the cut's windows.yml run: the named gate line. The relay half stays on update-return for the relay lane's line through master.
|
||||
|
||||
**first-block-21 in (16:0x BST):** 6e555d47 on 064fb02b (ladder.rs: first_block_shown persisted in ladder.json, Ladder::start_run; engine.rs start_run at load and started_at on the state; app.js staleCard, firstWait, the first rung reading the flag; the ui-mock secondblock scenario). Lines: build-2 app gate 254 + 32 + 8 (seven new ladder tests); UI 67 (view 46, one new known-failed first); pre-push 56. No installer, node or host change. Captures ~/Desktop/igneum-previews-2026-10-07/first-block/01 and 02.
|
||||
|
||||
**Three more in (16:2x BST):** update-return-21b a64c193f (the eGPU card kind from a USB4 or Thunderbolt router in the device's parent chain, the Power Helper's fault line and its stale-prefix fix; app 255 + 32 + 8, UI 76); first-block-21 at cc9141cb replacing 6e555d47 (main's "seen once": the first-block card waits until a window has shown it, POST api/card/seen, ladder.rs card_seen; app 255 + 32 + 8, UI 67); miner-reliability-21 at 018440ae (the register: MF-11 in the update-return lane's words, MF-12 the pool stall, MF-13 the Power Helper's stale count; code unchanged since 4a28eb59, CI success). UI tests on the merged tree 76 of 76; the app gate on build-2 at the merged tip below. GitHub refused pushes with "Internal Server Error" from about 15:25 to 16:18 BST, transient.
|
||||
|
||||
**The node order, final (16:3x BST):** on 55768f88: c631c64b first (the test-only fix of the two stale integration targets, 1026 → 1282; both green on build-2 at 15:34Z), then 52e96c94, f067f7c1, b0444f51, 437f0438, 2e32d5f6, f95178a1, a6864e36, d8bceca5; the tip's suite set runs the consensus crate whole (`-p kaspa-consensus` without `--lib`: the lib and both integration targets) beside consensus-core, the miner, kaspa-pow, the exec suite and the three checks (the suite rule from the 0.3.20 known-red finding). era-vdf-node 394a5902 is 0.3.22's.
|
||||
|
||||
## 6. The shape that ships: the 0.3.21 app tree over the field node c4459193 (main, 17:5x BST)
|
||||
|
||||
No node gate for 0.3.21: the app tree ships over the node already in the field (c4459193, the 0.3.20 pin, digest 4bbbe816 on the floor file). The 96161037 line (N15's numbering class, the bare-node proving ids) folds into 0.3.22 and later; its canary cells (kept-datadir ids BOTH PRESENT, wipe canary c22-1 synced in 42 minutes, 23 for 23, restart synced in 1 min 24 s) stand as readings, not as this release's gate.
|
||||
|
||||
**The exact tree:** release-0.3.21 at 44b63ac9 = scaling-21 b340b904 merged (c999a104), the windows.yml smoke fix 6c4686e7 (a direct call with the exit code read, in place of Start-Process -Wait -PassThru, which raced the version read-back on run 37653903394), and the node-source pin back to c4459193 (44b63ac9). App gate GREEN on build-2 on that tree at 18:05 BST: 257 + 32 + 8, rc 0. Payload inputs on the dl host at 18:04 BST: igneumd.exe 49502cc7, igneum-miner.exe b4871b5d (c4459193's Windows pair, the 0.3.20 release's bytes), igneum-worker-cuda.exe d7a413c7, igneum-worker-opencl-intel.exe af53f194, igneum-gpu-telemetry 0d68d06e, the Linux prover pair.
|
||||
|
||||
**The GitHub exception window, from 18:02 BST:** GitHub answers "Your account was suspended" (403) to every call from the igneum-labs login, API and git; the windows.yml dispatch at 18:04 BST was that 403 and no run started. Main's ruling: no lane pushes, fetches or polls GitHub, not even a retry; the box mirror /srv/igneum.git on build-1 and build-2 is origin for every lane; the box gate stamp replaces merge-to-master.sh's CI wait; the window and its start are recorded here and closed by a row when the login is restored. release-0.3.21 44b63ac9 reached both mirrors at 18:12 BST; master a4bca198 was fast-forwarded onto the mirrors (they had sat at 83977817) so every lane's origin carries a current master.
|
||||
|
||||
**Windows without windows.yml:** the 0.3.10 shape. igneum-app.exe cross-built on build-1 from 44b63ac9 (GNU target, 151803c7, 4,232,704 B; igneum-ota-sign.exe ddfd9444; igneum-prove-verify.exe dbda5323), the payload zip igneum-windows-app-0.3.21-44b63ac9.zip 586beedd and the installer kit installer-kit-44b63ac9.zip 6d0b5437 on the dl host; the window host (MSVC, WebView2) and the installer (Inno Setup, rcedit) only build on a Windows box, so a signed job on PC 2 (run-20261007-172000, woken 18:20 BST) builds both, reads --version off the three exes and posts the installer back through the relay; the smoke (install silent, --version read, the app starts and exits clean) runs on PC 2 by a following signed job and is the gate line. PC 2's agent polled the relay at 18:23 BST while its app, node and miners had been down since 17:27 BST (the Intel driver install), so the jobs reach it; no job on PC 1.
|
||||
|
||||
**The Mac:** Igneum-Miner-0.3.21.dmg rebuilt under the build lock at 18:15 BST with c4459193's Mac node pair (igneumd-mac b306baba, igneum-miner-mac deb4d263, the 0.3.20 release's bytes): 490919d9, 44,538,877 bytes, version 0.3.21 build 202610071714. The earlier fb517a11 (96161037's Mac node) never ships.
|
||||
|
||||
**Publish reading:** about 19:15 BST on the smoke's green; the staging in a scratch copy with the live floor file and the 0.3.20 hive package unchanged; the apps on the pollers, the Mac first.
|
||||
|
||||
## 7. LIVE on the Mac, 18:41:50 BST (main's ruling: the Mac entry now, Windows as its own entry)
|
||||
|
||||
Deploy runbook r0321/deploy.sh --mac-only --go (preflight: the staged manifest equals the live one on consensus.override, floor 900000, 16 fields, interface 1.0.1; the DMG present and read back). Copied into the live folder at 18:40:44 BST, Vercel deploy, the live manifest read back at 18:41:50 BST: version 0.3.21, channel devnet, mac Igneum-Miner-0.3.21-c4459193.dmg 490919d9 (44,538,877 bytes), windows none, floor 900000, ui 1.0.1; the DMG from the live URL 490919d9. The 0.3.20 hive package and the floor file unchanged. The Mac poller takes it within the hour or on Check now. The Windows entry lands as its own entry when an installer passes PC 2's smoke: (2a) a per-user Inno Setup 6 install on PC 2 by job (unelevated, fail clean) and (2b) the window host by mingw on the box run in parallel; a PC 1 build job (MSVC) wins over (2b) if the project lead allows one; (2c) windows.yml when GitHub returns is the last resort. Testnet re-arm line (the node lane, 18:38 BST): fork 6ed56f63 on release-0.3.22-node, digest 87d103b6 with no file, genesis 52a3e6a9 (5 October 00:00Z, past), every gate green on the exact commit; Devnet 3's digest on that binary still 83eb50cd. The 0.3.22 node pin candidate: N15 dfae08e5 as 34a2dbaa on 6ed56f63, gates running from 18:39 BST. Signing bonus (for the project lead, the node lane): supply unchanged, only who is paid (a silent producer 72 and the pool 28 instead of 80 and 20; fees untouched); waits for 0.3.23 whatever the decision (c7ea1e21 silent_split missing).
|
||||
|
|
|
|||
71
docs/plans/release-0.3.22.md
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
# Release 0.3.22: Devnet 3 (ordered 7 October 2026, 17:2x BST; genesis by 18:30 BST on the project lead's word)
|
||||
|
||||
Main's order (17:26 BST): Devnet 3 goes now, not after 0.3.21. 0.3.22's node = the release-0.3.21-node worktree on build-1 (96161037, both node gates PASS) + the sub-version 3 igneum-pow pin (the 017e7037 line, byte 7, pairing id a785001687d8688a; the Counter lane's handoff by 17:40 BST, else the node lane takes it from the audit-freeze-2026-10-07 tag) + the igneum-devnet-3 network object (its own network id and p2p port, every activation at 0: program_class_v4, difficulty_v2, finality_v3, fees_v1, proving_v1, latency_ladder rung 0; the genesis cut; NO override file on the new chain) + era VDF f2ecf452 only if its merge is clean and green in the same run (else 0.3.23 by an activation height; era_vdf_activation_daa stays at never on devnet-3 unless main's object names it). Built as an incremental on build-1's lease ahead of the 0.3.21 app gate.
|
||||
|
||||
Gates before genesis: the box suite on the exact commit (the consensus crate whole, consensus-core, the miner against sub-version 3's packs, kaspa-pow, the exec suite, the three checks); from the build on the fleet's pods: the empty-datadir canary, the fresh-genesis digest agreement on two fleet boxes from empty (the same digest and the first lock between them), the late joiner's sync from them, the shutdown under 1 s, the proving ids present on a bare node. After genesis on the live chain: the relay cases (with a relay kept synced before the window, the warm rule) and the hands. Genesis on green with the fleet's two genesis boxes (the standing-fleet shape: supervisor, kill file, vote key, miner); the old devnet keeps running until Devnet 3 has 24 hours; the apps move by signed update after that. The genesis is reported as a clock reading.
|
||||
|
||||
Staged (the build-server lane, 17:27 BST): the Devnet 3 seed on build-1 as a bare process (p2p 0.0.0.0:26631, gRPC 27630, JSON 27632, EVM 27810, empty datadir /home/build/dn3seed); the hands' second instances node1-dn3 (p2p 26651, rpc 26650, json 28650, evm 26830, --enable-unsynced-mining, peers the seed) and observer-dn3 (p2p 127.0.0.1:26661, rpc 26660, json 28660, evm 26860); ufw allows 26631 and 26651 since 17:27 BST; provision.sh's P2P_PORTS carries both; infra/build-server/devnet3/devnet3.{env,sh} with the NET_FLAGS placeholder until the node lane names the flag; read-back by the first log line, the commit-string count, the digest line, the "[igneum-exec] genesis <hash> executed" line and the server lines. The hands' nodes take no vote key (the miner's label is the key). The fleet: four gate pods on separate hosts renting with DESTROY=0; the fresh-genesis form, dn3_ tables, pay-by-key on the new chain and the no-stop cutover script follow; the capacity plan (a second node per standing box or a parallel set, the Devnet 3 hub) by 19:00 BST.
|
||||
|
||||
The app side: the app must start its node on igneum-devnet-3 (the network flag the node lane names; the manifest's channel; no override object), the chain scene and the ladder reading the new chain's facts, the first-block and earnings rows from zero: 0.3.22's app cut after the node is live, by signed update when Devnet 3 has 24 hours.
|
||||
|
||||
Era VDF (the era lane, 17:3x BST): f2ecf452 on 96161037, one round; the consensus crate whole 120 + 1 + 1, consensus-core 142, kaspa-pow 7; with the fields unset the digest is unchanged (the pinned devnet digest c562d70e read with the fields present; era_vdf_fields_enter_the_digest_only_when_set); at 0 it costs a node nothing for 180 days, then one core for an hour once; O-4.10 owed before any era 1.
|
||||
|
||||
**The frozen sub-version 3 object (the Counter lane, 17:3x BST, handed to the node lane):** igneum-pow 017e70376489251e18564c0abce7e466e606c8b3 on ca3-v4-amend (the audit-freeze-2026-10-07 tag; 2a111fb1 and 6941da1d above it are docs only). Object byte 7, PROGRAM_SUBVERSION_V4 = 3, the devnet epoch-0 program id a785001687d8688a (must-differ c120d7963abdcd96, 1a4230699a6b9c60, a788661687db4bb3); the kit packs-ca3-v4-sub3 zip sha256 4f2445c50c58d76a5544023492d8b858d0b07c5e372d31f9c90c4ce51f829154 (eight packs); fingerprints equal on Metal, Apple OpenCL, the fleet's 5090 (Linux CUDA) and PC 2 (Windows CUDA): mx8-devnet-epoch0 90f794dd556f7a3b (the v3 control), v4-devnet-epoch0 e370fb2080b7dbb1, era-0 b7237555d31fc3cf, era-1 b6b167fa15dfe2c9, era-2 28bdf65eff33f2c4, era-3 e26d38c46f3f1b16, era-4 dd8fdf6ff4f59eed, era-5 8bf40f5cb858d835. Both attack-pass gates GREEN on 017e7037 (the 64-seed hot-set census at 2^24: 60 of 64 under 1.2x; the exhaustion gate by construction and 0 of 24,631 chain-shaped seeds, max attempt 29); suite 103 of 103; CI success. Open, stated as open: the four-seed tail (p10 1.50x, p8 1.38x, p34 1.25x, p4 1.22x; main's ruling: the window model's unattributed residue with nil chip consequence; attribution for 0.3.23); the 10^6 chain-path count runs on as a strengthening line; the epoch draw costs about two attempts at 2.2 s once an hour; the owed measurements (G2, G3, the ladder, AMD on PC 1, the 2019-class core) do not gate Devnet 3. No further hash change rides 0.3.22. Devnet 3's object sets program_class_v4_activation_daa 0 and signals byte 7 from genesis.
|
||||
|
||||
## 1. The candidate: release-0.3.22-node = fa7f854f (16:37:50Z, 17:37 BST)
|
||||
|
||||
Three commits on 96161037: bd710a36 the sub-version 3 re-pin (byte 7, igneum-pow 017e7037, epoch-0 id a785001687d8688a, must-differ c120d796 / 1a423069 / a7886616); aded4620 era VDF (the era lane's f2ecf452, clean); fa7f854f the Devnet 3 object. The object: network igneum-devnet-3, flag `--devnet --devnet-suffix=3`, default p2p 26631 (ten above the previous suffix; gRPC, JSON and EVM on the devnet defaults unless passed); genesis 2026-10-07T00:00:00Z, payload "igneum-devnet-3 | 2026-10-07 | every upgrade on from block zero | coins here have no value | resets are announced", hash a6fa348e2a0fc6a5fa0ae3cb080160f5e2be865af71bac0068ca2fb8d1fcfd7b, bits 0x1d100000 (the DAA takes over after 600 blocks); active from DAA 0: difficulty v2, proving v0 and v1 (8 blocks a segment, 600 DAA, aggregator 1,000 bps, the fresh rule), finality v3, program class v3 and v4 (byte 7 from genesis, a one-day signal window), the latency ladder at rung 0, calibrated v1 fees, era VDF (main's ruling); at never (as on the live devnet, not in main's list): difficulty v3, the finality DAA-seconds rule, fork gate, peer directory, signing bonus, finality leave, pool split, consensus proof verify, exec restart (the chain executes from genesis). The node refuses --override-params-file on igneum-devnet-3 (mainnet, testnet, devnet suffixes 3 to 99; harness suffixes above 99 keep the file) and prints the digest with no file. Not in it: the N15 kept-datadir numbering class (p12-vast and pool-1 off by 2), 0.3.23's, the release note names it. Gates from 16:38Z: the release build on build-1 (gate priority); on build-2 the consensus crate whole, consensus-core, kaspa-pow with 017e7037's packs, the miner, the exec suite; then from the build the empty-datadir canary, the fresh-genesis digest agreement on two boxes, the late joiner, the shutdown under 1 s, the proving ids on a bare node.
|
||||
|
||||
**build-1 for Devnet 3 (the build-server lane and the fleet, reconciled 17:40 BST), nothing started:** the seed a bare process on p2p 0.0.0.0:26631 (rpc 27630, json 27632, evm 27810, empty datadir /home/build/dn3seed); the observer node on Devnet 3 is the fleet's instance (/srv/hands/bin/run-observer-node-dn3.sh, appdir /srv/hands/observer-node-dn3, rpc 26650, json 28650, p2p 26651, evm 26850, its observer.mjs on dn3_ tables running); the second node1 on p2p 0.0.0.0:26671 (rpc 26670, json 28670, evm 26870, appdir /srv/hands/node1-dn3, --enable-unsynced-mining); ufw allows 26631, 26651 and 26671; four units installed and DISABLED (igneum-observer-node-dn3, igneum-observer-dn3, igneum-hash-origin-dn3.service and .timer at 08:30 UTC with --prefix dn3_). On the go, in order: the 0.3.22 pairs under /srv/artefacts/0322-fa7f854f/ with the evm-types read, devnet3.env and dn3.env pointed at that igneumd, then seed --go, node1 --go, observer-node --go, each read back by the first log line, the string count, the devnet-3 digest line, the genesis line and the server lines.
|
||||
|
||||
**Main (17:4x BST):** fa7f854f accepted; the nine switches at never stay at never for the genesis (nothing untested flips under this clock); Devnet 3 is the chain they go live on by activation height, one at a time, each after its own gate, no further reset; consensus proof verify stays off until the proven share reads one. After genesis: the table of the nine (built and gated, built and ungated, not built; the owning lane; the earliest height) for the project lead.
|
||||
|
||||
**The fleet's Devnet 3 set, STANDING at 16:44Z:** five boxes on five hosts (the hive package, the kill file, box-dn3.sh, a vote key each, the binary slot empty until the artefact lands): dn3-g1 RunPod 3070 (64.119.209.250, p2p mapped 21703) = the Devnet 3 HUB and default peer; dn3-g2 Vast 3070 Utah (154.64.230.67, p2p 27017) = the second genesis node; dn3-j1 Vast 3060 12 GB = the late joiner from empty; dn3-c1 Vast 3060 12 GB = the empty-datadir canary (12 GB, so the prover statement reads there); dn3-x1 Vast 3060 12 GB = spare and second joiner; hairpin checked (every Vast box reaches dn3-g1's mapped port and build-1's 26631). The cutover dn3-genesis.py (per box: the binary with its sha read back, box-dn3.sh with --devnet --devnet-suffix=3, appdir /root/fleet/dn3, no override, FRESH=1, UNSYNCED=1 on the two genesis boxes only, seeds dn3-g1, dn3-g2, build-1's 26631 and 26671; read back the string, the devnet-3 digest, the genesis hash line, synced, the first lock; nothing named on the old devnet), dry-tested. The gate dn3-gate.py: digest agreement g1/g2, the same first lock on both, the late joiner synced from them, the canary mining ten minutes with its blocks held by dn3-g1 and 0 rejects, shutdown under 1 s then the restart on the kept datadir, the proving ids on a bare node; one line per check with its UTC time, DN3 GATE PASS/FAIL. hub-1's second node staged (36610/36611/36790, outbound only, FRESH, MINE=0). Pay-by-key on the new chain through dn3-g1. The watcher on /srv/artefacts/0322-*/ starts the gate within the minute of the binary. Capacity for day one: a SECOND NODE PER STANDING BOX (box-dn3.sh on 36610/36611/36790, FRESH from empty, the box's existing key label on the new chain, MINE=1 with a second miner on the same card), rolled in three waves of 5/5/4 after the genesis pair locks, nothing stopped on the old chain; plus the five gate boxes and hub-1's and build-1's second nodes: about 22 voters; cost USD 9.2/day for the five gate boxes, the second nodes USD 0, the 0.3.21 warm set 11.52/day; the fallback a parallel set of fourteen 3070 pods (USD 44/day) only if the first wave shows card contention (the read: the live miner's rate and the dn3 node's template timing). Spend at 16:40Z: 406.49 of 1,000.
|
||||
|
||||
**The 0.3.21 set, running on:** c22-1's wipe in IBD; the warm-set cases' window running; N15's live line: p2-4090-1b's kept snapshot tips were side-tip blocks on the hub's DAG, the node refused them rightly and loaded the hub's snapshot, healthy, no discontinuity line (the node lane holds the reading); p1-5090 now; roll lines p2-3090-2 2.3314 and p2-3090-3 2.8553 IGN verified by key.
|
||||
|
||||
**Main (17:4x BST): yes to the second node per standing box**, three waves of 5/5/4 after the genesis pair locks, nothing stopped on the old chain, with two conditions: (1) a 24-hour exception to the one-miner-per-GPU rule, not a new rule: when the apps move to Devnet 3 and the old chain's miners stop, each box is back to one miner (written as an exception with its end in the fleet notes); (2) the contention read on wave 1 decides the fallback mechanically: a live miner's rate on any of the five down more than 10 percent against its hour-before mean, or the dn3 node's template latency above the 0.3.20 gate figure, takes the 3070 set for the remaining waves without asking; spend under the USD 1,000 ceiling either way.
|
||||
|
||||
**The app side of 0.3.22 (the shipper):** the app's node starts on igneum-devnet-3 through its packaged config (Runtime.network "devnet" with devnet_suffix 3, read from igneum-app.json in the 0.3.22 package; the OTA update replaces the package, so the signed 0.3.22 update is the move), with node_dir devnet-3 (a fresh datadir beside devnet-v4, the old chain's kept for the way back), the node_override_file None on a suffixed devnet (the node refuses the file; the OTA manifest's consensus.override is ignored with a log line on devnet-3), the chain scene, the ladder, first-block and earnings reading the new chain from zero, the prover on the new chain's records; the manifest for the 0.3.22 publish carries channel "devnet-3". Cut after the genesis on its own branch release-0.3.22 off release-0.3.21's tip; published by signed update when Devnet 3 has 24 hours (main's clock).
|
||||
|
||||
## 5. The genesis: 69d1b56e, 18:06:19 BST
|
||||
|
||||
**The timestamp fault and the fix:** fa7f854f and 21d8f454 carried a genesis timestamp of 2026-10-08T00:00:00Z, so every block read "too far into the future"; the node lane's 69d1b56e sets 2026-10-07T00:00:00Z (genesis hash 4020cb4382e3fe4b…b925, test `every_compiled_genesis_lies_in_the_past_of_the_clock`). ab9af79f is void with it; the igneum-devnet-3 digest with no override file on 69d1b56e is 83eb50cdf2eda4cb…22b2.
|
||||
|
||||
**Gates on 69d1b56e, every one green:** build-1 release build 18:03:03 BST; box suites on build-2 (kaspa-consensus whole 120 + 1 + 1 at 18:02:17, igneum-exec 36 at 18:03:09, kaspa-consensus-core 152 at 18:03:40, kaspa-pow 17 at 18:04:31, igneum-miner 25 at 18:05:22 against the sub-version 3 packs); the canary set from the artefact (object 7 / 1794, era VDF from 0, ladder rung 0, fees v1, shutdown 677 ms after SIGTERM, the override file refused exit 1 while the shared devnet still takes it, two empty nodes handshaking with equal digests, the shared-devnet node rejected with the network mismatch); the pack gate PASS by construction on dn3-g1 (miner c29f33bb = the pair's, the pack exported on the box, the hive 0.3.20 miner 4050c255 refused); the program id read back fce15bf61030be57 (see the correction below).
|
||||
|
||||
**The pairs:** node-lane pair igneumd 0751598f (57,816,736 B) and igneum-miner c29f33bb under /srv/artefacts/0322-69d1b56e/node-lane/; the build-server lane's hands pair igneumd efb54938 (57,817,120 B, GLIBC_2.39) and igneum-miner 07246920 under /hands/, seed pair fb15cecf and f8c40e1c under /seed/ (the miners byte-identical to 21d8f454's: the miner does not embed the genesis). The shipper's ruling: the node-lane bytes stand as the genesis pair on dn3-g1 and dn3-g2; the hands pair goes on the joiners, hub-1 and build-1.
|
||||
|
||||
**The genesis reading:** dn3-g1 (the Devnet 3 hub, 64.119.209.250:21703) up 18:04:55 BST, "igneumd/2.1.0-69d1b56e", digest 83eb50cd, "genesis 4020cb43… executed: chain id 4463", miner from 18:05:19, FIRST BLOCK ACCEPTED 18:06:19.920 BST ("PoW accepted c313ddac… by igneum-lottery-v2-bound, daa 0, epoch seed 4020cb43…"), 85 of 85 GPU blocks by 18:10, 287 by 18:14, 0 rejected. dn3-g2 (154.64.230.67:27017) up 18:17:58 BST on the same pair, synced from g1 (639 blocks at 18:18:52), mining from 18:18:15; 702 blocks, daa 702 at 18:19:08, 0 rejected on either; finality checkpoints 20 (985353b4…), 21 (e788fac0…, blue score 631), 22 (f45336bd…, blue score 660) identical on both logs. The genesis declared on that agreement at 18:25 BST (main noted it at 18:18 BST). The object's finality window is 7,200 DAA, so no checkpoint can lock before about 20:10 BST; the first lock is a follow-up line, not a gate (the fleet's check 2 re-lettered to "first common lock within 30 minutes of DAA 7200"). The go to build-1's seed (26631), node1-dn3 (26671) and the observer unit on the hands pair went at 18:24 BST; the joiners dn3-j1, dn3-c1 (ten-minute canary) and dn3-x1 place on the hands pair. Nothing in the go path reads GitHub (both lanes confirmed: /srv/artefacts, the box mirror for the observer clone, the dl host for the hive package and the kit zip). The executor on a fresh devnet-3 node logs "waiting for consensus to sync before the executor starts (the sink is 61,000 s old)" until the first block, then executes genesis: expected (the genesis is 17 hours old by design), not a fault; runbook row.
|
||||
|
||||
**Program id correction (the Counter lane, 18:1x BST):** Devnet 3's epoch-0 class v4 program id is fce15bf61030be57 (read in the 0.3.22 miner's "cache ready" line on build-1 at 18:10:39 BST and on dn3-g1); a785001687d8688a is the SHARED devnet's epoch-0 id (genesis edc4fa84) and the kaspa-pow pairing pin, which is unchanged because the id follows the seed. Every Devnet 3 box's gate wants fce15bf61030be57 at epoch 0 and stops the miner on 1a4230699a6b9c60 or a785001687d8688a; the per-epoch form (the miner's line equals the node's seed-derived id, read each 3,600 DAA) is for after tonight. Both paired miners on dn3-g1 printed fce15bf61030be57, so the node drew Devnet 3's seed and the record is right.
|
||||
|
||||
**The nine switches:** recorded as section 6.11 of docs/plans/counter-asic-3-node.md (branch ca3-v4-node e70535fc on the box mirror, 18:15 BST), one row per switch with state, owner, gate and the earliest Devnet 3 height; signing bonus is not gateable on 69d1b56e (c7ea1e21 silent_split missing) and is 0.3.23's; every height reads as lock time + DAA seconds at 1 block/s.
|
||||
|
||||
**Found by the 0.3.21 wipe canary, fixed 18:14:35 BST:** the Hetzner live seed 188.245.5.161:26611 was still on the old sixteen-field object (digest eada4bda) one hour forty after the 0.3.20 sweep; it was never in a wave (the 15:56 go listed the hands and bps-seed, not it). Per tier: fleet voters, hub and pool-1 unaffected (they peer on the hub); every 0.3.20 app on the floor file saw a reject line at each dial of the seed and synced through the hub and node1 instead (c22-1 did); a fresh joiner configured with only the seed could not join. The build-server lane (infra/devnet/restart-seed.sh over the ops key) installed the c4459193 seed-class igneumd 4a2d8a8d and the floor file 294f1f80, unit igneumd-v4 down about 3 s, read-back "igneumd/2.1.0-c4459193", digest 4bbbe816 MATCH, 278 blocks accepted in the first minute. Rule 5 now names the seeds with a read-back line.
|
||||
|
||||
## 6. After the genesis: the clocks, the rulings, the 0.3.22 tree (18:3x to 18:5x BST)
|
||||
|
||||
**DN3 GATE PASS (the fleet, 18:36 BST):** digest and checkpoint agreement on dn3-g1/g2 (checkpoints 20 to 29 identical, lock line 855414eb identical), late joiner twice (dn3-j1, 911 then 1,099 blocks), canary blocks held (dn3-c1, 15 of dn3-g1's last 900), shutdown 589 ms, bare-node proving ids present; two of the six lines read by hand after script faults of the fleet's (inspect arguments reversed; a token read broken by spaces), both fixed and recorded. Eight nodes on five hosts plus build-1's seed, node1-dn3 and observer, all on 83eb50cd, about 1,900 blocks at 18:36 BST. The relay set dn3-relay, dn3-poison, dn3-twin rented for the cases. The first finality lock at DAA 7,200, about 20:10 BST; the second-node wave 1 on the standing boxes starts on that line (main's two conditions).
|
||||
|
||||
**The two clocks (main):** the 0.3.22 apps publish at 18:30 BST on 8 October on green (the 24-hour line is 18:06 BST); the first Discord card (Devnet 3 + 0.3.22) publishes after the fleet's relay run on Devnet 3 reads CASES END with the relay cell read AND the 0.3.22 apps are out; the card names the first-block time, the chain id and the launch-first chip line from master 9b996d06, no prize; staged at scratchpad/r0322/discord-card-devnet3-0322.md, main reads it after the relay run.
|
||||
|
||||
**The 0.3.22 app tree and its order (accepted by main):** release-0.3.22 at 27ab317e on the box mirror = release-0.3.21 44b63ac9 merged (7f07a37f) + driver-check 46cc41e9 (27ab317e; the eGPU driver-install hold and warning); app gate GREEN on build-2 at 18:33 BST (259 + 33 + 8, pre-push 56). Missing, in closing order: (a) the node pin = N15 dfae08e5 rebased onto 69d1b56e on release-0.3.22-node, gated, plus whichever switch heights are green by the cut; (b) the Windows node pair from build-1's cross and the payload inputs, the installer by the PC 2 job shape while GitHub is out, the Mac node pair and DMG on the Mac under the lock; (c) the hive 0.3.22 package with the sub-version 3 kit inside; (d) the manifest on channel devnet-3, KEEPING the floor file for the 0.3.20 and 0.3.21 apps until the intake shows no app below 0.3.22 for 24 hours (main's ruling; the 0.3.22 app ignores the file by construction); (e) the app's vote key hash to the intake and the publisher's --public ui arm; (f) node_peers adds dn3-g1 64.119.209.250:21703 and dn3-g2 154.64.230.67:27017 beside build-1.
|
||||
|
||||
**the project lead's ruling on the nine switches (through main, 18:4x BST), executed by the node lane on Devnet 3 by activation height, each with its gate line and a read-back on every node, no reset, one at a time:** (1) peer directory, pool split, fork gate ON in that order, each height set the moment its 6.11 condition reads true; (2) difficulty v3, the finality DAA-seconds rule, finality leave up: mid-chain crossing tests on the fast-time harness tonight, each height set as its test goes green; (3) signing bonus: one paragraph for the project lead on whether it changes total minted supply or only who is paid, with the number; (4) mandatory proof verification ON after 24 hours of every Devnet 3 block proven on the hash-origin report, the fleet's provers on Devnet 3 from tonight, the share reported hourly; (5) exec restart never. **Mechanics (main):** a height is a constant in the igneum-devnet-3 Params of a node commit, rolled out by the sweep (one box at a time, commit string and height line read back, the hub first); never a file, no new signed-record mechanism; one commit may carry several heights staggered so the chain crosses them one at a time; a node that misses the commit forks off at the height, as designed, which is the test; each commit is a release of the node line (0.3.22, 0.3.23) and reaches the apps by the signed update. Recorded in 6.11 by the node lane as heights are set; each height to main as a clock reading.
|
||||
|
||||
**Testnet re-arm (main, through the build-server lane):** the arming on fork e6dd3afd (digest 4fbb2152, genesis 01294fd3) is void (old object; a go on it hard-forks at sub-version 3). The node lane cuts a testnet genesis object on release-0.3.22-node in the Devnet 3 shape (byte 7 from genesis, every activation at 0 that Devnet 3 has at 0, era VDF at 0, a past genesis timestamp with the future-genesis test beside it, no override file, the testnet's seeds and chain id as they are); the build-server lane builds the seed-class pair under /srv/artefacts/testnet-<commit>/seed/ and dry-runs wave1-0320.sh against seed1/2/3 at height 0; nothing onto a seed and nothing mines before the project lead's word (not before 15 October, LG-2).
|
||||
|
||||
**0.3.21 Windows, the toolchain finding (18:37 BST):** PC 2's installer job (take 2, 68 s) verified the payload (igneum-app.exe 151803c7 prints "igneum-app 0.3.21", igneumd.exe 49502cc7 "igneumd 2.1.0") and stopped on PC 2's toolchain: no MSVC (no window host "Igneum Miner.exe", whose host.cpp changed in update-return-21) and no Inno Setup 6 (no installer; winget refused by the job as told). Three shapes put to main at 18:45 BST: the Mac entry now and Windows later (the manifest carries a platform that lands later; 0.3.20 Windows apps do nothing until their entry arrives); winget Inno Setup on PC 2 (still no 0.3.21 host); the host by mingw on the box (dry compile asked) or Windows held until GitHub returns and windows.yml runs. deploy.sh carries --mac-only for shape (1); the full preflight stands for the Windows entry.
|
||||
|
||||
**Proving on Devnet 3 opens (the fleet, 18:45 BST):** dn3-x1's first segment 1024..1031 claimed 18:44:23 BST and SUBMITTED 18:45:49 (8 of 8 shards accepted, proof 1,272,909 bytes, 86.1 s end to end, peak 8,534 MiB on a 3060 12 GB); its record waits in dn3-g1's pool for a carrier; the paid-by-key line opens the 24-hour window for the project lead's mandatory-verification rule. Sizing: about 42 segments an hour per 12 GB card against 450 an hour made, so 11 cards reach a share of one; 14 more 3060 pods renting (about USD 0.85/h together, 20 a day). The 0.3.21 warm cases (CASES-W21 END rc 0, 18:47 BST, on 96161037): the target refused every version-1026 block (44,081 seen, 0 accepted), restarted back at the tip, the hub holds 900 of its last 900; the relay cell again reads the target's own refusal, not a relayed poison block, so Devnet 3's relay run (relay on the hands pair synced before the window, the twin peered to the relay alone) is where that cell gets read, and its CASES END is the card's gate.
|
||||
|
||||
## 7. the project lead moves the apps to Devnet 3 tonight (19:1x BST): the pin, the tree, the clock
|
||||
|
||||
**the project lead's word (through main, 19:10 BST):** the apps and the site's live page move to Devnet 3 now, not tomorrow. The clock: the 0.3.22 node pin at 19:15 BST; the Mac entry about 20:15 BST on channel devnet-3 (the floor file kept in the manifest for the 0.3.20 and 0.3.21 apps until the intake shows none below 0.3.22 for 24 hours); the Windows entry as its own entry when PC 2's smoke runs, about 21:00 BST, the 0.3.21 Windows entry skipped in its favour (said in the notes); the hive 0.3.22 package with the sub-version 3 kit published with the pin, the fleet's standing boxes moving in waves after the first lock; the site's live page pointed at the dn3 observer on build-1 after the first lock (about 20:10 BST), deployed from the box with the Vercel CLI as a site-only deploy of master's live tree (GitHub dark), edge time to main. Heights ride 0.3.23, set from the 0.3.23 sweep's finish with a two-hour margin (plan: 12:00 BST 8 October, difficulty v3 at the first multiple of 7,200 DAA at or after 14:00 BST, the other two 7,200 apart).
|
||||
|
||||
**The pin: release-0.3.22-node = 34a2dbaa at 19:15 BST, no heights** (69d1b56e + the testnet object 6ed56f63 + the N15 kept-datadir fix dfae08e5; igneum-devnet-3 digest 83eb50cd unchanged, igneum-testnet-1 87d103b6 on the same binary). Gates on the exact commit: build-1 build 18:40:26 BST (igneumd bc25693c, node-lane pair under /srv/artefacts/0322-34a2dbaa/node-lane/); build-2 suites consensus 122, exec 37 (the new scan test), pow 17, miner 25, core 152 by 18:42:51; canary set green (shutdown 567 ms, override refused, handshake, mismatch rejection). The Devnet 3 join-and-restart read is the fleet's. Crossing cases on the fast-time harness: difficulty v3 pass GREEN 19:08 BST and known-failed FAIL as expected; the DAA-seconds rule and finality leave green on the chain's reading but the harness's checkpoint read used the wrong RPC parameter, rerun by 19:22 BST; no heights commit could carry gates by 19:15, so every height rides 0.3.23 (0.3.23 line: 18473645 = 43360992 + d840537b subsidy_per_block, gates green, digest edit list 25; daa61847 rebased by the genesis-forward lane).
|
||||
|
||||
**The 0.3.22 app tree at 19:15 BST, release-0.3.22 c977786b on the box mirror:** 27ab317e (release-0.3.21 44b63ac9 + driver-check 46cc41e9) + pool-finish-21 8f2aae75 (the Devnet 3 split-read tool) + signing-22 e1b01654 (vote on by default pinned by test; Overview and Cards rows read signing or silent with the reason) + key-22 6501558f (scene/live-dag.js 2.0.5 legend, the app's chain card renders it, the site untouched) + c977786b (node_peers adds dn3-g1 64.119.209.250:21703 and dn3-g2 154.64.230.67:27017; self-test reads four). App gate on build-2 GREEN at every step (last 259 + 33 + 8, rc 0); pre-push 56 on each push. Riding if on the mirror by 19:45 BST, else 0.3.23: boot-start-22 (the engine starts at boot without a logon on Windows; a headless engine never reads a closed stdin as the host leaving), the export-wait reliability item (a worker never waits on the export past one retry interval), the driver-check hold-every-card-of-the-vendor rule, the UI lane's shard words. The Mac node pair builds on 34a2dbaa under the lock from 19:12 BST (r0322/mac-node-34a2dbaa.sh), then the DMG.
|
||||
|
||||
**PC 2 tonight:** the take-4 0.3.21 installer (mingw host, run-20261007-175020) was picked up at 18:51:57 BST before its removal deployed and the runner's abort ended the install in its first second (the build-server lane's fault, two rules added to the job tooling: an installs-app job is never removable without --force; never remove a published job without reading the machine's latest line); the update-return lane re-ran the kept installer at 19:07:56 BST and the 0.3.21 engine then restarted four times a minute apart and died ("quit requested by the window host went away (stdin closed)" 3 s after the node start: an engine started by a parent whose stdin closes at once); the project lead reinstalled PC 2 by hand with the public 0.3.20 installer (45b2f3fb, the MSVC host; the public alias confirmed as that file by hash at 19:12:54 BST). PC 2 is read-only for every lane until its app uploads as 0.3.20; then the 0.3.22 installer job (--installs-app) and the smoke, one job at a time; then the Intel lane's driver retry with the minidump copy folded in (one UAC click). PC 1: released to the Counter lane's queue at 19:04:37 BST (the 0.3.21 MSVC host e223db18 built there in 9 s, collected by the relay Blob); one slot for the 0.3.22 host (app/windows/version.h moved to 0.3.22, host.cpp untouched).
|
||||
|
|
@ -9,7 +9,7 @@ Every cut of the Igneum Miner app and its node runs under these. The dated plan
|
|||
4c. **The proving ids gate (main, 7 October 2026, after the 0.3.20 blocker).** On every candidate, a node started on the LIVE override file reports both proving ids (the shard program id and the aggregator id) on its proving v1 start line, and a prover's first statement against it is accepted; a zero-id statement is the known-failed shape. It runs beside the kept-datadir read, since both share the warm pod. Why: c4459193 read the ids as unknown, built statements with zeros and refused every proof; a sweep would have stopped every prover's pay.
|
||||
4a. **Every gate starts on every candidate the moment its binary builds, never after the pin (the project lead, 7 October 2026).** The digest and mixed-version gates, the kept-datadir start, the relay and poison cases and the wipe canary all begin on each candidate binary as it lands; a struck candidate's runs are stopped and its successor's begin. The post-pin wait is then the longest single form (about 80 minutes, the wipe), not the sum.
|
||||
4b. **Warm pods per gate class (the project lead, 7 October 2026, ordered to the fleet lane).** The fleet keeps synced pods warm for each gate class so a case form's target starts at the tip (a kept copy of the live line, caught up), never from a kept copy far behind it; the wipe canary is the only full IBD in the set.
|
||||
5. **Rollout in waves, each box read back (the project lead, 7 October 2026, replacing one-box-at-a-time):** PC 1 first, then PC 2, the Mac, the seed, the hands and the fleet in parallel waves as the lock lines allow; a lock line from the hub between waves; hold if the frozen table's signed share reads under 75; every box read back by its commit string. When the publish moves the consensus floor (a new digest), every 0.3.x node on the old file refuses the new ones as peers until it is swept, so the seed, the hands and the fleet move in the first wave with the apps' pollers, not last. Every lock line of a sweep that replaces nodes carrying a consensus floor names the date the sweep must finish (0.3.20: before 13 October 2026 09:00 UK).
|
||||
5. **Rollout in waves, each box read back (the project lead, 7 October 2026, replacing one-box-at-a-time):** PC 1 first, then PC 2, the Mac, the seed, the hands and the fleet in parallel waves as the lock lines allow; a lock line from the hub between waves; hold if the frozen table's signed share reads under 75; every box read back by its commit string. When the publish moves the consensus floor (a new digest), every 0.3.x node on the old file refuses the new ones as peers until it is swept, so the seed, the hands and the fleet move in the first wave with the apps' pollers, not last. Every lock line of a sweep that replaces nodes carrying a consensus floor names the date the sweep must finish (0.3.20: before 13 October 2026 09:00 UK). The wave list is written, not remembered: every sweep's first wave names each Hetzner seed by address (188.245.5.161:26611 for the shared devnet; the testnet seeds when they move) beside the hands and the fleet, and the seed's row closes only on its own read-back line (string, digest, first accepted block) from the lane that holds its key (the build-server lane, infra/devnet/restart-seed.sh). Added 7 October 2026 after the 0.3.20 sweep left the seed on the old object for one hour forty, found by the 0.3.21 wipe canary's reject lines.
|
||||
6. **Read-back is by commit string plus digest plus engine:** on 0.3.18+ nodes igneum_getNodeInfo powEngine must read "igneum-pow" ("stub" = FAIL); on earlier trees `strings igneumd | grep -c igneum-pow/src/` above zero. The miner embeds no commit string; its pairing is the build line and the sha.
|
||||
7. **igneum-pow pairing:** a fork build takes igneum-pow by path from the igneum worktree it sits in; build each node tree inside its own app worktree whose igneum-pow is the pinned tree; the pairing log line names it. Master's build tools need rust-toolchain.toml in the tree (the app tree's pin applies to a vendor worktree under it; a standalone node checkout is unpinned until the node line carries its own file).
|
||||
8. **glibc classes:** HiveOS 2.31 (`--ship hive`, smoke in ubuntu:20.04 on the box), seeds and generic 2.35 (`--ship seed`), fleet 24.04 boxes native 2.39.
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 224 KiB After Width: | Height: | Size: 215 KiB |
|
Before Width: | Height: | Size: 225 KiB |
|
Before Width: | Height: | Size: 238 KiB After Width: | Height: | Size: 222 KiB |
|
Before Width: | Height: | Size: 240 KiB |
BIN
docs/plans/site-ui-5-shots/app-band__1440-dark.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1 MiB |
|
Before Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 586 KiB After Width: | Height: | Size: 553 KiB |
|
Before Width: | Height: | Size: 597 KiB |
|
Before Width: | Height: | Size: 478 KiB After Width: | Height: | Size: 476 KiB |
|
Before Width: | Height: | Size: 478 KiB |
|
Before Width: | Height: | Size: 367 KiB After Width: | Height: | Size: 374 KiB |
|
Before Width: | Height: | Size: 364 KiB |
|
Before Width: | Height: | Size: 549 KiB After Width: | Height: | Size: 537 KiB |
|
Before Width: | Height: | Size: 548 KiB |
|
Before Width: | Height: | Size: 549 KiB After Width: | Height: | Size: 536 KiB |
|
Before Width: | Height: | Size: 547 KiB |
|
Before Width: | Height: | Size: 332 KiB After Width: | Height: | Size: 312 KiB |
|
Before Width: | Height: | Size: 332 KiB |
|
Before Width: | Height: | Size: 277 KiB After Width: | Height: | Size: 262 KiB |
|
Before Width: | Height: | Size: 276 KiB |
|
Before Width: | Height: | Size: 590 KiB After Width: | Height: | Size: 567 KiB |
|
Before Width: | Height: | Size: 605 KiB |
|
Before Width: | Height: | Size: 518 KiB After Width: | Height: | Size: 492 KiB |
|
Before Width: | Height: | Size: 528 KiB |
|
Before Width: | Height: | Size: 517 KiB After Width: | Height: | Size: 475 KiB |
|
Before Width: | Height: | Size: 516 KiB |
|
Before Width: | Height: | Size: 309 KiB After Width: | Height: | Size: 249 KiB |
|
Before Width: | Height: | Size: 311 KiB |
|
Before Width: | Height: | Size: 381 KiB After Width: | Height: | Size: 350 KiB |
|
Before Width: | Height: | Size: 385 KiB |
|
Before Width: | Height: | Size: 263 KiB After Width: | Height: | Size: 255 KiB |
|
Before Width: | Height: | Size: 266 KiB |
|
Before Width: | Height: | Size: 335 KiB After Width: | Height: | Size: 300 KiB |
|
Before Width: | Height: | Size: 335 KiB |
|
Before Width: | Height: | Size: 276 KiB After Width: | Height: | Size: 255 KiB |
|
Before Width: | Height: | Size: 276 KiB |
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 558 KiB After Width: | Height: | Size: 571 KiB |
|
Before Width: | Height: | Size: 586 KiB |
|
Before Width: | Height: | Size: 328 KiB After Width: | Height: | Size: 304 KiB |
|
Before Width: | Height: | Size: 336 KiB |
|
Before Width: | Height: | Size: 327 KiB After Width: | Height: | Size: 305 KiB |
|
Before Width: | Height: | Size: 337 KiB |
|
Before Width: | Height: | Size: 345 KiB After Width: | Height: | Size: 344 KiB |
|
Before Width: | Height: | Size: 346 KiB |
|
Before Width: | Height: | Size: 374 KiB After Width: | Height: | Size: 350 KiB |
|
Before Width: | Height: | Size: 372 KiB |
|
Before Width: | Height: | Size: 488 KiB After Width: | Height: | Size: 480 KiB |
|
Before Width: | Height: | Size: 489 KiB |
|
Before Width: | Height: | Size: 396 KiB After Width: | Height: | Size: 381 KiB |
|
Before Width: | Height: | Size: 398 KiB |
|
Before Width: | Height: | Size: 613 KiB After Width: | Height: | Size: 504 KiB |
|
Before Width: | Height: | Size: 634 KiB |
|
Before Width: | Height: | Size: 393 KiB After Width: | Height: | Size: 368 KiB |
|
Before Width: | Height: | Size: 416 KiB |
|
Before Width: | Height: | Size: 407 KiB After Width: | Height: | Size: 377 KiB |
|
Before Width: | Height: | Size: 407 KiB |
|
Before Width: | Height: | Size: 350 KiB After Width: | Height: | Size: 340 KiB |
|
Before Width: | Height: | Size: 351 KiB |
BIN
docs/plans/site-ui-5-shots/miner-band__1440-dark.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 677 KiB After Width: | Height: | Size: 552 KiB |
|
Before Width: | Height: | Size: 682 KiB |