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 commitd6d6153(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 commitd6d6153, 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>
32 lines
1.1 KiB
TOML
32 lines
1.1 KiB
TOML
[package]
|
|
name = "igneum-prove-host"
|
|
description = "SP1 host: loads a block fixture, cuts and witnesses its shards, proves one shard (execute, core, compressed) or the whole block (shard proofs plus aggregation), prints cycles, times and sizes with timestamps, verifies every proof; holds the versioned ProofSystem trait"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
|
|
[dependencies]
|
|
igneum-prove-core.workspace = true
|
|
igneum-evm-types.workspace = true
|
|
sp1-sdk = { workspace = true, features = ["blocking"] }
|
|
alloy-primitives.workspace = true
|
|
alloy-trie.workspace = true
|
|
alloy-rlp.workspace = true
|
|
bincode.workspace = true
|
|
serde.workspace = true
|
|
serde_json.workspace = true
|
|
anyhow.workspace = true
|
|
hex.workspace = true
|
|
sha2 = "0.10"
|
|
tokio = { version = "1", features = ["rt-multi-thread", "time"] }
|
|
|
|
[build-dependencies]
|
|
sp1-build.workspace = true
|
|
# the source stamp (build.rs)
|
|
sha2 = "0.10"
|
|
hex.workspace = true
|
|
|
|
[features]
|
|
default = []
|
|
# The CUDA prover (SP1_PROVER=cuda): Linux x86_64 only, the SDK downloads sp1-gpu-server into ~/.sp1/bin.
|
|
cuda = ["sp1-sdk/cuda"]
|