This document describes the verification steps required after bumping the zkvm-prover / OpenVM version in the Scroll monorepo.
The prover relies on external zkvm-prover and scroll-zkvm-* crates pinned to specific git revisions. When OpenVM is upgraded (e.g., 1.4.2 → 1.4.3), the following typically change:
Cargo.toml/Cargo.lockdependency revisions- Rust toolchain version (OpenVM often requires a specific nightly)
- Circuit parameters (
segment_len, memory limits, etc.) - Witness serialization format
- VK (verification key) assets
Because the coordinator links libzkp.so (which also depends on these crates), both sides must be rebuilt and tested together.
Before starting the full test suite, verify:
-
rust-toolchainmatches the version expected by the new OpenVM release. -
Cargo.tomlgit revisions forscroll-zkvm-prover,scroll-zkvm-verifier,scroll-zkvm-typesare correct. - Coordinator's
conf/config.json(or template) lists the expected fork names and does not reference deprecated features (legacy_witness,openvm_13). - E2E test configs (
tests/prover-e2e/*/config.json) use the correctSCROLL_ZKVM_VERSIONandSCROLL_FORK_NAME. - Guest asset version matches the prover's OpenVM version. Mismatch causes
Invalid app vm commitduring proving/verification. If the guest assets were compiled with a different OpenVM version, they must be recompiled and re-uploaded. -
RUST_MIN_STACKis exported (e.g.,export RUST_MIN_STACK=16777216). Batch and bundle proving can exceed the default thread stack size, causing silent stack overflow crashes without this setting.
Goal: Ensure the code compiles and passes lint.
# Rust
cargo fmt --all -- --check
cargo clippy --all-features --all-targets -- -D warnings
cargo check --all-features
# Go (coordinator & rollup)
cd coordinator && go build ./...
cd rollup && go build ./...What failures indicate:
- Dependency resolution errors (wrong git rev, conflicting versions)
- API breakage between OpenVM versions (type mismatches, removed methods)
- Missing feature flags
Goal: Validate core logic without full proving.
# Rust
cargo test -p libzkp
cargo test -p prover-bin
# Go (coordinator; requires libzkp.so)
cd coordinator
make libzkp
make testFocus areas after an OpenVM upgrade:
- Witness encoding / decoding (
tasks/chunk.rs,tasks/batch.rs,tasks/bundle.rs) - Proof verification paths (
proofs.rs) - Version parsing (
coordinator/internal/utils/version.go)
Goal: Produce the final binaries and shared libraries.
| Artifact | Command | Consumer |
|---|---|---|
libzkp.so |
cargo build --release -p libzkp-c |
Coordinator (CGO) |
prover |
cd zkvm-prover && make prover_cpu (or make prover for GPU) |
Prover node |
coordinator_api |
cd coordinator && make coordinator_api |
Coordinator node |
e2e_tool |
cd tests/prover-e2e && make test_tool |
E2E harness |
Check: Run each binary with --version and confirm the reported ZK version matches expectations.
Guest asset version compatibility: After building prover, verify that the guest assets (VKs, app config, ELF files) were compiled with the same OpenVM version the prover links against. The simplest check is to run a chunk proving task and confirm the prover does not panic with Invalid app vm commit. If it does, the guest assets must be recompiled with the matching OpenVM version and re-uploaded.
Goal: Run the full coordinator → prover → coordinator loop with real task data.
Recommended scenario for GalileoV2-related upgrades: sepolia-galileoV2.
cd tests/prover-e2e
ln -snf sepolia-galileoV2 conf
make all # Start DB + import blocks
make coordinator_setupThen:
- Launch
coordinator_apiwith the generatedbuild/bin/conf/config.json. - In
zkvm-prover/, createconfig.jsonfromconfig.template.jsonand setsdk_config.coordinator.base_urltohttp://localhost:8390. - Run the prover:
cd zkvm-prover make test_e2e_run # CPU # or make test_e2e_run_gpu # GPU
What to watch:
- Prover successfully downloads assets for the target fork.
- Chunk tasks are picked up and proved without panic.
- Batch tasks aggregate chunk proofs correctly.
- Bundle tasks aggregate batch proofs correctly.
- Coordinator verifies all returned proofs and marks tasks
success. - Memory usage stays within node limits (OpenVM upgrades may change
segment_len, affecting RAM). - GPU timeout: On GPU-enabled provers, batch and bundle proving can take 1–3 minutes each. Ensure
chunk_collection_time_sec(coordinator config) is set high enough (e.g.,3600) so the coordinator does not abort long-running sessions. The default180is too short for GPU batch/bundle proving.
Goal: Validate the pipeline in a production-like topology where all components run as containers and the prover connects through the Coordinator Proxy.
This catches issues that bare-metal tests miss:
- Docker-specific volume / path / permission problems.
- Missing runtime dependencies inside containers (e.g.
solc, Halo2 SRS params). - Coordinator Proxy auth and task-routing behavior.
- GPU stack limits in containerized environments.
See docs/testing/docker-compose-e2e-guide.md for full setup, build instructions, and troubleshooting.
Goal: Ensure production images build correctly.
cd coordinator
make dockerCommon issues after upgrades:
- Dockerfile base image (
scrolltech/go-rust-builder) uses an older Rust nightly thanrust-toolchain. - Missing
riscv32im-unknown-none-elftarget in the Docker build stage. - CGO linker flags incompatible with the new
libzkp.so. - Prover GPU builds require
nvidia-smiat compile time; standarddocker buildcannot access the GPU. Use the external-build-then-COPY pattern described in the Docker Compose guide.
After adding or modifying the dump functionality:
../target/release/prover --config config.json dump chunk <task_id>
../target/release/prover --config config.json dump --json chunk <task_id>Verify:
- Files are written to the expected path.
--jsonproduces readable JSON; without it producesinput_task.binandagg_proofs.bin.- The command exits with a non-zero status (dump intentionally returns
TaskStatus::Failedto halt the service loop).
Enable debug_mode in the prover config and verify that existing local assets are reused without HEAD requests.
When debug_mode is true, the prover skips re-downloading assets that already exist locally and does not send HEAD requests to the remote server. This speeds up local development and E2E testing significantly, but it also means stale local assets will not be refreshed automatically. Always clear .work/<fork>/ when switching between asset versions.
Usage in local E2E:
{
"circuits": {
"galileo": {
"debug_mode": true
}
}
}If you see Invalid app vm commit or unexpected verification failures with debug_mode: true, delete the local workspace (e.g., .work/galileo/) to force a fresh asset download.
If the PR adds support for a new fork (e.g., galileoV2):
- Confirm the coordinator config contains the fork in the verifier list.
- Confirm the prover can download the corresponding VK asset.
- Run an E2E scenario that targets that fork.
An OpenVM upgrade PR can be considered fully tested when:
- All test levels above pass without errors.
- At least one E2E scenario completes the full chunk → batch → bundle pipeline.
- Docker images build and the container starts (
coordinator_api --versionsucceeds inside the image). - (Recommended) The Docker Compose + Proxy E2E setup also passes, confirming production-like topology works.
- No new Clippy warnings or formatting regressions.
- Coordinator config does not reference deprecated features (
legacy_witness,openvm_13).