From 16a884e8b6c3a029acfb5f0549ea61fbbbe718c2 Mon Sep 17 00:00:00 2001 From: han0110 Date: Mon, 25 May 2026 10:57:06 +0000 Subject: [PATCH 1/5] ci: skip empty/panic guest publish --- .github/workflows/compile-and-release.yml | 32 +++++++++++------------ 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/.github/workflows/compile-and-release.yml b/.github/workflows/compile-and-release.yml index 52930c8..225f812 100644 --- a/.github/workflows/compile-and-release.yml +++ b/.github/workflows/compile-and-release.yml @@ -18,18 +18,16 @@ permissions: jobs: compile: - name: Compile ${{ matrix.guest }}-${{ matrix.zkvm }} + name: Compile stateless-validator-${{ matrix.el }}-${{ matrix.zkvm }} runs-on: ubuntu-latest outputs: ere_tag: ${{ steps.get_ere_tag.outputs.ere_tag }} strategy: fail-fast: false matrix: - guest: - - empty - - panic - - stateless-validator-ethrex - - stateless-validator-reth + el: + - ethrex + - reth zkvm: - airbender - openvm @@ -37,9 +35,9 @@ jobs: - sp1 - zisk exclude: - - guest: stateless-validator-ethrex + - el: ethrex zkvm: airbender - - guest: stateless-validator-ethrex + - el: ethrex zkvm: openvm steps: - name: Checkout code @@ -70,9 +68,9 @@ jobs: -v $PWD/output:/output \ ghcr.io/eth-act/ere/ere-compiler-${{ matrix.zkvm }}:${{ steps.get_ere_tag.outputs.ere_tag }} \ --compiler-kind rust-customized \ - --guest-dir /ere-guests/bin/${{ matrix.guest }}/${{ matrix.zkvm }} \ + --guest-dir /ere-guests/bin/stateless-validator-${{ matrix.el }}/${{ matrix.zkvm }} \ --output-dir /output \ - --elf-name ${{ matrix.guest }}-${{ matrix.zkvm }}.elf + --elf-name stateless-validator-${{ matrix.el }}-${{ matrix.zkvm }}.elf - name: Compile ZisK guest with feature cycle-scope enabled if: ${{ matrix.zkvm == 'zisk' }} @@ -84,9 +82,9 @@ jobs: -v $PWD/output:/output \ ghcr.io/eth-act/ere/ere-compiler-${{ matrix.zkvm }}:${{ steps.get_ere_tag.outputs.ere_tag }} \ --compiler-kind rust-customized \ - --guest-dir /ere-guests/bin/${{ matrix.guest }}/${{ matrix.zkvm }} \ + --guest-dir /ere-guests/bin/stateless-validator-${{ matrix.el }}/${{ matrix.zkvm }} \ --output-dir /output \ - --elf-name ${{ matrix.guest }}-${{ matrix.zkvm }}-profiling.elf \ + --elf-name stateless-validator-${{ matrix.el }}-${{ matrix.zkvm }}-profiling.elf \ -- \ --features cycle-scope @@ -96,17 +94,17 @@ jobs: -e RUST_LOG=info \ -v $PWD/output:/output \ ghcr.io/eth-act/ere/ere-server-${{ matrix.zkvm }}:${{ steps.get_ere_tag.outputs.ere_tag }} \ - --elf-path /output/${{ matrix.guest }}-${{ matrix.zkvm }}.elf \ + --elf-path /output/stateless-validator-${{ matrix.el }}-${{ matrix.zkvm }}.elf \ keygen \ - --program-vk-path /output/${{ matrix.guest }}-${{ matrix.zkvm }}.vk + --program-vk-path /output/stateless-validator-${{ matrix.el }}-${{ matrix.zkvm }}.vk - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: ${{ matrix.guest }}-${{ matrix.zkvm }} + name: stateless-validator-${{ matrix.el }}-${{ matrix.zkvm }} path: | - output/${{ matrix.guest }}-${{ matrix.zkvm }}*.elf - output/${{ matrix.guest }}-${{ matrix.zkvm }}.vk + output/stateless-validator-${{ matrix.el }}-${{ matrix.zkvm }}*.elf + output/stateless-validator-${{ matrix.el }}-${{ matrix.zkvm }}.vk if-no-files-found: error check-git-tag: From 5ffb7642bf8e895af89d0395d0730d6015301742 Mon Sep 17 00:00:00 2001 From: han0110 Date: Mon, 25 May 2026 14:42:47 +0000 Subject: [PATCH 2/5] feat: add build script to get EL_VERSION of ethrex and reth --- Cargo.lock | 2 ++ Cargo.toml | 1 + crates/stateless-validator-ethrex/Cargo.toml | 3 +++ crates/stateless-validator-ethrex/build.rs | 12 ++++++++++++ crates/stateless-validator-ethrex/src/guest.rs | 3 +++ crates/stateless-validator-reth/Cargo.toml | 3 +++ crates/stateless-validator-reth/build.rs | 12 ++++++++++++ crates/stateless-validator-reth/src/guest.rs | 3 +++ 8 files changed, 39 insertions(+) create mode 100644 crates/stateless-validator-ethrex/build.rs create mode 100644 crates/stateless-validator-reth/build.rs diff --git a/Cargo.lock b/Cargo.lock index e1c3d74..147f6a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7770,6 +7770,7 @@ dependencies = [ "alloy-genesis", "alloy-rlp", "anyhow", + "ere-util-build", "ethrex-common", "ethrex-crypto", "ethrex-guest-program", @@ -7797,6 +7798,7 @@ dependencies = [ "anyhow", "bincode 2.0.1", "ere-prover-core", + "ere-util-build", "guest", "once_cell", "reth-chainspec", diff --git a/Cargo.toml b/Cargo.toml index 0aaeed3..ef4184c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -119,6 +119,7 @@ ere-codec = { git = "https://github.com/eth-act/ere", tag = "v0.11.0" } ere-platform-core = { git = "https://github.com/eth-act/ere", tag = "v0.11.0" } ere-prover-core = { git = "https://github.com/eth-act/ere", tag = "v0.11.0" } ere-dockerized = { git = "https://github.com/eth-act/ere", tag = "v0.11.0" } +ere-util-build = { git = "https://github.com/eth-act/ere", tag = "v0.11.0" } # local guest = { path = "crates/guest", default-features = false } diff --git a/crates/stateless-validator-ethrex/Cargo.toml b/crates/stateless-validator-ethrex/Cargo.toml index 75e8936..2d6935f 100644 --- a/crates/stateless-validator-ethrex/Cargo.toml +++ b/crates/stateless-validator-ethrex/Cargo.toml @@ -41,6 +41,9 @@ stateless-validator-reth = { workspace = true, default-features = true, optional "host", ] } +[build-dependencies] +ere-util-build.workspace = true + [features] # guest default = ["std"] diff --git a/crates/stateless-validator-ethrex/build.rs b/crates/stateless-validator-ethrex/build.rs new file mode 100644 index 0000000..7e63952 --- /dev/null +++ b/crates/stateless-validator-ethrex/build.rs @@ -0,0 +1,12 @@ +//! Generate env `EL_VERSION`. + +use ere_util_build::{cargo_lock_path, detect_dep_version}; + +fn main() { + if let Some(cargo_lock) = cargo_lock_path() { + println!("cargo:rerun-if-changed={}", cargo_lock.display()); + } + + let version = detect_dep_version("stateless-validator-ethrex", "ethrex-guest-program"); + println!("cargo:rustc-env=EL_VERSION={version}"); +} diff --git a/crates/stateless-validator-ethrex/src/guest.rs b/crates/stateless-validator-ethrex/src/guest.rs index cd020cb..4c31d3d 100644 --- a/crates/stateless-validator-ethrex/src/guest.rs +++ b/crates/stateless-validator-ethrex/src/guest.rs @@ -14,6 +14,9 @@ pub use { stateless_validator_common::guest::StatelessValidatorOutput, }; +/// Ethrex version. +pub const EL_VERSION: &str = env!("EL_VERSION"); + /// [`Guest`] implementation for Ethrex stateless validator. #[derive(Debug, Clone)] pub struct StatelessValidatorEthrexGuest; diff --git a/crates/stateless-validator-reth/Cargo.toml b/crates/stateless-validator-reth/Cargo.toml index 7dd0b41..ed9bf3a 100644 --- a/crates/stateless-validator-reth/Cargo.toml +++ b/crates/stateless-validator-reth/Cargo.toml @@ -52,6 +52,9 @@ sha2.workspace = true guest.workspace = true stateless-validator-common = { workspace = true, features = ["serde"] } +[build-dependencies] +ere-util-build.workspace = true + [features] # guest default = ["std"] diff --git a/crates/stateless-validator-reth/build.rs b/crates/stateless-validator-reth/build.rs new file mode 100644 index 0000000..602dfe6 --- /dev/null +++ b/crates/stateless-validator-reth/build.rs @@ -0,0 +1,12 @@ +//! Generate env `EL_VERSION`. + +use ere_util_build::{cargo_lock_path, detect_dep_version}; + +fn main() { + if let Some(cargo_lock) = cargo_lock_path() { + println!("cargo:rerun-if-changed={}", cargo_lock.display()); + } + + let version = detect_dep_version("stateless-validator-reth", "reth-chainspec"); + println!("cargo:rustc-env=EL_VERSION={version}"); +} diff --git a/crates/stateless-validator-reth/src/guest.rs b/crates/stateless-validator-reth/src/guest.rs index f23fd96..7c5440c 100644 --- a/crates/stateless-validator-reth/src/guest.rs +++ b/crates/stateless-validator-reth/src/guest.rs @@ -25,6 +25,9 @@ mod openvm; #[cfg(feature = "zkvm-interface")] pub mod zkvm_interface; +/// Reth version. +pub const EL_VERSION: &str = env!("EL_VERSION"); + /// Input for the stateless validator guest program. #[serde_as] #[derive(Debug, Clone, Serialize, Deserialize)] From e9d564909237f6cb5ca106cebb08b912afd5a1aa Mon Sep 17 00:00:00 2001 From: han0110 Date: Tue, 26 May 2026 06:42:00 +0000 Subject: [PATCH 3/5] ci: generate release node body by python script and support republish for future usage --- .github/scripts/release-body.py | 210 ++++++++++++++++++++++ .github/workflows/compile-and-release.yml | 57 ++---- .gitignore | 1 + artifact-registry.json | 5 + 4 files changed, 232 insertions(+), 41 deletions(-) create mode 100755 .github/scripts/release-body.py create mode 100644 artifact-registry.json diff --git a/.github/scripts/release-body.py b/.github/scripts/release-body.py new file mode 100755 index 0000000..ac06aa5 --- /dev/null +++ b/.github/scripts/release-body.py @@ -0,0 +1,210 @@ +#!/usr/bin/env python3 + +"""Generate the GitHub release body listing compiled and republished guest programs.""" + +import argparse +import json +import re +import subprocess +import sys +from dataclasses import dataclass +from pathlib import Path +from subprocess import DEVNULL, PIPE, STDOUT + +ROOT = Path(__file__).resolve().parents[2] +TARGET_DIR = ROOT / "target" + +REPOSITORY = "eth-act/ere-guests" +GUEST_PREFIX = "stateless-validator-" +COMPILED_ELS = ("ethrex", "reth") +ZKVMS = ("airbender", "openvm", "risc0", "sp1", "zisk") + +TABLE_HEADER = ( + "| EL | EL Version | zkVM | zkVM Version | Target | ELF | Program VK |", + "| --- | --- | --- | --- | --- | --- | --- |", +) + + +@dataclass(frozen=True) +class Guest: + """A guest program keyed by execution layer and zkVM, with display versions.""" + + el: str + el_version: str + zkvm: str + zkvm_version: str + source_url: str | None = None + + +def parse_args() -> argparse.Namespace: + """Parses the command-line arguments.""" + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--tag", required=True) + parser.add_argument("--artifacts-dir", type=Path, default=Path("artifacts")) + parser.add_argument( + "--artifact-registry", type=Path, default=Path("artifact-registry.json") + ) + return parser.parse_args() + + +def run_command( + args: list[str], stdout: int = DEVNULL, stderr: int = PIPE +) -> subprocess.CompletedProcess: + """Runs `args` from ROOT, raising RuntimeError with captured output on failure.""" + try: + proc = subprocess.run(args, cwd=ROOT, stdout=stdout, stderr=stderr, text=True) + except OSError as error: + raise RuntimeError(f"`{' '.join(args)}` could not run: {error}") from error + if proc.returncode != 0: + detail = (proc.stderr or proc.stdout or "").strip() + raise RuntimeError(f"`{' '.join(args)}` failed ({proc.returncode})\n{detail}") + return proc + + +def read_ere_version() -> str: + """Returns the Ere version pinned by git tag in the workspace Cargo.toml.""" + cargo_toml = (ROOT / "Cargo.toml").read_text() + match = re.search(r'eth-act/ere"[^}]*?\btag\s*=\s*"(v[^"]+)"', cargo_toml) + if not match: + raise RuntimeError('no `eth-act/ere` git `tag = "vX.Y.Z"` found in Cargo.toml') + return match.group(1) + + +def read_compiled_el_version(el: str) -> str: + """Returns the EL version from the `stateless-validator-{el}` build script.""" + crate = f"{GUEST_PREFIX}{el}" + run_command(["cargo", "clean", "--package", crate]) + proc = run_command(["cargo", "build", "-vv", "--package", crate], PIPE, STDOUT) + match = re.search(r"cargo:rustc-env=EL_VERSION=(\S+)", proc.stdout) + if not match: + raise RuntimeError(f"EL_VERSION not emitted by `{crate}` build script") + return match.group(1) + + +def read_zkvm_versions() -> dict[str, str]: + """Returns zkVM SDK versions parsed from the `ere-catalog` build-script output.""" + version_file = "zkvm_sdk_version_impl.rs" + run_command(["cargo", "build", "--package", "ere-catalog"]) + outputs = (TARGET_DIR / "debug" / "build").glob(f"ere-catalog-*/out/{version_file}") + latest = max(outputs, key=lambda path: path.stat().st_mtime, default=None) + if latest is None: + raise RuntimeError(f"{version_file} not found after building ere-catalog") + versions = re.findall(r'Self::(\w+)\s*=>\s*"([^"]+)"', latest.read_text()) + if not versions: + raise RuntimeError(f"failed to parse zkVM versions from {version_file}") + return {zkvm.lower(): version for zkvm, version in versions} + + +def read_elf_word_size(elf_path: Path) -> int: + """Returns the ELF word size (32 or 64) reported by `file`.""" + proc = run_command(["file", str(elf_path)], PIPE, STDOUT) + if "32-bit" in proc.stdout: + return 32 + if "64-bit" in proc.stdout: + return 64 + raise RuntimeError(f"cannot determine ELF class from `file`: {proc.stdout.strip()}") + + +def render_row(guest: Guest, artifacts_dir: Path, release_url: str) -> str | None: + """Renders `guest` as a Markdown table row, or None when its ELF or VK is absent.""" + elf = f"{GUEST_PREFIX}{guest.el}-{guest.zkvm}.elf" + vk = f"{GUEST_PREFIX}{guest.el}-{guest.zkvm}.vk" + elf_path = artifacts_dir / elf + vk_path = artifacts_dir / vk + if not (elf_path.is_file() and vk_path.is_file()): + return None + + target = f"riscv{read_elf_word_size(elf_path)}im" + elf_cell = f"[Link]({release_url}/{elf})" + if guest.source_url: + elf_cell += f" / [Source]({guest.source_url})" + return ( + f"| `{guest.el}` | `{guest.el_version}` " + f"| `{guest.zkvm}` | `{guest.zkvm_version}` " + f"| `{target}` | {elf_cell} | [Link]({release_url}/{vk}) |" + ) + + +def compiled_guests() -> list[Guest]: + """Returns the COMPILED_ELS x ZKVMS guests, with versions from the build scripts.""" + el_versions = {el: read_compiled_el_version(el) for el in COMPILED_ELS} + zkvm_versions = read_zkvm_versions() + return [ + Guest(el, el_versions[el], zkvm, zkvm_versions[zkvm]) + for el in COMPILED_ELS + for zkvm in ZKVMS + ] + + +def republished_guests(artifact_registry: Path) -> list[Guest]: + """Returns the guests listed in the artifact registry, ordered by key.""" + registry = json.loads(artifact_registry.read_text())["stateless-validator-elf"] + guests = [] + for key, entry in sorted(registry.items()): + el, zkvm = key.rsplit("-", 1) + guests.append( + Guest(el, entry["el_version"], zkvm, entry["zkvm_version"], entry["url"]) + ) + return guests + + +def compiled_rows(artifacts_dir: Path, release_url: str) -> list[str]: + """Returns rows for compiled guests, skipping any whose artifacts are absent.""" + rendered = ( + render_row(guest, artifacts_dir, release_url) for guest in compiled_guests() + ) + return [row for row in rendered if row is not None] + + +def republished_rows( + artifacts_dir: Path, artifact_registry: Path, release_url: str +) -> list[str]: + """Returns rows for registry guests, requiring every artifact to be present.""" + rows = [] + for guest in republished_guests(artifact_registry): + row = render_row(guest, artifacts_dir, release_url) + if row is None: + raise RuntimeError( + f"republished guest {GUEST_PREFIX}{guest.el}-{guest.zkvm}.elf is missing" + ) + rows.append(row) + return rows + + +def render_release_body(tag: str, artifacts_dir: Path, artifact_registry: Path) -> str: + """Builds the Markdown release body for `tag`.""" + release_url = f"https://github.com/{REPOSITORY}/releases/download/{tag}" + + ere_version = read_ere_version() + compiled = compiled_rows(artifacts_dir, release_url) + republished = republished_rows(artifacts_dir, artifact_registry, release_url) + + body = [ + "## Compiled guest programs", + "", + f"Built with Ere compiler version: `{ere_version}`.", + "", + *TABLE_HEADER, + *compiled, + ] + if republished: + body += [ + "", + "## Republished guest programs", + "", + *TABLE_HEADER, + *republished, + ] + return "\n".join(body) + + +def main() -> None: + args = parse_args() + print(render_release_body(args.tag, args.artifacts_dir, args.artifact_registry)) + + +if __name__ == "__main__": + try: + main() + except RuntimeError as error: + sys.exit(str(error)) diff --git a/.github/workflows/compile-and-release.yml b/.github/workflows/compile-and-release.yml index 225f812..75b6087 100644 --- a/.github/workflows/compile-and-release.yml +++ b/.github/workflows/compile-and-release.yml @@ -129,6 +129,15 @@ jobs: if: needs.check-git-tag.outputs.exists == 'true' runs-on: ubuntu-latest steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + + - name: Cache cargo build + uses: Swatinem/rust-cache@v2 + - name: Download all artifacts uses: actions/download-artifact@v4 with: @@ -138,44 +147,10 @@ jobs: - name: Display structure of downloaded files run: ls -R artifacts - - name: Generate release notes + - name: Generate release notes body run: | - echo "## Compiled guest programs" > release-body.md - echo "" >> release-body.md - echo "This release contains compiled guest programs for various zkVMs." >> release-body.md - echo "" >> release-body.md - echo "Built with Ere compiler version: \`${{ needs.compile.outputs.ere_tag }}\`." >> release-body.md - echo "" >> release-body.md - - RELEASE_URL="https://github.com/${{ github.repository }}/releases/download/${{ needs.check-git-tag.outputs.tag }}" - - # Get unique guest names from .elf files - declare -A guests - for file in artifacts/*.elf; do - if [ -f "$file" ]; then - filename=$(basename "$file") - # Skip variant ELFs (e.g. -profiling.elf) — only canonical guest-zkvm.elf entries are listed. - [[ "$filename" == *-profiling.elf ]] && continue - # Strip the last -zkvm.elf segment to get the guest name - guest=$(echo "$filename" | sed 's/-[^-]*\.elf$//') - guests["$guest"]=1 - fi - done - - # Sort and group by guest - for guest in $(echo "${!guests[@]}" | tr ' ' '\n' | sort); do - echo "### $guest" >> release-body.md - echo "" >> release-body.md - for elf_file in artifacts/$guest-*.elf; do - if [ -f "$elf_file" ]; then - elf_name=$(basename "$elf_file") - [[ "$elf_name" == *-profiling.elf ]] && continue - program_vk_name="${elf_name%.elf}.vk" - echo "- [\`$elf_name\`]($RELEASE_URL/$elf_name) | [\`$program_vk_name\`]($RELEASE_URL/$program_vk_name)" >> release-body.md - fi - done - echo "" >> release-body.md - done + .github/scripts/release-body.py --tag "${{ needs.check-git-tag.outputs.tag }}" > release-body.md + cat release-body.md - name: Install Minisign run: sudo apt-get update && sudo apt-get install -y minisign @@ -222,7 +197,7 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - EXISTING="$(gh release view --repo "${{ github.repository }}" "${{ needs.check-git-tag.outputs.tag }}" --json body -q .body)" - gh release edit --repo "${{ github.repository }}" "${{ needs.check-git-tag.outputs.tag }}" --notes "${EXISTING} - - $(cat release-body.md)" + gh release view --repo "${{ github.repository }}" "${{ needs.check-git-tag.outputs.tag }}" --json body -q .body > combined-notes.md + printf '\n\n' >> combined-notes.md + cat release-body.md >> combined-notes.md + gh release edit --repo "${{ github.repository }}" "${{ needs.check-git-tag.outputs.tag }}" --notes-file combined-notes.md diff --git a/.gitignore b/.gitignore index ff8858e..419c734 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ target .vscode .secrets +__pycache__ diff --git a/artifact-registry.json b/artifact-registry.json new file mode 100644 index 0000000..ceaacae --- /dev/null +++ b/artifact-registry.json @@ -0,0 +1,5 @@ +{ + "stateless-validator-elf": {}, + "stateless-validator-static-library": {}, + "zkvm-static-library": {} +} \ No newline at end of file From 7fcdf03b501e631d97658756ee1de2881cf9e2ea Mon Sep 17 00:00:00 2001 From: han0110 Date: Tue, 26 May 2026 07:35:26 +0000 Subject: [PATCH 4/5] chore: sync Cargo.lock --- .../risc0/Cargo.lock | 41 +++++++++++++++ bin/stateless-validator-ethrex/sp1/Cargo.lock | 45 ++++++++++++++++ .../zisk/Cargo.lock | 51 +++++++++++++++++++ .../airbender/Cargo.lock | 45 ++++++++++++++++ .../openvm/Cargo.lock | 47 ++++++++++++++++- bin/stateless-validator-reth/risc0/Cargo.lock | 41 +++++++++++++++ bin/stateless-validator-reth/sp1/Cargo.lock | 47 ++++++++++++++++- bin/stateless-validator-reth/zisk/Cargo.lock | 45 ++++++++++++++++ 8 files changed, 360 insertions(+), 2 deletions(-) diff --git a/bin/stateless-validator-ethrex/risc0/Cargo.lock b/bin/stateless-validator-ethrex/risc0/Cargo.lock index 92c0f62..ebee477 100644 --- a/bin/stateless-validator-ethrex/risc0/Cargo.lock +++ b/bin/stateless-validator-ethrex/risc0/Cargo.lock @@ -482,6 +482,38 @@ dependencies = [ "serde", ] +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "cc" version = "1.2.60" @@ -938,6 +970,14 @@ dependencies = [ "risc0-zkvm-platform", ] +[[package]] +name = "ere-util-build" +version = "0.11.0" +source = "git+https://github.com/eth-act/ere?tag=v0.11.0#e1d345c5e4e2b41d1334421310443306ea44f65f" +dependencies = [ + "cargo_metadata", +] + [[package]] name = "ethbloom" version = "0.14.1" @@ -2747,6 +2787,7 @@ name = "stateless-validator-ethrex" version = "0.11.0" dependencies = [ "anyhow", + "ere-util-build", "ethrex-common", "ethrex-crypto", "ethrex-guest-program", diff --git a/bin/stateless-validator-ethrex/sp1/Cargo.lock b/bin/stateless-validator-ethrex/sp1/Cargo.lock index 1272dc7..7548161 100644 --- a/bin/stateless-validator-ethrex/sp1/Cargo.lock +++ b/bin/stateless-validator-ethrex/sp1/Cargo.lock @@ -452,6 +452,38 @@ dependencies = [ "serde", ] +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "cc" version = "1.2.60" @@ -882,6 +914,14 @@ dependencies = [ "sp1-zkvm", ] +[[package]] +name = "ere-util-build" +version = "0.11.0" +source = "git+https://github.com/eth-act/ere?tag=v0.11.0#e1d345c5e4e2b41d1334421310443306ea44f65f" +dependencies = [ + "cargo_metadata", +] + [[package]] name = "ethbloom" version = "0.14.1" @@ -2544,6 +2584,10 @@ name = "semver" version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] [[package]] name = "serde" @@ -2870,6 +2914,7 @@ name = "stateless-validator-ethrex" version = "0.11.0" dependencies = [ "anyhow", + "ere-util-build", "ethrex-common", "ethrex-crypto", "ethrex-guest-program", diff --git a/bin/stateless-validator-ethrex/zisk/Cargo.lock b/bin/stateless-validator-ethrex/zisk/Cargo.lock index 88901f8..06520c4 100644 --- a/bin/stateless-validator-ethrex/zisk/Cargo.lock +++ b/bin/stateless-validator-ethrex/zisk/Cargo.lock @@ -396,6 +396,38 @@ dependencies = [ "serde", ] +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "cc" version = "1.2.60" @@ -783,6 +815,14 @@ dependencies = [ "ziskos", ] +[[package]] +name = "ere-util-build" +version = "0.11.0" +source = "git+https://github.com/eth-act/ere?tag=v0.11.0#e1d345c5e4e2b41d1334421310443306ea44f65f" +dependencies = [ + "cargo_metadata", +] + [[package]] name = "ethbloom" version = "0.14.1" @@ -2203,6 +2243,16 @@ dependencies = [ "cc", ] +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + [[package]] name = "serde" version = "1.0.228" @@ -2366,6 +2416,7 @@ name = "stateless-validator-ethrex" version = "0.11.0" dependencies = [ "anyhow", + "ere-util-build", "ethrex-common", "ethrex-crypto", "ethrex-guest-program", diff --git a/bin/stateless-validator-reth/airbender/Cargo.lock b/bin/stateless-validator-reth/airbender/Cargo.lock index e8f24c3..e652c77 100644 --- a/bin/stateless-validator-reth/airbender/Cargo.lock +++ b/bin/stateless-validator-reth/airbender/Cargo.lock @@ -752,6 +752,38 @@ dependencies = [ "serde", ] +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "cc" version = "1.2.56" @@ -1152,6 +1184,14 @@ name = "ere-platform-core" version = "0.11.0" source = "git+https://github.com/eth-act/ere?tag=v0.11.0#e1d345c5e4e2b41d1334421310443306ea44f65f" +[[package]] +name = "ere-util-build" +version = "0.11.0" +source = "git+https://github.com/eth-act/ere?tag=v0.11.0#e1d345c5e4e2b41d1334421310443306ea44f65f" +dependencies = [ + "cargo_metadata", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -2741,6 +2781,10 @@ name = "semver" version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] [[package]] name = "seq-macro" @@ -2957,6 +3001,7 @@ dependencies = [ "alloy-rpc-types-engine", "anyhow", "bincode", + "ere-util-build", "guest", "once_cell", "reth-chainspec", diff --git a/bin/stateless-validator-reth/openvm/Cargo.lock b/bin/stateless-validator-reth/openvm/Cargo.lock index 2c31cc9..3b4bedb 100644 --- a/bin/stateless-validator-reth/openvm/Cargo.lock +++ b/bin/stateless-validator-reth/openvm/Cargo.lock @@ -291,7 +291,7 @@ dependencies = [ "alloy-rlp", "alloy-serde", "alloy-sol-types", - "itertools 0.14.0", + "itertools 0.13.0", "serde", "serde_json", "thiserror", @@ -720,6 +720,38 @@ dependencies = [ "serde", ] +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "cc" version = "1.2.56" @@ -1137,6 +1169,14 @@ dependencies = [ "openvm", ] +[[package]] +name = "ere-util-build" +version = "0.11.0" +source = "git+https://github.com/eth-act/ere?tag=v0.11.0#e1d345c5e4e2b41d1334421310443306ea44f65f" +dependencies = [ + "cargo_metadata", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -3135,6 +3175,10 @@ name = "semver" version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] [[package]] name = "serde" @@ -3369,6 +3413,7 @@ dependencies = [ "alloy-rpc-types-engine", "anyhow", "bincode", + "ere-util-build", "guest", "once_cell", "reth-chainspec", diff --git a/bin/stateless-validator-reth/risc0/Cargo.lock b/bin/stateless-validator-reth/risc0/Cargo.lock index 6443ee5..af39d93 100644 --- a/bin/stateless-validator-reth/risc0/Cargo.lock +++ b/bin/stateless-validator-reth/risc0/Cargo.lock @@ -857,6 +857,38 @@ dependencies = [ "serde", ] +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "cc" version = "1.2.56" @@ -1327,6 +1359,14 @@ dependencies = [ "risc0-zkvm-platform", ] +[[package]] +name = "ere-util-build" +version = "0.11.0" +source = "git+https://github.com/eth-act/ere?tag=v0.11.0#e1d345c5e4e2b41d1334421310443306ea44f65f" +dependencies = [ + "cargo_metadata", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -3456,6 +3496,7 @@ dependencies = [ "alloy-rpc-types-engine", "anyhow", "bincode", + "ere-util-build", "guest", "once_cell", "reth-chainspec", diff --git a/bin/stateless-validator-reth/sp1/Cargo.lock b/bin/stateless-validator-reth/sp1/Cargo.lock index 3b3ed13..fa6b957 100644 --- a/bin/stateless-validator-reth/sp1/Cargo.lock +++ b/bin/stateless-validator-reth/sp1/Cargo.lock @@ -302,7 +302,7 @@ dependencies = [ "alloy-rlp", "alloy-serde", "alloy-sol-types", - "itertools 0.14.0", + "itertools 0.13.0", "serde", "serde_json", "thiserror", @@ -853,6 +853,38 @@ dependencies = [ "serde", ] +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "cc" version = "1.2.56" @@ -1318,6 +1350,14 @@ dependencies = [ "sp1-zkvm", ] +[[package]] +name = "ere-util-build" +version = "0.11.0" +source = "git+https://github.com/eth-act/ere?tag=v0.11.0#e1d345c5e4e2b41d1334421310443306ea44f65f" +dependencies = [ + "cargo_metadata", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -3344,6 +3384,10 @@ name = "semver" version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] [[package]] name = "serde" @@ -3719,6 +3763,7 @@ dependencies = [ "alloy-rpc-types-engine", "anyhow", "bincode 2.0.1", + "ere-util-build", "guest", "once_cell", "reth-chainspec", diff --git a/bin/stateless-validator-reth/zisk/Cargo.lock b/bin/stateless-validator-reth/zisk/Cargo.lock index f5c6f25..c720654 100644 --- a/bin/stateless-validator-reth/zisk/Cargo.lock +++ b/bin/stateless-validator-reth/zisk/Cargo.lock @@ -747,6 +747,38 @@ dependencies = [ "serde", ] +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "cc" version = "1.2.56" @@ -1164,6 +1196,14 @@ dependencies = [ "ziskos", ] +[[package]] +name = "ere-util-build" +version = "0.11.0" +source = "git+https://github.com/eth-act/ere?tag=v0.11.0#e1d345c5e4e2b41d1334421310443306ea44f65f" +dependencies = [ + "cargo_metadata", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -2882,6 +2922,10 @@ name = "semver" version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] [[package]] name = "serde" @@ -3095,6 +3139,7 @@ dependencies = [ "alloy-rpc-types-engine", "anyhow", "bincode", + "ere-util-build", "guest", "once_cell", "reth-chainspec", From afcb1b108b45fd91f7cdb7a3a02070d76c4ad60e Mon Sep 17 00:00:00 2001 From: han0110 Date: Tue, 26 May 2026 08:23:19 +0000 Subject: [PATCH 5/5] feat: allow missing profiling elf --- crates/downloader/src/lib.rs | 44 ++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/crates/downloader/src/lib.rs b/crates/downloader/src/lib.rs index b0e01b6..212e99b 100644 --- a/crates/downloader/src/lib.rs +++ b/crates/downloader/src/lib.rs @@ -1,6 +1,6 @@ //! Downloads compiled guests from GitHub releases or action artifacts. -use std::collections::BTreeMap; +use std::{collections::BTreeMap, io::ErrorKind}; use anyhow::{Context, ensure}; use reqwest::{ @@ -21,8 +21,8 @@ pub struct CompiledGuest { pub elf: Vec, /// Raw Program VK bytes. pub program_vk: Vec, - /// Raw ELF bytes of ZisK guest with feature `cycle-scope` enabled. `Some` only if the guest is - /// a ZisK guest. + /// Raw ELF bytes of a ZisK guest compiled with feature `cycle-scope` enabled. `Some` only when + /// a `{guest_name}-profiling.elf` artifact is released. pub profiling_elf: Option>, } @@ -89,10 +89,7 @@ impl Downloader { let elf = get_bytes(&self.client, elf_url).await?; let program_vk = get_bytes(&self.client, program_vk_url).await?; - let profiling_elf = if guest_name.contains("zisk") { - let url = assets - .get(&format!("{guest_name}-profiling.elf")) - .with_context(|| format!("Profiling ELF not found: {guest_name}-profiling.elf"))?; + let profiling_elf = if let Some(url) = assets.get(&format!("{guest_name}-profiling.elf")) { Some(get_bytes(&self.client, url).await?) } else { None @@ -130,23 +127,26 @@ impl Downloader { .context("Failed to run unzip")?; ensure!(output.status.success(), "Unzip exited with non-zero status"); - let elf = fs::read(tempdir.path().join(format!("{guest_name}.elf"))) + let elf_path = tempdir.path().join(format!("{guest_name}.elf")); + let program_vk_path = tempdir.path().join(format!("{guest_name}.vk")); + let profiling_elf_path = tempdir.path().join(format!("{guest_name}-profiling.elf")); + let elf = fs::read(&elf_path) .await - .with_context(|| format!("Failed to read ELF: {guest_name}.elf"))?; - let program_vk = fs::read(tempdir.path().join(format!("{guest_name}.vk"))) + .with_context(|| format!("Failed to read ELF: {}", elf_path.display()))?; + let program_vk = fs::read(&program_vk_path) .await - .with_context(|| format!("Failed to read Program VK: {guest_name}.vk"))?; - - let profiling_elf = if guest_name.contains("zisk") { - Some( - fs::read(tempdir.path().join(format!("{guest_name}-profiling.elf"))) - .await - .with_context(|| { - format!("Failed to read profiling ELF: {guest_name}-profiling.elf") - })?, - ) - } else { - None + .with_context(|| format!("Failed to read Program VK: {}", program_vk_path.display()))?; + let profiling_elf = match fs::read(&profiling_elf_path).await { + Ok(bytes) => Some(bytes), + Err(err) if err.kind() == ErrorKind::NotFound => None, + Err(err) => { + return Err(err).with_context(|| { + format!( + "Failed to read profiling ELF: {}", + profiling_elf_path.display() + ) + }); + } }; Ok(CompiledGuest {