igneum/proving
igneum-labs 0cba49cfe0 Prover: the 5 October post-root assertion explained (stale build, empty-segment plan), fixture 58927, fixture test, source stamp
The fact: PC 2's exporter failed blocks 58,752 to 58,843 (and the task's 58,584 to 58,984) at
shard.rs:175, "shard 0 post-root from the witness", while three empty shards were later proven, verified and
paid. Every failing block is empty: one blue block, one reward, the pool credit, no transactions, no payouts
(igneum_exportSegments 0x0..0xe738 from the Mac node, fork 2b6d23ef). The proven block 59,507 has the same
shape and the same miner as the failing 58,927. So the difference is not block content.

The rule that differed: the planner's post-root of an empty segment. The exporter on PC 2 was a stale build
whose core predated commit d6d6153 (the assertion sits at line 175 there and at 179 since). That planner
returned root_at(end) for a segment with no transactions, which is the pre-root; the statement applied the
rewards and the pool credit, as the node does (vendor/igneum-node-036/igneum/exec/src/executor.rs,
execute_segment) and as spec 7.7 item 8 says. Left = the root after the rewards (the node's), right = the root
before them; PC 2's export log for 58,752 shows exactly that pair. Reproduced here: master's core with that one
rule put back fires the same assertion on 58,927 with left 0x7886b9cf (the node's root) and right 0xea9db302
(the pre-root). Master's core as it is reproduces 58,927 and 59,192 with the node's roots, the host's native
mode matches the fixture, and the SP1 executor runs shard 0 to post-root 0x7886b9cf.

So the prover core needs no rule change: the fix is commit d6d6153, which PC 2 received with the 10:49 and
10:52 UTC rebuilds (job-rebuild-prover-pc2-037 and 037b), after which its proofs were paid. What this commit
adds is the regression and the guard for the class:

- proving/fixtures/block-58927-empty-reward.json: the failing shape cut from the devnet (33 KB).
- proving/igneum-prove/export/tests/fixtures.rs: every fixture in proving/fixtures reproduces (block
  statement, plan, every shard statement from its witness, the chain of roots and links), and the empty
  segment's shard ends at the root after the rewards, never the pre-root. With the pre-d6d6153 rule put back
  the test fails. The test lives in the export crate so the core's manifest, part of the guest build, stays
  untouched.
- export/build.rs and host/build.rs stamp each binary with a hash of the native sources it was built from,
  printed on the first line of every run, so a stale build names itself in the log instead of in a line
  number (the stale-build class of 4 and 5 October).
- docs/bench-log.md: the row under the first paid proofs.

The guest is unchanged: built in one directory, this branch and master give byte-identical loadable segments
for the shard program and the aggregator, so no prover needs a rebuild for this commit. Noted on the way and
left open: the same sources built in three directories on this Mac gave two different guest ELFs, so the
program id is not yet a pure function of the sources on a native build.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 11:50:40 +00:00
..
fixtures Prover: the 5 October post-root assertion explained (stale build, empty-segment plan), fixture 58927, fixture test, source stamp 2026-10-05 11:50:40 +00:00
igneum-prove Prover: the 5 October post-root assertion explained (stale build, empty-segment plan), fixture 58927, fixture test, source stamp 2026-10-05 11:50:40 +00:00
windows-wsl2 wsl scripts: the re-stamp prunes every target dir, not only one level deep (touching target made cargo skip the rebuild) 2026-10-05 10:51:10 +00:00
README.md Docs: ledger P12 fixed in the proving code and P20 fixed in the host; spec 7.6 shard statement definitions and the provisional S_p; benchmark standard rows 2026-10-04 10:10:17 +00:00

proving

Igneum proving: v0 (3 October 2026, one SP1 proof per block) and the devnet v4 shards (4 October 2026). Plan, status and measurements: docs/plans/proving-v0.md; numbers: docs/bench-log.md.

  • igneum-prove/: Cargo workspace. core (the port of the execution layer's executor at b7fca5a0; the cutter plan.rs, the partial-trie witnesses trie.rs and witness.rs, the shard statement shard.rs, the block statement agg.rs), program (the shard guest), aggregator (the aggregator guest, SP1 deferred proofs of the shard program), host (modes native, execute, shard, block, all; the versioned ProofSystem trait with the stub and the SP1 implementation in host/src/proof_system.rs), export (cuts a real block out of an igneum_exportSegments dump, checks the port against the node's state roots, plans the shards and checks every witness).
  • fixtures/: block-338-shard1, block-341-shards2, block-344-shards4 (one, two and four shards at S_p = 7.5 M pgas, from the private simnet of tools/prove-fixtures), block-78-increment and block-56-transfers (the v0 blocks, one shard each), block-56-transfers-3shards (a test cut at 200 pgas for the CPU multi-shard check).
  • windows-wsl2/: SETUP-PROVER.bat, PROVE-SHARD.bat (the shard at S_p and the two- and four-shard blocks on the GPU), PROVE-BLOCK.bat (the small block) and the Linux scripts for the project lead's PC; make-package.sh builds the zip.

Build and run on a machine with the SP1 toolchain (curl -L https://sp1up.succinct.xyz | bash && sp1up):

cd proving/igneum-prove
cargo build --release -p igneum-prove-export -p igneum-prove-host   # add --features igneum-prove-host/cuda on Linux x86_64 with an NVIDIA card
./target/release/igneum-prove-export ../../tools/prove-fixtures/seq.json 344 ../fixtures/block-344-shards4.json   # replay, plan, witnesses; --budget <pgas> for a test cut
./target/release/igneum-prove-host ../fixtures/block-344-shards4.json --mode native     # cut, witnesses, chain and sums, tamper checks
./target/release/igneum-prove-host ../fixtures/block-344-shards4.json --mode execute    # SP1 cycles per shard and for the aggregator
./target/release/igneum-prove-host ../fixtures/block-338-shard1.json --mode shard --shard 0 --out results.json   # execute, core, compressed, verified
SP1_PROVER=cuda ./target/release/igneum-prove-host ../fixtures/block-344-shards4.json --mode block --out results.json   # shard proofs plus aggregation

Fixtures of real size: tools/prove-fixtures/net.sh start (a one-node simnet on ports 29300+), node tools/prove-fixtures/gen.mjs (bursts of modexp calls, transfers and Counter increments landed in one block, then the export), then the exporter per block.