igneum/proving/README.md
igneum-labs 24aaa0e254 Prover mirrors the fee switch: both tables and fees_v1_activation_daa in the shard input, guest re-pinned, devnet runbook for H = 210,000
igneum-prove-core carries the node's fees.rs (PgasTable, FeeParams PROTOTYPE and CALIBRATED_V1,
FeeSchedule::at); the shard input and every fixture carry the schedule and the block's DAA score; the executor
reads the set at that score, raises the base fees to its floors and meters with its intrinsic, B_p and modexp
entry, as the node's execute_segment does. The 328-byte statement is unchanged: the node's native veto pins the
schedule (a new layout would be a consensus change for every node). Exporter: schedule and daaScore from the
dump (gen.mjs writes them), per-segment switch on replay, S_p from the set. Fixtures from one simnet chain across
the switch at DAA 800: fees-switch-prototype (block 51), fees-v1-shards2 (351), fees-v1-shards3 (355); 358
segments replayed, every state root the node's. Host tests on both sides. Guest re-pinned: shard
0x2b1a81cb..., aggregator 0x474678f3...; pinned-guests-check passes.

Node fork 2b6d23ef unchanged (igneum-exec tests 11 passed). Digest for the override with
fees_v1_activation_daa 210000: ab8847da538dead1dc10e046dfaadab3c1c35928e3748810c4e050d4a886087a.
Runbook docs/plans/fee-switch-devnet.md; infra/devnet/restart-hand-nodes.sh and restart-seed.sh take the
override object (the hand nodes and the seed run 20139145 today and must move to 2b6d23ef first). One line on
the live page, spec 5.11, the testnet README, the floor analysis, the bench log and the journey.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 16:24:35 +00:00

32 lines
5.8 KiB
Markdown

# 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), `fees-switch-prototype`, `fees-v1-shards2` and `fees-v1-shards3` (5 October 2026: one simnet chain across the `fees_v1_activation_daa` switch at DAA 800, a prototype block below it and v1 blocks at `S_p` = 30,000 pgas above it; `docs/plans/fee-switch-devnet.md`).
- The fee schedule (5 October 2026): every fixture and shard input carries the node's schedule (`fees`: both tables and the switch, `core/src/config.rs`) and the block's DAA score; the executor reads the set at that score and raises the base fees to its floors as the node does. A fixture without `fees` is the devnet as compiled (prototype, never). The exporter takes the schedule from the dump (`feesV1ActivationDaa`, `fees`, per-segment `daaScore`, written by `tools/prove-fixtures/gen.mjs`) or from `--fees-v1-activation-daa` and `--fees-base`.
- `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.
## Pinned guest programs (5 October 2026)
The two SP1 guests are build artefacts committed under `igneum-prove/elf/`: `igneum-prove-program.elf` and `igneum-prove-aggregator.elf`, their verifying keys (`.vk`, bincode) and `manifest.json` (SHA-256 of every file, the program ids, the SP1 crate and circuit versions, when and where they were pinned). The host embeds these files (`host/src/pinned.rs`), never a guest it compiled itself, checks every hash against the manifest at each start, refuses in the prove modes when SP1's key setup does not derive the manifest's program id, and in `--mode verify` uses the pinned key with SP1's light verifier (no prover client, no key generation). `igneum-prove-host --mode id` prints the pinned ids with no setup.
Why: on 5 October 2026 the Mac's host (shard program id `0x0559759b...`) rejected every proof from PC 2's host (`0x05db1aca...`). Both were built from the same guest sources; `host/build.rs` compiled the guest on each machine and the two toolchains produced different ELFs, so a node only ever included its own prover's records. The node's verifier also spent 114 s to 138 s per proof in the prover client and key setups before a 0.1 s to 0.4 s verify.
- A normal host build compiles nothing for the zkVM and needs no Succinct toolchain.
- Changing a guest: `igneum-prove/pin-guests.sh` (builds both guests with `IGNEUM_BUILD_GUESTS=1`, runs `igneum-prove-pin`, rebuilds the host, runs the unit tests). Commit `elf/` with the change. `tools/ci/pinned-guests-check.sh` fails CI when `elf/` and its manifest disagree or when any other script builds a guest.
- A new pin is a new program id: every prover and verifier must move together, and proofs made with the old id are rejected by a verifier with the new one (the verify line then says `program id 0x... IS NOT OURS`). Rollout order: (1) stop the provers (the app's prove setting off on every machine); (2) wait until every record in flight is either included or expired (`igneum_getProvingStatus` shows an empty pool on every node); (3) install the new host on every node (DMG on the Mac, `igneum-prove-wsl2.zip` and `SETUP-PROVER.bat` on the PCs: the package carries `elf/`, so the PC build embeds the same files) and restart the nodes; (4) confirm `--mode id` prints the same shard program id on every machine; (5) turn the provers back on.
Build and run (the Succinct toolchain, `curl -L https://sp1up.succinct.xyz | bash && sp1up`, is needed only to re-pin the guests):
```
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.