|
| 1 | +#!/usr/bin/env bash |
| 2 | +# Benchmark: Lambda VM proving an empty ethrex block. |
| 3 | +# |
| 4 | +# Usage: ./bench_vs/run_ethrex.sh [--report-dir DIR] [--no-color] |
| 5 | +# |
| 6 | +# Prerequisites: |
| 7 | +# - Lambda VM CLI build dependencies available |
| 8 | +# - Sysroot present at /opt/lambda-vm-sysroot (run `make prepare-sysroot` first) |
| 9 | +# - Rust stable + nightly-2026-02-01 installed |
| 10 | + |
| 11 | +set -euo pipefail |
| 12 | + |
| 13 | +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| 14 | +ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" |
| 15 | +TMP_DIR="/tmp/bench_ethrex" |
| 16 | +REPORT_DIR="" |
| 17 | +NO_COLOR=false |
| 18 | + |
| 19 | +RED='\033[0;31m' |
| 20 | +GREEN='\033[0;32m' |
| 21 | +YELLOW='\033[1;33m' |
| 22 | +BOLD='\033[1m' |
| 23 | +NC='\033[0m' |
| 24 | + |
| 25 | +# --- Parse args ------------------------------------------------------------- |
| 26 | +while [[ $# -gt 0 ]]; do |
| 27 | + case $1 in |
| 28 | + --report-dir) |
| 29 | + if [[ $# -lt 2 ]]; then echo "--report-dir requires an argument"; exit 1; fi |
| 30 | + REPORT_DIR=$2 |
| 31 | + shift 2 |
| 32 | + ;; |
| 33 | + --no-color) |
| 34 | + NO_COLOR=true |
| 35 | + shift |
| 36 | + ;; |
| 37 | + -h|--help) |
| 38 | + echo "Usage: $0 [--report-dir DIR] [--no-color]" |
| 39 | + exit 0 |
| 40 | + ;; |
| 41 | + *) |
| 42 | + echo "Unknown option: $1" |
| 43 | + exit 1 |
| 44 | + ;; |
| 45 | + esac |
| 46 | +done |
| 47 | + |
| 48 | +if $NO_COLOR; then |
| 49 | + RED='' |
| 50 | + GREEN='' |
| 51 | + YELLOW='' |
| 52 | + BOLD='' |
| 53 | + NC='' |
| 54 | +fi |
| 55 | + |
| 56 | +mkdir -p "$TMP_DIR" |
| 57 | +rm -rf "${TMP_DIR:?}"/* |
| 58 | + |
| 59 | +if [ -n "$REPORT_DIR" ]; then |
| 60 | + mkdir -p "$REPORT_DIR/raw" |
| 61 | +fi |
| 62 | + |
| 63 | +extract_proving_time() { |
| 64 | + sed -nE '/Proving time: [0-9.]+s/ { |
| 65 | + s/.*Proving time: ([0-9.]+)s.*/\1/ |
| 66 | + p |
| 67 | + q |
| 68 | + }' |
| 69 | +} |
| 70 | + |
| 71 | +extract_cycles() { |
| 72 | + sed -nE '/Cycles: [0-9]+/ { |
| 73 | + s/.*Cycles: ([0-9]+).*/\1/ |
| 74 | + p |
| 75 | + q |
| 76 | + }' |
| 77 | +} |
| 78 | + |
| 79 | +# --- Pre-build -------------------------------------------------------------- |
| 80 | + |
| 81 | +CLI="$ROOT_DIR/target/release/cli" |
| 82 | +ETHREX_ELF="$ROOT_DIR/executor/program_artifacts/rust/ethrex.elf" |
| 83 | +ETHREX_INPUT="$ROOT_DIR/executor/tests/ethrex_empty_block.bin" |
| 84 | +echo -e "${BOLD}=== Ethrex Empty Block Benchmark: Lambda VM ===${NC}" |
| 85 | +echo "" |
| 86 | + |
| 87 | +echo -e "${GREEN}[Lambda VM] Building CLI...${NC}" |
| 88 | +cargo build --release -p cli --manifest-path "$ROOT_DIR/Cargo.toml" 2>&1 | tail -5 |
| 89 | + |
| 90 | +if [ -f "$ETHREX_ELF" ]; then |
| 91 | + echo -e "${YELLOW}[Lambda VM] Using pre-existing ethrex.elf at $ETHREX_ELF${NC}" |
| 92 | +else |
| 93 | + echo -e "${GREEN}[Lambda VM] Building ethrex guest ELF...${NC}" |
| 94 | + make -C "$ROOT_DIR" executor/program_artifacts/rust/ethrex.elf 2>&1 | tail -5 |
| 95 | +fi |
| 96 | + |
| 97 | +if [ ! -f "$ETHREX_ELF" ]; then |
| 98 | + echo -e "${RED}[Lambda VM] Build failed — ethrex.elf not found at $ETHREX_ELF${NC}" |
| 99 | + exit 1 |
| 100 | +fi |
| 101 | + |
| 102 | +if [ ! -f "$ETHREX_INPUT" ]; then |
| 103 | + echo -e "${RED}Input file not found: $ETHREX_INPUT${NC}" |
| 104 | + exit 1 |
| 105 | +fi |
| 106 | + |
| 107 | +# --- Run benchmark --------------------------------------------------- |
| 108 | +echo "" |
| 109 | +echo -e "${BOLD}--- Proving empty ethrex block ---${NC}" |
| 110 | + |
| 111 | +proof_file="$TMP_DIR/ethrex_empty_block.proof" |
| 112 | +stderr_file="$TMP_DIR/ethrex_empty_block.stderr" |
| 113 | + |
| 114 | +echo -e " ${GREEN}[Lambda VM] Proving...${NC}" |
| 115 | +if ! lambda_output=$("$CLI" prove "$ETHREX_ELF" \ |
| 116 | + -o "$proof_file" \ |
| 117 | + --private-input "$ETHREX_INPUT" \ |
| 118 | + --time --cycles 2>"$stderr_file"); then |
| 119 | + echo -e " ${RED}[Lambda VM] FAILED:${NC}" |
| 120 | + cat "$stderr_file" |
| 121 | + exit 1 |
| 122 | +fi |
| 123 | +rm -f "$proof_file" |
| 124 | + |
| 125 | +lambda_time=$(printf "%s\n" "$lambda_output" | extract_proving_time) |
| 126 | +lambda_cycles=$(printf "%s\n" "$lambda_output" | extract_cycles) |
| 127 | + |
| 128 | +if [ -z "$lambda_time" ]; then |
| 129 | + echo -e " ${RED}[Lambda VM] FAILED: could not parse proving time${NC}" |
| 130 | + printf "%s\n" "$lambda_output" |
| 131 | + exit 1 |
| 132 | +fi |
| 133 | +if [ -z "$lambda_cycles" ]; then |
| 134 | + lambda_cycles="n/a" |
| 135 | +fi |
| 136 | + |
| 137 | +if [ "$lambda_cycles" != "n/a" ]; then |
| 138 | + echo -e " Lambda VM: ${BOLD}${lambda_time}s${NC} (${lambda_cycles} cycles)" |
| 139 | +else |
| 140 | + echo -e " Lambda VM: ${BOLD}${lambda_time}s${NC}" |
| 141 | +fi |
| 142 | + |
| 143 | +if [ -n "$REPORT_DIR" ]; then |
| 144 | + printf "%s\n" "$lambda_output" > "$REPORT_DIR/raw/ethrex_empty_block.stdout" |
| 145 | + cp "$stderr_file" "$REPORT_DIR/raw/ethrex_empty_block.stderr" |
| 146 | +fi |
| 147 | + |
| 148 | +# --- Summary table ---------------------------------------------------------- |
| 149 | + |
| 150 | +echo "" |
| 151 | +echo -e "${BOLD}=== Summary ===${NC}" |
| 152 | +echo -e "Program: ethrex empty block" |
| 153 | +echo "" |
| 154 | + |
| 155 | +printf " %-22s %14s %14s\n" "Program" "Lambda (s)" "Lambda cycles" |
| 156 | +printf " %-22s %14s %14s\n" "----------------------" "----------" "-------------" |
| 157 | +printf " %-22s %13ss %14s\n" "ethrex empty block" "$lambda_time" "$lambda_cycles" |
| 158 | + |
| 159 | +echo "" |
| 160 | +echo -e "Timing window covers single-shot end-to-end proving; excludes verification." |
| 161 | +echo "Raw data in $TMP_DIR/" |
| 162 | + |
| 163 | +# --- Machine-readable report ------------------------------------------------ |
| 164 | + |
| 165 | +if [ -n "$REPORT_DIR" ]; then |
| 166 | + { |
| 167 | + echo "program=ethrex_empty_block" |
| 168 | + echo "input_file=$ETHREX_INPUT" |
| 169 | + echo "timing_window=single_shot_end_to_end_prove_no_verify" |
| 170 | + echo "ethrex_empty_block_time_s=$lambda_time" |
| 171 | + echo "ethrex_empty_block_cycles=$lambda_cycles" |
| 172 | + } > "$REPORT_DIR/ethrex_metrics.txt" |
| 173 | + |
| 174 | + { |
| 175 | + echo "# Ethrex Empty Block — Lambda VM" |
| 176 | + echo |
| 177 | + echo "Timing window: \`single-shot end-to-end prove\` (excludes verification)." |
| 178 | + echo |
| 179 | + echo "| Program | Lambda VM (s) | Lambda cycles |" |
| 180 | + echo "|---------|--------------:|--------------:|" |
| 181 | + printf "| ethrex empty block | %s | %s |\n" "$lambda_time" "$lambda_cycles" |
| 182 | + } > "$REPORT_DIR/ethrex_summary.md" |
| 183 | +fi |
0 commit comments