Compare commits

...

7 commits

Author SHA1 Message Date
igneum-labs
e39d966840 latency ladder: the step2 harness case passes on all 18 checks; the four runs' summaries and logs under docs/design/latency-ladder-harness
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 22:58:39 +00:00
igneum-labs
770eca9daf latency ladder design doc: the no-step case passes (5,833 bps weakest of seven holds rung 0 over 10 epochs)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 22:47:54 +00:00
igneum-labs
057b489107 latency ladder design doc: the test lines and the first two harness results (the known-failed case fails, the step case stepped at epoch 8; the two harness faults named)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 22:38:20 +00:00
igneum-labs
0bc7681875 igneum-pow show: --shadow-reps reaches the show path too (the step case's id check, 22:37Z: the CLI printed the rung-0 id for --shadow-reps 35 because show built its program without the rung; the three miners' rung-1 ids agreed with each other and differed from rung 0, as the chain requires)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 22:37:56 +00:00
igneum-labs
6660722bd7 latency-ladder harness: genesis (header version 0) is out of the low-byte check; the first known-failed run tripped it (a harness fault, recorded in the file)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 22:27:50 +00:00
igneum-labs
edf5e8831e fast-time 60x file: exec_restart_state_root, the last field the 0.3.16 node tree's every-field test asks for (never-set defaults, nothing else changes)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 22:20:34 +00:00
igneum-labs
b0af074fb4 Latency ladder (Horizon finding 4, 0.3.17): docs/design/latency-ladder.md (where N lives, the ladder as a genesis list, the 90 percent seven-window step rule on the class signal's machinery, the verifier bound and its measured table, the X9 chip anchor, the hostile review, consequences per tier); igneum-pow: v4_class_at, v4_rung_reps, v4_counted_ops, generate_from_seed_bytes_program_class_shadow and Epoch::chain_program_shadow (rung 0 is V4_CLASS byte for byte; a rung above carries its shadow size in the id through program_id_class), era draws 8 and 9 consumed and not used, --shadow-reps on the CLI, the known-failed test first (a changed N hashed another program under one id); tools/ladder/verify-bench-remote.sh (the bench per rung on core 40 alone and with core 88 loaded under the box's measure hold; the first run's sibling finished early and is recorded as the script's failed case) with both runs' raw lines under docs/design/latency-ladder-bench; infra/fast-time/latency-ladder.mjs (step, no-step and the known-failed case) and the 60x file's three ladder fields plus the two 0.3.16-lane fields it lacked; ledger M34; the litepaper's hash-class paragraph and the corrected RandomX precedent (Bitmain's Antminer X9, approximate)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 22:18:48 +00:00
60 changed files with 5333 additions and 16 deletions

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 362.8 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x173, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 365.3 ms
shadow: 256 instructions x 173 passes per iteration, 354304 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 7.445 ms, 4096 items derived, lane0 74dbb9c7808b6c12 lane31 14a606e8cc2988ee
warp base 4096: single cold run 7.241 ms, 4096 items derived, lane0 361270e067803cb3 lane31 979c376d679d74b2
warp base 1000000: single cold run 7.106 ms, 4096 items derived, lane0 173be6655be48c63 lane31 697bcf4f945c5bf9
CPU verify: 7.004 ms per 32-lane warp, avg of 50 (checksum e9371a9db9fc1817)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 363.1 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x267, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 372.7 ms
shadow: 256 instructions x 267 passes per iteration, 546816 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 8.905 ms, 4096 items derived, lane0 14e8e692f6f1f094 lane31 a25fb8045d382322
warp base 4096: single cold run 8.731 ms, 4096 items derived, lane0 eed0185d04e6d213 lane31 6b9af2c86bf9db03
warp base 1000000: single cold run 8.723 ms, 4096 items derived, lane0 a38b5590afcba174 lane31 39664cb2e742eb67
CPU verify: 8.714 ms per 32-lane warp, avg of 50 (checksum a30f9fb7574d0db3)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 368.9 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x27, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 365.5 ms
shadow: 256 instructions x 27 passes per iteration, 55296 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 5.089 ms, 4096 items derived, lane0 2576769ee4a14c8d lane31 c58ddcb717dd3370
warp base 4096: single cold run 4.944 ms, 4096 items derived, lane0 1ce77a600ec573b4 lane31 03600a05ffba0055
warp base 1000000: single cold run 4.935 ms, 4096 items derived, lane0 6b390e64bbdd91ce lane31 91c944d603539c62
CPU verify: 4.934 ms per 32-lane warp, avg of 50 (checksum 17e36e7905b81375)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 364.2 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x35, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 368.1 ms
shadow: 256 instructions x 35 passes per iteration, 71680 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 5.201 ms, 4096 items derived, lane0 177dd71be37996bc lane31 792114b1b40ad79f
warp base 4096: single cold run 5.057 ms, 4096 items derived, lane0 fe6701666e2e483a lane31 fc2105cb89fcb8b7
warp base 1000000: single cold run 5.059 ms, 4096 items derived, lane0 6401cfb6e9ddfed6 lane31 89445da95a2e7184
CPU verify: 5.067 ms per 32-lane warp, avg of 50 (checksum 4632b2b31b01b311)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 363.5 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x53, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 366.6 ms
shadow: 256 instructions x 53 passes per iteration, 108544 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 5.512 ms, 4096 items derived, lane0 9771dab715d71261 lane31 525676cf580b6f11
warp base 4096: single cold run 5.350 ms, 4096 items derived, lane0 1afa4ca3c965c3f5 lane31 4e238e93b5f0101d
warp base 1000000: single cold run 5.342 ms, 4096 items derived, lane0 21a07085d7c0bd82 lane31 39fd0197590efb2a
CPU verify: 5.342 ms per 32-lane warp, avg of 50 (checksum 2efdcc71de21f16f)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 364.3 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x88, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 365.0 ms
shadow: 256 instructions x 88 passes per iteration, 180224 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 6.044 ms, 4096 items derived, lane0 84beec0429c7ef83 lane31 334b204a4a68c30d
warp base 4096: single cold run 5.887 ms, 4096 items derived, lane0 32be0f5b7d992255 lane31 2c8dbd443403bc84
warp base 1000000: single cold run 5.887 ms, 4096 items derived, lane0 78541813d6547a59 lane31 fd7fb2e05bbc316f
CPU verify: 5.900 ms per 32-lane warp, avg of 50 (checksum 77189c69c05913b5)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 542.3 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x173, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 486.8 ms
shadow: 256 instructions x 173 passes per iteration, 354304 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 7.386 ms, 4096 items derived, lane0 74dbb9c7808b6c12 lane31 14a606e8cc2988ee
warp base 4096: single cold run 7.244 ms, 4096 items derived, lane0 361270e067803cb3 lane31 979c376d679d74b2
warp base 1000000: single cold run 7.254 ms, 4096 items derived, lane0 173be6655be48c63 lane31 697bcf4f945c5bf9
CPU verify: 7.231 ms per 32-lane warp, avg of 50 (checksum e9371a9db9fc1817)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 541.5 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x267, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 525.0 ms
shadow: 256 instructions x 267 passes per iteration, 546816 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 8.834 ms, 4096 items derived, lane0 14e8e692f6f1f094 lane31 a25fb8045d382322
warp base 4096: single cold run 8.701 ms, 4096 items derived, lane0 eed0185d04e6d213 lane31 6b9af2c86bf9db03
warp base 1000000: single cold run 8.717 ms, 4096 items derived, lane0 a38b5590afcba174 lane31 39664cb2e742eb67
CPU verify: 8.712 ms per 32-lane warp, avg of 50 (checksum a30f9fb7574d0db3)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 540.1 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x27, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 426.2 ms
shadow: 256 instructions x 27 passes per iteration, 55296 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 5.078 ms, 4096 items derived, lane0 2576769ee4a14c8d lane31 c58ddcb717dd3370
warp base 4096: single cold run 4.936 ms, 4096 items derived, lane0 1ce77a600ec573b4 lane31 03600a05ffba0055
warp base 1000000: single cold run 4.928 ms, 4096 items derived, lane0 6b390e64bbdd91ce lane31 91c944d603539c62
CPU verify: 4.931 ms per 32-lane warp, avg of 50 (checksum 17e36e7905b81375)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 542.5 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x35, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 429.9 ms
shadow: 256 instructions x 35 passes per iteration, 71680 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 5.201 ms, 4096 items derived, lane0 177dd71be37996bc lane31 792114b1b40ad79f
warp base 4096: single cold run 5.070 ms, 4096 items derived, lane0 fe6701666e2e483a lane31 fc2105cb89fcb8b7
warp base 1000000: single cold run 5.062 ms, 4096 items derived, lane0 6401cfb6e9ddfed6 lane31 89445da95a2e7184
CPU verify: 5.055 ms per 32-lane warp, avg of 50 (checksum 4632b2b31b01b311)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 542.1 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x53, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 436.9 ms
shadow: 256 instructions x 53 passes per iteration, 108544 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 5.497 ms, 4096 items derived, lane0 9771dab715d71261 lane31 525676cf580b6f11
warp base 4096: single cold run 5.360 ms, 4096 items derived, lane0 1afa4ca3c965c3f5 lane31 4e238e93b5f0101d
warp base 1000000: single cold run 5.359 ms, 4096 items derived, lane0 21a07085d7c0bd82 lane31 39fd0197590efb2a
CPU verify: 5.350 ms per 32-lane warp, avg of 50 (checksum 2efdcc71de21f16f)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 539.7 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x88, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 450.4 ms
shadow: 256 instructions x 88 passes per iteration, 180224 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 6.066 ms, 4096 items derived, lane0 84beec0429c7ef83 lane31 334b204a4a68c30d
warp base 4096: single cold run 5.881 ms, 4096 items derived, lane0 32be0f5b7d992255 lane31 2c8dbd443403bc84
warp base 1000000: single cold run 5.884 ms, 4096 items derived, lane0 78541813d6547a59 lane31 fd7fb2e05bbc316f
CPU verify: 5.829 ms per 32-lane warp, avg of 50 (checksum 77189c69c05913b5)

View file

@ -0,0 +1,2 @@
host igneum-build-1 load 26.61 13.24 8.88 freq40 1519940 kHz siblings 40,88 pow 3f7623f208335f5b
load after 19.77 12.55 8.74

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 364.1 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x173, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 547.4 ms
shadow: 256 instructions x 173 passes per iteration, 354304 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 9.918 ms, 4096 items derived, lane0 74dbb9c7808b6c12 lane31 14a606e8cc2988ee
warp base 4096: single cold run 9.703 ms, 4096 items derived, lane0 361270e067803cb3 lane31 979c376d679d74b2
warp base 1000000: single cold run 9.691 ms, 4096 items derived, lane0 173be6655be48c63 lane31 697bcf4f945c5bf9
CPU verify: 10.870 ms per 32-lane warp, avg of 50 (checksum e9371a9db9fc1817)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 364.6 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x267, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 545.8 ms
shadow: 256 instructions x 267 passes per iteration, 546816 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 11.728 ms, 4096 items derived, lane0 14e8e692f6f1f094 lane31 a25fb8045d382322
warp base 4096: single cold run 11.491 ms, 4096 items derived, lane0 eed0185d04e6d213 lane31 6b9af2c86bf9db03
warp base 1000000: single cold run 11.493 ms, 4096 items derived, lane0 a38b5590afcba174 lane31 39664cb2e742eb67
CPU verify: 13.125 ms per 32-lane warp, avg of 50 (checksum a30f9fb7574d0db3)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 365.9 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x27, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 545.3 ms
shadow: 256 instructions x 27 passes per iteration, 55296 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 7.146 ms, 4096 items derived, lane0 2576769ee4a14c8d lane31 c58ddcb717dd3370
warp base 4096: single cold run 6.915 ms, 4096 items derived, lane0 1ce77a600ec573b4 lane31 03600a05ffba0055
warp base 1000000: single cold run 6.897 ms, 4096 items derived, lane0 6b390e64bbdd91ce lane31 91c944d603539c62
CPU verify: 7.421 ms per 32-lane warp, avg of 50 (checksum 17e36e7905b81375)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 364.3 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x35, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 547.5 ms
shadow: 256 instructions x 35 passes per iteration, 71680 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 7.291 ms, 4096 items derived, lane0 177dd71be37996bc lane31 792114b1b40ad79f
warp base 4096: single cold run 7.057 ms, 4096 items derived, lane0 fe6701666e2e483a lane31 fc2105cb89fcb8b7
warp base 1000000: single cold run 7.070 ms, 4096 items derived, lane0 6401cfb6e9ddfed6 lane31 89445da95a2e7184
CPU verify: 7.587 ms per 32-lane warp, avg of 50 (checksum 4632b2b31b01b311)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 364.3 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x53, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 547.1 ms
shadow: 256 instructions x 53 passes per iteration, 108544 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 7.627 ms, 4096 items derived, lane0 9771dab715d71261 lane31 525676cf580b6f11
warp base 4096: single cold run 7.404 ms, 4096 items derived, lane0 1afa4ca3c965c3f5 lane31 4e238e93b5f0101d
warp base 1000000: single cold run 7.380 ms, 4096 items derived, lane0 21a07085d7c0bd82 lane31 39fd0197590efb2a
CPU verify: 8.023 ms per 32-lane warp, avg of 50 (checksum 2efdcc71de21f16f)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 364.3 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x88, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 544.8 ms
shadow: 256 instructions x 88 passes per iteration, 180224 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 8.290 ms, 4096 items derived, lane0 84beec0429c7ef83 lane31 334b204a4a68c30d
warp base 4096: single cold run 8.085 ms, 4096 items derived, lane0 32be0f5b7d992255 lane31 2c8dbd443403bc84
warp base 1000000: single cold run 8.051 ms, 4096 items derived, lane0 78541813d6547a59 lane31 fd7fb2e05bbc316f
CPU verify: 8.846 ms per 32-lane warp, avg of 50 (checksum 77189c69c05913b5)

View file

@ -0,0 +1,10 @@
host igneum-build-1 load 26.61 13.24 8.88 freq40 1519940 kHz siblings 40,88 pow 3f7623f208335f5b
load after 19.77 12.55 8.74
| Rung | reps | Shadow instrs per hash | Counted ops (approx) | Cold, core alone (ms) | Avg of 50, alone (ms) | Cold, sibling loaded (ms) | Avg of 50, sibling loaded (ms) | Under 10 ms loaded |
|---|---|---|---|---|---|---|---|---|
| 0 | 27 | 55296 | 102,122 | 5.09 | 4.93 | 5.08 | 4.93 | yes |
| 1 | 35 | 71680 | 132,105 | 5.20 | 5.07 | 5.20 | 5.05 | yes |
| 2 | 53 | 108544 | 199,566 | 5.51 | 5.34 | 5.50 | 5.35 | yes |
| 3 | 88 | 180224 | 330,740 | 6.04 | 5.90 | 6.07 | 5.83 | yes |
| 4 | 173 | 354304 | 649,307 | 7.45 | 7.00 | 7.39 | 7.23 | yes |
| 5 | 267 | 546816 | 1,001,604 | 8.90 | 8.71 | 8.83 | 8.71 | yes |

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 363.1 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x173, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 365.6 ms
shadow: 256 instructions x 173 passes per iteration, 354304 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 7.380 ms, 4096 items derived, lane0 74dbb9c7808b6c12 lane31 14a606e8cc2988ee
warp base 4096: single cold run 7.232 ms, 4096 items derived, lane0 361270e067803cb3 lane31 979c376d679d74b2
warp base 1000000: single cold run 7.230 ms, 4096 items derived, lane0 173be6655be48c63 lane31 697bcf4f945c5bf9
CPU verify: 7.233 ms per 32-lane warp, avg of 50 (checksum e9371a9db9fc1817)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 364.0 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x267, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 367.0 ms
shadow: 256 instructions x 267 passes per iteration, 546816 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 8.881 ms, 4096 items derived, lane0 14e8e692f6f1f094 lane31 a25fb8045d382322
warp base 4096: single cold run 8.723 ms, 4096 items derived, lane0 eed0185d04e6d213 lane31 6b9af2c86bf9db03
warp base 1000000: single cold run 8.707 ms, 4096 items derived, lane0 a38b5590afcba174 lane31 39664cb2e742eb67
CPU verify: 8.499 ms per 32-lane warp, avg of 50 (checksum a30f9fb7574d0db3)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 460.7 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x27, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 368.6 ms
shadow: 256 instructions x 27 passes per iteration, 55296 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 5.141 ms, 4096 items derived, lane0 2576769ee4a14c8d lane31 c58ddcb717dd3370
warp base 4096: single cold run 4.954 ms, 4096 items derived, lane0 1ce77a600ec573b4 lane31 03600a05ffba0055
warp base 1000000: single cold run 4.969 ms, 4096 items derived, lane0 6b390e64bbdd91ce lane31 91c944d603539c62
CPU verify: 4.946 ms per 32-lane warp, avg of 50 (checksum 17e36e7905b81375)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 456.9 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x35, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 437.3 ms
shadow: 256 instructions x 35 passes per iteration, 71680 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 5.571 ms, 4096 items derived, lane0 177dd71be37996bc lane31 792114b1b40ad79f
warp base 4096: single cold run 5.327 ms, 4096 items derived, lane0 fe6701666e2e483a lane31 fc2105cb89fcb8b7
warp base 1000000: single cold run 5.203 ms, 4096 items derived, lane0 6401cfb6e9ddfed6 lane31 89445da95a2e7184
CPU verify: 5.521 ms per 32-lane warp, avg of 50 (checksum 4632b2b31b01b311)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 368.7 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x53, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 364.8 ms
shadow: 256 instructions x 53 passes per iteration, 108544 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 5.569 ms, 4096 items derived, lane0 9771dab715d71261 lane31 525676cf580b6f11
warp base 4096: single cold run 5.352 ms, 4096 items derived, lane0 1afa4ca3c965c3f5 lane31 4e238e93b5f0101d
warp base 1000000: single cold run 5.366 ms, 4096 items derived, lane0 21a07085d7c0bd82 lane31 39fd0197590efb2a
CPU verify: 5.351 ms per 32-lane warp, avg of 50 (checksum 2efdcc71de21f16f)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 360.9 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x88, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 361.8 ms
shadow: 256 instructions x 88 passes per iteration, 180224 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 6.073 ms, 4096 items derived, lane0 84beec0429c7ef83 lane31 334b204a4a68c30d
warp base 4096: single cold run 5.900 ms, 4096 items derived, lane0 32be0f5b7d992255 lane31 2c8dbd443403bc84
warp base 1000000: single cold run 5.883 ms, 4096 items derived, lane0 78541813d6547a59 lane31 fd7fb2e05bbc316f
CPU verify: 5.892 ms per 32-lane warp, avg of 50 (checksum 77189c69c05913b5)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 548.6 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x173, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 551.8 ms
shadow: 256 instructions x 173 passes per iteration, 354304 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 12.383 ms, 4096 items derived, lane0 74dbb9c7808b6c12 lane31 14a606e8cc2988ee
warp base 4096: single cold run 11.970 ms, 4096 items derived, lane0 361270e067803cb3 lane31 979c376d679d74b2
warp base 1000000: single cold run 12.177 ms, 4096 items derived, lane0 173be6655be48c63 lane31 697bcf4f945c5bf9
CPU verify: 12.091 ms per 32-lane warp, avg of 50 (checksum e9371a9db9fc1817)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 548.8 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x267, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 556.3 ms
shadow: 256 instructions x 267 passes per iteration, 546816 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 14.959 ms, 4096 items derived, lane0 14e8e692f6f1f094 lane31 a25fb8045d382322
warp base 4096: single cold run 14.619 ms, 4096 items derived, lane0 eed0185d04e6d213 lane31 6b9af2c86bf9db03
warp base 1000000: single cold run 14.437 ms, 4096 items derived, lane0 a38b5590afcba174 lane31 39664cb2e742eb67
CPU verify: 14.580 ms per 32-lane warp, avg of 50 (checksum a30f9fb7574d0db3)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 551.2 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x27, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 561.9 ms
shadow: 256 instructions x 27 passes per iteration, 55296 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 8.769 ms, 4096 items derived, lane0 2576769ee4a14c8d lane31 c58ddcb717dd3370
warp base 4096: single cold run 8.503 ms, 4096 items derived, lane0 1ce77a600ec573b4 lane31 03600a05ffba0055
warp base 1000000: single cold run 8.469 ms, 4096 items derived, lane0 6b390e64bbdd91ce lane31 91c944d603539c62
CPU verify: 8.674 ms per 32-lane warp, avg of 50 (checksum 17e36e7905b81375)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 549.4 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x35, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 554.8 ms
shadow: 256 instructions x 35 passes per iteration, 71680 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 8.867 ms, 4096 items derived, lane0 177dd71be37996bc lane31 792114b1b40ad79f
warp base 4096: single cold run 8.505 ms, 4096 items derived, lane0 fe6701666e2e483a lane31 fc2105cb89fcb8b7
warp base 1000000: single cold run 8.517 ms, 4096 items derived, lane0 6401cfb6e9ddfed6 lane31 89445da95a2e7184
CPU verify: 8.510 ms per 32-lane warp, avg of 50 (checksum 4632b2b31b01b311)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 541.1 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x53, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 549.4 ms
shadow: 256 instructions x 53 passes per iteration, 108544 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 9.233 ms, 4096 items derived, lane0 9771dab715d71261 lane31 525676cf580b6f11
warp base 4096: single cold run 8.869 ms, 4096 items derived, lane0 1afa4ca3c965c3f5 lane31 4e238e93b5f0101d
warp base 1000000: single cold run 8.943 ms, 4096 items derived, lane0 21a07085d7c0bd82 lane31 39fd0197590efb2a
CPU verify: 8.908 ms per 32-lane warp, avg of 50 (checksum 2efdcc71de21f16f)

View file

@ -0,0 +1,8 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 542.3 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x88, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 556.0 ms
shadow: 256 instructions x 88 passes per iteration, 180224 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 10.081 ms, 4096 items derived, lane0 84beec0429c7ef83 lane31 334b204a4a68c30d
warp base 4096: single cold run 9.845 ms, 4096 items derived, lane0 32be0f5b7d992255 lane31 2c8dbd443403bc84
warp base 1000000: single cold run 9.944 ms, 4096 items derived, lane0 78541813d6547a59 lane31 fd7fb2e05bbc316f
CPU verify: 9.842 ms per 32-lane warp, avg of 50 (checksum 77189c69c05913b5)

View file

@ -0,0 +1,2 @@
host igneum-build-1 load 25.39 17.85 11.63 freq40 1500000 kHz siblings 40,88 pow 3f7623f208335f5b
load after 23.60 18.46 12.05

View file

@ -0,0 +1,7 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 363.1 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x173, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 364.9 ms
shadow: 256 instructions x 173 passes per iteration, 354304 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 7.394 ms, 4096 items derived, lane0 74dbb9c7808b6c12 lane31 14a606e8cc2988ee
warp base 4096: single cold run 7.241 ms, 4096 items derived, lane0 361270e067803cb3 lane31 979c376d679d74b2
warp base 1000000: single cold run 7.269 ms, 4096 items derived, lane0 173be6655be48c63 lane31 697bcf4f945c5bf9

View file

@ -0,0 +1,7 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 365.1 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x267, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 372.0 ms
shadow: 256 instructions x 267 passes per iteration, 546816 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 8.930 ms, 4096 items derived, lane0 14e8e692f6f1f094 lane31 a25fb8045d382322
warp base 4096: single cold run 8.716 ms, 4096 items derived, lane0 eed0185d04e6d213 lane31 6b9af2c86bf9db03
warp base 1000000: single cold run 8.762 ms, 4096 items derived, lane0 a38b5590afcba174 lane31 39664cb2e742eb67

View file

@ -0,0 +1,7 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 369.7 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x27, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 370.0 ms
shadow: 256 instructions x 27 passes per iteration, 55296 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 5.129 ms, 4096 items derived, lane0 2576769ee4a14c8d lane31 c58ddcb717dd3370
warp base 4096: single cold run 4.944 ms, 4096 items derived, lane0 1ce77a600ec573b4 lane31 03600a05ffba0055
warp base 1000000: single cold run 4.947 ms, 4096 items derived, lane0 6b390e64bbdd91ce lane31 91c944d603539c62

View file

@ -0,0 +1,7 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 366.7 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x35, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 368.5 ms
shadow: 256 instructions x 35 passes per iteration, 71680 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 5.247 ms, 4096 items derived, lane0 177dd71be37996bc lane31 792114b1b40ad79f
warp base 4096: single cold run 5.071 ms, 4096 items derived, lane0 fe6701666e2e483a lane31 fc2105cb89fcb8b7
warp base 1000000: single cold run 5.063 ms, 4096 items derived, lane0 6401cfb6e9ddfed6 lane31 89445da95a2e7184

View file

@ -0,0 +1,7 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 362.3 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x53, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 364.4 ms
shadow: 256 instructions x 53 passes per iteration, 108544 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 5.481 ms, 4096 items derived, lane0 9771dab715d71261 lane31 525676cf580b6f11
warp base 4096: single cold run 5.346 ms, 4096 items derived, lane0 1afa4ca3c965c3f5 lane31 4e238e93b5f0101d
warp base 1000000: single cold run 5.349 ms, 4096 items derived, lane0 21a07085d7c0bd82 lane31 39fd0197590efb2a

View file

@ -0,0 +1,7 @@
igneum-pow bench: seed "igneum-genesis", day "2026-10-03", dataset 2^28 words (memory-hard)
cache: fill 367.6 ms on one core (2^26 words, 256 MiB, 65536 chains of 64 ChaCha12 blocks), FNV-1a 64 48c4f5bf24166b2e
program: class mx8+sh256x88, 128 loads/hash, 512 bytes/hash, widths (1,4,16 words) [16, 0, 0], 4096 items/warp, mixer x8 (72 mixers/item), cache 2^26 words, op mix load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1; epoch built in 364.7 ms
shadow: 256 instructions x 88 passes per iteration, 180224 shadow instructions per hash, op mix add=47 rotl=30 xor=30 shfl=29 mad=27 mul=22 sub=21 rotr=20 mulhi=18 or=12
warp base 0: single cold run 6.058 ms, 4096 items derived, lane0 84beec0429c7ef83 lane31 334b204a4a68c30d
warp base 4096: single cold run 5.909 ms, 4096 items derived, lane0 32be0f5b7d992255 lane31 2c8dbd443403bc84
warp base 1000000: single cold run 5.896 ms, 4096 items derived, lane0 78541813d6547a59 lane31 fd7fb2e05bbc316f

View file

@ -0,0 +1,10 @@
host igneum-build-1 load 25.39 17.85 11.63 freq40 1500000 kHz siblings 40,88 pow 3f7623f208335f5b
load after 23.60 18.46 12.05
| Rung | reps | Shadow instrs per hash | Counted ops (approx) | Cold, core alone (ms) | Avg of 50, alone (ms) | Cold, sibling loaded (ms) | Avg of 50, sibling loaded (ms) | Under 10 ms loaded |
|---|---|---|---|---|---|---|---|---|
| 0 | 27 | 55296 | 102,122 | 5.14 | 4.95 | 8.77 | 8.67 | yes |
| 1 | 35 | 71680 | 132,105 | 5.57 | 5.52 | 8.87 | 8.51 | yes |
| 2 | 53 | 108544 | 199,566 | 5.57 | 5.35 | 9.23 | 8.91 | yes |
| 3 | 88 | 180224 | 330,740 | 6.07 | 5.89 | 10.08 | 9.84 | NO |
| 4 | 173 | 354304 | 649,307 | 7.38 | 7.23 | 12.38 | 12.09 | NO |
| 5 | 267 | 546816 | 1,001,604 | 8.88 | 8.50 | 14.96 | 14.58 | NO |

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,86 @@
22:15:30.265 signals up/up/none, expect step; class v4 from genesis, the ladder active from DAA 0, window 60 DAA x 7 (the first epoch that can step is 8, DAA 480); 60 DAA per epoch, lead 10; run 900 s or 10 epochs
22:15:31.502 n0 up pid 1524201 json 29722 p2p 29721, signals up
22:15:32.712 n1 up pid 1524767 json 29732 p2p 29731, signals up
22:15:33.921 n2 up pid 1525234 json 29742 p2p 29741, signals none
22:15:33.922 n0: Latency ladder from the override file: rungs 27, 35, 53, [88], [173], [267] shadow passes (brackets: inadmissible, never entered), active from epoch 0 (DAA score 0 rounded up to the epoch boundary at 0), one rung per decision at 90 percent of blue blocks in each of 7 consecutive windows of 60 DAA ending at an epoch's seed block | this node signals up
22:15:33.922 n1: Latency ladder from the override file: rungs 27, 35, 53, [88], [173], [267] shadow passes (brackets: inadmissible, never entered), active from epoch 0 (DAA score 0 rounded up to the epoch boundary at 0), one rung per decision at 90 percent of blue blocks in each of 7 consecutive windows of 60 DAA ending at an epoch's seed block | this node signals up
22:15:33.923 n2: Latency ladder from the override file: rungs 27, 35, 53, [88], [173], [267] shadow passes (brackets: inadmissible, never entered), active from epoch 0 (DAA score 0 rounded up to the epoch boundary at 0), one rung per decision at 90 percent of blue blocks in each of 7 consecutive windows of 60 DAA ending at an epoch's seed block | this node signals none
22:15:33.923 n0 digest: b1f606bede788b70
22:15:34.935 epoch -1 -> 0 at daa 0, 4.7 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 0 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:15:34.936 t=4.7 s daa 0 epoch 0 rung 0 (27) up 0 bps weakest 0 blocks/sink per node 0/234e082d 0/234e082d 0/234e082d
22:15:49.976 t=19.7 s daa 5 epoch 0 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 5/40fa3a38 5/40fa3a38 5/40fa3a38
22:16:04.996 t=34.7 s daa 10 epoch 0 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 10/6c4045c3 10/6c4045c3 10/6c4045c3
22:16:20.016 t=49.8 s daa 18 epoch 0 rung 0 (27) up 8235 bps weakest 0 blocks/sink per node 18/c1c333f0 18/c1c333f0 18/c1c333f0
22:16:35.038 t=64.8 s daa 35 epoch 0 rung 0 (27) up 8529 bps weakest 0 blocks/sink per node 35/7b225e5b 35/7b225e5b 35/7b225e5b
22:16:50.055 t=79.8 s daa 50 epoch 0 rung 0 (27) up 7755 bps weakest 0 blocks/sink per node 50/47cc7477 50/47cc7477 50/47cc7477
22:17:01.070 epoch 0 -> 1 at daa 60, 90.8 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 7627 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:17:05.076 t=94.8 s daa 66 epoch 1 rung 0 (27) up 7333 bps weakest 0 blocks/sink per node 66/3e771191 66/3e771191 66/3e771191
22:17:20.093 t=109.8 s daa 83 epoch 1 rung 0 (27) up 6666 bps weakest 0 blocks/sink per node 83/6c5cdee4 83/6c5cdee4 83/6c5cdee4
22:17:35.109 t=124.8 s daa 95 epoch 1 rung 0 (27) up 6500 bps weakest 0 blocks/sink per node 95/7764cba7 95/7764cba7 95/7764cba7
22:17:50.123 t=139.9 s daa 107 epoch 1 rung 0 (27) up 6500 bps weakest 0 blocks/sink per node 107/2cb36d19 107/2cb36d19 107/2cb36d19
22:18:05.138 t=154.9 s daa 119 epoch 1 rung 0 (27) up 6166 bps weakest 0 blocks/sink per node 119/352afb28 119/352afb28 119/352afb28
22:18:06.139 epoch 1 -> 2 at daa 121, 155.9 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 6166 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:18:20.155 t=169.9 s daa 136 epoch 2 rung 0 (27) up 6666 bps weakest 0 blocks/sink per node 136/e0952e01 136/e0952e01 136/e0952e01
22:18:35.174 t=184.9 s daa 152 epoch 2 rung 0 (27) up 6166 bps weakest 0 blocks/sink per node 152/ed8e34c7 152/ed8e34c7 152/ed8e34c7
22:18:50.193 t=199.9 s daa 162 epoch 2 rung 0 (27) up 6500 bps weakest 0 blocks/sink per node 162/6065aef4 162/6065aef4 162/6065aef4
22:19:05.211 t=214.9 s daa 176 epoch 2 rung 0 (27) up 6333 bps weakest 0 blocks/sink per node 176/317cae30 176/317cae30 176/317cae30
22:19:09.216 epoch 2 -> 3 at daa 181, 218.9 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 6500 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:19:20.231 t=230.0 s daa 189 epoch 3 rung 0 (27) up 6666 bps weakest 0 blocks/sink per node 189/21d90cfa 189/21d90cfa 189/21d90cfa
22:19:35.249 t=245.0 s daa 202 epoch 3 rung 0 (27) up 6333 bps weakest 0 blocks/sink per node 202/f1e7ec5c 202/f1e7ec5c 202/f1e7ec5c
22:19:50.265 t=260.0 s daa 218 epoch 3 rung 0 (27) up 6333 bps weakest 0 blocks/sink per node 218/e274c4f7 218/e274c4f7 218/e274c4f7
22:20:05.285 t=275.0 s daa 235 epoch 3 rung 0 (27) up 6666 bps weakest 0 blocks/sink per node 235/8e665e8d 235/8e665e8d 235/8e665e8d
22:20:08.289 epoch 3 -> 4 at daa 240, 278.0 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 7000 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:20:20.303 t=290.0 s daa 254 epoch 4 rung 0 (27) up 7500 bps weakest 0 blocks/sink per node 254/ce04cd38 254/ce04cd38 254/ce04cd38
22:20:35.315 t=305.0 s daa 267 epoch 4 rung 0 (27) up 7500 bps weakest 0 blocks/sink per node 267/bf108545 267/bf108545 267/bf108545
22:20:50.328 t=320.1 s daa 283 epoch 4 rung 0 (27) up 7500 bps weakest 0 blocks/sink per node 283/5a897c6f 283/5a897c6f 283/5a897c6f
22:21:05.344 t=335.1 s daa 294 epoch 4 rung 0 (27) up 8000 bps weakest 0 blocks/sink per node 294/2b000b87 294/2b000b87 294/2b000b87
22:21:09.348 epoch 4 -> 5 at daa 300, 339.1 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 7833 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:21:20.359 t=350.1 s daa 319 epoch 5 rung 0 (27) up 7333 bps weakest 0 blocks/sink per node 319/ecef2a5f 319/ecef2a5f 319/ecef2a5f
22:21:35.378 t=365.1 s daa 335 epoch 5 rung 0 (27) up 7166 bps weakest 0 blocks/sink per node 335/a8fbe817 335/a8fbe817 335/a8fbe817
22:21:50.399 t=380.1 s daa 343 epoch 5 rung 0 (27) up 7333 bps weakest 0 blocks/sink per node 343/b1967aab 343/b1967aab 343/b1967aab
22:22:05.416 t=395.1 s daa 354 epoch 5 rung 0 (27) up 6666 bps weakest 0 blocks/sink per node 354/2a4ccf8a 354/2a4ccf8a 354/2a4ccf8a
22:22:13.424 epoch 5 -> 6 at daa 360, 403.2 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 6333 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:22:20.432 t=410.2 s daa 366 epoch 6 rung 0 (27) up 6166 bps weakest 6166 blocks/sink per node 366/a16b8185 366/a16b8185 366/a16b8185
22:22:35.449 t=425.2 s daa 377 epoch 6 rung 0 (27) up 6000 bps weakest 6000 blocks/sink per node 377/50316214 377/50316214 377/50316214
22:22:50.468 t=440.2 s daa 395 epoch 6 rung 0 (27) up 6666 bps weakest 6166 blocks/sink per node 395/5be9e979 395/5be9e979 395/5be9e979
22:23:05.487 t=455.2 s daa 404 epoch 6 rung 0 (27) up 6000 bps weakest 6000 blocks/sink per node 404/3a965599 404/3a965599 404/3a965599
22:23:15.500 epoch 6 -> 7 at daa 421, 465.2 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 6333 bps (weakest of 7: 6166), down 0 bps, this node signals 1, step took effect at epoch 0
22:23:20.507 t=470.2 s daa 424 epoch 7 rung 0 (27) up 6333 bps weakest 6065 blocks/sink per node 424/097eaa14 424/097eaa14 424/097eaa14
22:23:35.529 t=485.3 s daa 439 epoch 7 rung 0 (27) up 6166 bps weakest 6000 blocks/sink per node 439/7d27db8c 439/7d27db8c 439/7d27db8c
22:23:50.550 t=500.3 s daa 456 epoch 7 rung 0 (27) up 5833 bps weakest 5833 blocks/sink per node 456/f4675851 456/f4675851 456/f4675851
22:24:05.570 t=515.3 s daa 467 epoch 7 rung 0 (27) up 6333 bps weakest 6333 blocks/sink per node 467/a7575707 467/a7575707 467/a7575707
22:24:20.593 epoch 7 -> 8 at daa 480, 530.3 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 6500 bps (weakest of 7: 6333), down 0 bps, this node signals 1, step took effect at epoch 0
22:24:20.593 t=530.3 s daa 480 epoch 8 rung 0 (27) up 6500 bps weakest 6333 blocks/sink per node 480/f8f68e4b 480/f8f68e4b 480/f8f68e4b
22:24:35.616 t=545.4 s daa 499 epoch 8 rung 0 (27) up 7000 bps weakest 6000 blocks/sink per node 499/dba81f65 499/dba81f65 499/dba81f65
22:24:50.638 t=560.4 s daa 508 epoch 8 rung 0 (27) up 7000 bps weakest 5833 blocks/sink per node 508/e6208807 508/e6208807 508/e6208807
22:25:05.661 t=575.4 s daa 521 epoch 8 rung 0 (27) up 6833 bps weakest 6166 blocks/sink per node 521/faf3f2b3 521/faf3f2b3 521/faf3f2b3
22:25:20.684 t=590.4 s daa 537 epoch 8 rung 0 (27) up 7166 bps weakest 6166 blocks/sink per node 537/0cec2d26 537/0cec2d26 537/0cec2d26
22:25:24.690 epoch 8 -> 9 at daa 543, 594.4 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 6666 bps (weakest of 7: 6333), down 0 bps, this node signals 1, step took effect at epoch 0
22:25:35.706 t=605.4 s daa 546 epoch 9 rung 0 (27) up 6666 bps weakest 6166 blocks/sink per node 546/75a259c6 546/75a259c6 546/75a259c6
22:25:50.729 t=620.5 s daa 573 epoch 9 rung 0 (27) up 6166 bps weakest 6000 blocks/sink per node 573/31d72980 573/31d72980 573/31d72980
22:26:05.750 t=635.5 s daa 581 epoch 9 rung 0 (27) up 6333 bps weakest 6166 blocks/sink per node 581/3cfe5b93 581/3cfe5b93 581/3cfe5b93
22:26:20.771 t=650.5 s daa 595 epoch 9 rung 0 (27) up 6333 bps weakest 6333 blocks/sink per node 595/84601051 595/84601051 595/84601051
22:26:25.777 epoch 9 -> 10 at daa 600, 655.5 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 6166 bps (weakest of 7: 6166), down 0 bps, this node signals 1, step took effect at epoch 0
22:26:29.069 SUMMARY FAIL (expect step, signals up/up/none): no step; epochs seen e0:r0:0bps e1:r0:0bps e2:r0:0bps e3:r0:0bps e4:r0:0bps e5:r0:0bps e6:r0:0bps e7:r0:6166bps e8:r0:6333bps e9:r0:6333bps e10:r0:6166bps; chain bits {"none":198,"up":406} (6722 bps up); blocks 604 / 0; rejected miners 0/0/0 nodes 0/0/0; sinks 783087038f7096b1 783087038f7096b1 783087038f7096b1 at 603/603/603
22:26:29.069 PROGRAM ID epoch 0 seed 234e082d653dc69d reps 27: miners 26fc8f3decca98ed (3 of 3) cli at reps 26fc8f3decca98ed cli rung 0 26fc8f3decca98ed
22:26:29.069 PROGRAM ID epoch 1 seed 47cc74777f2067e9 reps 27: miners 4eca8ebd9601cb06 (3 of 3) cli at reps 4eca8ebd9601cb06 cli rung 0 4eca8ebd9601cb06
22:26:29.069 PROGRAM ID epoch 2 seed 885cd519d10a63af reps 27: miners d8692bc62ac8b7c1 (3 of 3) cli at reps d8692bc62ac8b7c1 cli rung 0 d8692bc62ac8b7c1
22:26:29.069 PROGRAM ID epoch 3 seed 422f6e379baea2d0 reps 27: miners 379b63489b302ff1 (3 of 3) cli at reps 379b63489b302ff1 cli rung 0 379b63489b302ff1
22:26:29.069 PROGRAM ID epoch 4 seed 9a339c3a0da7a629 reps 27: miners 5297fd1c191bef91 (3 of 3) cli at reps 5297fd1c191bef91 cli rung 0 5297fd1c191bef91
22:26:29.069 PROGRAM ID epoch 5 seed 630d437238ecfbd0 reps 27: miners 188721c15b83df97 (3 of 3) cli at reps 188721c15b83df97 cli rung 0 188721c15b83df97
22:26:29.069 PROGRAM ID epoch 6 seed 46d593aedc1dfd37 reps 27: miners 962b4d74afdf7f3a (3 of 3) cli at reps 962b4d74afdf7f3a cli rung 0 962b4d74afdf7f3a
22:26:29.069 PROGRAM ID epoch 7 seed 842561a101da3cc8 reps 27: miners 3fc4c1e7704bb8a5 (3 of 3) cli at reps 3fc4c1e7704bb8a5 cli rung 0 3fc4c1e7704bb8a5
22:26:29.069 PROGRAM ID epoch 8 seed c0cb56ba970dd961 reps 27: miners 0fa5001f8bc6ffc0 (3 of 3) cli at reps 0fa5001f8bc6ffc0 cli rung 0 0fa5001f8bc6ffc0
22:26:29.069 PROGRAM ID epoch 9 seed 3a647e8feb58ab1b reps 27: miners b0a067d5bf44497e (3 of 3) cli at reps b0a067d5bf44497e cli rung 0 b0a067d5bf44497e
22:26:29.069 PROGRAM ID epoch 10 seed 5d7277e6f83f9e4d reps 27: miners 84e6cfe07a3316f4 (3 of 3) cli at reps 84e6cfe07a3316f4 cli rung 0 84e6cfe07a3316f4
22:26:29.069 FAILED CHECK chain_carries_the_bits
22:26:29.069 FAILED CHECK template_stepped_to_rung_1
22:26:29.069 FAILED CHECK stepped_at_the_first_full_window_epoch
22:26:29.069 FAILED CHECK step_line_on_every_node_same_epoch
22:26:29.069 FAILED CHECK weakest_up_at_or_above_threshold
22:26:29.069 FAILED CHECK no_second_step_inside_seven_windows
22:26:29.069 FAILED CHECK blocks_on_both_sides
22:26:29.069 FAILED CHECK rung1_ids_equal_the_cli_rung1_id
22:26:29.069 FAILED CHECK rung1_ids_differ_from_the_same_seed_rung0_id
22:26:29.069 summary: /tmp/igneum-fast-time-ladder-failed-case/summary.json
CASE failed-case rc=1

View file

@ -0,0 +1,969 @@
{
"pass": true,
"expect": "no-step",
"signals": [
"up",
"up",
"none"
],
"checks": {
"zero_rejected_by_miners": true,
"zero_rejected_by_nodes": true,
"sinks_agree": true,
"block_counts_agree": true,
"miners_agree_on_every_program": true,
"ladder_line_on_every_node": true,
"every_node_signals_its_bits": true,
"every_epoch_class_v4": true,
"rung0_ids_equal_the_cli_rung0_id": true,
"chain_carries_the_bits": true,
"template_never_above_rung_0": true,
"no_step_line_on_any_node": true,
"ran_the_epochs": true,
"passed_the_first_full_window_epoch": true,
"up_share_under_threshold_on_chain": true
},
"window": 60,
"windows": 7,
"threshold_bps": 9000,
"epoch_blocks": 60,
"lead": 10,
"first_step_epoch": 8,
"node": "/srv/builds/igneum-wt-ladder/vendor/igneum-node-ladder/target/release/igneumd",
"miner": "/srv/builds/igneum-wt-ladder/vendor/igneum-node-ladder/target/release/igneum-miner",
"pow": "/srv/builds/igneum-wt-ladder/igneum-pow/target/release/igneum-pow",
"template_step": null,
"run_ended_at_s": 592.5,
"final_daa": 600,
"max_epoch_seen": 10,
"epochs": {
"0": {
"class": 4,
"reps": 27,
"step": 0,
"firstSeenDaa": 0,
"at": 4.7,
"eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062",
"up_bps": 0,
"up_weakest_bps": 0,
"down_bps": 0,
"step_epoch": 0
},
"1": {
"class": 4,
"reps": 27,
"step": 0,
"firstSeenDaa": 62,
"at": 96.8,
"eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062",
"up_bps": 7000,
"up_weakest_bps": 0,
"down_bps": 0,
"step_epoch": 0
},
"2": {
"class": 4,
"reps": 27,
"step": 0,
"firstSeenDaa": 120,
"at": 156.9,
"eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062",
"up_bps": 7166,
"up_weakest_bps": 0,
"down_bps": 0,
"step_epoch": 0
},
"3": {
"class": 4,
"reps": 27,
"step": 0,
"firstSeenDaa": 180,
"at": 213.9,
"eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062",
"up_bps": 7166,
"up_weakest_bps": 0,
"down_bps": 0,
"step_epoch": 0
},
"4": {
"class": 4,
"reps": 27,
"step": 0,
"firstSeenDaa": 240,
"at": 273,
"eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062",
"up_bps": 6833,
"up_weakest_bps": 0,
"down_bps": 0,
"step_epoch": 0
},
"5": {
"class": 4,
"reps": 27,
"step": 0,
"firstSeenDaa": 300,
"at": 322.1,
"eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062",
"up_bps": 6666,
"up_weakest_bps": 0,
"down_bps": 0,
"step_epoch": 0
},
"6": {
"class": 4,
"reps": 27,
"step": 0,
"firstSeenDaa": 360,
"at": 378.2,
"eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062",
"up_bps": 6333,
"up_weakest_bps": 0,
"down_bps": 0,
"step_epoch": 0
},
"7": {
"class": 4,
"reps": 27,
"step": 0,
"firstSeenDaa": 420,
"at": 436.2,
"eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062",
"up_bps": 5833,
"up_weakest_bps": 5833,
"down_bps": 0,
"step_epoch": 0
},
"8": {
"class": 4,
"reps": 27,
"step": 0,
"firstSeenDaa": 480,
"at": 490.3,
"eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062",
"up_bps": 6166,
"up_weakest_bps": 5833,
"down_bps": 0,
"step_epoch": 0
},
"9": {
"class": 4,
"reps": 27,
"step": 0,
"firstSeenDaa": 540,
"at": 541.4,
"eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062",
"up_bps": 6666,
"up_weakest_bps": 5833,
"down_bps": 0,
"step_epoch": 0
},
"10": {
"class": 4,
"reps": 27,
"step": 0,
"firstSeenDaa": 600,
"at": 592.5,
"eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062",
"up_bps": 6833,
"up_weakest_bps": 5833,
"down_bps": 0,
"step_epoch": 0
}
},
"blocks": {
"total": 602,
"before_boundary": 602,
"after_boundary": 0,
"ladder_bits": {
"none": 200,
"up": 402
},
"object_bytes": {
"0": 602
},
"up_share_bps_on_chain": 6678
},
"programs": [
{
"epoch": 0,
"class": "v4",
"program_id": "26fc8f3decca98ed",
"seed": "234e082d653dc69d",
"miners": 3,
"disagree": false
},
{
"epoch": 1,
"class": "v4",
"program_id": "e0910c8d87135035",
"seed": "894676c6f3ebb385",
"miners": 3,
"disagree": false
},
{
"epoch": 2,
"class": "v4",
"program_id": "2eb05375a9d9077d",
"seed": "405d6592622d1af9",
"miners": 3,
"disagree": false
},
{
"epoch": 3,
"class": "v4",
"program_id": "0acdab9caca48471",
"seed": "9598288f0a520b69",
"miners": 3,
"disagree": false
},
{
"epoch": 4,
"class": "v4",
"program_id": "1df476827c33e263",
"seed": "9b6e5a23005f0998",
"miners": 3,
"disagree": false
},
{
"epoch": 5,
"class": "v4",
"program_id": "20003329ca5050d9",
"seed": "a0a54f6a687f94f4",
"miners": 3,
"disagree": false
},
{
"epoch": 6,
"class": "v4",
"program_id": "2e5cee148e6b82b1",
"seed": "1b20ae99061e034f",
"miners": 3,
"disagree": false
},
{
"epoch": 7,
"class": "v4",
"program_id": "d9babb74721f6cd0",
"seed": "5545b276021f1ad9",
"miners": 3,
"disagree": false
},
{
"epoch": 8,
"class": "v4",
"program_id": "94b5809680b13285",
"seed": "f959d016b2d47167",
"miners": 3,
"disagree": false
},
{
"epoch": 9,
"class": "v4",
"program_id": "e1cae64a2a12de45",
"seed": "24b28bef5cba00a9",
"miners": 3,
"disagree": false
},
{
"epoch": 10,
"class": "v4",
"program_id": "c7ce4aa0e96ba6b9",
"seed": "ccfc16e9107ae720",
"miners": 3,
"disagree": false
}
],
"program_id_rows": [
{
"epoch": 0,
"seed": "234e082d653dc69d",
"reps": 27,
"miners_id": "26fc8f3decca98ed",
"miners": 3,
"cli_rung0": "26fc8f3decca98ed",
"cli_at_reps": "26fc8f3decca98ed"
},
{
"epoch": 1,
"seed": "894676c6f3ebb385",
"reps": 27,
"miners_id": "e0910c8d87135035",
"miners": 3,
"cli_rung0": "e0910c8d87135035",
"cli_at_reps": "e0910c8d87135035"
},
{
"epoch": 2,
"seed": "405d6592622d1af9",
"reps": 27,
"miners_id": "2eb05375a9d9077d",
"miners": 3,
"cli_rung0": "2eb05375a9d9077d",
"cli_at_reps": "2eb05375a9d9077d"
},
{
"epoch": 3,
"seed": "9598288f0a520b69",
"reps": 27,
"miners_id": "0acdab9caca48471",
"miners": 3,
"cli_rung0": "0acdab9caca48471",
"cli_at_reps": "0acdab9caca48471"
},
{
"epoch": 4,
"seed": "9b6e5a23005f0998",
"reps": 27,
"miners_id": "1df476827c33e263",
"miners": 3,
"cli_rung0": "1df476827c33e263",
"cli_at_reps": "1df476827c33e263"
},
{
"epoch": 5,
"seed": "a0a54f6a687f94f4",
"reps": 27,
"miners_id": "20003329ca5050d9",
"miners": 3,
"cli_rung0": "20003329ca5050d9",
"cli_at_reps": "20003329ca5050d9"
},
{
"epoch": 6,
"seed": "1b20ae99061e034f",
"reps": 27,
"miners_id": "2e5cee148e6b82b1",
"miners": 3,
"cli_rung0": "2e5cee148e6b82b1",
"cli_at_reps": "2e5cee148e6b82b1"
},
{
"epoch": 7,
"seed": "5545b276021f1ad9",
"reps": 27,
"miners_id": "d9babb74721f6cd0",
"miners": 3,
"cli_rung0": "d9babb74721f6cd0",
"cli_at_reps": "d9babb74721f6cd0"
},
{
"epoch": 8,
"seed": "f959d016b2d47167",
"reps": 27,
"miners_id": "94b5809680b13285",
"miners": 3,
"cli_rung0": "94b5809680b13285",
"cli_at_reps": "94b5809680b13285"
},
{
"epoch": 9,
"seed": "24b28bef5cba00a9",
"reps": 27,
"miners_id": "e1cae64a2a12de45",
"miners": 3,
"cli_rung0": "e1cae64a2a12de45",
"cli_at_reps": "e1cae64a2a12de45"
},
{
"epoch": 10,
"seed": "ccfc16e9107ae720",
"reps": 27,
"miners_id": "c7ce4aa0e96ba6b9",
"miners": 3,
"cli_rung0": "c7ce4aa0e96ba6b9",
"cli_at_reps": "c7ce4aa0e96ba6b9"
}
],
"accepted_per_miner": [
202,
200,
199
],
"rejected_by_miners": [
0,
0,
0
],
"rejected_by_nodes": [
0,
0,
0
],
"sinks": [
"bfc435d62d7c659c",
"bfc435d62d7c659c",
"bfc435d62d7c659c"
],
"block_counts": [
601,
601,
601
],
"step_lines": [
[],
[],
[]
],
"samples": [
{
"t": 4.7,
"daa": 0,
"epoch": 0,
"step": 0,
"reps": 27,
"up_bps": 0,
"up_weakest_bps": 0,
"nodes": [
"0/234e082d",
"0/234e082d",
"0/234e082d"
]
},
{
"t": 19.7,
"daa": 1,
"epoch": 0,
"step": 0,
"reps": 27,
"up_bps": 0,
"up_weakest_bps": 0,
"nodes": [
"1/350fed25",
"1/350fed25",
"1/350fed25"
]
},
{
"t": 34.7,
"daa": 7,
"epoch": 0,
"step": 0,
"reps": 27,
"up_bps": 6666,
"up_weakest_bps": 0,
"nodes": [
"7/33ca6cd0",
"7/33ca6cd0",
"7/33ca6cd0"
]
},
{
"t": 49.8,
"daa": 12,
"epoch": 0,
"step": 0,
"reps": 27,
"up_bps": 6363,
"up_weakest_bps": 0,
"nodes": [
"12/70a47fc6",
"12/70a47fc6",
"12/70a47fc6"
]
},
{
"t": 64.8,
"daa": 28,
"epoch": 0,
"step": 0,
"reps": 27,
"up_bps": 6296,
"up_weakest_bps": 0,
"nodes": [
"28/1c7719a6",
"28/1c7719a6",
"28/1c7719a6"
]
},
{
"t": 79.8,
"daa": 36,
"epoch": 0,
"step": 0,
"reps": 27,
"up_bps": 6571,
"up_weakest_bps": 0,
"nodes": [
"36/72330841",
"36/72330841",
"36/72330841"
]
},
{
"t": 94.8,
"daa": 59,
"epoch": 0,
"step": 0,
"reps": 27,
"up_bps": 7068,
"up_weakest_bps": 0,
"nodes": [
"59/cf02d592",
"59/cf02d592",
"59/cf02d592"
]
},
{
"t": 109.8,
"daa": 74,
"epoch": 1,
"step": 0,
"reps": 27,
"up_bps": 6833,
"up_weakest_bps": 0,
"nodes": [
"74/c65d7a59",
"74/c65d7a59",
"74/c65d7a59"
]
},
{
"t": 124.8,
"daa": 85,
"epoch": 1,
"step": 0,
"reps": 27,
"up_bps": 7333,
"up_weakest_bps": 0,
"nodes": [
"85/e53510f4",
"85/e53510f4",
"85/e53510f4"
]
},
{
"t": 139.9,
"daa": 105,
"epoch": 1,
"step": 0,
"reps": 27,
"up_bps": 7166,
"up_weakest_bps": 0,
"nodes": [
"105/37769ced",
"105/37769ced",
"105/37769ced"
]
},
{
"t": 154.9,
"daa": 119,
"epoch": 1,
"step": 0,
"reps": 27,
"up_bps": 7166,
"up_weakest_bps": 0,
"nodes": [
"119/aa8e5664",
"119/aa8e5664",
"119/aa8e5664"
]
},
{
"t": 169.9,
"daa": 131,
"epoch": 2,
"step": 0,
"reps": 27,
"up_bps": 7500,
"up_weakest_bps": 0,
"nodes": [
"131/bf6ed8b2",
"131/bf6ed8b2",
"131/bf6ed8b2"
]
},
{
"t": 184.9,
"daa": 150,
"epoch": 2,
"step": 0,
"reps": 27,
"up_bps": 8166,
"up_weakest_bps": 0,
"nodes": [
"150/6a31bf2e",
"150/6a31bf2e",
"150/6a31bf2e"
]
},
{
"t": 199.9,
"daa": 165,
"epoch": 2,
"step": 0,
"reps": 27,
"up_bps": 7500,
"up_weakest_bps": 0,
"nodes": [
"165/83f8d3f6",
"165/83f8d3f6",
"165/83f8d3f6"
]
},
{
"t": 215,
"daa": 181,
"epoch": 3,
"step": 0,
"reps": 27,
"up_bps": 7000,
"up_weakest_bps": 0,
"nodes": [
"181/5be6a01e",
"181/5be6a01e",
"181/5be6a01e"
]
},
{
"t": 230,
"daa": 202,
"epoch": 3,
"step": 0,
"reps": 27,
"up_bps": 6666,
"up_weakest_bps": 0,
"nodes": [
"202/5663af4a",
"202/5663af4a",
"202/5663af4a"
]
},
{
"t": 245,
"daa": 216,
"epoch": 3,
"step": 0,
"reps": 27,
"up_bps": 5833,
"up_weakest_bps": 0,
"nodes": [
"216/3d231639",
"216/3d231639",
"216/3d231639"
]
},
{
"t": 260,
"daa": 228,
"epoch": 3,
"step": 0,
"reps": 27,
"up_bps": 6500,
"up_weakest_bps": 0,
"nodes": [
"228/88370ed6",
"228/88370ed6",
"228/88370ed6"
]
},
{
"t": 275,
"daa": 241,
"epoch": 4,
"step": 0,
"reps": 27,
"up_bps": 6833,
"up_weakest_bps": 0,
"nodes": [
"241/a2dbefc3",
"241/a2dbefc3",
"241/a2dbefc3"
]
},
{
"t": 290,
"daa": 248,
"epoch": 4,
"step": 0,
"reps": 27,
"up_bps": 6500,
"up_weakest_bps": 0,
"nodes": [
"248/0815d37e",
"248/0815d37e",
"248/0815d37e"
]
},
{
"t": 305.1,
"daa": 267,
"epoch": 4,
"step": 0,
"reps": 27,
"up_bps": 6833,
"up_weakest_bps": 0,
"nodes": [
"267/09bb3297",
"267/09bb3297",
"267/09bb3297"
]
},
{
"t": 320.1,
"daa": 297,
"epoch": 4,
"step": 0,
"reps": 27,
"up_bps": 6833,
"up_weakest_bps": 0,
"nodes": [
"297/af91ef29",
"297/af91ef29",
"297/af91ef29"
]
},
{
"t": 335.1,
"daa": 312,
"epoch": 5,
"step": 0,
"reps": 27,
"up_bps": 6666,
"up_weakest_bps": 0,
"nodes": [
"312/a015f07f",
"312/a015f07f",
"312/a015f07f"
]
},
{
"t": 350.1,
"daa": 330,
"epoch": 5,
"step": 0,
"reps": 27,
"up_bps": 6833,
"up_weakest_bps": 0,
"nodes": [
"330/c9f57620",
"330/c9f57620",
"330/c9f57620"
]
},
{
"t": 365.1,
"daa": 345,
"epoch": 5,
"step": 0,
"reps": 27,
"up_bps": 6949,
"up_weakest_bps": 0,
"nodes": [
"345/fe4111b9",
"345/fe4111b9",
"345/fe4111b9"
]
},
{
"t": 380.2,
"daa": 360,
"epoch": 6,
"step": 0,
"reps": 27,
"up_bps": 6333,
"up_weakest_bps": 0,
"nodes": [
"360/2acb1c9a",
"360/2acb1c9a",
"360/2acb1c9a"
]
},
{
"t": 395.2,
"daa": 368,
"epoch": 6,
"step": 0,
"reps": 27,
"up_bps": 6779,
"up_weakest_bps": 5714,
"nodes": [
"368/853bece4",
"368/853bece4",
"368/853bece4"
]
},
{
"t": 410.2,
"daa": 390,
"epoch": 6,
"step": 0,
"reps": 27,
"up_bps": 5666,
"up_weakest_bps": 5666,
"nodes": [
"390/9101251e",
"389/6d70c5a8",
"390/9101251e"
]
},
{
"t": 425.2,
"daa": 404,
"epoch": 6,
"step": 0,
"reps": 27,
"up_bps": 5500,
"up_weakest_bps": 5500,
"nodes": [
"404/89a08ca7",
"404/89a08ca7",
"404/89a08ca7"
]
},
{
"t": 440.2,
"daa": 421,
"epoch": 7,
"step": 0,
"reps": 27,
"up_bps": 6000,
"up_weakest_bps": 6000,
"nodes": [
"421/a39e260b",
"421/a39e260b",
"421/a39e260b"
]
},
{
"t": 455.3,
"daa": 437,
"epoch": 7,
"step": 0,
"reps": 27,
"up_bps": 5666,
"up_weakest_bps": 5666,
"nodes": [
"437/9782bb5e",
"437/9782bb5e",
"437/9782bb5e"
]
},
{
"t": 470.3,
"daa": 456,
"epoch": 7,
"step": 0,
"reps": 27,
"up_bps": 5932,
"up_weakest_bps": 5833,
"nodes": [
"456/2a6dea3c",
"456/2a6dea3c",
"456/2a6dea3c"
]
},
{
"t": 485.3,
"daa": 473,
"epoch": 7,
"step": 0,
"reps": 27,
"up_bps": 6500,
"up_weakest_bps": 5500,
"nodes": [
"473/ab842458",
"473/ab842458",
"473/ab842458"
]
},
{
"t": 500.3,
"daa": 488,
"epoch": 8,
"step": 0,
"reps": 27,
"up_bps": 6000,
"up_weakest_bps": 5666,
"nodes": [
"488/a16f988f",
"488/a16f988f",
"488/a16f988f"
]
},
{
"t": 515.4,
"daa": 505,
"epoch": 8,
"step": 0,
"reps": 27,
"up_bps": 6333,
"up_weakest_bps": 5737,
"nodes": [
"505/915b20b6",
"505/915b20b6",
"505/915b20b6"
]
},
{
"t": 530.4,
"daa": 527,
"epoch": 8,
"step": 0,
"reps": 27,
"up_bps": 6666,
"up_weakest_bps": 5333,
"nodes": [
"527/7161dfa6",
"527/7161dfa6",
"527/7161dfa6"
]
},
{
"t": 545.4,
"daa": 541,
"epoch": 9,
"step": 0,
"reps": 27,
"up_bps": 6666,
"up_weakest_bps": 6000,
"nodes": [
"541/5fcc65e3",
"541/5fcc65e3",
"541/5fcc65e3"
]
},
{
"t": 560.4,
"daa": 562,
"epoch": 9,
"step": 0,
"reps": 27,
"up_bps": 6833,
"up_weakest_bps": 5666,
"nodes": [
"562/673f1e20",
"562/673f1e20",
"562/673f1e20"
]
},
{
"t": 575.4,
"daa": 577,
"epoch": 9,
"step": 0,
"reps": 27,
"up_bps": 7166,
"up_weakest_bps": 5833,
"nodes": [
"577/67af1166",
"577/67af1166",
"577/67af1166"
]
},
{
"t": 590.5,
"daa": 596,
"epoch": 9,
"step": 0,
"reps": 27,
"up_bps": 7000,
"up_weakest_bps": 5666,
"nodes": [
"596/2dd560ca",
"596/2dd560ca",
"596/2dd560ca"
]
}
]
}

View file

@ -0,0 +1,73 @@
22:37:08.927 signals up/up/none, expect no-step; class v4 from genesis, the ladder active from DAA 0, window 60 DAA x 7 (the first epoch that can step is 8, DAA 480); 60 DAA per epoch, lead 10; run 900 s or 10 epochs
22:37:10.165 n0 up pid 1658675 json 29722 p2p 29721, signals up
22:37:11.374 n1 up pid 1659188 json 29732 p2p 29731, signals up
22:37:12.584 n2 up pid 1659706 json 29742 p2p 29741, signals none
22:37:12.584 n0: Latency ladder from the override file: rungs 27, 35, 53, [88], [173], [267] shadow passes (brackets: inadmissible, never entered), active from epoch 0 (DAA score 0 rounded up to the epoch boundary at 0), one rung per decision at 90 percent of blue blocks in each of 7 consecutive windows of 60 DAA ending at an epoch's seed block | this node signals up
22:37:12.585 n1: Latency ladder from the override file: rungs 27, 35, 53, [88], [173], [267] shadow passes (brackets: inadmissible, never entered), active from epoch 0 (DAA score 0 rounded up to the epoch boundary at 0), one rung per decision at 90 percent of blue blocks in each of 7 consecutive windows of 60 DAA ending at an epoch's seed block | this node signals up
22:37:12.585 n2: Latency ladder from the override file: rungs 27, 35, 53, [88], [173], [267] shadow passes (brackets: inadmissible, never entered), active from epoch 0 (DAA score 0 rounded up to the epoch boundary at 0), one rung per decision at 90 percent of blue blocks in each of 7 consecutive windows of 60 DAA ending at an epoch's seed block | this node signals none
22:37:12.585 n0 digest: b1f606bede788b70
22:37:13.597 epoch -1 -> 0 at daa 0, 4.7 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 0 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:37:13.598 t=4.7 s daa 0 epoch 0 rung 0 (27) up 0 bps weakest 0 blocks/sink per node 0/234e082d 0/234e082d 0/234e082d
22:37:28.640 t=19.7 s daa 1 epoch 0 rung 0 (27) up 0 bps weakest 0 blocks/sink per node 1/350fed25 1/350fed25 1/350fed25
22:37:43.659 t=34.7 s daa 7 epoch 0 rung 0 (27) up 6666 bps weakest 0 blocks/sink per node 7/33ca6cd0 7/33ca6cd0 7/33ca6cd0
22:37:58.679 t=49.8 s daa 12 epoch 0 rung 0 (27) up 6363 bps weakest 0 blocks/sink per node 12/70a47fc6 12/70a47fc6 12/70a47fc6
22:38:13.696 t=64.8 s daa 28 epoch 0 rung 0 (27) up 6296 bps weakest 0 blocks/sink per node 28/1c7719a6 28/1c7719a6 28/1c7719a6
22:38:28.714 t=79.8 s daa 36 epoch 0 rung 0 (27) up 6571 bps weakest 0 blocks/sink per node 36/72330841 36/72330841 36/72330841
22:38:43.731 t=94.8 s daa 59 epoch 0 rung 0 (27) up 7068 bps weakest 0 blocks/sink per node 59/cf02d592 59/cf02d592 59/cf02d592
22:38:45.733 epoch 0 -> 1 at daa 62, 96.8 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 7000 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:38:58.747 t=109.8 s daa 74 epoch 1 rung 0 (27) up 6833 bps weakest 0 blocks/sink per node 74/c65d7a59 74/c65d7a59 74/c65d7a59
22:39:13.765 t=124.8 s daa 85 epoch 1 rung 0 (27) up 7333 bps weakest 0 blocks/sink per node 85/e53510f4 85/e53510f4 85/e53510f4
22:39:28.785 t=139.9 s daa 105 epoch 1 rung 0 (27) up 7166 bps weakest 0 blocks/sink per node 105/37769ced 105/37769ced 105/37769ced
22:39:43.805 t=154.9 s daa 119 epoch 1 rung 0 (27) up 7166 bps weakest 0 blocks/sink per node 119/aa8e5664 119/aa8e5664 119/aa8e5664
22:39:45.808 epoch 1 -> 2 at daa 120, 156.9 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 7166 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:39:58.824 t=169.9 s daa 131 epoch 2 rung 0 (27) up 7500 bps weakest 0 blocks/sink per node 131/bf6ed8b2 131/bf6ed8b2 131/bf6ed8b2
22:40:13.843 t=184.9 s daa 150 epoch 2 rung 0 (27) up 8166 bps weakest 0 blocks/sink per node 150/6a31bf2e 150/6a31bf2e 150/6a31bf2e
22:40:28.862 t=199.9 s daa 165 epoch 2 rung 0 (27) up 7500 bps weakest 0 blocks/sink per node 165/83f8d3f6 165/83f8d3f6 165/83f8d3f6
22:40:42.878 epoch 2 -> 3 at daa 180, 213.9 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 7166 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:40:43.880 t=215.0 s daa 181 epoch 3 rung 0 (27) up 7000 bps weakest 0 blocks/sink per node 181/5be6a01e 181/5be6a01e 181/5be6a01e
22:40:58.901 t=230.0 s daa 202 epoch 3 rung 0 (27) up 6666 bps weakest 0 blocks/sink per node 202/5663af4a 202/5663af4a 202/5663af4a
22:41:13.919 t=245.0 s daa 216 epoch 3 rung 0 (27) up 5833 bps weakest 0 blocks/sink per node 216/3d231639 216/3d231639 216/3d231639
22:41:28.939 t=260.0 s daa 228 epoch 3 rung 0 (27) up 6500 bps weakest 0 blocks/sink per node 228/88370ed6 228/88370ed6 228/88370ed6
22:41:41.955 epoch 3 -> 4 at daa 240, 273.0 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 6833 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:41:43.958 t=275.0 s daa 241 epoch 4 rung 0 (27) up 6833 bps weakest 0 blocks/sink per node 241/a2dbefc3 241/a2dbefc3 241/a2dbefc3
22:41:58.976 t=290.0 s daa 248 epoch 4 rung 0 (27) up 6500 bps weakest 0 blocks/sink per node 248/0815d37e 248/0815d37e 248/0815d37e
22:42:13.998 t=305.1 s daa 267 epoch 4 rung 0 (27) up 6833 bps weakest 0 blocks/sink per node 267/09bb3297 267/09bb3297 267/09bb3297
22:42:29.017 t=320.1 s daa 297 epoch 4 rung 0 (27) up 6833 bps weakest 0 blocks/sink per node 297/af91ef29 297/af91ef29 297/af91ef29
22:42:31.020 epoch 4 -> 5 at daa 300, 322.1 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 6666 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:42:44.036 t=335.1 s daa 312 epoch 5 rung 0 (27) up 6666 bps weakest 0 blocks/sink per node 312/a015f07f 312/a015f07f 312/a015f07f
22:42:59.055 t=350.1 s daa 330 epoch 5 rung 0 (27) up 6833 bps weakest 0 blocks/sink per node 330/c9f57620 330/c9f57620 330/c9f57620
22:43:14.072 t=365.1 s daa 345 epoch 5 rung 0 (27) up 6949 bps weakest 0 blocks/sink per node 345/fe4111b9 345/fe4111b9 345/fe4111b9
22:43:27.092 epoch 5 -> 6 at daa 360, 378.2 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 6333 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:43:29.095 t=380.2 s daa 360 epoch 6 rung 0 (27) up 6333 bps weakest 0 blocks/sink per node 360/2acb1c9a 360/2acb1c9a 360/2acb1c9a
22:43:44.112 t=395.2 s daa 368 epoch 6 rung 0 (27) up 6779 bps weakest 5714 blocks/sink per node 368/853bece4 368/853bece4 368/853bece4
22:43:59.132 t=410.2 s daa 390 epoch 6 rung 0 (27) up 5666 bps weakest 5666 blocks/sink per node 390/9101251e 389/6d70c5a8 390/9101251e
22:44:14.153 t=425.2 s daa 404 epoch 6 rung 0 (27) up 5500 bps weakest 5500 blocks/sink per node 404/89a08ca7 404/89a08ca7 404/89a08ca7
22:44:25.167 epoch 6 -> 7 at daa 420, 436.2 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 5833 bps (weakest of 7: 5833), down 0 bps, this node signals 1, step took effect at epoch 0
22:44:29.172 t=440.2 s daa 421 epoch 7 rung 0 (27) up 6000 bps weakest 6000 blocks/sink per node 421/a39e260b 421/a39e260b 421/a39e260b
22:44:44.192 t=455.3 s daa 437 epoch 7 rung 0 (27) up 5666 bps weakest 5666 blocks/sink per node 437/9782bb5e 437/9782bb5e 437/9782bb5e
22:44:59.214 t=470.3 s daa 456 epoch 7 rung 0 (27) up 5932 bps weakest 5833 blocks/sink per node 456/2a6dea3c 456/2a6dea3c 456/2a6dea3c
22:45:14.235 t=485.3 s daa 473 epoch 7 rung 0 (27) up 6500 bps weakest 5500 blocks/sink per node 473/ab842458 473/ab842458 473/ab842458
22:45:19.242 epoch 7 -> 8 at daa 480, 490.3 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 6166 bps (weakest of 7: 5833), down 0 bps, this node signals 1, step took effect at epoch 0
22:45:29.257 t=500.3 s daa 488 epoch 8 rung 0 (27) up 6000 bps weakest 5666 blocks/sink per node 488/a16f988f 488/a16f988f 488/a16f988f
22:45:44.278 t=515.4 s daa 505 epoch 8 rung 0 (27) up 6333 bps weakest 5737 blocks/sink per node 505/915b20b6 505/915b20b6 505/915b20b6
22:45:59.304 t=530.4 s daa 527 epoch 8 rung 0 (27) up 6666 bps weakest 5333 blocks/sink per node 527/7161dfa6 527/7161dfa6 527/7161dfa6
22:46:10.317 epoch 8 -> 9 at daa 540, 541.4 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 6666 bps (weakest of 7: 5833), down 0 bps, this node signals 1, step took effect at epoch 0
22:46:14.324 t=545.4 s daa 541 epoch 9 rung 0 (27) up 6666 bps weakest 6000 blocks/sink per node 541/5fcc65e3 541/5fcc65e3 541/5fcc65e3
22:46:29.343 t=560.4 s daa 562 epoch 9 rung 0 (27) up 6833 bps weakest 5666 blocks/sink per node 562/673f1e20 562/673f1e20 562/673f1e20
22:46:44.364 t=575.4 s daa 577 epoch 9 rung 0 (27) up 7166 bps weakest 5833 blocks/sink per node 577/67af1166 577/67af1166 577/67af1166
22:46:59.385 t=590.5 s daa 596 epoch 9 rung 0 (27) up 7000 bps weakest 5666 blocks/sink per node 596/2dd560ca 596/2dd560ca 596/2dd560ca
22:47:01.388 epoch 9 -> 10 at daa 600, 592.5 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 6833 bps (weakest of 7: 5833), down 0 bps, this node signals 1, step took effect at epoch 0
22:47:04.711 SUMMARY PASS (expect no-step, signals up/up/none): no step; epochs seen e0:r0:0bps e1:r0:0bps e2:r0:0bps e3:r0:0bps e4:r0:0bps e5:r0:0bps e6:r0:0bps e7:r0:5833bps e8:r0:5833bps e9:r0:5833bps e10:r0:5833bps; chain bits {"none":200,"up":402} (6678 bps up); blocks 602 / 0; rejected miners 0/0/0 nodes 0/0/0; sinks bfc435d62d7c659c bfc435d62d7c659c bfc435d62d7c659c at 601/601/601
22:47:04.711 PROGRAM ID epoch 0 seed 234e082d653dc69d reps 27: miners 26fc8f3decca98ed (3 of 3) cli at reps 26fc8f3decca98ed cli rung 0 26fc8f3decca98ed
22:47:04.711 PROGRAM ID epoch 1 seed 894676c6f3ebb385 reps 27: miners e0910c8d87135035 (3 of 3) cli at reps e0910c8d87135035 cli rung 0 e0910c8d87135035
22:47:04.711 PROGRAM ID epoch 2 seed 405d6592622d1af9 reps 27: miners 2eb05375a9d9077d (3 of 3) cli at reps 2eb05375a9d9077d cli rung 0 2eb05375a9d9077d
22:47:04.711 PROGRAM ID epoch 3 seed 9598288f0a520b69 reps 27: miners 0acdab9caca48471 (3 of 3) cli at reps 0acdab9caca48471 cli rung 0 0acdab9caca48471
22:47:04.711 PROGRAM ID epoch 4 seed 9b6e5a23005f0998 reps 27: miners 1df476827c33e263 (3 of 3) cli at reps 1df476827c33e263 cli rung 0 1df476827c33e263
22:47:04.711 PROGRAM ID epoch 5 seed a0a54f6a687f94f4 reps 27: miners 20003329ca5050d9 (3 of 3) cli at reps 20003329ca5050d9 cli rung 0 20003329ca5050d9
22:47:04.711 PROGRAM ID epoch 6 seed 1b20ae99061e034f reps 27: miners 2e5cee148e6b82b1 (3 of 3) cli at reps 2e5cee148e6b82b1 cli rung 0 2e5cee148e6b82b1
22:47:04.711 PROGRAM ID epoch 7 seed 5545b276021f1ad9 reps 27: miners d9babb74721f6cd0 (3 of 3) cli at reps d9babb74721f6cd0 cli rung 0 d9babb74721f6cd0
22:47:04.711 PROGRAM ID epoch 8 seed f959d016b2d47167 reps 27: miners 94b5809680b13285 (3 of 3) cli at reps 94b5809680b13285 cli rung 0 94b5809680b13285
22:47:04.711 PROGRAM ID epoch 9 seed 24b28bef5cba00a9 reps 27: miners e1cae64a2a12de45 (3 of 3) cli at reps e1cae64a2a12de45 cli rung 0 e1cae64a2a12de45
22:47:04.711 PROGRAM ID epoch 10 seed ccfc16e9107ae720 reps 27: miners c7ce4aa0e96ba6b9 (3 of 3) cli at reps c7ce4aa0e96ba6b9 cli rung 0 c7ce4aa0e96ba6b9
22:47:04.711 summary: /tmp/igneum-fast-time-ladder-no-step/summary.json
CASE no-step rc=0

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,78 @@
22:26:30.617 signals up/up/up, expect step; class v4 from genesis, the ladder active from DAA 0, window 60 DAA x 7 (the first epoch that can step is 8, DAA 480); 60 DAA per epoch, lead 10; run 900 s or 10 epochs
22:26:31.854 n0 up pid 1601845 json 29722 p2p 29721, signals up
22:26:33.062 n1 up pid 1602372 json 29732 p2p 29731, signals up
22:26:34.272 n2 up pid 1602849 json 29742 p2p 29741, signals up
22:26:34.273 n0: Latency ladder from the override file: rungs 27, 35, 53, [88], [173], [267] shadow passes (brackets: inadmissible, never entered), active from epoch 0 (DAA score 0 rounded up to the epoch boundary at 0), one rung per decision at 90 percent of blue blocks in each of 7 consecutive windows of 60 DAA ending at an epoch's seed block | this node signals up
22:26:34.273 n1: Latency ladder from the override file: rungs 27, 35, 53, [88], [173], [267] shadow passes (brackets: inadmissible, never entered), active from epoch 0 (DAA score 0 rounded up to the epoch boundary at 0), one rung per decision at 90 percent of blue blocks in each of 7 consecutive windows of 60 DAA ending at an epoch's seed block | this node signals up
22:26:34.273 n2: Latency ladder from the override file: rungs 27, 35, 53, [88], [173], [267] shadow passes (brackets: inadmissible, never entered), active from epoch 0 (DAA score 0 rounded up to the epoch boundary at 0), one rung per decision at 90 percent of blue blocks in each of 7 consecutive windows of 60 DAA ending at an epoch's seed block | this node signals up
22:26:34.274 n0 digest: b1f606bede788b70
22:26:35.285 epoch -1 -> 0 at daa 0, 4.7 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 0 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:26:35.286 t=4.7 s daa 0 epoch 0 rung 0 (27) up 0 bps weakest 0 blocks/sink per node 0/234e082d 0/234e082d 0/234e082d
22:26:50.326 t=19.7 s daa 3 epoch 0 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 3/249577e0 3/249577e0 3/249577e0
22:27:05.344 t=34.7 s daa 9 epoch 0 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 9/f5f30338 9/f5f30338 9/f5f30338
22:27:20.362 t=49.7 s daa 13 epoch 0 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 13/9a570e80 13/9a570e80 13/9a570e80
22:27:35.380 t=64.8 s daa 21 epoch 0 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 21/e9eb6357 21/e9eb6357 21/e9eb6357
22:27:50.394 t=79.8 s daa 43 epoch 0 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 43/231339b1 43/231339b1 43/231339b1
22:28:05.413 t=94.8 s daa 59 epoch 0 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 59/b7fc02c8 59/b7fc02c8 59/b7fc02c8
22:28:06.415 epoch 0 -> 1 at daa 60, 95.8 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 10000 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:28:20.430 t=109.8 s daa 72 epoch 1 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 72/b2806522 72/b2806522 72/b2806522
22:28:35.450 t=124.8 s daa 94 epoch 1 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 94/79f760e8 94/79f760e8 94/79f760e8
22:28:50.469 t=139.9 s daa 113 epoch 1 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 113/5561b157 113/5561b157 113/5561b157
22:28:59.481 epoch 1 -> 2 at daa 120, 148.9 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 10000 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:29:05.490 t=154.9 s daa 126 epoch 2 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 126/2349621f 126/2349621f 126/2349621f
22:29:20.507 t=169.9 s daa 140 epoch 2 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 140/bc35ba71 140/bc35ba71 140/bc35ba71
22:29:35.525 t=184.9 s daa 156 epoch 2 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 156/63d8089e 156/63d8089e 156/63d8089e
22:29:50.544 t=199.9 s daa 171 epoch 2 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 171/18cedc1e 171/18cedc1e 171/18cedc1e
22:30:01.556 epoch 2 -> 3 at daa 180, 210.9 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 10000 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:30:05.560 t=214.9 s daa 183 epoch 3 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 183/72878aa2 183/72878aa2 183/72878aa2
22:30:20.580 t=230.0 s daa 194 epoch 3 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 194/d912a5a6 194/d912a5a6 194/d912a5a6
22:30:35.597 t=245.0 s daa 213 epoch 3 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 213/c32e5855 213/c32e5855 213/c32e5855
22:30:50.614 t=260.0 s daa 230 epoch 3 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 230/6e0fe9f3 230/6e0fe9f3 230/6e0fe9f3
22:30:55.619 epoch 3 -> 4 at daa 240, 265.0 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 10000 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:31:05.626 t=275.0 s daa 254 epoch 4 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 254/5374343f 254/5374343f 254/5374343f
22:31:20.640 t=290.0 s daa 270 epoch 4 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 270/2102c92b 270/2102c92b 270/2102c92b
22:31:35.653 t=305.0 s daa 283 epoch 4 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 283/96ca2f27 283/96ca2f27 283/96ca2f27
22:31:50.672 t=320.1 s daa 295 epoch 4 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 295/d8305233 295/d8305233 295/d8305233
22:31:54.677 epoch 4 -> 5 at daa 300, 324.1 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 10000 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:32:05.692 t=335.1 s daa 308 epoch 5 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 308/a6a3dd91 308/a6a3dd91 308/a6a3dd91
22:32:20.714 t=350.1 s daa 322 epoch 5 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 322/6819393b 322/6819393b 322/6819393b
22:32:35.737 t=365.1 s daa 346 epoch 5 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 346/354f160d 346/354f160d 346/354f160d
22:32:48.751 epoch 5 -> 6 at daa 360, 378.1 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 10000 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:32:50.754 t=380.1 s daa 361 epoch 6 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 361/af58d2f8 361/af58d2f8 361/af58d2f8
22:33:05.772 t=395.2 s daa 382 epoch 6 rung 0 (27) up 10000 bps weakest 10000 blocks/sink per node 382/71d14149 382/71d14149 382/71d14149
22:33:20.794 t=410.2 s daa 399 epoch 6 rung 0 (27) up 10000 bps weakest 10000 blocks/sink per node 399/9fb39463 399/9fb39463 399/9fb39463
22:33:35.817 t=425.2 s daa 407 epoch 6 rung 0 (27) up 10000 bps weakest 10000 blocks/sink per node 407/c60fa280 407/c60fa280 407/c60fa280
22:33:48.836 epoch 6 -> 7 at daa 420, 438.2 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 10000 bps (weakest of 7: 10000), down 0 bps, this node signals 1, step took effect at epoch 0
22:33:50.840 t=440.2 s daa 421 epoch 7 rung 0 (27) up 10000 bps weakest 10000 blocks/sink per node 421/237fb92b 421/237fb92b 421/237fb92b
22:34:05.864 t=455.2 s daa 435 epoch 7 rung 0 (27) up 10000 bps weakest 10000 blocks/sink per node 435/4b441312 435/4b441312 435/4b441312
22:34:20.885 t=470.3 s daa 453 epoch 7 rung 0 (27) up 10000 bps weakest 10000 blocks/sink per node 453/cd6b10e3 453/cd6b10e3 453/cd6b10e3
22:34:35.908 t=485.3 s daa 468 epoch 7 rung 0 (27) up 10000 bps weakest 10000 blocks/sink per node 468/07607c5a 468/07607c5a 468/07607c5a
22:34:50.929 epoch 7 -> 8 at daa 480, 500.3 s: template class 4 rung 1 (35 passes), next rung 1 (35), up 10000 bps (weakest of 7: 10000), down 0 bps, this node signals 1, step took effect at epoch 8
22:34:50.930 LADDER STEP: the template is rung 1 (35 shadow passes) from epoch 8 (daa 480) at 500.3 s wall
22:34:50.930 t=500.3 s daa 480 epoch 8 rung 1 (35) up 10000 bps weakest 10000 blocks/sink per node 480/446f5cad 480/446f5cad 480/446f5cad
22:35:05.952 t=515.3 s daa 494 epoch 8 rung 1 (35) up 10000 bps weakest 10000 blocks/sink per node 494/cb995010 494/cb995010 494/cb995010
22:35:20.972 t=530.4 s daa 507 epoch 8 rung 1 (35) up 10000 bps weakest 10000 blocks/sink per node 507/6fdd3fa6 507/6fdd3fa6 507/6fdd3fa6
22:35:35.991 t=545.4 s daa 523 epoch 8 rung 1 (35) up 10000 bps weakest 10000 blocks/sink per node 523/9c372f3f 523/9c372f3f 523/9c372f3f
22:35:51.015 t=560.4 s daa 539 epoch 8 rung 1 (35) up 10000 bps weakest 10000 blocks/sink per node 539/89195e3c 539/89195e3c 539/89195e3c
22:35:52.017 epoch 8 -> 9 at daa 540, 561.4 s: template class 4 rung 1 (35 passes), next rung 1 (35), up 10000 bps (weakest of 7: 10000), down 0 bps, this node signals 1, step took effect at epoch 8
22:36:06.037 t=575.4 s daa 555 epoch 9 rung 1 (35) up 10000 bps weakest 10000 blocks/sink per node 555/e9ac1c74 555/e9ac1c74 555/e9ac1c74
22:36:21.059 t=590.4 s daa 568 epoch 9 rung 1 (35) up 10000 bps weakest 10000 blocks/sink per node 568/f092f0fb 568/f092f0fb 568/f092f0fb
22:36:36.084 t=605.5 s daa 583 epoch 9 rung 1 (35) up 10000 bps weakest 10000 blocks/sink per node 583/e3ffdab3 583/e3ffdab3 583/e3ffdab3
22:36:51.107 t=620.5 s daa 592 epoch 9 rung 1 (35) up 10000 bps weakest 10000 blocks/sink per node 592/27682e21 592/27682e21 592/27682e21
22:36:57.114 epoch 9 -> 10 at daa 601, 626.5 s: template class 4 rung 1 (35 passes), next rung 1 (35), up 10000 bps (weakest of 7: 10000), down 0 bps, this node signals 1, step took effect at epoch 8
22:37:07.379 SUMMARY FAIL (expect step, signals up/up/up): rung 1 (35 passes) from epoch 8 at DAA 480; epochs seen e0:r0:0bps e1:r0:0bps e2:r0:0bps e3:r0:0bps e4:r0:0bps e5:r0:0bps e6:r0:0bps e7:r0:10000bps e8:r1:10000bps e9:r1:10000bps e10:r1:10000bps; chain bits {"none":1,"up":612} (9984 bps up); blocks 481 / 132; rejected miners 0/0/0 nodes 0/0/0; sinks c4fb461282cf9321 c4fb461282cf9321 c4fb461282cf9321 at 612/612/612
22:37:07.379 PROGRAM ID epoch 0 seed 234e082d653dc69d reps 27: miners 26fc8f3decca98ed (3 of 3) cli at reps 26fc8f3decca98ed cli rung 0 26fc8f3decca98ed
22:37:07.379 PROGRAM ID epoch 1 seed f3f15962195b3ed5 reps 27: miners 8a3027b727010ebb (3 of 3) cli at reps 8a3027b727010ebb cli rung 0 8a3027b727010ebb
22:37:07.379 PROGRAM ID epoch 2 seed 08861cd8892dd5bf reps 27: miners 5ce393c9689621a3 (3 of 3) cli at reps 5ce393c9689621a3 cli rung 0 5ce393c9689621a3
22:37:07.379 PROGRAM ID epoch 3 seed 1ea70b68ae751655 reps 27: miners 1e113fa683988a88 (3 of 3) cli at reps 1e113fa683988a88 cli rung 0 1e113fa683988a88
22:37:07.379 PROGRAM ID epoch 4 seed 6e0fe9f3461ed4b7 reps 27: miners f78fdc10877a6a53 (3 of 3) cli at reps f78fdc10877a6a53 cli rung 0 f78fdc10877a6a53
22:37:07.379 PROGRAM ID epoch 5 seed 756db10abdc2caa1 reps 27: miners c54ce8f09a0197fd (3 of 3) cli at reps c54ce8f09a0197fd cli rung 0 c54ce8f09a0197fd
22:37:07.379 PROGRAM ID epoch 6 seed 71066f551557cca4 reps 27: miners 4ee83f583fd0d3a6 (3 of 3) cli at reps 4ee83f583fd0d3a6 cli rung 0 4ee83f583fd0d3a6
22:37:07.379 PROGRAM ID epoch 7 seed f2f76ce991184adb reps 27: miners 32c35a3b0dfb22e8 (3 of 3) cli at reps 32c35a3b0dfb22e8 cli rung 0 32c35a3b0dfb22e8
22:37:07.379 PROGRAM ID epoch 8 seed beb8b40fec4bf2c8 reps 35: miners d4cfc28a1c525077 (3 of 3) cli at reps ea49bc6e870eb34c cli rung 0 ea49bc6e870eb34c
22:37:07.379 PROGRAM ID epoch 9 seed 04d782fc0d5def41 reps 35: miners 35c3a81b81cc2b02 (3 of 3) cli at reps 1fe5e84ead8e71e3 cli rung 0 1fe5e84ead8e71e3
22:37:07.379 PROGRAM ID epoch 10 seed 3a51ee194be8d47b reps 35: miners 804c18c3a462f05c (3 of 3) cli at reps 4e6c5bbf6463131d cli rung 0 4e6c5bbf6463131d
22:37:07.379 FAILED CHECK chain_carries_the_bits
22:37:07.379 FAILED CHECK rung1_ids_equal_the_cli_rung1_id
22:37:07.379 summary: /tmp/igneum-fast-time-ladder-step/summary.json
CASE step rc=1

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,76 @@
22:47:26.794 signals up/up/up, expect step; class v4 from genesis, the ladder active from DAA 0, window 60 DAA x 7 (the first epoch that can step is 8, DAA 480); 60 DAA per epoch, lead 10; run 900 s or 10 epochs
22:47:28.032 n0 up pid 1734618 json 29722 p2p 29721, signals up
22:47:29.240 n1 up pid 1735138 json 29732 p2p 29731, signals up
22:47:30.451 n2 up pid 1735605 json 29742 p2p 29741, signals up
22:47:30.452 n0: Latency ladder from the override file: rungs 27, 35, 53, [88], [173], [267] shadow passes (brackets: inadmissible, never entered), active from epoch 0 (DAA score 0 rounded up to the epoch boundary at 0), one rung per decision at 90 percent of blue blocks in each of 7 consecutive windows of 60 DAA ending at an epoch's seed block | this node signals up
22:47:30.452 n1: Latency ladder from the override file: rungs 27, 35, 53, [88], [173], [267] shadow passes (brackets: inadmissible, never entered), active from epoch 0 (DAA score 0 rounded up to the epoch boundary at 0), one rung per decision at 90 percent of blue blocks in each of 7 consecutive windows of 60 DAA ending at an epoch's seed block | this node signals up
22:47:30.453 n2: Latency ladder from the override file: rungs 27, 35, 53, [88], [173], [267] shadow passes (brackets: inadmissible, never entered), active from epoch 0 (DAA score 0 rounded up to the epoch boundary at 0), one rung per decision at 90 percent of blue blocks in each of 7 consecutive windows of 60 DAA ending at an epoch's seed block | this node signals up
22:47:30.453 n0 digest: b1f606bede788b70
22:47:31.464 epoch -1 -> 0 at daa 0, 4.7 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 0 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:47:31.468 t=4.7 s daa 0 epoch 0 rung 0 (27) up 0 bps weakest 0 blocks/sink per node 0/234e082d 0/234e082d 0/234e082d
22:47:46.507 t=19.7 s daa 2 epoch 0 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 2/93be64d1 2/93be64d1 2/93be64d1
22:48:01.523 t=34.7 s daa 12 epoch 0 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 12/702814dd 12/702814dd 12/702814dd
22:48:16.542 t=49.7 s daa 25 epoch 0 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 25/d0d9d954 25/d0d9d954 25/d0d9d954
22:48:31.562 t=64.8 s daa 44 epoch 0 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 44/59a39e34 44/59a39e34 43/fbe3301e
22:48:46.581 t=79.8 s daa 58 epoch 0 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 58/5d32aa5d 58/5d32aa5d 58/5d32aa5d
22:48:49.585 epoch 0 -> 1 at daa 60, 82.8 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 10000 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:49:01.599 t=94.8 s daa 72 epoch 1 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 72/d6ae0009 72/d6ae0009 72/d6ae0009
22:49:16.617 t=109.8 s daa 89 epoch 1 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 89/37c27f2c 89/37c27f2c 89/37c27f2c
22:49:31.633 t=124.8 s daa 102 epoch 1 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 102/cca31beb 102/cca31beb 102/cca31beb
22:49:46.650 t=139.9 s daa 115 epoch 1 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 115/22238404 115/22238404 115/22238404
22:49:49.654 epoch 1 -> 2 at daa 122, 142.9 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 10000 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:50:01.669 t=154.9 s daa 128 epoch 2 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 128/3b025ca2 128/3b025ca2 128/3b025ca2
22:50:16.687 t=169.9 s daa 148 epoch 2 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 148/eb6fd081 148/eb6fd081 148/eb6fd081
22:50:31.708 t=184.9 s daa 162 epoch 2 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 162/f7591e43 162/f7591e43 162/f7591e43
22:50:45.727 epoch 2 -> 3 at daa 180, 198.9 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 10000 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:50:46.729 t=199.9 s daa 180 epoch 3 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 180/8508ae27 180/8508ae27 180/8508ae27
22:51:01.749 t=215.0 s daa 192 epoch 3 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 192/d3cae989 192/d3cae989 192/d3cae989
22:51:16.769 t=230.0 s daa 205 epoch 3 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 205/b7e9b38a 205/b7e9b38a 205/b7e9b38a
22:51:31.789 t=245.0 s daa 224 epoch 3 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 224/4b576b96 224/4b576b96 224/4b576b96
22:51:44.803 epoch 3 -> 4 at daa 240, 258.0 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 10000 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:51:46.806 t=260.0 s daa 242 epoch 4 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 242/21eac0e7 242/21eac0e7 242/21eac0e7
22:52:01.826 t=275.0 s daa 263 epoch 4 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 263/3a7f5eb1 263/3a7f5eb1 263/3a7f5eb1
22:52:16.845 t=290.1 s daa 276 epoch 4 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 276/9fa09972 276/9fa09972 276/9fa09972
22:52:31.861 t=305.1 s daa 292 epoch 4 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 292/c5cfe43d 292/c5cfe43d 292/c5cfe43d
22:52:41.874 epoch 4 -> 5 at daa 301, 315.1 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 10000 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:52:46.877 t=320.1 s daa 306 epoch 5 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 306/8a223b88 306/8a223b88 306/8a223b88
22:53:01.894 t=335.1 s daa 319 epoch 5 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 319/3818e422 319/3818e422 319/3818e422
22:53:16.914 t=350.1 s daa 333 epoch 5 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 333/5d9f5abe 333/5d9f5abe 333/5d9f5abe
22:53:31.934 t=365.1 s daa 345 epoch 5 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 345/c186686a 345/c186686a 345/c186686a
22:53:46.950 t=380.2 s daa 358 epoch 5 rung 0 (27) up 10000 bps weakest 0 blocks/sink per node 358/71308cca 358/71308cca 358/71308cca
22:53:49.955 epoch 5 -> 6 at daa 360, 383.2 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 10000 bps (weakest of 7: 0), down 0 bps, this node signals 1, step took effect at epoch 0
22:54:01.971 t=395.2 s daa 373 epoch 6 rung 0 (27) up 10000 bps weakest 10000 blocks/sink per node 373/dc7f7051 373/dc7f7051 373/dc7f7051
22:54:16.990 t=410.2 s daa 392 epoch 6 rung 0 (27) up 10000 bps weakest 10000 blocks/sink per node 392/932e6a12 392/932e6a12 392/932e6a12
22:54:32.010 t=425.2 s daa 401 epoch 6 rung 0 (27) up 10000 bps weakest 10000 blocks/sink per node 401/c76de149 401/c76de149 401/c76de149
22:54:47.031 t=440.2 s daa 418 epoch 6 rung 0 (27) up 10000 bps weakest 10000 blocks/sink per node 418/3bfd34a2 418/3bfd34a2 418/3bfd34a2
22:54:49.033 epoch 6 -> 7 at daa 420, 442.2 s: template class 4 rung 0 (27 passes), next rung 0 (27), up 10000 bps (weakest of 7: 10000), down 0 bps, this node signals 1, step took effect at epoch 0
22:55:02.050 t=455.3 s daa 437 epoch 7 rung 0 (27) up 10000 bps weakest 10000 blocks/sink per node 437/1eb8bef0 437/1eb8bef0 437/1eb8bef0
22:55:17.071 t=470.3 s daa 450 epoch 7 rung 0 (27) up 10000 bps weakest 10000 blocks/sink per node 450/8b056200 450/8b056200 450/8b056200
22:55:32.093 t=485.3 s daa 459 epoch 7 rung 0 (27) up 10000 bps weakest 10000 blocks/sink per node 459/75ec3917 459/75ec3917 459/75ec3917
22:55:47.114 t=500.3 s daa 473 epoch 7 rung 0 (27) up 10000 bps weakest 10000 blocks/sink per node 473/022ba23c 473/022ba23c 473/022ba23c
22:55:52.120 epoch 7 -> 8 at daa 481, 505.3 s: template class 4 rung 1 (35 passes), next rung 1 (35), up 10000 bps (weakest of 7: 10000), down 0 bps, this node signals 1, step took effect at epoch 8
22:55:52.120 LADDER STEP: the template is rung 1 (35 shadow passes) from epoch 8 (daa 481) at 505.3 s wall
22:56:02.135 t=515.3 s daa 486 epoch 8 rung 1 (35) up 10000 bps weakest 10000 blocks/sink per node 486/3e3ac762 486/3e3ac762 486/3e3ac762
22:56:17.156 t=530.4 s daa 501 epoch 8 rung 1 (35) up 10000 bps weakest 10000 blocks/sink per node 501/4de14a5f 501/4de14a5f 501/4de14a5f
22:56:32.177 t=545.4 s daa 515 epoch 8 rung 1 (35) up 10000 bps weakest 10000 blocks/sink per node 515/c64de9c2 515/c64de9c2 515/c64de9c2
22:56:47.198 t=560.4 s daa 538 epoch 8 rung 1 (35) up 10000 bps weakest 10000 blocks/sink per node 538/d24d285a 538/d24d285a 538/d24d285a
22:56:50.203 epoch 8 -> 9 at daa 540, 563.4 s: template class 4 rung 1 (35 passes), next rung 1 (35), up 10000 bps (weakest of 7: 10000), down 0 bps, this node signals 1, step took effect at epoch 8
22:57:02.221 t=575.4 s daa 555 epoch 9 rung 1 (35) up 10000 bps weakest 10000 blocks/sink per node 555/d8617bdb 555/d8617bdb 555/d8617bdb
22:57:17.243 t=590.4 s daa 570 epoch 9 rung 1 (35) up 10000 bps weakest 10000 blocks/sink per node 570/c16b6327 570/c16b6327 570/c16b6327
22:57:32.263 t=605.5 s daa 586 epoch 9 rung 1 (35) up 10000 bps weakest 10000 blocks/sink per node 586/f1afc7fb 586/f1afc7fb 586/f1afc7fb
22:57:42.280 epoch 9 -> 10 at daa 600, 615.5 s: template class 4 rung 1 (35 passes), next rung 1 (35), up 10000 bps (weakest of 7: 10000), down 0 bps, this node signals 1, step took effect at epoch 8
22:57:47.288 t=620.5 s daa 605 epoch 10 rung 1 (35) up 10000 bps weakest 10000 blocks/sink per node 605/407dd224 605/407dd224 605/407dd224
22:57:58.524 SUMMARY PASS (expect step, signals up/up/up): rung 1 (35 passes) from epoch 8 at DAA 481; epochs seen e0:r0:0bps e1:r0:0bps e2:r0:0bps e3:r0:0bps e4:r0:0bps e5:r0:0bps e6:r0:0bps e7:r0:10000bps e8:r1:10000bps e9:r1:10000bps e10:r1:10000bps; chain bits {"none":1,"up":617} (9984 bps up); blocks 481 / 137; rejected miners 0/0/0 nodes 0/0/0; sinks f1cbdb99f48e0a19 f1cbdb99f48e0a19 f1cbdb99f48e0a19 at 617/617/617
22:57:58.524 PROGRAM ID epoch 0 seed 234e082d653dc69d reps 27: miners 26fc8f3decca98ed (3 of 3) cli at reps 26fc8f3decca98ed cli rung 0 26fc8f3decca98ed
22:57:58.524 PROGRAM ID epoch 1 seed 5fce000863234999 reps 27: miners 22db8cc739098c5f (3 of 3) cli at reps 22db8cc739098c5f cli rung 0 22db8cc739098c5f
22:57:58.524 PROGRAM ID epoch 2 seed 8217681d05165ddb reps 27: miners 0ec4930eb73fccbd (3 of 3) cli at reps 0ec4930eb73fccbd cli rung 0 0ec4930eb73fccbd
22:57:58.524 PROGRAM ID epoch 3 seed 4870884b48c88957 reps 27: miners 436c842444e67520 (3 of 3) cli at reps 436c842444e67520 cli rung 0 436c842444e67520
22:57:58.524 PROGRAM ID epoch 4 seed 2505cecc606d69e8 reps 27: miners 4dd9f1e921cb066e (3 of 3) cli at reps 4dd9f1e921cb066e cli rung 0 4dd9f1e921cb066e
22:57:58.524 PROGRAM ID epoch 5 seed e31a3a8e73690d75 reps 27: miners fead43c4c01d42da (3 of 3) cli at reps fead43c4c01d42da cli rung 0 fead43c4c01d42da
22:57:58.524 PROGRAM ID epoch 6 seed 2674be5e8dbaba18 reps 27: miners 2c6402c1dcc39dae (3 of 3) cli at reps 2c6402c1dcc39dae cli rung 0 2c6402c1dcc39dae
22:57:58.524 PROGRAM ID epoch 7 seed de28d9d30dad45b8 reps 27: miners 120eb6f07fdd1e2b (3 of 3) cli at reps 120eb6f07fdd1e2b cli rung 0 120eb6f07fdd1e2b
22:57:58.524 PROGRAM ID epoch 8 seed 5fbfb48f6e4c66ba reps 35: miners 65ffdc96f1921062 (3 of 3) cli at reps 65ffdc96f1921062 cli rung 0 3d40916b72ae9b97
22:57:58.524 PROGRAM ID epoch 9 seed 367f8d4b525fd620 reps 35: miners 62c19c11cb2909cf (3 of 3) cli at reps 62c19c11cb2909cf cli rung 0 9c6ad9fe883c3330
22:57:58.524 PROGRAM ID epoch 10 seed 518f98485a18e924 reps 35: miners 2f5237323ef1a4bb (3 of 3) cli at reps 2f5237323ef1a4bb cli rung 0 2a003e3289fe04dc
22:57:58.524 summary: /tmp/igneum-fast-time-ladder-step2/summary.json
CASE step2 rc=0

View file

@ -0,0 +1,127 @@
# The latency ladder: N as a verifier-bounded genesis ladder stepped by miner signal
6 October 2026, night UK. Horizon finding 4 (`docs/analysis/horizon/algorithm.md` 5.3a and proposal 5; `frontier.md` 2.3). Branch `ladder` (repo) and `ladder-node` (fork, from `ca3-v4-0316` 8dbb7a23). Status: implemented behind `latency_ladder_activation_daa` (never until set; 0 on the testnet when the project lead says), ships in the 0.3.17 feature tree (0.3.16 went out on 6 October 2026 as a corrective cut of 0.3.15, node f1ea7a38, and carries none of this); not in `docs/spec` until adopted.
## 1. The finding in one line
The chip that matters stores the dataset; the reserve and the era draw buy nothing against it; the one lever is the latency-shadow size N, and an unconditional doubling per era retires the M5 Max at era 1 (-10.5 percent at 200,000 ops). So N moves inside a ladder fixed at genesis, one rung at a time, only when 90 percent of mining weight asks for it, never past the rung the reference verifier can still check under 10 ms.
## 2. Where N lives
| Item | Place | Value |
|---|---|---|
| The unit | `igneum_pow::ShadowClass { instrs: 256, reps }`: class v4 is `mx8` plus a 256-instruction shadow block run `reps` times per iteration; N in counted ops = 930 + 2,048 x reps x 1.83 (the convention of `latency-shadow-2026-10-06.md` s1) | reps is what the generator consumes; the ops label is derived (`igneum::latency_ladder_counted_ops`) |
| The ladder | `Params::latency_ladder` (`consensus/core/src/config/params.rs`), a genesis list of six rungs `{ reps, admissible }`, in the override file as `latency_ladder: [{"reps": 27, "admissible": true}, ...]`, in the digest once the activation is set | reps 27, 35, 53, 88, 173, 267 = about 102,100, 132,100, 199,600, 330,700, 649,400, 1,001,600 counted ops: the measured rungs of 5.3a (35 passes is the integer rung nearest the 130,000 interpolation), then the two doublings; admissible tonight: rungs 0, 1, 2 (section 5) |
| The switch | `Params::latency_ladder_activation_daa` (`u64::MAX` never; in the digest once set, the 0.3.15 rule, so a binary that carries the field peers with one that does not until a file sets it) | never on every network; 0 on the testnet when the project lead says |
| The window | `Params::latency_ladder_window_daa` (one window of the seven; in the digest once the activation is set) | 86,400 DAA (one day); 120 on the fast-time profile, the class window's rounding |
| The step | consensus state derived from signals, never stored: `processes::latency_ladder::step_of_epoch` walks the epochs' seed blocks down the selected chain exactly as `class_signal::program_class_of_epoch` does, memoised per seed block | rung 0 before the activation and at it |
| The era draw | draws 8 (`epoch_len`) and 9 (the ladder) of the era stream are consumed and not used (`igneum_pow::era_draw`), so a later use of either slot changes no other parameter; the first seven draws and every pinned pack are unchanged | the value is set by signal, not by the draw, as `epoch_len` is (spec 01 1.13.1) |
| The program | `EpochSeeds.shadow_reps` (0 = the class's own) → `Epoch::chain_program_shadow` → `generate_from_seed_bytes_program_class_shadow`: class v4 at rung r is `LoadClass::era(v4_class_at(reps_r), era, &V3_ALLOWED)`, generator 4; rung 0 is `V4_CLASS` byte for byte | the base program, the 16 loads, the day cache and the era draw are class v3's; only the block count moves |
## 3. The step rule (`igneum::latency_ladder_step_signalled`, pure; the tally shared with the class signal)
1. The carrier: two bits of the header `version` high byte. Bit 15 = up, bit 14 = down, both = no signal; the object version (the class signal) keeps bits 8 to 13 (`class_signal_of` masks with 0x3f; every value written so far is 4, so nothing changes). Stamped by the node from `Params::latency_ladder_signal` (`IGNEUM_LADDER_SIGNAL=up|down|none` on devnet and simnet; the app's toggle later) only while the ladder is active; the header version rule accepts the high byte while the class signal or the ladder is active.
2. The weight and the windows: blue blocks, the finality rule's convention, `CLASS_SIGNAL_WINDOWS = 7` consecutive windows of `latency_ladder_window_daa` ending at the epoch's seed block `S_e`, one walk bucketed per window (`class_signal::tally_window` with the ladder predicate). The number the decision rests on is the weakest of the seven.
3. The decision for epoch e, from the step of epoch e - 1: up one rung when every one of the seven windows is full, each has at least `LADDER_SIGNAL_THRESHOLD_BPS = 9,000` of its blue blocks signalling up, the rung above exists and is admissible, and the oldest window begins at or after the DAA score where the current step took effect; down one rung symmetrically (never below rung 0). Otherwise the step stands. 90 percent, not 95: the ladder is a parameter the genesis rules leave to miners within fixed bounds (the `epoch_len` precedent, spec 01 1.13.1), not a class change; 60 percent (a parameter the rules leave open) is too low for a move that retires cards.
4. Where it lands: at the epoch boundary, decided at the seed block, so the miner learns the next epoch's rung one lead (600 DAA) before it, with `next_latency_ladder_reps` in every template; a class never changes inside an epoch, nor does a rung.
5. The cool-down (the two-step guard): because the seven windows must lie wholly after the last step, the earliest next decision is 7 x W (seven days) after a step, and every counted signal was cast under the rung it moves from. A miner majority cannot jump two rungs in one decision and cannot take two decisions inside seven days.
## 4. The verifier bound
A rung is admissible only if the cold verify of one 32-lane warp on the reference core stays under 10 ms with the SMT sibling loaded. Measured as lane 2 measured class v4: `igneum-pow bench --seed igneum-genesis --day 2026-10-03 --class mx8+sh256x<reps> --warps 50` on igneum-build-1 (EPYC 9454P, core 40 at 3.8 GHz under schedutil, `nice -n 19 taskset -c 40`), the figure is `warp base 0: single cold run` with the same bench on core 88 (the sibling, `thread_siblings_list` 40,88) at the same time; the average of 50 warps and the quiet-core cold run are recorded beside it. The measurement runs under the box's `measure` hold (`remote-run.sh BR_MEASURE=1`: every build slot waits, the capacity layer yields), `tools/ladder/verify-bench-remote.sh`. The table is section 5; a rung over 10 ms is `admissible: false` in the genesis list itself, and the step rule never enters it. Changing a flag after genesis is a code change under the 90 percent upgrade path (spec 05 5.7); the owed O-1.14 laptop run can only tighten the list before genesis.
## 5. The measured table (igneum-build-1, 6 to 7 October 2026)
Run 2 (22:10Z, `docs/design/latency-ladder-bench/20261006T221034Z`, `tools/ladder/verify-bench-remote.sh` under the measure hold; core 40 read 1,500,000 kHz at the start under schedutil; box load average 25.4 before and 23.6 after from other agents' processes the hold does not exclude; igneum-pow sha256 3f7623f2...; every rung's lane-0 hash equal across the three runs of a rung):
| Rung | reps | Shadow instrs per hash | Counted ops (approx) | Cold, core alone (ms) | Avg of 50, alone (ms) | Cold, sibling loaded (ms) | Avg of 50, sibling loaded (ms) | Admissible |
|---|---|---|---|---|---|---|---|---|
| 0 | 27 | 55,296 | 102,100 | 5.14 | 4.95 | 8.77 | 8.67 | yes (class v4 today) |
| 1 | 35 | 71,680 | 132,100 | 5.57 | 5.52 | 8.87 | 8.51 | yes |
| 2 | 53 | 108,544 | 199,600 | 5.57 | 5.35 | 9.23 | 8.91 | yes |
| 3 | 88 | 180,224 | 330,700 | 6.07 | 5.89 | 10.08 | 9.84 | NO (by 0.08 ms under a load of 25; a quiet re-run before genesis may admit it) |
| 4 | 173 | 354,304 | 649,400 | 7.38 | 7.23 | 12.38 | 12.09 | NO |
| 5 | 267 | 546,816 | 1,001,600 | 8.88 | 8.50 | 14.96 | 14.58 | NO |
Reading: the loaded slope is about 12.6 us per 1,000 extra shadow instructions (8.77 to 14.96 over 491,520), lane 2's 12.1; rung 0 reads 8.77 against lane 2's 8.23 (its load average was 2.3), so the box's other work costs about 0.5 ms and rung 3 would read about 9.6 ms on a quiet box. The rule is the measurement, not the estimate: the genesis list carries rung 3 as inadmissible tonight, and a re-measurement on a quiet box (or the O-1.14 laptop) before the testnet genesis file is written can admit it. Per tier what the flags mean: the ladder as it ships can take N from 102,100 to 199,600 ops (two steps, each at least seven windows apart); at the top rung the Apple tier has given up about 10 percent of rate, the 5090 2.7 percent at its cap, the 4070 pays 21 W more, and a node on a 2019-class core still verifies a warp inside 10 ms with its sibling busy.
Lane 2's slopes predicted 8.23 + 12.1 us per 1,000 extra shadow instructions on the loaded core: 8.4, 8.9, 9.7, 11.9, 14.2 ms for rungs 1 to 5, so rungs 4 and 5 were expected out before the run. The genesis list in `params.rs` carries the flags this table gives. First run (22:06Z, `docs/design/latency-ladder-bench/20261006T220642Z`): the "loaded" column was NOT loaded (the known-failed case of the script: a 50-warp sibling finished during the measured run's own cache fill, which the fill time showed, 540 against 366 ms, while the warps then ran alone: 5.08, 5.20, 5.50, 6.07, 7.39, 8.83 ms); the script now keeps the sibling busy for the whole run and the table above is the second run's.
Also recorded in the first run: the quiet-core cold figures 5.09, 5.20, 5.51, 6.04, 7.45, 8.90 ms for rungs 0 to 5 (lane 2's class v4 cold figure was 5.06), so on the quiet reference core every rung including 1.0 M ops passes 10 ms; the loaded column decides.
## 5a. The chip anchor: what a determined vendor did to RandomX in seven years (coordinator's data point, 6 October 2026, night)
Bitmain's Antminer X9 is a shipping RandomX ASIC: about 1 MH/s at 2,472 W (2.47 J per KH), custom RISC-V cores, about USD 5,600, shipping July 2026 (github.com/monero-project/monero/issues/10270; every figure approximate, read from the issue by the coordinator). A Zen 4 desktop CPU at roughly 20 KH/s and 150 W is 7.5 J per KH (approximate), so the chip's per-joule edge over the honest device RandomX was built for is about 3x, seven years after launch. Two consequences for this project's own text and model:
| Item | Before | After |
|---|---|---|
| The precedent sentence | `latency-shadow-2026-10-06.md` s5 and `site/litepaper.html`: "no RandomX chip has beaten a CPU per joule", "no chip publicly shipped" | false since July 2026; corrected in the litepaper tonight (section 10 below) and owed in `latency-shadow-2026-10-06.md` and `chip-model-v3.md` |
| The k column | k = 0.3 was "the attacker's claim" (a wide-SIMD fixed-datapath array at N5); k = 1 was "ours" and the headline (2.1x over the 5090 at class v4) | a shipped product reached about 1/3 of its honest device's energy on a latency-bound random program, so k about 0.33 is a measured class, not a claim; the honest headline is the range, 2.1x (k = 1) to 3.9x (k = 0.33) over the 5090 at rung 0, with the X9 bracket named. Approximate in both directions: the 5090's ALU is already a wide-SIMD part at 11 pJ per op, so a chip's gain over it on random ALU work should be under its gain over a CPU core, and the memory side (the f = 1 chip) is priced separately and is not moved by k |
| The 5.7x | the f = 1 GDDR7 chip's per-joule edge at class v3 (memory only) | unchanged: no core work in it, k does not enter |
What N buys against a vendor at the X9's scale (energy per hash = memory + N x 11 pJ x k, `latency-shadow-2026-10-06.md` s5; the 5090 and M5 Max rows measured, algorithm.md 5.3a; k = 0.33; approximate):
| Rung | N (approx) | f = 1 GDDR7 chip, uJ | Edge over the 5090 at its 431 W cap | Edge over the M5 Max |
|---|---|---|---|---|
| 0 | 102,100 | 0.84 | 3.9x | 1.7x |
| 1 | 132,100 | 0.95 | 3.4x | 1.5x |
| 2 | 199,600 | 1.19 | 2.8x | 1.3x |
| 3 | 330,700 | 1.67 | 3.0x (the 5090 itself is compute-bound at this rung, 86 MH/s) | 1.1x |
So against a vendor at the X9's scale the ladder narrows the chip's edge over the 5090 from about 3.9x to about 2.8x by rung 2 (the top admissible rung tonight) and does not close it; against the Apple tier it takes the edge to about 1.3x at rung 2 and would take it to about 1.1x at rung 3, where the Mac has given up 21 percent of its rate and which the verifier measurement keeps out until a quiet re-run. The lever that moves every row by the same factor is the honest card's own watts (algorithm.md proposal 7), and the public text says so. The ladder is the chain's only automatic answer; it is not the whole answer.
## 6. What moves the digest and the wire
| Change | Digest | Wire |
|---|---|---|
| The binary carrying the fields, nothing set | no (the 0.3.15 rule: the activation and the window enter only once set; the ladder list enters only once the activation is set) | header version unchanged; `PowEpochInfo` gains fields 25 to 36 with defaults, so an old miner reads reps 0 (the class's own) |
| The file setting `latency_ladder_activation_daa` (and the window, and the list) | yes, once, at publish | the high byte may carry bits 14 and 15; a node without the ladder refuses the version when class signalling is inactive, which is the point of the rollout order (binary first, file second) |
| A step | no | the program of the epoch changes: `program_id_class` with the `shadow/` bytes (rung 0 keeps `program_id(4, seed, attempt)`), the pack's `IGNEUM_SHADOW_REPS` and `seeds.txt`'s `shadow_reps` line (absent at rung 0, so every pack and job line written today is unchanged; the job line gains no token, because the three hosts strip only `class=` and `era=` from its tail) |
## 7. Hostile review
| Question | Answer |
|---|---|
| Can a chip-holder vote the ladder down? | Down needs 90 percent of blue blocks in each of seven windows. A chip at 10 percent of hash cannot; at 90 percent the chain has a bigger problem than N, and the honest 10 percent still blocks the move (a 10 percent minority stops any move either way). |
| Can a chip-holder stall it? | Yes, with over 10 percent of weight for the whole week: the status quo is kept. The status quo is an admissible rung the cards already run, so a stall costs the chain nothing it does not have today; the ladder is a lever miners pull, not a schedule a chip can be late for. The one defence it does not give is a forced move against a chip that holds 10 percent: that is the honest-card watts and the price per joule (algorithm.md 5.1). |
| Can a miner majority jump two steps? | No: one rung per decision, and the next decision's seven windows must begin after the step took effect, so two moves are at least 7 x W apart (`latency_ladder_step_signalled`, tested). |
| Can a week be bought? | 90 percent of blue blocks for seven consecutive days is 90 percent of hash for a week, in public, with the pending count on every console (`latency_ladder_up_weakest_bps`); the class signal's argument (one day can be bought, seven cannot unnoticed). |
| What happens to a miner mid-step? | The rung is decided at the seed block, 600 DAA before the boundary; the template carries `next_latency_ladder_reps` and the miner prepares the next pack with it (the 2.0 era-boundary shape: a boundary that decides otherwise costs one refused pair and one prepare). A miner on a binary without the ladder keeps mining rung 0 after the step and loses every block until it updates; it can be at most 10 percent of hash by construction, and it had seven days of a rising count to see it. |
| An inadmissible rung by a 90 percent majority? | Impossible: the rule reads the flag; the flag is a genesis constant in the digest. |
| A proof-synced node | holds no headers below its pruning point, so an epoch whose windows reach below it cannot be tallied; it takes rung 0 (the floor) and logs that a ladder witness is owed, the class signal's shape (counter-asic-3-node.md 6.3). The witness in the proof format is the next node item, shared with the class witness. |
| The program id | rung 0 keeps today's id; a rung above goes through `program_id_class`, which carries the shadow size, so two rungs of one seed never share an id and a pack of another rung is refused by the id check as a pack of another class is. |
## 8. Consequences per tier (measured rungs from algorithm.md 5.3a; the step is the miners' to take)
| Step | M5 Max | RTX 5090 at 431 W | RTX 4070 at 160 W | RX 9070 XT | Pool user | Verifier (half-core) |
|---|---|---|---|---|---|---|
| 0 → 1 (102,100 → 132,100) | -3.3 points of rate, 0 W more | 0 | 0 | 0 | 0 | +0.2 ms |
| 1 → 2 (→ 199,600) | -6 more points | -2.7 percent | +21 W | 0 | 0 | +0.5 ms |
| 2 → 3 (→ 330,700) | -21 percent | -35 percent (compute-bound at the cap) | -12 percent | +3.6 percent | 0 | +0.9 ms |
| 3 → 4, 4 → 5 | unmeasured on cards; the verifier decides admissibility (section 5) | | | | | |
A chip's shadow core grows with N at k x 11 pJ per op; at rung 1 the f = 1 GDDR7 chip's edge over the 5090 at k = 1 falls 2.1x to 1.7x, at rung 2 to 1.3x. Which is why the step is the miners' who pay for it: rung 3 is a step the signal would refuse until cards change.
## 9. What is implemented, tested, owed
Public text: section 10.
Test and build lines (igneum-build-1 through `tools/build-remote.sh`, `IGNEUM_AGENT=ladder`, 6 October 2026, 22:00 to 22:20Z): igneum-pow `test --release`: 61 passed (the first run failed on the rung-1 label 130,000 against the arithmetic's 132,105, corrected to the arithmetic); the fork at 1591ee1d: kaspa-consensus-core 114 passed, 2 ignored (`latency_ladder_rule`, `override_params_carry_the_latency_ladder_and_the_digest_moves_only_when_set`, the 60x file test after the file gained the two 0.3.16-lane fields and `exec_restart_state_root` it lacked); kaspa-pow with the feature 16 passed (`latency_ladder_rungs_are_programs_of_their_own_over_one_day_cache`: one cache build for three rungs, rung 1 another pow, 27 passes equal to rung 0); kaspa-consensus lib 131 passed (the template carries bit 15 only while the ladder is active); igneum-miner, kaspa-rpc-core, kaspa-grpc-core green; `igneumd` and `igneum-miner` built, the commit string carried. Harness results: section 11.
Implemented: the ladder, activation, window and signal in `Params`, `OverrideParams`, the digest and the 60x file; the pure rule and the bits in `igneum.rs`; `processes::latency_ladder` (the walk, the memo, the step); `EpochSeeds.shadow_reps` through the engine, the header path, the miner and the pack; `PowEpochInfo` and the gRPC fields; the daemon lines; `igneum-pow`: `v4_class_at`, the shadow program path, the id rule, the consumed draws, `--shadow-reps` on the CLI. Tests, the known-failed case first: a changed N today is a hard fork (the same seeds at reps 35 hash another program with the same class and, before the ladder, the same id); the step moves only by signal; 8,999 bps does not move it; a two-step jump is impossible; down never below 0; an inadmissible rung is never entered; rung 0 is `V4_CLASS` byte for byte. Fast-time harness `infra/fast-time/latency-ladder.mjs` (three cases and the failed case, the class harness's shape). Owed: the ladder witness in the pruning proof; the app's signal toggle and its consequences line; a rung check in the three hosts (today a host compiles whatever `IGNEUM_SHADOW_REPS` the pack carries and the Rust pack check binds the pack to its seeds, so a stale pack of another rung fails the miner's own check, not the host's); the O-1.14 laptop run.
## 10. Public text (the litepaper's hash-class paragraph, `site/litepaper.html`, Mining section) and the ledger row
The paragraph as placed in the litepaper: "**The work that waits can grow.** Class v4 adds a block of latency-shadow arithmetic to every hash, about 100,000 integer operations that run while the memory reads are in flight, so a chip that stores the whole dataset still has to pay for a core. That size sits on a ladder fixed at genesis, six rungs from about 100,000 to about 1,000,000 operations, and it moves one rung at a time only when 90 percent of blue blocks in each of seven consecutive days ask for it; it can never move two rungs inside a week and never past a rung the reference verifier cannot check under 10 ms with its sibling thread busy (measured on the build server: every rung's cold verify stays under that gate on the quiet core, 5.1 to 8.9 ms). What it buys, on the measured cards: against a dataset-storing chip whose core costs what an RTX 5090's does per operation, the chip's per-joule edge falls from 2.1x at the first rung to 1.3x at the third; against a core as good as the shipping RandomX chip's (Bitmain's Antminer X9, about 3x per joule over a desktop CPU after seven years, approximate), from 3.9x to 2.8x. What it costs, per rung, is measured too: the Apple tier gives up 3 points of rate at the first step and 6 more at the second, the RTX 5090 nothing until the second; so the miners who pay for a step are the ones who take it." The sentence "Monero has run on RandomX since 2019 with no chip publicly shipped" is replaced by the X9 fact.
The ledger row is M34 in `docs/fud-ledger.md`.
## 11. The fast-time gate (igneum-build-1, 6 October 2026, 22:15 to 22:58Z; summaries and logs copied to `docs/design/latency-ladder-harness/`; `infra/fast-time/latency-ladder.mjs`, the ladder fork's Linux binaries built on the box, three nodes and three CPU miners on `override-60x.json` with class v4 from genesis, class signalling off, the ladder active from DAA 0, windows of 60 DAA)
| Case | Run | SUMMARY | Summary file |
|---|---|---|---|
| The known-failed case first (`--signal up,up,none --expect step`) | 22:15 to 22:26Z | FAIL as it must: no step over epochs 0 to 10, the weakest-of-seven up share 6,166 to 6,333 bps at the sink from epoch 7 (two CPU miners of three), on the chain 406 blocks up and 198 none (6,722 bps up), no step line on any node, 0 rejected, one sink at 603/603/603; `FAILED CHECK` on eight step checks plus `chain_carries_the_bits`, which was the harness's own fault (genesis carries header version 0 and the low-byte check read it; fixed in the file and recorded there), exit 1 | `/srv/builds/_log/ladder-harness/failed-case.json` |
| All three signal up (`--signal up,up,up --expect step`) | 22:26 to 22:37Z | the chain did what the rule says: `Latency ladder step by miner signal: epoch 8 moves to rung 1 (35 shadow passes, from rung 0): up in each of 7 consecutive windows of 60 DAA ending at seed block beb8b40f..., threshold 9000 bps, weakest up 10000 bps, ... 420 of 420 blue blocks up` on 3 of 3 nodes with the same epoch; the template at rung 1 from epoch 8 (DAA 480, the first epoch whose seed block has seven full windows below it) at 500 s wall; epochs 9 and 10 stayed at rung 1 (no second step inside seven windows); 481 / 132 blocks across the boundary; 0 rejected; one sink at 612/612/612; 612 blocks up and genesis none (9,984 bps up), every object byte 0; the three miners' rung-1 ids equal each other and differ from the same seed's rung-0 id on epochs 8, 9 and 10 (e8 `d4cfc28a1c525077` against `ea49bc6e870eb34c`). The harness reported FAIL on two checks of its own: the genesis low-byte fault above and `rung1_ids_equal_the_cli_rung1_id`, because `igneum-pow show` built its program without `--shadow-reps` (fixed at 6b30e85; the miners' ids were the chain's). Re-run as step2 below with both fixes | `step.json` |
| Two of three signal up (`--signal up,up,none --expect no-step --epochs 10`) | 22:37 to 22:47Z | PASS: no step over epochs 0 to 10; the weakest-of-seven up share at the sink 5,833 bps from epoch 7 (the third miner's blocks carry no bits); on the chain 402 blocks up and 200 none (6,678 bps up); no step line on any node; 0 rejected; one sink `bfc435d62d7c659c` at 601/601/601; every rung-0 id equal to the CLI's | `no-step.json` |
| All three signal up, the fixed harness and CLI (`--signal up,up,up --expect step`, step2) | 22:47 to 22:58Z | PASS on all 18 checks: the step line on 3 of 3 nodes at epoch 8 (weakest up 10,000 bps, 420 of 420 blue blocks up); the template at rung 1 (35 passes) from epoch 8 at 505 s wall; epochs 9 and 10 at rung 1, one step line per node (no second step inside seven windows); 481 / 137 blocks across the boundary; 0 rejected; one sink `f1cbdb99f48e0a19` at 617/617/617; 617 blocks up and genesis none (9,984 bps), every object byte 0, every mined block's low byte 2; the three miners' rung-1 ids on epochs 8, 9 and 10 equal the CLI's `--shadow-reps 35` id and differ from the same seed's rung-0 id | `step2.json` |

View file

@ -182,6 +182,15 @@ Answer: Correct. The measured 2.4 G/s had been read on 6 October as a mapping ar
Evidence: `docs/analysis/horizon/algorithm.md` section 5.1 (the ceiling table: measured 2.4, tFAW-bound 2.3, tRRD-bound 2.8, bank-bound 11.4, O'Connor 10.7 G reads/s, and the F2 measurement plan), 6 October 2026; JEDEC HBM2 timings as carried by ICCAD 2021 Table I; Shuhai, FCCM 2020, Fig 7. Evidence: `docs/analysis/horizon/algorithm.md` section 5.1 (the ceiling table: measured 2.4, tFAW-bound 2.3, tRRD-bound 2.8, bank-bound 11.4, O'Connor 10.7 G reads/s, and the F2 measurement plan), 6 October 2026; JEDEC HBM2 timings as carried by ICCAD 2021 Table I; Shuhai, FCCM 2020, Fig 7.
### M34. The shadow size N is a constant of the binary, so the one lever against the dataset-storing chip needs a fork to move
"Your own Horizon lane says the reserve and the era draw buy nothing against a chip that stores the dataset, and that the only lever is the latency-shadow size N. N is 27 passes of a 256-instruction block, hard-coded in `V4_CLASS`. So when HBM4 doubles a chip's rate per stack in 2028, your answer is a hard fork, and a fork that retires the M5 Max at the first doubling. And now there is a shipping RandomX ASIC."
Status: Conceded, implemented (6 October 2026, night; `docs/design/latency-ladder.md`, branch `ladder`, fork branch `ladder-node`, the 0.3.17 feature tree, behind `latency_ladder_activation_daa`, never until set, 0 on the testnet when the project lead says): N is a genesis ladder of six rungs (27, 35, 53, 88, 173, 267 passes; about 102,100 to 1,001,600 counted ops) with a measured admissibility flag per rung (cold verify under 10 ms on the reference core with its SMT sibling loaded, igneum-build-1, 6 October 2026: rungs 0 to 2 pass at 8.77, 8.87 and 9.23 ms, rung 3 misses by 0.08 ms under a box load of 25 and is out until a quiet re-run, rungs 4 and 5 are out at 12.38 and 14.96), and the step is consensus state derived from two bits of the header version: up one rung when 90 percent of blue blocks in each of seven consecutive windows ask for it and the rung above is admissible, down one rung symmetrically, never two rungs inside seven windows (the oldest window must begin after the last step took effect), never unconditionally. Tests, the known-failed case first: a changed N today hashes another program under the same program id (a hard fork no pack line told apart); after, rung 0 is class v4 byte for byte, a rung above carries its pass count in the id, 8,999 bps in one window of seven does not move the step, a two-step jump is impossible, down never passes rung 0, an inadmissible rung is never entered. Stated in `site/litepaper.html`, Mining section ("The work that waits can grow").
Answer: Correct on both counts, and the second was the sharper one. The X9 (Bitmain, about 1 MH/s at 2,472 W, approximate, github.com/monero-project/monero/issues/10270) is a shipped 3x per-joule edge over a desktop CPU on the best-known latency-bound random-program design, seven years after launch; it makes the k = 0.3 column of the chip model a product class rather than an attacker's claim, and the public headline is now the range 2.1x (k = 1) to 3.9x (k = 0.33) over the RTX 5090 at class v4, with the ladder taking the X9 bracket to about 2.8x by rung 2 and the Apple tier's to about 1.1x by rung 3. The ladder does not close the gap; it is the chain's only automatic answer, it moves at the pace of the cards that pay for it, and the honest card's watts remain the lever that moves every row (algorithm lane proposal 7). What the ladder gives up by design: a chip holding over 10 percent of weight can stall it, and the status quo it stalls is a rung the cards already run.
Evidence: `docs/design/latency-ladder.md` (the rule, the hostile review, the measured verifier table, the X9 arithmetic); `igneum-pow/src/generator.rs` test `latency_ladder_known_failed_a_changed_n_was_a_hard_fork_and_rungs_are_class_v4`; the fork's `consensus/core/src/igneum.rs` test `latency_ladder_rule`, `consensus/pow/src/igneum.rs` test `latency_ladder_rungs_are_programs_of_their_own_over_one_day_cache`; `infra/fast-time/latency-ladder.mjs` (the step, no-step and known-failed cases).
## 2. Finality and attacks ## 2. Finality and attacks
### F1. Finality is attackable for the first month ### F1. Finality is attackable for the first month

View file

@ -326,6 +326,11 @@ pub fn era_draw(era_bytes: &[u8], allowed: &[u8]) -> EraParams {
let j = i + (r[i] % n as u64) as usize; let j = i + (r[i] % n as u64) as usize;
c.swap(i, j); c.swap(i, j);
} }
// Draws 8 and 9, consumed and not used (spec 01 section 1.13.1 for `epoch_len`; `docs/design/latency-ladder.md`
// section 2 for the latency ladder): both parameters are set by miner signal, and consuming their slots here means a
// later use of either changes no other draw. Nothing below reads them, so every value drawn above is what it was.
let _epoch_len_draw = s.next();
let _latency_ladder_draw = s.next();
let mut chosen: Vec<u8> = c[..free].to_vec(); let mut chosen: Vec<u8> = c[..free].to_vec();
chosen.sort_unstable(); chosen.sort_unstable();
let mut pos = [0u8; 4]; let mut pos = [0u8; 4];
@ -804,7 +809,43 @@ pub const V3_CLASS: LoadClass = LoadClass { era: None, hot: None, ..LoadClass::M
/// of 256 ALU instructions run 27 times per iteration ("mx8+sh256x27", 55,296 shadow instructions per hash). The /// of 256 ALU instructions run 27 times per iteration ("mx8+sh256x27", 55,296 shadow instructions per hash). The
/// base program, the 16 loads, the item construction, the cache growth rule and the era draw are class v3's, draw /// base program, the 16 loads, the item construction, the cache growth rule and the era draw are class v3's, draw
/// for draw, so a v4 epoch's day cache and dataset are the v3 day's. Composed with the era exactly as V3 is. /// for draw, so a v4 epoch's day cache and dataset are the v3 day's. Composed with the era exactly as V3 is.
pub const V4_CLASS: LoadClass = LoadClass { shadow: Some(ShadowClass { instrs: 256, reps: 27 }), ..V3_CLASS }; pub const V4_CLASS: LoadClass = LoadClass { shadow: Some(ShadowClass { instrs: V4_SHADOW_INSTRS, reps: V4_SHADOW_REPS }), ..V3_CLASS };
/// The shadow block size of class v4 at every rung of the latency ladder (`docs/design/latency-ladder.md`): 256
/// instructions. The ladder moves the pass count alone.
pub const V4_SHADOW_INSTRS: u16 = 256;
/// The shadow passes of class v4 at rung 0 of the latency ladder: 27 (`mx8+sh256x27`, about 102,100 counted ops).
pub const V4_SHADOW_REPS: u16 = 27;
/// Class v4 at a rung of the latency ladder (`docs/design/latency-ladder.md` section 2): [`V4_CLASS`] with the
/// 256-instruction shadow block run `reps` times per iteration. `reps` 0 means the class's own count, so
/// `v4_class_at(0) == v4_class_at(27) == V4_CLASS` and a caller that knows no rung changes nothing.
pub fn v4_class_at(reps: u16) -> LoadClass {
if reps == 0 {
V4_CLASS
} else {
LoadClass { shadow: Some(ShadowClass { instrs: V4_SHADOW_INSTRS, reps }), ..V3_CLASS }
}
}
/// The shadow passes of a class v4 load class at any rung of the ladder, the era draw set aside (`Some(27)` for
/// [`V4_CLASS`] itself); `None` for every other class, a measurement class with another block size included.
pub fn v4_rung_reps(class: &LoadClass) -> Option<u16> {
let base = LoadClass { era: None, ..*class };
match base.shadow {
Some(ShadowClass { instrs: V4_SHADOW_INSTRS, reps }) if LoadClass { shadow: None, ..base } == V3_CLASS => Some(reps),
_ => None,
}
}
/// Counted integer ops per hash of class v4 at `reps` shadow passes, the convention of
/// `docs/analysis/latency-shadow-2026-10-06.md` section 1: 930 for the base program and its loads, 1.83 ops per
/// shadow instruction (137 / 75 over the non-load weights), 8 iterations x 256 instructions x `reps` shadow
/// instructions. Approximate by construction; the label of a rung, never a consensus value.
pub fn v4_counted_ops(reps: u16) -> u64 {
930 + (ITERATIONS as u64 * V4_SHADOW_INSTRS as u64 * reps as u64 * 183).div_ceil(100)
}
/// The width set class v3's era draw chooses from: 4 bytes only (the read-width decision of 5 October 2026; the /// The width set class v3's era draw chooses from: 4 bytes only (the read-width decision of 5 October 2026; the
/// draw is consumed, so widening the set at genesis keeps the derivation). /// draw is consumed, so widening the set at genesis keeps the derivation).
@ -1009,7 +1050,12 @@ impl Program {
/// || attempt_le32`. Written into every pack so a version 1 program, or another attempt of the same seed, /// || attempt_le32`. Written into every pack so a version 1 program, or another attempt of the same seed,
/// can never be mistaken for this one. /// can never be mistaken for this one.
pub fn program_id(&self) -> u64 { pub fn program_id(&self) -> u64 {
if self.class.is_v2() || self.generator == GENERATOR_VERSION_V3 || self.generator == GENERATOR_VERSION_V4 { // Latency ladder (docs/design/latency-ladder.md section 7): a class v4 program above rung 0 carries its shadow
// size in the id (`program_id_class`, the "shadow/" bytes), so two rungs of one seed never share an id and a
// pack of another rung is refused as a pack of another class is. Rung 0 keeps `program_id(4, seed, attempt)`
// byte for byte, so every v4 id written before the ladder stands.
let v4_rung_0 = self.generator == GENERATOR_VERSION_V4 && LoadClass { era: None, ..self.class } == V4_CLASS;
if self.class.is_v2() || self.generator == GENERATOR_VERSION_V3 || v4_rung_0 {
// Spec 01 section 1.4.6: a class v3 program's id is `program_id(3, seed, attempt)`, a class v4 program's // Spec 01 section 1.4.6: a class v3 program's id is `program_id(3, seed, attempt)`, a class v4 program's
// `program_id(4, seed, attempt)` (Counter ASIC 3.0); the generator version in the preimage separates // `program_id(4, seed, attempt)` (Counter ASIC 3.0); the generator version in the preimage separates
// them from every version 2 program of the same seed // them from every version 2 program of the same seed
@ -1378,6 +1424,27 @@ pub fn generate_from_seed_bytes_program_class(seed_string: &str, seed_bytes: &[u
p p
} }
/// [`generate_from_seed_bytes_program_class`] at a rung of the latency ladder (`docs/design/latency-ladder.md`
/// section 2): `shadow_reps` is the shadow pass count the chain's step gives the epoch, 0 for the class's own. Class
/// v4 at a rung above 0 draws from [`v4_class_at`] with the era inside and generator 4 stamped; every other class,
/// and class v4 at rung 0, is [`generate_from_seed_bytes_program_class`] byte for byte. The base program, the 16 loads
/// and the era draw do not move with the rung: only the pass count of the shadow block does.
pub fn generate_from_seed_bytes_program_class_shadow(seed_string: &str, seed_bytes: &[u8], class: ProgramClass, era_bytes: Option<&[u8]>, shadow_reps: u16) -> Program {
if class != ProgramClass::V4 || shadow_reps == 0 || shadow_reps == V4_SHADOW_REPS {
return generate_from_seed_bytes_program_class(seed_string, seed_bytes, class, era_bytes);
}
let base = v4_class_at(shadow_reps);
match era_bytes {
Some(era) => generate_era_generator(seed_string, seed_bytes, base, era, &V3_ALLOWED, GENERATOR_VERSION_V4),
None => {
let mut p = generate_from_seed_bytes_class(seed_string, seed_bytes, base);
p.generator = GENERATOR_VERSION_V4;
p.era_bytes = None;
p
}
}
}
/// The program of a seed string (its UTF-8 bytes are the program seed). /// The program of a seed string (its UTF-8 bytes are the program seed).
pub fn generate(seed_string: &str) -> Program { pub fn generate(seed_string: &str) -> Program {
generate_from_seed_bytes(seed_string, seed_string.as_bytes()) generate_from_seed_bytes(seed_string, seed_string.as_bytes())
@ -2027,4 +2094,72 @@ mod tests {
assert_eq!(again.shadow, sh.shadow); assert_eq!(again.shadow, sh.shadow);
assert_eq!(crate::verify::hash_warp(&again, 0, &ds), h1); assert_eq!(crate::verify::hash_warp(&again, 0, &ds), h1);
} }
/// Latency ladder (`docs/design/latency-ladder.md`), the known-failed case first: before the ladder a changed N
/// was a hard fork. Two nodes drawing class v4 at 27 and at 35 passes from the same seeds build the same base
/// program and the same shadow block, carry generator 4 on both and, under the id rule as it stood, the SAME id
/// (`program_id(4, seed, attempt)` reads no shadow size), yet their warps hash differently: every block of one is
/// invalid to the other and no pack line told them apart. After: the rung is a parameter of the chain's step,
/// rung 0 is `V4_CLASS` byte for byte, and a rung above carries its pass count in the id.
#[test]
fn latency_ladder_known_failed_a_changed_n_was_a_hard_fork_and_rungs_are_class_v4() {
let era = [7u8; 32];
let today = generate_from_seed_bytes_program_class("igneum-genesis", b"igneum-genesis", ProgramClass::V4, Some(&era));
let r0 = generate_from_seed_bytes_program_class_shadow("igneum-genesis", b"igneum-genesis", ProgramClass::V4, Some(&era), 0);
let r27 = generate_from_seed_bytes_program_class_shadow("igneum-genesis", b"igneum-genesis", ProgramClass::V4, Some(&era), V4_SHADOW_REPS);
assert_eq!(r0, today, "rung 0 is class v4 byte for byte");
assert_eq!(r27, today, "27 passes is rung 0");
let r1 = generate_from_seed_bytes_program_class_shadow("igneum-genesis", b"igneum-genesis", ProgramClass::V4, Some(&era), 35);
// the failed case, as it stood: the same base, the same block, the same seed words, generator 4 on both, one id
assert_eq!(r1.instrs, today.instrs, "the base program is the class's, draw for draw");
assert_eq!(r1.shadow, today.shadow, "the block is the same draw; only the pass count moves");
assert_eq!((r1.seed, r1.attempt, r1.generator, r1.era_bytes.clone()), (today.seed, today.attempt, today.generator, today.era_bytes.clone()));
assert_eq!(program_id(GENERATOR_VERSION_V4, &r1.seed, r1.attempt), program_id(GENERATOR_VERSION_V4, &today.seed, today.attempt), "the old rule gave both nodes one id");
assert_eq!(r1.shadow_reps(), 35);
assert_eq!(r1.shadow_instrs_per_hash(), ITERATIONS * 256 * 35);
let ds = crate::verify::DatasetSource::new("2026-10-06", crate::verify::DatasetMode::ClosedForm, 20);
let h0 = crate::verify::hash_warp(&today, 0, &ds);
let h1 = crate::verify::hash_warp(&r1, 0, &ds);
assert_ne!(h0, h1, "a changed N is another hash: before the ladder, a hard fork");
// after: the rung is in the id above rung 0; rung 0 keeps the id written before the ladder
assert_ne!(r1.program_id(), today.program_id(), "the rung is in the id");
assert_eq!(r1.program_id(), program_id_class(GENERATOR_VERSION_V4, &r1.seed, r1.attempt, &r1.class));
assert_eq!(today.program_id(), program_id(GENERATOR_VERSION_V4, &today.seed, today.attempt), "rung 0 keeps the v4 id");
assert_eq!(r1.program_class(), ProgramClass::V4, "a rung is class v4");
assert_eq!(v4_rung_reps(&r1.class), Some(35));
assert_eq!(v4_rung_reps(&today.class), Some(27));
assert_eq!(v4_rung_reps(&V4_CLASS), Some(27));
assert_eq!(v4_rung_reps(&V3_CLASS), None);
assert_eq!(v4_rung_reps(&LoadClass::V2), None);
assert_eq!(v4_rung_reps(&LoadClass::MX8.with_shadow(64, 52)), None, "another block size is a measurement class, not a rung");
assert_eq!(v4_class_at(0), V4_CLASS);
assert_eq!(v4_class_at(27), V4_CLASS);
assert_eq!(v4_class_at(35), LoadClass::parse("mx8+sh256x35").unwrap());
assert_eq!(LoadClass { era: None, ..r1.class }, v4_class_at(35), "the era rides inside the rung's class");
assert_eq!(r1.class.era, today.class.era, "the same era draw at every rung");
assert!(check(&r1).is_ok(), "the acceptance rule reads the base program, which did not move");
// every rung of the designed ladder is another program with its own id
let rungs = [27u16, 35, 53, 88, 173, 267];
let ids: Vec<u64> = rungs.iter().map(|&r| generate_from_seed_bytes_program_class_shadow("igneum-genesis", b"igneum-genesis", ProgramClass::V4, Some(&era), r).program_id()).collect();
for i in 0..ids.len() {
for j in 0..i {
assert_ne!(ids[i], ids[j], "rungs {} and {} share an id", rungs[i], rungs[j]);
}
}
// the ops labels of the rungs, within 1 percent of the measured rungs of algorithm.md 5.3a
for (r, ops) in [(27u16, 102_100u64), (35, 132_100), (53, 199_600), (88, 330_700), (173, 649_400), (267, 1_001_600)] {
let got = v4_counted_ops(r);
assert!(got.abs_diff(ops) * 100 < ops, "reps {r}: {got} counted ops against the label {ops}");
}
// other classes ignore the rung; class v4 without an era takes it
assert_eq!(generate_from_seed_bytes_program_class_shadow("igneum-genesis", b"igneum-genesis", ProgramClass::V3, Some(&era), 35), generate_from_seed_bytes_program_class("igneum-genesis", b"igneum-genesis", ProgramClass::V3, Some(&era)));
assert_eq!(generate_from_seed_bytes_program_class_shadow("igneum-genesis", b"igneum-genesis", ProgramClass::V2, None, 35), generate_from_seed_bytes_program_class("igneum-genesis", b"igneum-genesis", ProgramClass::V2, None));
let bare = generate_from_seed_bytes_program_class_shadow("igneum-genesis", b"igneum-genesis", ProgramClass::V4, None, 35);
assert_eq!((bare.generator, bare.shadow_reps(), bare.era_bytes.is_none()), (GENERATOR_VERSION_V4, 35, true));
// the era stream consumes draws 8 and 9 after the seven it uses, so the seven are what they were: the pinned era
// packs of tests/packs.rs hold the values; here, the draw is a function of the bytes and the set alone
let e = era_draw(&era, &V3_ALLOWED);
assert_eq!(e, era_draw(&era, &V3_ALLOWED));
assert_eq!(e.width_words, 1);
}
} }

View file

@ -34,7 +34,7 @@ pub mod verify;
pub use bind::{block_init_words, day_bytes, pow256_from_lane, target64_from_le256}; pub use bind::{block_init_words, day_bytes, pow256_from_lane, target64_from_le256};
pub use accept::{check as accept_program, AcceptReport, Reject}; pub use accept::{check as accept_program, AcceptReport, Reject};
pub use generator::{generate, generate_from_seed_bytes, generate_from_seed_bytes_program_class, Instr, LoadClass, Op, Program, ProgramClass, GENERATOR_VERSION, GENERATOR_VERSION_V3, GENERATOR_VERSION_V4, V3_CLASS, V4_CLASS}; pub use generator::{generate, generate_from_seed_bytes, generate_from_seed_bytes_program_class, generate_from_seed_bytes_program_class_shadow, v4_class_at, v4_counted_ops, v4_rung_reps, Instr, LoadClass, Op, Program, ProgramClass, GENERATOR_VERSION, GENERATOR_VERSION_V3, GENERATOR_VERSION_V4, V3_CLASS, V4_CLASS, V4_SHADOW_INSTRS, V4_SHADOW_REPS};
pub use memhard::{cache_log2_words, dataset_log2_words, days_since_genesis, growth_doublings, Cache, MemhardCpu, MixParams, Shape}; pub use memhard::{cache_log2_words, dataset_log2_words, days_since_genesis, growth_doublings, Cache, MemhardCpu, MixParams, Shape};
pub use seed::{fnv1a64, seed_words, SplitMix64}; pub use seed::{fnv1a64, seed_words, SplitMix64};
pub use verify::{hash_warp, interpret_warp_init, verify_block, DatasetMode, DatasetSource, Epoch}; pub use verify::{hash_warp, interpret_warp_init, verify_block, DatasetMode, DatasetSource, Epoch};

View file

@ -44,6 +44,9 @@ struct Args {
days: u64, days: u64,
/// The program class (Counter ASIC 2.0 seam): v2 (default), v3 (V3_CLASS, generator 3) or v4 (V4_CLASS, generator 4). /// The program class (Counter ASIC 2.0 seam): v2 (default), v3 (V3_CLASS, generator 3) or v4 (V4_CLASS, generator 4).
program_class: Option<ProgramClass>, program_class: Option<ProgramClass>,
/// The shadow pass count of a class v4 program at a rung of the latency ladder (`--shadow-reps`, 0 = the class's
/// own 27; `docs/design/latency-ladder.md`); read under `--program-class v4` only.
shadow_reps: u16,
/// The era seed bytes a class v3 chain program records (`--era-hex`). /// The era seed bytes a class v3 chain program records (`--era-hex`).
era_hex: Option<String>, era_hex: Option<String>,
/// Era layout: `--era igneum-era-test/<n>` or `--era <n>:<64 hex>` composes the era class over `--class` with /// Era layout: `--era igneum-era-test/<n>` or `--era <n>:<64 hex>` composes the era class over `--class` with
@ -99,6 +102,7 @@ fn usage() -> ! {
\x20 also: w4, w16, w64, w64x4, p4,p16,p64[xN], <class>m<mult>[g], <class>+sh<S>x<R> (latency-shadow block of S ALU instructions x R passes per iteration, Counter ASIC 3.0 item 8)\n\ \x20 also: w4, w16, w64, w64x4, p4,p16,p64[xN], <class>m<mult>[g], <class>+sh<S>x<R> (latency-shadow block of S ALU instructions x R passes per iteration, Counter ASIC 3.0 item 8)\n\
\x20 --days N days since genesis for the cache growth rule of a class with it (default 0: the 2^26-word cache)\n\ \x20 --days N days since genesis for the cache growth rule of a class with it (default 0: the 2^26-word cache)\n\
\x20 --program-class v2|v3|v4 the program class of the seam (v3 = generator 3 on V3_CLASS, v4 = generator 4 on V4_CLASS = mx8+sh256x27, the chain's own derivation; --era-hex records the era seed)\n\ \x20 --program-class v2|v3|v4 the program class of the seam (v3 = generator 3 on V3_CLASS, v4 = generator 4 on V4_CLASS = mx8+sh256x27, the chain's own derivation; --era-hex records the era seed)\n\
\x20 --shadow-reps N class v4 at a rung of the latency ladder: the shadow block's pass count (0 = the class's own 27; docs/design/latency-ladder.md), with --program-class v4\n\
\x20 --era E era layout over --class: igneum-era-test/<n> or <n>:<64 hex> (the 32-byte era seed E_n)\n\ \x20 --era E era layout over --class: igneum-era-test/<n> or <n>:<64 hex> (the 32-byte era seed E_n)\n\
\x20 --era-widths 4[,16,64] the width set the era draws from, in bytes (default 4: pinned; more lets the era draw it)" \x20 --era-widths 4[,16,64] the width set the era draws from, in bytes (default 4: pinned; more lets the era draw it)"
); );
@ -123,6 +127,7 @@ fn parse() -> Args {
days: 0, days: 0,
program_class: None, program_class: None,
era_hex: None, era_hex: None,
shadow_reps: 0,
era: None, era: None,
era_widths: vec![1], era_widths: vec![1],
}; };
@ -146,6 +151,7 @@ fn parse() -> Args {
"--days" => a.days = val().parse().unwrap_or_else(|_| usage()), "--days" => a.days = val().parse().unwrap_or_else(|_| usage()),
"--program-class" => a.program_class = Some(ProgramClass::parse(&val()).unwrap_or_else(|| usage())), "--program-class" => a.program_class = Some(ProgramClass::parse(&val()).unwrap_or_else(|| usage())),
"--era-hex" => a.era_hex = Some(val()), "--era-hex" => a.era_hex = Some(val()),
"--shadow-reps" => a.shadow_reps = val().parse().unwrap_or_else(|_| usage()),
"--era" => a.era = Some(parse_era(&val()).unwrap_or_else(|| usage())), "--era" => a.era = Some(parse_era(&val()).unwrap_or_else(|| usage())),
"--era-widths" => a.era_widths = parse_widths(&val()).unwrap_or_else(|| usage()), "--era-widths" => a.era_widths = parse_widths(&val()).unwrap_or_else(|| usage()),
_ => usage(), _ => usage(),
@ -222,7 +228,7 @@ fn epoch_of_class(a: &Args, mode: DatasetMode) -> (Epoch, String) {
let label = format!("igneum-epoch/{eh}/day/{dh}"); let label = format!("igneum-epoch/{eh}/day/{dh}");
let e = match a.program_class { let e = match a.program_class {
Some(pc) => Epoch { Some(pc) => Epoch {
program: Epoch::chain_program(&eb, era.as_deref(), pc, &label), program: Epoch::chain_program_shadow(&eb, era.as_deref(), pc, a.shadow_reps, &label),
dataset: Epoch::chain_dataset_day(&db, pc, a.days, a.dataset_log2), dataset: Epoch::chain_dataset_day(&db, pc, a.days, a.dataset_log2),
}, },
None => Epoch::from_seed_bytes_day(&eb, &db, &label, a.class, a.days, a.dataset_log2), None => Epoch::from_seed_bytes_day(&eb, &db, &label, a.class, a.days, a.dataset_log2),
@ -232,7 +238,7 @@ fn epoch_of_class(a: &Args, mode: DatasetMode) -> (Epoch, String) {
_ => { _ => {
let e = match a.program_class { let e = match a.program_class {
Some(pc) => { Some(pc) => {
let program = igneum_pow::generator::generate_from_seed_bytes_program_class(&a.seed, a.seed.as_bytes(), pc, era.as_deref()); let program = igneum_pow::generator::generate_from_seed_bytes_program_class_shadow(&a.seed, a.seed.as_bytes(), pc, era.as_deref(), a.shadow_reps);
let lc = pc.load_class(); let lc = pc.load_class();
let shape = Shape::for_class_day(&lc, a.days); let shape = Shape::for_class_day(&lc, a.days);
let log2 = if lc.growth { igneum_pow::memhard::dataset_log2_words(a.dataset_log2, a.days) } else { a.dataset_log2 }; let log2 = if lc.growth { igneum_pow::memhard::dataset_log2_words(a.dataset_log2, a.days) } else { a.dataset_log2 };
@ -410,7 +416,7 @@ fn show(a: &Args) {
// the load class of --class, the era of --era composed over it // the load class of --class, the era of --era composed over it
let era_hex_bytes = a.era_hex.as_deref().map(|h| igneum_pow::bind::unhex(h).unwrap_or_else(|| usage())); let era_hex_bytes = a.era_hex.as_deref().map(|h| igneum_pow::bind::unhex(h).unwrap_or_else(|| usage()));
let mut p = match a.program_class { let mut p = match a.program_class {
Some(pc) => igneum_pow::generator::generate_from_seed_bytes_program_class(&label, &bytes, pc, era_hex_bytes.as_deref()), Some(pc) => igneum_pow::generator::generate_from_seed_bytes_program_class_shadow(&label, &bytes, pc, era_hex_bytes.as_deref(), a.shadow_reps),
None => igneum_pow::generator::generate_from_seed_bytes_class(&label, &bytes, a.class), None => igneum_pow::generator::generate_from_seed_bytes_class(&label, &bytes, a.class),
}; };
if let (None, Some((_, eb, _))) = (a.program_class, &a.era) { if let (None, Some((_, eb, _))) = (a.program_class, &a.era) {

View file

@ -626,6 +626,13 @@ impl Epoch {
crate::generator::generate_from_seed_bytes_program_class(label, epoch_seed, class, era_bytes) crate::generator::generate_from_seed_bytes_program_class(label, epoch_seed, class, era_bytes)
} }
/// [`Epoch::chain_program`] at a rung of the latency ladder (`docs/design/latency-ladder.md`): `shadow_reps` is
/// the shadow pass count the chain's step gives the epoch (0 = the class's own, which is [`Epoch::chain_program`]
/// byte for byte). The node's engine and the miner's pack export call this with the step the template names.
pub fn chain_program_shadow(epoch_seed: &[u8], era_bytes: Option<&[u8]>, class: ProgramClass, shadow_reps: u16, label: &str) -> Program {
crate::generator::generate_from_seed_bytes_program_class_shadow(label, epoch_seed, class, era_bytes, shadow_reps)
}
/// The day's cache and dataset of [`Epoch::from_chain_seeds`], the one entry the node's engine builds a day /// The day's cache and dataset of [`Epoch::from_chain_seeds`], the one entry the node's engine builds a day
/// cache through. The class is an argument because the Counter ASIC 2.0 integration gives class v3 its own item /// cache through. The class is an argument because the Counter ASIC 2.0 integration gives class v3 its own item
/// construction (the mixer multiplier) and cache size schedule (ca2-mixer); today both classes build the day of /// construction (the mixer multiplier) and cache size schedule (ca2-mixer); today both classes build the day of

View file

@ -36,6 +36,13 @@ Class v4 switch gate (Counter ASIC 3.0 G4): `node infra/fast-time/class-v4.mjs`
known-failed case, which must report FAIL with no v4 epoch; `--metal <igneum-bench>` puts a real Metal miner on node 0 known-failed case, which must report FAIL with no v4 epoch; `--metal <igneum-bench>` puts a real Metal miner on node 0
for G4b; see `docs/plans/counter-asic-3-node.md`). for G4b; see `docs/plans/counter-asic-3-node.md`).
Latency ladder gate (`docs/design/latency-ladder.md` section 9): `node infra/fast-time/latency-ladder.mjs --signal up,up,up --expect step`
(3 nodes on ports 29720 and up, `igneum-devnet-972`, data `/tmp/igneum-fast-time-ladder`, class v4 from genesis with class
signalling off, the ladder active from DAA 0 with a 60-DAA window, each node's bits from `IGNEUM_LADDER_SIGNAL`; the step to
rung 1 at epoch 8, the first with seven full windows, the rung-1 program ids against the CLI's `--shadow-reps 35`, and no
second step inside the next two epochs; `--signal up,up,none --expect no-step` holds rung 0 for 10 epochs; `--signal
up,up,none --expect step` is the known-failed case and must report FAIL).
Miners: `igneum-miner` follows the epoch length and lead its node reports in every template (`pow_epoch`), no flag. Miners: `igneum-miner` follows the epoch length and lead its node reports in every template (`pow_epoch`), no flag.
The dataset day is not in the template, so a real-hash miner on a fast-time network takes `IGNEUM_POW_DAY_MS=1440000` The dataset day is not in the template, so a real-hash miner on a fast-time network takes `IGNEUM_POW_DAY_MS=1440000`
in its environment (the node reads it from the file). The environment variables `IGNEUM_POW_EPOCH_BLOCKS`, in its environment (the node reads it from the file). The environment variables `IGNEUM_POW_EPOCH_BLOCKS`,
@ -70,6 +77,8 @@ Time parameters, divided by 60 (devnet value, 60x value):
| `program_class_v3_activation_daa` | never | never | a height, not a clock: the lottery hash draws programs from class v3 (Counter ASIC 2.0, 5 Oct 2026) from the first EPOCH whose start is at or above this DAA score (rounded up to an epoch boundary: at 60 DAA per epoch, 150 means epoch 3 at DAA 180); `infra/fast-time/class-v3.mjs` sets it a few epochs ahead in its merged file | | `program_class_v3_activation_daa` | never | never | a height, not a clock: the lottery hash draws programs from class v3 (Counter ASIC 2.0, 5 Oct 2026) from the first EPOCH whose start is at or above this DAA score (rounded up to an epoch boundary: at 60 DAA per epoch, 150 means epoch 3 at DAA 180); `infra/fast-time/class-v3.mjs` sets it a few epochs ahead in its merged file |
| `program_class_v4_activation_daa` | never | never | a height, not a clock: the lottery hash draws programs from class v4 (Counter ASIC 3.0, 6 Oct 2026: class v3 plus the latency-shadow block) from the first EPOCH whose start is at or above this DAA score, rounded up like the v3 switch; `infra/fast-time/class-v4.mjs` sets it a few epochs ahead in its merged file | | `program_class_v4_activation_daa` | never | never | a height, not a clock: the lottery hash draws programs from class v4 (Counter ASIC 3.0, 6 Oct 2026: class v3 plus the latency-shadow block) from the first EPOCH whose start is at or above this DAA score, rounded up like the v3 switch; `infra/fast-time/class-v4.mjs` sets it a few epochs ahead in its merged file |
| `program_class_v4_signal_window_daa` | 86,400 | 120 | a DAA window (one day of blocks), divided by 60 and rounded to two epochs: the class v4 signal tally (PROPOSED, `docs/plans/counter-asic-3-node.md` section 6) over the blue blocks below each epoch's seed block; 0 = off; `infra/fast-time/class-v4-signal.mjs` is its gate | | `program_class_v4_signal_window_daa` | 86,400 | 120 | a DAA window (one day of blocks), divided by 60 and rounded to two epochs: the class v4 signal tally (PROPOSED, `docs/plans/counter-asic-3-node.md` section 6) over the blue blocks below each epoch's seed block; 0 = off; `infra/fast-time/class-v4-signal.mjs` is its gate |
| `latency_ladder_window_daa` | 86,400 | 120 | a DAA window (one day of blocks), divided by 60 and rounded to two epochs as the class window is: one of the seven windows of the latency ladder's step rule (`docs/design/latency-ladder.md`); `infra/fast-time/latency-ladder.mjs` is its gate and passes `--window 60` by default |
| `latency_ladder_activation_daa`, `latency_ladder` | never, the designed six rungs | the same | a height and a genesis list, not clocks: the ladder runs from the first epoch at or above the height (rung 0 until a signal moves it); the harness sets 0 in its merged file |
| `proving_v1_fresh_rule_daa`, `exec_restart_number`, `exec_restart_trust_daa`, `exec_restart_hash` | never, never, never, "" | the same | heights and a hash, not clocks (the 0.3.12 and 0.3.13 switches); present so the fork's every-field test (`fast_time_60x_file_is_the_devnet_at_60x`) holds; added 6 Oct 2026 with the class v4 field | | `proving_v1_fresh_rule_daa`, `exec_restart_number`, `exec_restart_trust_daa`, `exec_restart_hash` | never, never, never, "" | the same | heights and a hash, not clocks (the 0.3.12 and 0.3.13 switches); present so the fork's every-field test (`fast_time_60x_file_is_the_devnet_at_60x`) holds; added 6 Oct 2026 with the class v4 field |
Unchanged, and why: Unchanged, and why:

View file

@ -0,0 +1,277 @@
#!/usr/bin/env node
// The latency ladder's fast-time gate (docs/design/latency-ladder.md section 9; the class-v4-signal.mjs shape): a 3-node
// network on override-60x.json, class v4 from genesis (v3 and the v4 floor at 0, the class window 0: class signalling off,
// so the ladder opens the header's high byte on its own), the ladder active from DAA 0 with one window of --window DAA
// (default 60, one epoch; seven windows = 420 DAA, so the first epoch whose seed block has seven full windows below it is
// epoch 8 at DAA 480), each node's ladder signal set by IGNEUM_LADDER_SIGNAL (--signal a,b,c of up|down|none), one real CPU
// miner per node. Ports 29720 and up, network igneum-devnet-972, data /tmp/igneum-fast-time-ladder.
//
// The cases and the known-failed case:
// --signal up,up,none --expect no-step two of three miners signal up: about 67 percent, rung 0 must hold (run 10 epochs)
// --signal up,up,up --expect step all three: rung 1 (35 shadow passes) from epoch 8, the first with seven full
// windows, every miner's rung-1 program id equal to the CLI's --shadow-reps 35 id and
// unequal to the rung-0 id, and NO second step inside the next two epochs
// --signal up,up,none --expect step the known-failed case: the harness must report FAIL (no step happened)
//
// node infra/fast-time/latency-ladder.mjs --signal a,b,c --expect step|no-step [--window 60] [--secs 900] [--epochs 10]
// IGNEUMD, IGNEUM_MINER, IGNEUM_POW name the binaries (defaults: the ladder fork worktree's target/release and
// igneum-pow/target/release/igneum-pow, the layout on igneum-build-1 under /srv/builds/igneum-wt-ladder).
import { spawn, spawnSync } from 'node:child_process';
import { mkdirSync, rmSync, writeFileSync, readFileSync, openSync, existsSync } from 'node:fs';
import { connectRpc } from '../../tools/finality-attacks/lib/rpc.mjs';
import { devAddress } from '../../tools/harness/lib/address.mjs';
const ROOT = new URL('../../', import.meta.url).pathname;
const FILE = `${ROOT}infra/fast-time/override-60x.json`;
const BIN = process.env.IGNEUM_LADDER_BIN || `${ROOT}vendor/igneum-node-ladder/target/release`;
const IGNEUMD = process.env.IGNEUMD || `${BIN}/igneumd`;
const CPU_MINER = process.env.IGNEUM_MINER || `${BIN}/igneum-miner`;
const IGNEUM_POW = process.env.IGNEUM_POW || `${ROOT}igneum-pow/target/release/igneum-pow`;
const TMP = process.env.IGNEUM_LADDER_TMP || '/tmp/igneum-fast-time-ladder';
const BASE = 29720, SUFFIX = 972;
const NEVER = '18446744073709551615';
const RUNG0 = 27, RUNG1 = 35, WINDOWS = 7, THRESHOLD = 9000;
const args = process.argv.slice(2);
const flag = (name, dflt) => { const i = args.indexOf(`--${name}`); return i >= 0 ? +args[i + 1] : dflt; };
const sflag = (name) => { const i = args.indexOf(`--${name}`); return i >= 0 ? args[i + 1] : null; };
const GENESIS_BITS = flag('genesis-bits', 0x1f010000);
const SECS = flag('secs', 900);
const EPOCHS = flag('epochs', 10);
const WINDOW = flag('window', 60);
const SIGNAL = (sflag('signal') || 'up,up,up').split(',').map(s => s.trim().toLowerCase());
const EXPECT = sflag('expect') || 'step';
if (!['step', 'no-step'].includes(EXPECT) || SIGNAL.length !== 3 || !SIGNAL.every(s => ['up', 'down', 'none'].includes(s))) { console.error('usage: --signal a,b,c (up|down|none) --expect step|no-step'); process.exit(2); }
const started = [];
const log = (...a) => console.log(new Date().toISOString().slice(11, 23), ...a);
const sleep = (ms) => new Promise(r => setTimeout(r, ms));
for (const b of [IGNEUMD, CPU_MINER]) if (!existsSync(b)) { console.error(`missing ${b}`); process.exit(2); }
rmSync(TMP, { recursive: true, force: true }); mkdirSync(TMP, { recursive: true });
const baseText = readFileSync(FILE, 'utf8');
const field = (name) => { const m = new RegExp(`"${name}":\\s*([0-9]+)`).exec(baseText); return m ? +m[1] : undefined; };
const EPOCH = field('pow_epoch_blocks');
const LEAD = field('pow_epoch_lead');
const DAY_MS = field('pow_day_ms');
// the first epoch whose seed block (the last chain block below L*e - lead) can have DAA >= 7 x WINDOW: L*e - lead - 1 >= 7W
let FIRST_STEP_EPOCH = 0;
while (FIRST_STEP_EPOCH * EPOCH - LEAD - 1 < WINDOWS * WINDOW) FIRST_STEP_EPOCH++;
function mergeOverrideText(text, fields) {
let out = text;
for (const k of Object.keys(fields)) out = out.replace(new RegExp(`\\s*"${k}":\\s*[^,}\\n]+,?`), '');
const extra = Object.entries(fields).map(([k, v]) => `"${k}": ${typeof v === 'string' && !/^\d+$/.test(v) ? JSON.stringify(v) : v}`).join(', ');
return out.replace(/,?\s*}\s*$/, `,\n ${extra}\n}\n`);
}
const override = `${TMP}/override.json`;
writeFileSync(override, mergeOverrideText(baseText, {
genesis_bits: GENESIS_BITS, skip_proof_of_work: false,
program_class_v3_activation_daa: '0', program_class_v4_activation_daa: '0', program_class_v4_signal_window_daa: '0',
latency_ladder_activation_daa: '0', latency_ladder_window_daa: String(WINDOW),
}));
log(`signals ${SIGNAL.join('/')}, expect ${EXPECT}; class v4 from genesis, the ladder active from DAA 0, window ${WINDOW} DAA x ${WINDOWS} (the first epoch that can step is ${FIRST_STEP_EPOCH}, DAA ${FIRST_STEP_EPOCH * EPOCH}); ${EPOCH} DAA per epoch, lead ${LEAD}; run ${SECS} s or ${EPOCHS} epochs`);
class Node {
constructor(i, connect = []) {
this.i = i; this.grpcPort = BASE + i * 10; this.p2pPort = BASE + i * 10 + 1; this.jsonPort = BASE + i * 10 + 2;
this.connect = connect; this.dir = `${TMP}/n${i}`; this.logFile = `${this.dir}/node.log`;
}
get grpc() { return `grpc://127.0.0.1:${this.grpcPort}`; }
async start() {
mkdirSync(this.dir, { recursive: true });
const a = ['--devnet', `--devnet-suffix=${SUFFIX}`, '--nodnsseed', '--disable-upnp', '--nologfiles', '--enable-unsynced-mining', '--utxoindex',
`--appdir=${this.dir}`, `--rpclisten=127.0.0.1:${this.grpcPort}`, `--rpclisten-json=127.0.0.1:${this.jsonPort}`,
`--listen=127.0.0.1:${this.p2pPort}`, `--override-params-file=${override}`, '--loglevel=info', '--yes'];
if (this.connect.length) a.push(`--connect=${this.connect.join(',')}`); else a.push('--outpeers=0');
const out = openSync(this.logFile, 'a');
// the node's own ladder signal: what its templates carry in bits 15 and 14
this.proc = spawn(IGNEUMD, a, { stdio: ['ignore', out, out], env: { ...process.env, IGNEUM_LADDER_SIGNAL: SIGNAL[this.i] } });
started.push(this.proc);
await sleep(1200);
this.rpc = await connectRpc(`ws://127.0.0.1:${this.jsonPort}`);
log(`n${this.i} up pid ${this.proc.pid} json ${this.jsonPort} p2p ${this.p2pPort}, signals ${SIGNAL[this.i]}`);
return this;
}
grepLog(re) { try { return readFileSync(this.logFile, 'utf8').split('\n').filter(l => re.test(l)); } catch { return []; } }
}
function miner(bin, argv, name, env = {}) {
const out = openSync(`${TMP}/${name}.log`, 'a');
const p = spawn(bin, argv, { stdio: ['ignore', out, out], env: { ...process.env, ...env } });
started.push(p);
return p;
}
async function stopAll() {
for (const p of started.reverse()) { try { p.kill('SIGINT'); } catch { } }
await sleep(1500);
for (const p of started) { try { p.kill('SIGKILL'); } catch { } }
}
process.on('SIGINT', async () => { await stopAll(); process.exit(130); });
process.on('unhandledRejection', async (e) => { log(`FAILED: ${e?.stack || e}`); await stopAll(); process.exit(3); });
const minerLog = (i) => { try { return readFileSync(`${TMP}/cpu${i}.log`, 'utf8').split('\n'); } catch { return []; } };
const STEP_LINE = /Latency ladder step by miner signal: epoch (\d+) moves to rung (\d+) \((\d+) shadow passes, from rung (\d+)\): (up|down) in each of (\d+) consecutive windows of (\d+) DAA .*weakest up (\d+) bps, weakest down (\d+) bps/;
const LADDER_LINE = /Latency ladder from the override file/;
const ACTIVE_LINE = /Latency ladder active: rungs/;
const OWN_LINE = /Latency ladder signal from IGNEUM_LADDER_SIGNAL: this node signals (\w+)/;
const t0 = Date.now();
const since = () => ((Date.now() - t0) / 1000).toFixed(1);
const n0 = await new Node(0).start();
const n1 = await new Node(1, [`127.0.0.1:${n0.p2pPort}`]).start();
const n2 = await new Node(2, [`127.0.0.1:${n0.p2pPort}`]).start();
const nodes = [n0, n1, n2];
for (const n of nodes) log(`n${n.i}: ${n.grepLog(LADDER_LINE).map(l => l.replace(/^.*?(Latency ladder from)/, '$1'))[0] || '(no ladder line)'} | ${n.grepLog(OWN_LINE).map(l => l.replace(/^.*?(this node signals)/, '$1'))[0] || '(no signal line)'}`);
log(`n0 digest: ${n0.grepLog(/Consensus params digest/).map(l => l.replace(/^.*?digest: /, '').slice(0, 16)).join(' ')}`);
nodes.forEach((n, i) => miner(CPU_MINER, ['mine', n.grpc, '1', String(SECS), `cpu${i}`, '--engine', 'igneum-pow', '--payout-label', `cpu${i}`, '--status-secs', '30', '--no-vote'], `cpu${i}`, { IGNEUM_POW_DAY_MS: String(DAY_MS) }));
const pay = devAddress('fast-time-ladder');
const epochs = new Map();
let firstStep = null, lastEpoch = -1, lastReport = 0, lastDaa = 0, endAt = null;
const samples = [];
while (Date.now() - t0 < SECS * 1000) {
await sleep(1000);
let daa = null, epoch = null, cls = null, reps = null, nextReps = null, step = null, nextStep = null, up = null, upWeak = null, down = null, sig = null, stepEpoch = null, eraSeed = null;
try {
const t = await n0.rpc.call('getBlockTemplate', { payAddress: pay, extraData: [] });
const pe = t.powEpoch || t.pow_epoch || {};
daa = pe.virtualDaaScore ?? t.block?.header?.daaScore; epoch = pe.epochIndex; cls = pe.programClass; eraSeed = pe.eraSeed;
reps = pe.latencyLadderReps; nextReps = pe.nextLatencyLadderReps; step = pe.latencyLadderStep; nextStep = pe.nextLatencyLadderStep;
up = pe.latencyLadderUpBps; upWeak = pe.latencyLadderUpWeakestBps; down = pe.latencyLadderDownBps; sig = pe.latencyLadderSignal; stepEpoch = pe.latencyLadderStepEpoch;
} catch (e) { log(`template: ${e.message}`); }
if (epoch != null && epoch !== lastEpoch) {
epochs.set(epoch, { class: cls, reps, step, firstSeenDaa: daa, at: +since(), eraSeed: eraSeed == null ? null : String(eraSeed), up_bps: up, up_weakest_bps: upWeak, down_bps: down, step_epoch: stepEpoch ?? null });
log(`epoch ${lastEpoch} -> ${epoch} at daa ${daa}, ${since()} s: template class ${cls} rung ${step} (${reps} passes), next rung ${nextStep} (${nextReps}), up ${up} bps (weakest of ${WINDOWS}: ${upWeak}), down ${down} bps, this node signals ${sig}, step took effect at epoch ${stepEpoch ?? 'none'}`);
if (firstStep == null && step > 0) { firstStep = { epoch, daa, step, reps, at: +since() }; log(`LADDER STEP: the template is rung ${step} (${reps} shadow passes) from epoch ${epoch} (daa ${daa}) at ${since()} s wall`); }
lastEpoch = epoch;
}
lastDaa = daa ?? lastDaa;
if (Date.now() - lastReport > 15000) {
lastReport = Date.now();
const counts = await Promise.all(nodes.map(async n => { try { const d = await n.rpc.call('getBlockDagInfo'); return `${d.blockCount}/${String(d.sink).slice(0, 8)}`; } catch { return '?'; } }));
log(`t=${since()} s daa ${daa} epoch ${epoch} rung ${step} (${reps}) up ${up} bps weakest ${upWeak} blocks/sink per node ${counts.join(' ')}`);
samples.push({ t: +since(), daa, epoch, step, reps, up_bps: up, up_weakest_bps: upWeak, nodes: counts });
}
// the end: two epochs after a step (to show no second step), or --epochs epochs when no step is expected
if (firstStep != null && daa != null && daa >= (firstStep.epoch + 2) * EPOCH + LEAD) { endAt = +since(); break; }
if (firstStep == null && daa != null && daa >= EPOCHS * EPOCH) { endAt = +since(); break; }
}
await sleep(3000);
const dag = await Promise.all(nodes.map(async n => { try { return await n.rpc.call('getBlockDagInfo'); } catch (e) { return { error: e.message }; } }));
const genesis = dag[0].pruningPointHash;
async function allBlocks(n) {
const out = []; let low = genesis; const seen = new Set();
for (let round = 0; round < 500; round++) {
const r = await n.rpc.call('getBlocks', { lowHash: low, includeBlocks: true, includeTransactions: false });
const blocks = r.blocks || [];
let added = 0;
for (const b of blocks) { const h = b.verboseData?.hash || b.header?.hash; if (seen.has(h)) continue; seen.add(h); out.push({ hash: h, daa: +b.header.daaScore, version: +b.header.version, chain: !!b.verboseData?.isChainBlock }); added++; }
if (!blocks.length || added === 0) break;
low = (r.blockHashes || []).at(-1) || blocks.at(-1).verboseData?.hash; if (!low) break;
}
return out;
}
let blocks = [];
try { blocks = await allBlocks(n0); } catch (e) { log(`getBlocks: ${e.message}`); }
const BOUNDARY = firstStep ? firstStep.epoch * EPOCH : Infinity;
const before = blocks.filter(b => b.daa < BOUNDARY), after = blocks.filter(b => b.daa >= BOUNDARY);
// the ladder bits on the chain: bit 15 up, bit 14 down; the object byte (bits 8 to 13) must be 0 (class signalling off)
const bitsOf = (v) => (v & 0x8000) ? 'up' : (v & 0x4000) ? 'down' : 'none';
const ladderBits = blocks.reduce((m, b) => { const k = bitsOf(b.version); m[k] = (m[k] || 0) + 1; return m; }, {});
const upShareOnChain = blocks.length ? Math.round(10000 * (blocks.filter(b => bitsOf(b.version) === 'up').length) / blocks.length) : 0;
const objectBytes = blocks.reduce((m, b) => { const v = (b.version >> 8) & 0x3f; m[v] = (m[v] || 0) + 1; return m; }, {});
// genesis carries header version 0 (genesis.rs), every mined block the block version 2 in its low byte
const lowBytes = new Set(blocks.filter(b => b.daa > 0).map(b => b.version & 0xff));
const programs = new Map();
for (const i of [0, 1, 2]) for (const l of minerLog(i)) {
const m = /epoch seed ([0-9a-f]{64}) day (\d+) \(daa (\d+)\): program and 256 MiB cache ready in ([\d.]+) ms; class (v\d) program id ([0-9a-f]{16})/.exec(l);
if (!m) continue;
const k = m[1]; const e = programs.get(k) || { seed: k.slice(0, 16), epoch: Math.floor(+m[3] / EPOCH), class: m[5], id: m[6], miners: new Set() };
if (e.id !== m[6] || e.class !== m[5]) e.disagree = true;
e.miners.add(i); programs.set(k, e);
}
const programRows = [...programs.values()].sort((a, b) => a.epoch - b.epoch).map(p => ({ epoch: p.epoch, class: p.class, program_id: p.id, seed: p.seed, miners: p.miners.size, disagree: !!p.disagree }));
function cliId(seedHex, eraHex, reps) {
if (!existsSync(IGNEUM_POW)) return null;
const r = spawnSync(IGNEUM_POW, ['show', '--epoch-hex', seedHex, '--program-class', 'v4', '--era-hex', eraHex, '--shadow-reps', String(reps)], { encoding: 'utf8' });
const m = /program id ([0-9a-f]{16})/.exec(r.stdout || '');
return m ? m[1] : null;
}
const idRows = [];
for (const [k, e] of programs) {
const ep = epochs.get(e.epoch);
if (!ep || ep.eraSeed == null) continue;
const reps = ep.reps ?? 0;
idRows.push({ epoch: e.epoch, seed: e.seed, reps, miners_id: e.id, miners: e.miners.size, cli_rung0: cliId(k, ep.eraSeed, 0), cli_at_reps: cliId(k, ep.eraSeed, reps) });
}
const steppedRows = idRows.filter(r => r.reps !== RUNG0 && r.reps !== 0);
const accepted = [0, 1, 2].map(i => minerLog(i).filter(l => /ACCEPTED block/.test(l)).length);
const rejectedMiner = [0, 1, 2].map(i => minerLog(i).filter(l => /rejected nonce=|submit error/.test(l)));
const rejectedNode = nodes.map(n => n.grepLog(/PoW rejected|Rejected block|rejected block/i));
const stepLines = nodes.map(n => n.grepLog(STEP_LINE).map(l => l.replace(/^.*?(Latency ladder step by miner signal)/, '$1')));
const firstStepLine = stepLines.map(ls => ls[0] || null);
const stepEpochs = firstStepLine.map(l => { const m = l && STEP_LINE.exec(l); return m ? +m[1] : null; });
const stepRungs = firstStepLine.map(l => { const m = l && STEP_LINE.exec(l); return m ? +m[2] : null; });
const stepWeakestUp = firstStepLine.map(l => { const m = l && STEP_LINE.exec(l); return m ? +m[8] : null; });
const sinks = dag.map(d => String(d.sink || '?').slice(0, 16));
const counts = dag.map(d => d.blockCount ?? '?');
const maxEpochSeen = Math.max(-1, ...epochs.keys());
const repsSeen = [...epochs.values()].map(e => e.reps);
const afterStep = firstStep ? [...epochs.entries()].filter(([e]) => e > firstStep.epoch).map(([, v]) => v.step) : [];
const common = {
zero_rejected_by_miners: rejectedMiner.every(r => r.length === 0),
zero_rejected_by_nodes: rejectedNode.every(r => r.length === 0),
sinks_agree: new Set(sinks).size === 1,
block_counts_agree: new Set(counts.map(String)).size === 1,
miners_agree_on_every_program: programRows.every(p => !p.disagree),
ladder_line_on_every_node: nodes.every(n => n.grepLog(LADDER_LINE).length > 0 && n.grepLog(ACTIVE_LINE).length > 0),
every_node_signals_its_bits: nodes.every((n, i) => n.grepLog(OWN_LINE).some(l => OWN_LINE.exec(l)[1] === SIGNAL[i])),
every_epoch_class_v4: [...epochs.values()].every(e => e.class === 4),
rung0_ids_equal_the_cli_rung0_id: idRows.filter(r => r.reps === RUNG0).length > 0 && idRows.filter(r => r.reps === RUNG0).every(r => r.cli_rung0 != null && r.cli_rung0 === r.miners_id),
};
// every block carries block version 2, an object byte of 0 (class signalling off) and the ladder bits of one of the three
// nodes; genesis, made before any node, is the one bit-less block when every node signals (the first run of the known-failed
// case, 22:26Z, failed this check on genesis's version 0 in the low-byte test, a harness fault, not a chain one)
const noneNodes = SIGNAL.filter(s => s === 'none').length;
common.chain_carries_the_bits = blocks.length > 0 && [...lowBytes].every(v => v === 2) && Object.keys(objectBytes).every(v => +v === 0)
&& Object.keys(ladderBits).every(k => SIGNAL.includes(k) || k === 'none') && (noneNodes > 0 || (ladderBits.none || 0) === 1);
let checks;
if (EXPECT === 'step') {
checks = {
...common,
template_stepped_to_rung_1: firstStep != null && firstStep.step === 1 && firstStep.reps === RUNG1,
stepped_at_the_first_full_window_epoch: firstStep != null && firstStep.epoch === FIRST_STEP_EPOCH,
step_line_on_every_node_same_epoch: stepEpochs.every(e => e != null) && new Set(stepEpochs).size === 1 && stepEpochs[0] === (firstStep && firstStep.epoch) && stepRungs.every(r => r === 1),
weakest_up_at_or_above_threshold: stepWeakestUp.every(s => s != null && s >= THRESHOLD),
no_second_step_inside_seven_windows: firstStep != null && afterStep.length >= 2 && afterStep.every(s => s === 1) && stepLines.every(ls => ls.length === 1),
blocks_on_both_sides: before.length > 0 && after.length > 0,
rung1_ids_equal_the_cli_rung1_id: steppedRows.length > 0 && steppedRows.every(r => r.reps === RUNG1 && r.cli_at_reps != null && r.cli_at_reps === r.miners_id && r.miners === 3),
rung1_ids_differ_from_the_same_seed_rung0_id: steppedRows.length > 0 && steppedRows.every(r => r.cli_rung0 != null && r.cli_rung0 !== r.miners_id),
};
} else {
checks = {
...common,
template_never_above_rung_0: firstStep == null && repsSeen.every(r => r === RUNG0 || r === 0),
no_step_line_on_any_node: stepLines.every(ls => ls.length === 0),
ran_the_epochs: maxEpochSeen >= EPOCHS - 1,
passed_the_first_full_window_epoch: maxEpochSeen >= FIRST_STEP_EPOCH,
up_share_under_threshold_on_chain: upShareOnChain < THRESHOLD,
};
}
const pass = Object.values(checks).every(Boolean);
const summary = {
pass, expect: EXPECT, signals: SIGNAL, checks, window: WINDOW, windows: WINDOWS, threshold_bps: THRESHOLD, epoch_blocks: EPOCH, lead: LEAD, first_step_epoch: FIRST_STEP_EPOCH,
node: IGNEUMD, miner: CPU_MINER, pow: IGNEUM_POW, template_step: firstStep, run_ended_at_s: endAt, final_daa: lastDaa, max_epoch_seen: maxEpochSeen,
epochs: Object.fromEntries([...epochs.entries()].map(([k, v]) => [k, v])),
blocks: { total: blocks.length, before_boundary: before.length, after_boundary: after.length, ladder_bits: ladderBits, object_bytes: objectBytes, up_share_bps_on_chain: upShareOnChain },
programs: programRows, program_id_rows: idRows, accepted_per_miner: accepted,
rejected_by_miners: rejectedMiner.map(r => r.length), rejected_by_nodes: rejectedNode.map(r => r.length),
sinks, block_counts: counts, step_lines: stepLines, samples,
};
writeFileSync(`${TMP}/summary.json`, JSON.stringify(summary, null, 2));
log(`SUMMARY ${pass ? 'PASS' : 'FAIL'} (expect ${EXPECT}, signals ${SIGNAL.join('/')}): ${firstStep ? `rung ${firstStep.step} (${firstStep.reps} passes) from epoch ${firstStep.epoch} at DAA ${firstStep.daa}` : 'no step'}; epochs seen ${[...epochs.entries()].map(([e, v]) => `e${e}:r${v.step}:${v.up_weakest_bps}bps`).join(' ')}; chain bits ${JSON.stringify(ladderBits)} (${upShareOnChain} bps up); blocks ${before.length} / ${after.length}; rejected miners ${rejectedMiner.map(r => r.length).join('/')} nodes ${rejectedNode.map(r => r.length).join('/')}; sinks ${sinks.join(' ')} at ${counts.join('/')}`);
for (const r of idRows) log(`PROGRAM ID epoch ${r.epoch} seed ${r.seed} reps ${r.reps}: miners ${r.miners_id} (${r.miners} of 3) cli at reps ${r.cli_at_reps} cli rung 0 ${r.cli_rung0}`);
for (const [k, v] of Object.entries(checks)) if (!v) log(`FAILED CHECK ${k}`);
log(`summary: ${TMP}/summary.json`);
await stopAll();
process.exit(pass ? 0 : 1);

View file

@ -52,14 +52,20 @@
"pow_epoch_lead": 10, "pow_epoch_lead": 10,
"pow_day_ms": 1440000, "pow_day_ms": 1440000,
"difficulty_v2_activation_daa": 18446744073709551615, "difficulty_v2_activation_daa": 18446744073709551615,
"difficulty_v3_activation_daa": 18446744073709551615,
"finality_daa_rule_activation_daa": 18446744073709551615,
"proving_v0_activation_daa": 18446744073709551615, "proving_v0_activation_daa": 18446744073709551615,
"finality_v3_activation_daa": 18446744073709551615, "finality_v3_activation_daa": 18446744073709551615,
"program_class_v3_activation_daa": 18446744073709551615, "program_class_v3_activation_daa": 18446744073709551615,
"program_class_v4_activation_daa": 18446744073709551615, "program_class_v4_activation_daa": 18446744073709551615,
"program_class_v4_signal_window_daa": 120, "program_class_v4_signal_window_daa": 120,
"latency_ladder": [{"reps": 27, "admissible": true}, {"reps": 35, "admissible": true}, {"reps": 53, "admissible": true}, {"reps": 88, "admissible": false}, {"reps": 173, "admissible": false}, {"reps": 267, "admissible": false}],
"latency_ladder_activation_daa": 18446744073709551615,
"latency_ladder_window_daa": 120,
"proving_v1_fresh_rule_daa": 18446744073709551615, "proving_v1_fresh_rule_daa": 18446744073709551615,
"exec_restart_number": 18446744073709551615, "exec_restart_number": 18446744073709551615,
"exec_restart_hash": "", "exec_restart_hash": "",
"exec_restart_state_root": "",
"exec_restart_trust_daa": 18446744073709551615, "exec_restart_trust_daa": 18446744073709551615,
"pow_genesis_dataset_log2": 28, "pow_genesis_dataset_log2": 28,
"proving_v1_activation_daa": 18446744073709551615, "proving_v1_activation_daa": 18446744073709551615,

View file

@ -4,13 +4,13 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>Igneum ledger: every criticism, answered</title> <title>Igneum ledger: every criticism, answered</title>
<meta name="description" content="Every criticism Igneum expects, in the critic's words, with what was done, the status and the date. 179 entries. Nothing deleted, nothing softened."> <meta name="description" content="Every criticism Igneum expects, in the critic's words, with what was done, the status and the date. 180 entries. Nothing deleted, nothing softened.">
<link rel="canonical" href="https://igneum.network/ledger"> <link rel="canonical" href="https://igneum.network/ledger">
<meta name="theme-color" content="#0C0C0E"> <meta name="theme-color" content="#0C0C0E">
<meta property="og:type" content="website"> <meta property="og:type" content="website">
<meta property="og:site_name" content="Igneum"> <meta property="og:site_name" content="Igneum">
<meta property="og:title" content="Igneum ledger: every criticism, answered"> <meta property="og:title" content="Igneum ledger: every criticism, answered">
<meta property="og:description" content="179 criticisms in the critic's words, with what was done, the status and the date."> <meta property="og:description" content="180 criticisms in the critic's words, with what was done, the status and the date.">
<meta property="og:url" content="https://igneum.network/ledger"> <meta property="og:url" content="https://igneum.network/ledger">
<meta property="og:image" content="https://igneum.network/og-small.png?v=3"> <meta property="og:image" content="https://igneum.network/og-small.png?v=3">
<meta property="og:image:width" content="256"> <meta property="og:image:width" content="256">
@ -18,7 +18,7 @@
<meta property="og:image:alt" content="Igneum. Mined by GPUs. Proven by fire."> <meta property="og:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
<meta name="twitter:card" content="summary"> <meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Igneum ledger: every criticism, answered"> <meta name="twitter:title" content="Igneum ledger: every criticism, answered">
<meta name="twitter:description" content="179 criticisms in the critic's words, with what was done, the status and the date."> <meta name="twitter:description" content="180 criticisms in the critic's words, with what was done, the status and the date.">
<meta name="twitter:image" content="https://igneum.network/og-small.png?v=3"> <meta name="twitter:image" content="https://igneum.network/og-small.png?v=3">
<meta name="twitter:image:alt" content="Igneum. Mined by GPUs. Proven by fire."> <meta name="twitter:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
<link rel="icon" href="/favicon.ico" sizes="48x48"> <link rel="icon" href="/favicon.ico" sizes="48x48">
@ -51,10 +51,21 @@
</script> </script>
<!-- head:end --> <!-- head:end -->
<style> <style>
/* page block; tokens, type and components are in /site.css */ :root{--obsidian:#0C0C0E;--graphite:#16161A;--line:#2A2A30;--line-2:#3A3A42;--ember:#F2541B;--molten:#FFB35C;--bone:#F4F1EC;--ash:#9A9A9E;--ink-2:#C9C7C2;--max:1200px;--gutter:clamp(16px,4vw,32px);--sec:clamp(40px,6vw,72px)}
.entry code,.entry .did,.entry blockquote,.entry p,.entry h3{overflow-wrap:anywhere}.entry code{white-space:normal} *{box-sizing:border-box}
body{margin:0;background:var(--obsidian);color:var(--bone);font-family:var(--f-sans);font-size:16px;line-height:1.55;-webkit-font-smoothing:antialiased;overflow-x:hidden}
a{color:var(--ember);text-decoration:none}a:hover{color:var(--molten)}
.wrap{max-width:var(--max);margin:0 auto;padding-inline:var(--gutter)}
.eyebrow{font-family:var(--f-mono);font-size:12px;letter-spacing:.18em;text-transform:uppercase;color:var(--ash)}
h1{font-family:var(--f-display);font-weight:900;font-size:clamp(30px,5vw,52px);line-height:1.08;margin:10px 0 18px}
main h2{font-family:var(--f-display);font-weight:700;font-size:clamp(20px,2.6vw,28px);text-wrap:balance;margin:var(--sec) 0 16px;padding-top:8px;border-top:1px solid var(--line);scroll-margin-top:84px} main h2{font-family:var(--f-display);font-weight:700;font-size:clamp(20px,2.6vw,28px);text-wrap:balance;margin:var(--sec) 0 16px;padding-top:8px;border-top:1px solid var(--line);scroll-margin-top:84px}
h3{font-family:var(--f-sans);font-weight:600;font-size:17px;margin:0;flex:1 1 auto;min-width:0}
.intro{font-size:17px;color:var(--ink-2);max-width:76ch;margin:0 0 24px} .intro{font-size:17px;color:var(--ink-2);max-width:76ch;margin:0 0 24px}
.tbl{overflow-x:auto;border:1px solid var(--line);border-radius:16px;background:var(--graphite);margin:0 0 20px}
table{border-collapse:collapse;width:100%;font-size:15px;min-width:520px}
th,td{padding:11px 14px;text-align:left;vertical-align:top;border-bottom:1px solid var(--line)}
th{font-family:var(--f-mono);font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--ash);font-weight:500}
tr:last-child td{border-bottom:0}
td.num{font-family:var(--f-display);font-weight:700;font-size:22px;color:var(--ember);white-space:nowrap} td.num{font-family:var(--f-display);font-weight:700;font-size:22px;color:var(--ember);white-space:nowrap}
.chip{background:none;border:1px solid var(--line-2);color:var(--bone);border-radius:999px;padding:6px 12px;font:inherit;font-size:14px;cursor:pointer} .chip{background:none;border:1px solid var(--line-2);color:var(--bone);border-radius:999px;padding:6px 12px;font:inherit;font-size:14px;cursor:pointer}
.chip:hover,.chip.on{border-color:var(--ember);color:var(--molten)} .chip:hover,.chip.on{border-color:var(--ember);color:var(--molten)}
@ -70,7 +81,9 @@ blockquote{margin:10px 0;padding:10px 14px;border-left:3px solid var(--line-2);c
.status{font-size:15px;color:var(--ink-2)} .status{font-size:15px;color:var(--ink-2)}
.badge{display:inline-block;font-family:var(--f-mono);font-size:12px;letter-spacing:.06em;text-transform:uppercase;padding:3px 8px;border-radius:6px;border:1px solid var(--line-2);color:var(--bone);margin-right:6px;vertical-align:middle} .badge{display:inline-block;font-family:var(--f-mono);font-size:12px;letter-spacing:.06em;text-transform:uppercase;padding:3px 8px;border-radius:6px;border:1px solid var(--line-2);color:var(--bone);margin-right:6px;vertical-align:middle}
.b-open{border-color:var(--ember);color:var(--ember)}.b-conceded{border-color:var(--molten);color:var(--molten)}.b-fixed-or-built{border-color:#5cb85c;color:#8fd48f} .b-open{border-color:var(--ember);color:var(--ember)}.b-conceded{border-color:var(--molten);color:var(--molten)}.b-fixed-or-built{border-color:#5cb85c;color:#8fd48f}
code{font-family:var(--f-mono);font-size:13px;color:var(--bone);background:#0C0C0E;padding:1px 5px;border-radius:5px}
details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;color:var(--ash)}details p{margin:8px 0 0;color:var(--ink-2)} details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;color:var(--ash)}details p{margin:8px 0 0;color:var(--ink-2)}
.foot{margin-top:var(--sec)}
</style> </style>
</head> </head>
<body> <body>
@ -121,20 +134,20 @@ details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;co
<!-- nav:end --> <!-- nav:end -->
<main id="main" class="wrap"> <main id="main" class="wrap">
<header style="padding-block:clamp(40px,6vw,72px) 8px"> <header style="padding-block:clamp(40px,6vw,72px) 8px">
<div class="eyebrow">Ledger · 179 entries · regenerated from the repository</div> <div class="eyebrow">Ledger · 180 entries · regenerated from the repository</div>
<h1>Every criticism, answered or conceded</h1> <h1>Every criticism, answered or conceded</h1>
<p class="intro">This is every criticism the project expects, in the critic's words, with what was done about it and the date. 179 entries since 3 October 2026. Entries are never deleted; a status that changes keeps its history on the line. Where the critic was right the entry says Conceded. Where nothing has been done it says Open and names what settles it. The founder mined through the GPU years. Ethereum's move to proof of stake in September 2022 ended that income and the miners' place in that chain. This is one person building, with AI systems doing the engineering, the coin he wanted to exist for miners: GPU-mined, the miners are the provers, no founder allocation, every cost stated. Help is welcome and a team is wanted: cryptographers, node engineers, miners who will test. This ledger is the application form: pick an open row and write to <a href="mailto:hello@igneum.network">hello@igneum.network</a> with its id.</p> <p class="intro">This is every criticism the project expects, in the critic's words, with what was done about it and the date. 180 entries since 3 October 2026. Entries are never deleted; a status that changes keeps its history on the line. Where the critic was right the entry says Conceded. Where nothing has been done it says Open and names what settles it. The founder mined through the GPU years. Ethereum's move to proof of stake in September 2022 ended that income and the miners' place in that chain. This is one person building, with AI systems doing the engineering, the coin he wanted to exist for miners: GPU-mined, the miners are the provers, no founder allocation, every cost stated. Help is welcome and a team is wanted: cryptographers, node engineers, miners who will test. This ledger is the application form: pick an open row and write to <a href="mailto:hello@igneum.network">hello@igneum.network</a> with its id.</p>
</header> </header>
<div class="tbl"><table> <div class="tbl"><table>
<thead><tr><th>Count</th><th>Status</th><th>Meaning</th></tr></thead> <thead><tr><th>Count</th><th>Status</th><th>Meaning</th></tr></thead>
<tbody> <tbody>
<tr><td class="num">7</td><td><button type="button" class="chip" data-filter="Open">Open</button></td><td>Nothing has settled it yet. The entry names what will</td></tr> <tr><td class="num">7</td><td><button type="button" class="chip" data-filter="Open">Open</button></td><td>Nothing has settled it yet. The entry names what will</td></tr>
<tr><td class="num">62</td><td><button type="button" class="chip" data-filter="Conceded">Conceded</button></td><td>The critic is right. &quot;Stated&quot; means the public text says so; &quot;not yet stated&quot; means it does not yet</td></tr> <tr><td class="num">63</td><td><button type="button" class="chip" data-filter="Conceded">Conceded</button></td><td>The critic is right. &quot;Stated&quot; means the public text says so; &quot;not yet stated&quot; means it does not yet</td></tr>
<tr><td class="num">57</td><td><button type="button" class="chip" data-filter="Fixed or built">Fixed or built</button></td><td>A code, spec or text change answers it, with the commit or the page named</td></tr> <tr><td class="num">57</td><td><button type="button" class="chip" data-filter="Fixed or built">Fixed or built</button></td><td>A code, spec or text change answers it, with the commit or the page named</td></tr>
<tr><td class="num">27</td><td><button type="button" class="chip" data-filter="Closed by rule or decided">Closed by rule or decided</button></td><td>A consensus rule or a decision by the owner answers it, dated</td></tr> <tr><td class="num">27</td><td><button type="button" class="chip" data-filter="Closed by rule or decided">Closed by rule or decided</button></td><td>A consensus rule or a decision by the owner answers it, dated</td></tr>
<tr><td class="num">13</td><td><button type="button" class="chip" data-filter="Answered with evidence">Answered with evidence</button></td><td>A measurement or a simulation exists and is named</td></tr> <tr><td class="num">13</td><td><button type="button" class="chip" data-filter="Answered with evidence">Answered with evidence</button></td><td>A measurement or a simulation exists and is named</td></tr>
<tr><td class="num">13</td><td><button type="button" class="chip" data-filter="Answered by design">Answered by design</button></td><td>A design rule answers it; no measurement is possible yet</td></tr> <tr><td class="num">13</td><td><button type="button" class="chip" data-filter="Answered by design">Answered by design</button></td><td>A design rule answers it; no measurement is possible yet</td></tr>
<tr><td class="num">179</td><td><button type="button" class="chip" data-filter="">All</button></td><td>Every entry. The sections: <a href="#m">Mining and chips</a>, <a href="#f">Finality and attacks</a>, <a href="#p">Proving and the zkEVM</a>, <a href="#e">Economics and the coin</a>, <a href="#g">Governance and the founders</a>, <a href="#c">Comparisons</a>, <a href="#l">Legal and regulatory</a>, <a href="#x">Launch and operations</a>, <a href="#d">Builders</a></td></tr> <tr><td class="num">180</td><td><button type="button" class="chip" data-filter="">All</button></td><td>Every entry. The sections: <a href="#m">Mining and chips</a>, <a href="#f">Finality and attacks</a>, <a href="#p">Proving and the zkEVM</a>, <a href="#e">Economics and the coin</a>, <a href="#g">Governance and the founders</a>, <a href="#c">Comparisons</a>, <a href="#l">Legal and regulatory</a>, <a href="#x">Launch and operations</a>, <a href="#d">Builders</a></td></tr>
</tbody></table></div> </tbody></table></div>
<div class="toolbar"><input type="search" id="q" placeholder="Search the ledger" aria-label="Search the ledger"><span id="shown"></span></div> <div class="toolbar"><input type="search" id="q" placeholder="Search the ledger" aria-label="Search the ledger"><span id="shown"></span></div>
<h2 id="m">Mining and chips</h2> <h2 id="m">Mining and chips</h2>
@ -228,6 +241,12 @@ details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;co
<div class="status"><span class="badge b-conceded">Conceded, stated</span> <span class="did">6 October 2026, evening; the Horizon lane analysis <code>a repository file</code> section 5.1, the FPGA lane): the public FPGA line carries only the measured row, 2.4 G reads/s per card and 0.30x to 0.39x of the RTX 5090 per watt (Shuhai, FCCM 2020 Fig 7; the tFAW arithmetic from ICCAD 2021 Table I), and the 11.4 G bank-bound row and the 12.2 G ceiling are marked unmeasured until an AWS F2 hour measures them. Stated in <code>a repository file</code> section 5.3 (the activate-bound row marked UNMEASURED with the JEDEC figure beside it, and the FPGA paragraph after the table). The epoch-length analysis's 12.2 row is not on master yet and is corrected when it lands.</span></div> <div class="status"><span class="badge b-conceded">Conceded, stated</span> <span class="did">6 October 2026, evening; the Horizon lane analysis <code>a repository file</code> section 5.1, the FPGA lane): the public FPGA line carries only the measured row, 2.4 G reads/s per card and 0.30x to 0.39x of the RTX 5090 per watt (Shuhai, FCCM 2020 Fig 7; the tFAW arithmetic from ICCAD 2021 Table I), and the 11.4 G bank-bound row and the 12.2 G ceiling are marked unmeasured until an AWS F2 hour measures them. Stated in <code>a repository file</code> section 5.3 (the activate-bound row marked UNMEASURED with the JEDEC figure beside it, and the FPGA paragraph after the table). The epoch-length analysis's 12.2 row is not on master yet and is corrected when it lands.</span></div>
<details><summary>The answer as first written</summary><p>Correct. The measured 2.4 G/s had been read on 6 October as a mapping artefact (&quot;the paper's point is that this mapping is the wrong one for random access&quot;); the activate window says it is the DRAM's own limit, and a bank-interleaved mapping does not lift it because tFAW is enforced per channel by the die. The measurement that settles it is one AWS F2 hour (f2.6xlarge, Virtex UltraScale+ VU47P, 16 GB HBM2 in 2 stacks, 32 pseudo-channels, USD 1.98 an hour on demand): the chase kernel of <code>a repository file</code> 2.2 ported to a Vitis HLS AXI master over the HBM IP at 1 GiB across all 32 pseudo-channels, 256 to 4,096 lanes in flight, board power at 1 Hz; pass line 15 to 25 M reads/s/W (0.3x to 0.5x of the 5090), alarm 27 (0.5x), over 54 (1.0x) a Counter ASIC 4.0 item. Consequence per tier: none today (no FPGA mines); on the measured row a soft-overlay FPGA mines at an RX 9070 XT's rate per watt for about 7x the price (approximate), so no home or rig tier is displaced.</p></details> <details><summary>The answer as first written</summary><p>Correct. The measured 2.4 G/s had been read on 6 October as a mapping artefact (&quot;the paper's point is that this mapping is the wrong one for random access&quot;); the activate window says it is the DRAM's own limit, and a bank-interleaved mapping does not lift it because tFAW is enforced per channel by the die. The measurement that settles it is one AWS F2 hour (f2.6xlarge, Virtex UltraScale+ VU47P, 16 GB HBM2 in 2 stacks, 32 pseudo-channels, USD 1.98 an hour on demand): the chase kernel of <code>a repository file</code> 2.2 ported to a Vitis HLS AXI master over the HBM IP at 1 GiB across all 32 pseudo-channels, 256 to 4,096 lanes in flight, board power at 1 Hz; pass line 15 to 25 M reads/s/W (0.3x to 0.5x of the 5090), alarm 27 (0.5x), over 54 (1.0x) a Counter ASIC 4.0 item. Consequence per tier: none today (no FPGA mines); on the measured row a soft-overlay FPGA mines at an RX 9070 XT's rate per watt for about 7x the price (approximate), so no home or rig tier is displaced.</p></details>
</article> </article>
<article class="entry" id="M34" data-bucket="Conceded">
<div class="head"><span class="id">M34</span><h3>The shadow size N is a constant of the binary, so the one lever against the dataset-storing chip needs a fork to move</h3><span class="date">6 October 2026</span></div>
<blockquote>Your own Horizon lane says the reserve and the era draw buy nothing against a chip that stores the dataset, and that the only lever is the latency-shadow size N. N is 27 passes of a 256-instruction block, hard-coded in <code>V4_CLASS</code>. So when HBM4 doubles a chip's rate per stack in 2028, your answer is a hard fork, and a fork that retires the M5 Max at the first doubling. And now there is a shipping RandomX ASIC.</blockquote>
<div class="status"><span class="badge b-conceded">Conceded, implemented</span> <span class="did">6 October 2026, night; <code>a repository file</code>, branch <code>ladder</code>, fork branch <code>ladder-node</code>, the 0.3.17 feature tree, behind <code>latency_ladder_activation_daa</code>, never until set, 0 on the testnet when the owner says): N is a genesis ladder of six rungs (27, 35, 53, 88, 173, 267 passes; about 102,100 to 1,001,600 counted ops) with a measured admissibility flag per rung (cold verify under 10 ms on the reference core with its SMT sibling loaded, igneum-build-1, 6 October 2026: rungs 0 to 2 pass at 8.77, 8.87 and 9.23 ms, rung 3 misses by 0.08 ms under a box load of 25 and is out until a quiet re-run, rungs 4 and 5 are out at 12.38 and 14.96), and the step is consensus state derived from two bits of the header version: up one rung when 90 percent of blue blocks in each of seven consecutive windows ask for it and the rung above is admissible, down one rung symmetrically, never two rungs inside seven windows (the oldest window must begin after the last step took effect), never unconditionally. Tests, the known-failed case first: a changed N today hashes another program under the same program id (a hard fork no pack line told apart); after, rung 0 is class v4 byte for byte, a rung above carries its pass count in the id, 8,999 bps in one window of seven does not move the step, a two-step jump is impossible, down never passes rung 0, an inadmissible rung is never entered. Stated in <code>a repository file</code>, Mining section (&quot;The work that waits can grow&quot;).</span></div>
<details><summary>The answer as first written</summary><p>Correct on both counts, and the second was the sharper one. The X9 (Bitmain, about 1 MH/s at 2,472 W, approximate, github.com/monero-project/monero/issues/10270) is a shipped 3x per-joule edge over a desktop CPU on the best-known latency-bound random-program design, seven years after launch; it makes the k = 0.3 column of the chip model a product class rather than an attacker's claim, and the public headline is now the range 2.1x (k = 1) to 3.9x (k = 0.33) over the RTX 5090 at class v4, with the ladder taking the X9 bracket to about 2.8x by rung 2 and the Apple tier's to about 1.1x by rung 3. The ladder does not close the gap; it is the chain's only automatic answer, it moves at the pace of the cards that pay for it, and the honest card's watts remain the lever that moves every row (algorithm lane proposal 7). What the ladder gives up by design: a chip holding over 10 percent of weight can stall it, and the status quo it stalls is a rung the cards already run.</p></details>
</article>
<h2 id="f">Finality and attacks</h2> <h2 id="f">Finality and attacks</h2>
<article class="entry" id="F1" data-bucket="Fixed or built"> <article class="entry" id="F1" data-bucket="Fixed or built">
<div class="head"><span class="id">F1</span><h3>Finality is attackable for the first month</h3><span class="date">5 October 2026</span></div> <div class="head"><span class="id">F1</span><h3>Finality is attackable for the first month</h3><span class="date">5 October 2026</span></div>

View file

@ -344,7 +344,8 @@ body.all .pager{display:none}
</tbody> </tbody>
</table></div> </table></div>
<p>Three ideas carry the chip resistance. <strong>The hash rewrites itself.</strong> A new program every hour, drawn from the chain. Its memory pattern changes with it. The rules change on a schedule fixed at launch. No release, no vote. These are automatic schedule changes: they defeat a chip wired for one datapath and they need no human fork. Against a chip that stores the dataset every drawn parameter is firmware, and what meets that chip is the latency-shadow work (class v4) and the price per joule (the Horizon lane analysis, 6 October 2026, section 5.4; ledger M32). <strong>It waits on memory, not maths.</strong> Every hash is a chain of random reads into a table too big for a chip to carry. The wait is the same physics for everyone. <strong>Miners hold the switch.</strong> Spare defences are written into the rules, switched off. A miner signal turns one on, at the class-change threshold: miners signal three things at three thresholds, 60 percent of blue blocks over two weeks for a parameter genesis leaves open, 90 percent for an upgrade (new code), and 95 percent with a floor height for a class change. No fork.</p> <p>Three ideas carry the chip resistance. <strong>The hash rewrites itself.</strong> A new program every hour, drawn from the chain. Its memory pattern changes with it. The rules change on a schedule fixed at launch. No release, no vote. These are automatic schedule changes: they defeat a chip wired for one datapath and they need no human fork. Against a chip that stores the dataset every drawn parameter is firmware, and what meets that chip is the latency-shadow work (class v4) and the price per joule (the Horizon lane analysis, 6 October 2026, section 5.4; ledger M32). <strong>It waits on memory, not maths.</strong> Every hash is a chain of random reads into a table too big for a chip to carry. The wait is the same physics for everyone. <strong>Miners hold the switch.</strong> Spare defences are written into the rules, switched off. A miner signal turns one on, at the class-change threshold: miners signal three things at three thresholds, 60 percent of blue blocks over two weeks for a parameter genesis leaves open, 90 percent for an upgrade (new code), and 95 percent with a floor height for a class change. No fork.</p>
<p>No hash has stayed free of chips forever. Igneum does not claim to. It states the gain its own model finds, the response takes a week, and both are measured. The model is public: <a href="/bench#counter-asic-2-0-the-numbers">the numbers</a>; the claim is tested by paid independent cryptanalysis and the public benchmark. Monero has run on RandomX since 2019 with no chip publicly shipped, approximate; that is precedent, not proof.</p> <p><strong>The work that waits can grow.</strong> Class v4 adds a block of latency-shadow arithmetic to every hash, about 100,000 integer operations that run while the memory reads are in flight, so a chip that stores the whole dataset still has to pay for a core. That size sits on a ladder fixed at genesis, six rungs from about 100,000 to about 1,000,000 operations, and it moves one rung at a time only when 90 percent of blue blocks in each of seven consecutive days ask for it; it can never move two rungs inside a week and never past a rung the reference verifier cannot check under 10 ms with its sibling thread busy (measured on the build server, 6 October 2026: the first three rungs pass at 8.8, 8.9 and 9.2 ms, the fourth misses by 0.08 ms on a loaded box and stays out until a quiet re-measurement, the two doublings are out at 12.4 and 15.0 ms). What it buys, on the measured cards: against a dataset-storing chip whose core costs what an RTX 5090's does per operation, the chip's per-joule edge falls from 2.1x at the first rung to 1.3x at the third; against a core as good as the shipping RandomX chip's (Bitmain's Antminer X9, about 3x per joule over a desktop CPU after seven years, approximate), from 3.9x to 2.8x. What it costs, per rung, is measured too: the Apple tier gives up 3 points of rate at the first step and 6 more at the second, the RTX 5090 nothing until the second; so the miners who pay for a step are the ones who take it (<a href="/ledger#M34">ledger M34</a>).</p>
<p>No hash has stayed free of chips forever. Igneum does not claim to. It states the gain its own model finds, the response takes a week, and both are measured. The model is public: <a href="/bench#counter-asic-2-0-the-numbers">the numbers</a>; the claim is tested by paid independent cryptanalysis and the public benchmark. Monero ran on RandomX from 2019 until a chip shipped in July 2026 (Bitmain's Antminer X9, about 3x per joule over a desktop CPU, approximate); seven years is the precedent for what a latency-bound random-program design buys, not proof of more.</p>
<p>One thing takes a person, here and on every chain that exists: writing new code. A chain cannot safely write its own generator, and it cannot safely tell a chip from a wave of honest new cards by hashrate alone. If the design above ever failed, anyone could publish a new generator and miners would switch it on by signalling, as Monero's community can fork. Igneum is built to make that day unlikely, and does not depend on avoiding it.</p> <p>One thing takes a person, here and on every chain that exists: writing new code. A chain cannot safely write its own generator, and it cannot safely tell a chip from a wave of honest new cards by hashrate alone. If the design above ever failed, anyone could publish a new generator and miners would switch it on by signalling, as Monero's community can fork. Igneum is built to make that day unlikely, and does not depend on avoiding it.</p>
</section> </section>

View file

@ -0,0 +1,81 @@
#!/usr/bin/env bash
# The latency ladder's verifier bound, measured on igneum-build-1 (docs/design/latency-ladder.md section 4): for every rung
# of the ladder, the cold verify of one 32-lane warp of class v4 at that rung on the reference core (core 40, 3.8 GHz under
# schedutil, nice 19), alone and with its SMT sibling (core 88) running the same bench, plus the average of 50 warps. The
# figure a rung's admissibility reads is the cold run with the sibling loaded; the gate is 10 ms.
#
# tools/ladder/verify-bench-remote.sh [--rungs "27 35 53 88 173 267"] [--pow <path on the box>] [--out <dir on the Mac>]
#
# Runs ON the box under its measure hold (infra/build-server/remote-run.sh BR_MEASURE=1: waits for every running build, blocks
# new ones and the capacity layer until it ends; one JSONL line of kind measure in /srv/builds/_log/builds.jsonl). The binary is
# the box's own build of igneum-pow from this worktree (tools/build-remote.sh from igneum-pow/ puts it at
# /srv/builds/<worktree>/igneum-pow/target/release/igneum-pow); the results come back as one text file per run plus a table.
# A number taken beside another build is not a number (CLAUDE.md), which is what the hold is for.
set -euo pipefail
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BS_TOOL=ladder-verify-bench
# shellcheck source=../../infra/build-server/lib.sh
. "$HERE/../../infra/build-server/lib.sh"
RUNGS="27 35 53 88 173 267"; POW=""; OUT=""
while [ $# -gt 0 ]; do
case "$1" in
--rungs) RUNGS="$2"; shift 2 ;; --pow) POW="$2"; shift 2 ;; --out) OUT="$2"; shift 2 ;;
*) echo "unknown argument $1" >&2; exit 2 ;;
esac
done
bs_host
# the context of the igneum-pow crate (BS_WT, BS_WT_ROOT, branch and sha for the JSONL line); the binary is already on the box
( cd "$HERE/../../igneum-pow" ) || bs_die "no igneum-pow beside tools/"
pushd "$HERE/../../igneum-pow" > /dev/null; bs_context; popd > /dev/null
WT_ROOT="$BS_WT_ROOT"
WT_NAME="$BS_WT"
POW="${POW:-/srv/builds/$WT_NAME/igneum-pow/target/release/igneum-pow}"
OUT="${OUT:-$WT_ROOT/docs/design/latency-ladder-bench}"
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
REMOTE_OUT="/srv/builds/_log/ladder-bench/$STAMP"
mkdir -p "$OUT"
# the command remote-run.sh evals under the measure hold: per rung, the quiet-core run, then the two siblings at once
read -r -d '' CMD <<EOF || true
set -u; mkdir -p '$REMOTE_OUT'; cd '$REMOTE_OUT'
echo "host \$(hostname) load \$(cut -d' ' -f1-3 /proc/loadavg) freq40 \$(cat /sys/devices/system/cpu/cpu40/cpufreq/scaling_cur_freq 2>/dev/null || echo ?) kHz siblings \$(cat /sys/devices/system/cpu/cpu40/topology/thread_siblings_list) pow \$(sha256sum '$POW' | cut -c1-16)" > meta.txt
for r in $RUNGS; do
nice -n 19 taskset -c 40 '$POW' bench --seed igneum-genesis --day 2026-10-03 --class mx8+sh256x\$r --warps 50 > alone-\$r.txt 2>&1
# the sibling's load must outlast the measured run (the first run of this script, 22:06Z: a 50-warp sibling finished during
# the measured run's own cache fill, so the "loaded" warps ran alone; 4,000 warps is 20 to 40 s, killed when the run ends)
nice -n 19 taskset -c 88 '$POW' bench --seed igneum-genesis --day 2026-10-03 --class mx8+sh256x\$r --warps 4000 > sibling-\$r.txt 2>&1 &
sib=\$!
sleep 1.5
nice -n 19 taskset -c 40 '$POW' bench --seed igneum-genesis --day 2026-10-03 --class mx8+sh256x\$r --warps 50 > loaded-\$r.txt 2>&1
kill \$sib 2>/dev/null; wait \$sib 2>/dev/null
echo "rung reps=\$r done \$(date -u +%H:%M:%SZ)"
done
echo "load after \$(cut -d' ' -f1-3 /proc/loadavg)" >> meta.txt
EOF
bs_log "measuring rungs $RUNGS on $BS_HOST under the measure hold (pow $POW); results to $OUT"
BR_MEASURE=1 BR_KIND=measure BR_COMMAND="igneum-pow bench per ladder rung (core 40 alone, then with core 88 loaded)" BR_TARGET=x86_64-unknown-linux-gnu \
bs_remote_run "$(dirname "$POW")" "latency ladder verifier bench rungs $RUNGS" "$CMD"
bs_rsync -a "$BS_HOST:$REMOTE_OUT/" "$OUT/$STAMP/"
# the table: cold = the "warp base 0: single cold run" line, avg = the "CPU verify" line
python3 - "$OUT/$STAMP" $RUNGS <<'PY'
import re, sys, os
d = sys.argv[1]; rungs = sys.argv[2:]
def read(name):
try: t = open(os.path.join(d, name)).read()
except FileNotFoundError: return (None, None, None)
cold = re.search(r"warp base 0: single cold run ([\d.]+) ms", t)
avg = re.search(r"CPU verify: ([\d.]+) ms per 32-lane warp", t)
shadow = re.search(r"(\d+) shadow instructions per hash", t)
return (float(cold.group(1)) if cold else None, float(avg.group(1)) if avg else None, int(shadow.group(1)) if shadow else None)
out = [open(os.path.join(d, "meta.txt")).read().strip()]
out.append("| Rung | reps | Shadow instrs per hash | Counted ops (approx) | Cold, core alone (ms) | Avg of 50, alone (ms) | Cold, sibling loaded (ms) | Avg of 50, sibling loaded (ms) | Under 10 ms loaded |")
out.append("|---|---|---|---|---|---|---|---|---|")
for i, r in enumerate(rungs):
a = read(f"alone-{r}.txt"); l = read(f"loaded-{r}.txt")
ops = 930 + (8 * 256 * int(r) * 183 + 99) // 100
f = lambda x: "?" if x is None else f"{x:.2f}"
ok = "?" if l[0] is None else ("yes" if l[0] < 10.0 else "NO")
out.append(f"| {i} | {r} | {a[2] or '?'} | {ops:,} | {f(a[0])} | {f(a[1])} | {f(l[0])} | {f(l[1])} | {ok} |")
print("\n".join(out))
open(os.path.join(d, "table.md"), "w").write("\n".join(out) + "\n")
PY
bs_log "done; raw lines in $OUT/$STAMP"