This document describes how to run the end-to-end (E2E) proving pipeline in a production-like containerized setup using Docker Compose. Unlike the bare-metal E2E test (Level 4 in openvm-upgrade-testing-guide.md), this setup:
- Runs all components in Docker containers.
- Uses the same Docker images and base layers as the production deployment.
- Prover connects directly to Coordinator API (no proxy).
┌─────────────┐ ┌─────────────────┐
│ Prover │─────>│ Coordinator API │
│ (Docker) │ │ (port 8390) │
└─────────────┘ └────────┬────────┘
│
│
┌──────▼──────┐
│ PostgreSQL │
│ (Docker) │
└─────────────┘
- PostgreSQL: Existing
local_postgrescontainer (fromtests/prover-e2e/docker-compose.yml). - Coordinator API: Scroll L2 coordinator with
libzkp.soand verifier assets. - Prover: zkVM prover with GPU support, connecting directly to the coordinator API.
- Docker & Docker Compose installed.
- NVIDIA Container Toolkit configured (for GPU prover).
local_postgresalready running with imported block data:cd tests/prover-e2e ln -snf mainnet-galileoV2 conf make all- Halo2 SRS parameters downloaded to
~/.openvm/params/(required for bundle SNARK):These are large KZG trusted-setup files used by OpenVM's Halo2 wrapper. If missing, the prover will panic during bundle proof generation.ls ~/.openvm/params/ # kzg_bn254_23.srs # kzg_bn254_24.srs
docker build \
-f build/dockerfiles/coordinator-api.Dockerfile \
-t scrolltech/coordinator-api:e2e-test .Build stages:
chef/planner/zkp-builder: Caches Rust dependencies withcargo chef, buildslibzkp.so.base/builder: Downloads Go modules, buildscoordinator_apibinary with CGO linking against the.sofrom the Rust stage.- Final
ubuntu:20.04stage: Copies the binary andlibzkp.sointo a minimal runtime image.
The prover is built outside the container (same as production CI) because GPU-enabled builds require:
- A CUDA development environment (
nvcc, CUDA headers). - Access to
nvidia-smiduring thecuda-buildercrate's compile-time architecture detection.
Standard build (matches devops repo practice):
cd zkvm-prover
make prover # GPU version
# or
make prover_cpu # CPU versionThen package the pre-built binary into a runtime image:
docker build \
-f build/dockerfiles/prover.Dockerfile \
-t scrolltech/prover:e2e-test .Runtime image:
- Base:
nvidia/cuda:12.9.1-runtime-ubuntu22.04 - Installs
solc0.8.24 (needed for EVM proof generation) - Copies
target/release/prover
Why not build inside Docker?
The upstreamopenvm-cuda-buildercrate runsnvidia-smiat compile time to detect the GPU architecture (sm_86, etc.). Standarddocker builddoes not expose the GPU to the build context, causing the architecture detection to fail. Production pipelines (seegit@github.com:scroll-tech/devops.git) solve this by building on GPU-equipped CI runners and then copying the artifact into a slim runtime image.
All configs live in tests/prover-e2e/docker-e2e/conf/:
| File | Service | Key Points |
|---|---|---|
coordinator-api.json |
Coordinator API | assets_path: "assets_v2", DB connects to local_postgres:5432, chunk_collection_time_sec: 3600 |
prover.json |
Prover | base_url: "http://coordinator-api:8390", circuits point to galileov2 S3 assets |
File: tests/prover-e2e/docker-e2e/docker-compose.yml
Services:
coordinator-api: ports8390:8390, mounts config +assets_v2+genesis.json.prover: mounts config +testset.json+.workcache +~/.openvm/params, GPU reservation,RUST_MIN_STACK=16777216.
Run:
cd tests/prover-e2e/docker-e2e
docker compose up -d coordinator-api
docker compose up -d proverFollow logs:
docker logs -f prover
docker logs -f coordinator-apiSymptom: thread 'tokio-rt-worker' has overflowed its stack
Fix: Set RUST_MIN_STACK=16777216 (16 MiB) in the prover container environment. The default Rust thread stack is too small for OpenVM's deep recursion during Halo2 key generation.
Symptom: Prover panics during bundle proof with Params file "/root/.openvm/params/kzg_bn254_23.srs" does not exist.
Fix: Mount the host's ~/.openvm/params directory into the container at /root/.openvm/params.
Symptom: Coordinator API crashes on startup with Setting up chunk verifier: No such file or directory.
Fix: The assets_v2 directory was not mounted correctly. Ensure the host path in docker-compose.yml resolves to coordinator/build/bin/assets_v2 (contains verifier.bin, root_verifier_vk, openVmVk.json).
Fix: docker rm -f coordinator-api before recreating.
After the prover finishes (All done!), confirm in the coordinator API logs that all tasks are status=verified:
docker logs coordinator-api | grep "status=verified"Expected output:
- 4 chunk tasks verified
- 2 batch tasks verified
- 1 bundle task verified