diff --git a/docs/plans/counter-asic-2-gate/class-v3-20261005-2215Z-era-mx8.json b/docs/plans/counter-asic-2-gate/class-v3-20261005-2215Z-era-mx8.json new file mode 100644 index 000000000..3ce77b68f --- /dev/null +++ b/docs/plans/counter-asic-2-gate/class-v3-20261005-2215Z-era-mx8.json @@ -0,0 +1,367 @@ +{ + "pass": true, + "checks": { + "switch_line_on_every_node": true, + "switch_line_names_the_rounded_epoch": true, + "template_switched_at_the_first_v3_epoch": true, + "blocks_before_the_boundary": true, + "blocks_after_the_boundary": true, + "v2_and_v3_programs_seen": true, + "program_ids_differ_across_the_switch": true, + "miners_agree_on_every_program": true, + "zero_rejected_by_miners": true, + "zero_rejected_by_nodes": true, + "sinks_agree": true, + "block_counts_agree": true + }, + "activation": 150, + "epoch_blocks": 60, + "first_v3_epoch": 3, + "boundary_daa": 180, + "secs": 480, + "threads": 1, + "node": "/Users/joshm/Projects/igneum-wt-ca2-v3/vendor/igneum-node-ca2/target-ca2/release/igneumd", + "miner": "/Users/joshm/Projects/igneum-wt-ca2-v3/vendor/igneum-node-ca2/target-ca2/release/igneum-miner", + "genesis_bits": "0x1f010000", + "template_switch": { + "epoch": 3, + "daa": 181, + "at": 127.9 + }, + "run_ended_at_s": 280.2, + "final_daa": 300, + "blocks": { + "total": 304, + "before_boundary": 182, + "after_boundary": 122, + "chain_before": 180, + "chain_after": 120 + }, + "programs": [ + { + "epoch": 0, + "class": "v2", + "program_id": "8f8806638d59850f", + "seed": "234e082d653dc69d", + "miners": 3, + "disagree": false, + "ready_ms": [ + 179, + 178, + 179 + ] + }, + { + "epoch": 1, + "class": "v2", + "program_id": "e145305446a6b4ce", + "seed": "09952ab515cc5a10", + "miners": 3, + "disagree": false, + "ready_ms": [ + 2, + 2, + 2 + ] + }, + { + "epoch": 2, + "class": "v2", + "program_id": "743ad2a3cab0518a", + "seed": "1812a8eabb5a452c", + "miners": 3, + "disagree": false, + "ready_ms": [ + 2, + 2, + 2 + ] + }, + { + "epoch": 3, + "class": "v3", + "program_id": "a6523b90cff501e3", + "seed": "6296e3d38df15872", + "miners": 3, + "disagree": false, + "ready_ms": [ + 191, + 191, + 191 + ] + }, + { + "epoch": 4, + "class": "v3", + "program_id": "bc811b3c4b8b1ced", + "seed": "a59152f149a517e0", + "miners": 3, + "disagree": false, + "ready_ms": [ + 2, + 2, + 2 + ] + }, + { + "epoch": 5, + "class": "v3", + "program_id": "e784541f19cdebe5", + "seed": "87ec7849fce0019f", + "miners": 3, + "disagree": false, + "ready_ms": [ + 2, + 2, + 2 + ] + } + ], + "accepted_per_miner": [ + 101, + 89, + 113 + ], + "rejected_by_miners": [ + 0, + 0, + 0 + ], + "rejected_by_nodes": [ + 0, + 0, + 0 + ], + "rejected_lines": [], + "sinks": [ + "a9ce45df8beeaf13", + "a9ce45df8beeaf13", + "a9ce45df8beeaf13" + ], + "block_counts": [ + 303, + 303, + 303 + ], + "tips_per_node": [ + 1, + 1, + 1 + ], + "switch_lines": [ + "Program class v3 from the override file: active from epoch 3 (DAA score 150 rounded up to the epoch boundary at 180, epochs of 60 DAA)", + "Program class v3 from the override file: active from epoch 3 (DAA score 150 rounded up to the epoch boundary at 180, epochs of 60 DAA)", + "Program class v3 from the override file: active from epoch 3 (DAA score 150 rounded up to the epoch boundary at 180, epochs of 60 DAA)" + ], + "samples": [ + { + "t": 4.6, + "daa": 0, + "epoch": 0, + "class": 2, + "nodes": [ + "0/234e082d", + "0/234e082d", + "0/234e082d" + ] + }, + { + "t": 19.7, + "daa": 48, + "epoch": 0, + "class": 2, + "nodes": [ + "48/78df0834", + "48/78df0834", + "48/78df0834" + ] + }, + { + "t": 34.7, + "daa": 67, + "epoch": 1, + "class": 2, + "nodes": [ + "67/0b934b49", + "67/0b934b49", + "67/0b934b49" + ] + }, + { + "t": 49.7, + "daa": 84, + "epoch": 1, + "class": 2, + "nodes": [ + "84/2ba5b427", + "84/2ba5b427", + "84/2ba5b427" + ] + }, + { + "t": 64.8, + "daa": 101, + "epoch": 1, + "class": 2, + "nodes": [ + "101/6574b577", + "101/6574b577", + "101/6574b577" + ] + }, + { + "t": 79.8, + "daa": 123, + "epoch": 2, + "class": 2, + "nodes": [ + "123/21e2b6ce", + "123/21e2b6ce", + "123/21e2b6ce" + ] + }, + { + "t": 94.8, + "daa": 134, + "epoch": 2, + "class": 2, + "nodes": [ + "134/74b83d55", + "134/74b83d55", + "134/74b83d55" + ] + }, + { + "t": 109.9, + "daa": 153, + "epoch": 2, + "class": 2, + "nodes": [ + "153/71b251a6", + "153/71b251a6", + "153/71b251a6" + ] + }, + { + "t": 124.9, + "daa": 175, + "epoch": 2, + "class": 2, + "nodes": [ + "175/b1500fb5", + "175/b1500fb5", + "175/b1500fb5" + ] + }, + { + "t": 139.9, + "daa": 185, + "epoch": 3, + "class": 3, + "nodes": [ + "185/dd8ff66c", + "185/dd8ff66c", + "185/dd8ff66c" + ] + }, + { + "t": 155, + "daa": 191, + "epoch": 3, + "class": 3, + "nodes": [ + "191/2ef77979", + "191/2ef77979", + "191/2ef77979" + ] + }, + { + "t": 170, + "daa": 194, + "epoch": 3, + "class": 3, + "nodes": [ + "194/1871cd31", + "194/1871cd31", + "194/1871cd31" + ] + }, + { + "t": 185, + "daa": 206, + "epoch": 3, + "class": 3, + "nodes": [ + "206/808070af", + "206/808070af", + "206/808070af" + ] + }, + { + "t": 200.1, + "daa": 221, + "epoch": 3, + "class": 3, + "nodes": [ + "221/1bccc51c", + "221/1bccc51c", + "221/1bccc51c" + ] + }, + { + "t": 215.1, + "daa": 237, + "epoch": 3, + "class": 3, + "nodes": [ + "237/d0bfaef8", + "237/d0bfaef8", + "237/d0bfaef8" + ] + }, + { + "t": 230.1, + "daa": 253, + "epoch": 4, + "class": 3, + "nodes": [ + "253/a4136a32", + "253/a4136a32", + "253/a4136a32" + ] + }, + { + "t": 245.2, + "daa": 268, + "epoch": 4, + "class": 3, + "nodes": [ + "268/51ef3166", + "268/51ef3166", + "268/51ef3166" + ] + }, + { + "t": 260.2, + "daa": 277, + "epoch": 4, + "class": 3, + "nodes": [ + "277/869d0dd3", + "277/869d0dd3", + "277/869d0dd3" + ] + }, + { + "t": 275.2, + "daa": 292, + "epoch": 4, + "class": 3, + "nodes": [ + "292/fe54acb8", + "292/fe54acb8", + "292/fe54acb8" + ] + } + ] +} \ No newline at end of file diff --git a/docs/plans/counter-asic-2-node.md b/docs/plans/counter-asic-2-node.md index 24287a9ae..7586f2240 100644 --- a/docs/plans/counter-asic-2-node.md +++ b/docs/plans/counter-asic-2-node.md @@ -120,13 +120,30 @@ The regression was `memhard::derive_items` at m = 1 (2.2x); the fix dispatches t Epoch 0's v2 id is the same in both runs (`8f8806638d59850f`: a v2 program is untouched by the era code, on the chain as in the packs); the v3 ids differ from run 1 because the era draw is now inside the class. +### Result, run 3 (5 October 2026, 22:15:04Z to 22:19:44Z): the final class, x8 with the era + +Binaries rebuilt on ca2-v3 d233fa1 (mixer x8, the era drawn inside the class, the verifier fix), fork 89dfcb95. Summary: `docs/plans/counter-asic-2-gate/class-v3-20261005-2215Z-era-mx8.json`. PASS: every check true. + +| Check | Measured | +|---|---| +| Switch lines, digest | 3 of 3, the same line; digest `0186df7d0834d054...` | +| Template class per epoch | epochs 0 to 2 class 2, 3 to 5 class 3; the switch seen at DAA 181, 127.9 s wall | +| Blocks before / after the boundary | 182 / 122 (selected chain 180 / 120), 304 in all; 101, 89, 113 accepted per miner | +| Program id per epoch, all three miners agreeing | e0 v2 `8f8806638d59850f`, e1 v2 `e145305446a6b4ce`, e2 v2 `743ad2a3cab0518a`, e3 v3 `a6523b90cff501e3`, e4 v3 `bc811b3c4b8b1ced`, e5 v3 `e784541f19cdebe5` | +| Rejected blocks | miners 0 / 0 / 0, nodes 0 / 0 / 0 | +| Forks | sinks `a9ce45df8beeaf13` on all three nodes, block counts 303 / 303 / 303, one tip each | +| Program and cache ready, one CPU core | v2 epoch 0 179 ms, the first v3 epoch 191 ms (x8 construction: the cache fill is unchanged, the items are derived on demand), an in-day swap 2 ms | + +Epoch 0's v2 id `8f8806638d59850f` is the same in all three runs. Three runs, three v3 classes (mixer x4; x4 with the era; x8 with the era), the same chain behaviour each time: the switch rounds up to epoch 3, no block rejected, one chain. + The PC 2 suite jobs for the same fork (79bd8e10), the G6 evidence (the coordinator's status file carries the SUMMARY lines): | Job | Tree | What | Result | |---|---|---|---| | `build-20261005-215219` | main b105a55 | the Linux node, the six node suites, the app tests | Linux build and app tests passed; `kaspa-consensus` failed on the known flake (`ban_is_decided_by_the_carrying_block`, `UnexpectedDifficulty` in `mine_on_all`, the 0.3.10 cut's section 11 case) | | `build-20261005-215712` | main b105a55 | `kaspa-consensus` alone | 97 passed, 0 failed, 3 ignored, `ban_is_decided ...` ok, 21:59:45Z | -| `build-20261005-220351` | main 8ea6740 | the other five crates (`kaspa-consensus-core igneum-exec kaspa-pow igneum-miner kaspa-p2p-flows`) and the app tests | 22:04 to 22:06:55Z: igneum-exec 17, igneum-miner 18, consensus-core and p2p-flows green, the app 78 + 26 + 8; `kaspa-pow` FAILED on `program_class_v3_seeds_hash_their_own_program_over_their_own_cache` (the fork test compared a chain v3 program's class to `V3_CLASS` with `era: None`; on the era-merged crate the class carries the drawn era inside). Fixed on the fork at 89dfcb95 (the class minus its era is `V3_CLASS`, the era is drawn, another era seed keeps the program id and hashes another program over the same day cache). Re-run owed with the mixer fix job | +| `build-20261005-220351` | main 8ea6740 | the other five crates (`kaspa-consensus-core igneum-exec kaspa-pow igneum-miner kaspa-p2p-flows`) and the app tests | 22:04 to 22:06:55Z: igneum-exec 17, igneum-miner 18, consensus-core and p2p-flows green, the app 78 + 26 + 8; `kaspa-pow` FAILED on `program_class_v3_seeds_hash_their_own_program_over_their_own_cache` (the fork test compared a chain v3 program's class to `V3_CLASS` with `era: None`; on the era-merged crate the class carries the drawn era inside). Fixed on the fork at 89dfcb95 (the class minus its era is `V3_CLASS`, the era is drawn, another era seed keeps the program id and hashes another program over the same day cache). Re-run: job 4 | +| `build-20261005-221237` | main d233fa1, fork 89dfcb95 | the five crates and the app | 22:12:37 to 22:15:44Z (185 s): every stage ok; kaspa-consensus-core 108 (2 ignored), igneum-exec 17, kaspa-pow 33 + 14 (the v3 engine test, with the igneum-pow feature), igneum-miner 18, kaspa-p2p-flows 7, igneum-app 78 + 26 + 8; 0 failed. With job 2, G6 is green | The PC's test stage builds the fork's test binaries with the plan's feature set, so the v3 engine test DID run on PC 2 (the earlier reading that it was Mac-only is withdrawn): the PC job is the G6 evidence. @@ -137,7 +154,7 @@ The PC's test stage builds the fork's test binaries with the plan's feature set, | igneum-pow `cargo test --release` | 42 unit + 11 pack tests, including `program_classes`, `program_class_and_era_are_checked`, the pinned-pack diffs | pass (Mac, 5 Oct 2026) | | `proto-cuda/nvrtc/emu/packfile-test.sh` | 13 checks: the attempt rule, the generator rule, a v3 pack with its era, the token matcher | pass (Mac) | | `host.c`, `worker.cpp` (emulation), `main.swift` | syntax / compile | pass (Mac) | -| fork `cargo test -p kaspa-pow --features igneum-pow` | 14 engine tests including `program_class_v3_seeds_hash_their_own_program_over_their_own_cache` (rewritten at 89dfcb95 for the era-in-class rule) | pass (Mac, fork 79bd8e10 on the pre-era crate; 89dfcb95 on the era crate: see the final report) | +| fork `cargo test -p kaspa-pow --features igneum-pow` | 14 engine tests including `program_class_v3_seeds_hash_their_own_program_over_their_own_cache` (rewritten at 89dfcb95 for the era-in-class rule) | pass (Mac, 89dfcb95 against d233fa1; PC 2 job 4: 33 + 14) | | fork `cargo test -p kaspa-consensus-core` | 108 + 7: the switch rounding, the era clock, the params, digest and fast-time file tests | pass (Mac, fork 79bd8e10) | | PC 2 `build-job.mjs` suites | `kaspa-consensus-core igneum-exec kaspa-pow kaspa-consensus igneum-miner` + `igneum-app` | the coordinator publishes on its go |