Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
3a3224c
feat(eest): generate and replay stateful EEST benchmark fixtures
skylenet Jun 16, 2026
d986075
feat(builder): run build containers as host user; rework fill-statefu…
skylenet Jun 16, 2026
c47fd2e
fix(ui): render local EEST fixture sources without crashing
skylenet Jun 16, 2026
60edcf6
feat(build): match run log format and make fill progress readable
skylenet Jun 16, 2026
922f6a0
feat(client): boot state-actor snapshots (besu/reth genesis-trust flags)
skylenet Jun 16, 2026
7ed4411
feat(builder): clone EEST repo at build time into a slim fill image
skylenet Jun 17, 2026
be636d8
refactor(config): one shared cache dir (global.directories.cachedir)
skylenet Jun 17, 2026
c78085c
docs(examples): add state-actor + EEST stateful end-to-end config
skylenet Jun 17, 2026
ee4d3d0
fix(builder): resolve temp symlinks so container mounts work on macOS
skylenet Jun 17, 2026
be482ca
fix: mac toml mount
skylenet Jun 17, 2026
12552dd
feat(builder): build fill image from fill_dockerfile when set
skylenet Jun 17, 2026
4d78d25
fix(builder): install clang/libclang in fill image for native EEST deps
skylenet Jun 17, 2026
212adf6
fix(stats): stop Docker stats collection from inflating MGas/s and ru…
skylenet Jun 17, 2026
4b6e288
fix(examples): enable bootstrap_fcu and pin besu so besu passes
skylenet Jun 18, 2026
dfcc848
fix(examples): point nethermind at the state-actor datadir via Init.B…
skylenet Jun 18, 2026
48fb7af
feat(state-actor): support ethrex as a builder target
skylenet Jun 18, 2026
d728f50
fix(examples): enable p2p on besu so it accepts the bootstrap FCU (#249)
CPerezz Jun 19, 2026
2332849
feat(builder): use distinct 🟠 prefix for BULD container logs
skylenet Jun 22, 2026
77703ca
feat(builder): support erigon as a state_actor client
skylenet Jun 23, 2026
907dc48
fix(examples): run erigon daemon on the bal-devnet-7 build for state-…
skylenet Jun 23, 2026
2ab6fcb
feat(builder): plumb besu/nethermind as eest_payloads fillers (gated,…
skylenet Jun 23, 2026
14e800a
feat(builder): schedule a later fork on the filler via fork_activatio…
skylenet Jun 23, 2026
c2a1100
examples: predeploy the create2 deterministic factory for amsterdam fill
skylenet Jun 23, 2026
67f3f73
feat(examples): amsterdam eest_payloads fill config for geth
skylenet Jun 24, 2026
8fc2ef5
feat(examples): run amsterdam eest payloads against geth runner
skylenet Jun 24, 2026
e5be9c7
feat(runner): automated per-instance genesis fork overrides + amsterd…
skylenet Jun 24, 2026
5c47159
chore(examples): drop bloated-eoa-2g from the amsterdam state-actor spec
skylenet Jun 24, 2026
42d47fd
docs(examples): note erigon can't use genesis_fork_override
skylenet Jun 24, 2026
9808138
docs(configuration): document genesis_fork_override and genesis_eip_o…
skylenet Jun 24, 2026
66b1d4f
feat(examples): add stateful EIP-7928 (BAL) eest_payloads target
skylenet Jun 24, 2026
8a5a110
refactor(examples): split amsterdam config into compute + stateful files
skylenet Jun 24, 2026
00f9440
chore(hack): add orbstack.sh to provision a Linux VM for COW datadirs
skylenet Jun 24, 2026
51a9851
feat(gitrepo): fetch submodules after clone/checkout
skylenet Jun 24, 2026
203c601
feat(examples): full bloatnet/repricing amsterdam stateful config
skylenet Jun 24, 2026
6ffeebc
fix(executor): cap over-long test result path components
skylenet Jun 24, 2026
bb6c8aa
refactor: align eest_payloads genesis/fork config with the runner
skylenet Jun 24, 2026
437135a
fix(executor): preserve full test name when result dir is shortened
skylenet Jun 24, 2026
a35a109
feat(examples): bloatnet full stateful — fix ether_transfers funding,…
skylenet Jun 25, 2026
8914b1b
fix(examples): nest runner genesis under client.config.genesis in blo…
skylenet Jun 25, 2026
4687f21
feat(examples): add nethermind cross-client filler to bloatnet full s…
skylenet Jun 25, 2026
770290f
feat(examples): add nethermind cross-client filler to simple compute/…
skylenet Jun 25, 2026
39831b8
feat(eest_payloads): add per-target `marker` for pytest -m
skylenet Jun 25, 2026
2485b43
docs: nethermind is also a supported eest_payloads filler
skylenet Jun 25, 2026
7ade07c
feat(examples): keep test_blockhash on the nethermind compute filler …
skylenet Jun 25, 2026
9be2af9
feat(examples): enable the besu compute filler target
skylenet Jun 25, 2026
cafd153
chore(typos): allow the BAL / BALs identifiers
skylenet Jun 26, 2026
feeb565
feat(runner): copy EEST .meta into suite output as .eest-meta
skylenet Jun 26, 2026
6fe7c9f
feat(ui): show EEST build metadata in the suite Source tab
skylenet Jun 26, 2026
9ba6069
feat(runs): surface state-actor snapshot manifest as a Database section
skylenet Jun 26, 2026
bb7fab0
feat(eest): support inline address_stubs in addition to address_stubs…
skylenet Jun 26, 2026
fef4ae6
feat(eest): hoist tests/filter/marker/address_stubs to eest_payloads.…
skylenet Jun 26, 2026
4c61059
chore(examples): rename config.state-actor-eest.yaml to config.state-…
skylenet Jun 26, 2026
259c497
chore(examples): point amsterdam EEST configs at upstream devnets/bal…
skylenet Jun 26, 2026
7467930
chore(examples): drop the "filler_image is set per-target" comments
skylenet Jun 26, 2026
3a9eea0
docs(examples): trim verbose comments from the amsterdam EEST configs
skylenet Jun 26, 2026
aa99633
chore(examples): use upstream ethpandaops/besu:bal-devnet-7 for the b…
skylenet Jun 26, 2026
04131ad
feat(examples): add a besu eest filler target to the simple amsterdam…
skylenet Jun 26, 2026
90b21c6
docs(examples): point commented besu filler at ethpandaops/besu:main
skylenet Jun 26, 2026
c94d3d1
docs(examples): point commented nethermind filler at nethermindeth/ne…
skylenet Jun 26, 2026
220119f
feat(config): add global.env config-local vars; give each state-actor…
skylenet Jun 26, 2026
f9b66dd
docs(configuration): document global.env, eest_payloads config hoisti…
skylenet Jun 26, 2026
8aa303c
feat(build): add --limit-state-actor-target / --limit-eest-payload-ta…
skylenet Jun 26, 2026
7d1765b
chore(examples): add EEST_FIXTURES_DIR to global.env with per-config …
skylenet Jun 26, 2026
cf4da66
chore(examples): rename STATE_DIR_PREFIX to STATE_DIR for consistency…
skylenet Jun 26, 2026
4e90338
chore(examples): make runner fixture source selectable via EEST_FIXTU…
skylenet Jun 26, 2026
e60eefd
feat(build): add --skip-state-actor-build / --skip-eest-payload-build…
skylenet Jun 26, 2026
165fe13
chore(examples): set eest_payloads pull_policy to always
skylenet Jun 26, 2026
21ecbd9
fix(eest): only warn about a missing pre_run when start block is ahea…
skylenet Jun 26, 2026
2d1f8e7
chore(examples): set rollback_strategy container-recreate on simple a…
skylenet Jun 26, 2026
1d90987
feat(examples): enable ethrex as a state-actor target in the full ams…
skylenet Jun 26, 2026
66e65e8
feat(examples): enable ethrex runner instance in the full amsterdam s…
skylenet Jun 26, 2026
6ec8caa
feat(examples): enable reth as a state-actor target and runner instance
skylenet Jun 27, 2026
0ab6212
chore(examples): route reth's overlay scratch via runner.directories.…
skylenet Jun 27, 2026
78d0a75
fix(builder): fail fast when eest filler container exits before RPC r…
skylenet Jun 30, 2026
4fe2691
chore(hack): install make + git in the orbstack VM provisioner
skylenet Jun 30, 2026
b337091
chore(hack): build the orbstack VM binary via make build-core into bin/
skylenet Jun 30, 2026
590199b
fix(config): preserve address-stub casing across multi-file config me…
skylenet Jun 30, 2026
5f77bdf
fix(builder): make tailBuffer safe for concurrent use
skylenet Jun 30, 2026
626752d
feat(build): tear down the shared eest build network after a build an…
skylenet Jun 30, 2026
81690d3
test: tighten stateful fixture ordering assertion and cover build sum…
skylenet Jun 30, 2026
19d65ed
feat(examples): enable besu as a state-actor target and runner instance
skylenet Jun 30, 2026
2ca2d8f
feat(config): allow builder.state_actor.spec as structured YAML (not …
skylenet Jun 30, 2026
3a836c5
fix(config): reject genesis_fork_override + genesis_eip_override on t…
skylenet Jun 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 106 additions & 0 deletions .hack/orbstack.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
#!/usr/bin/env bash
#
# Provision an OrbStack Linux machine to run benchmarkoor with a copy-on-write
# datadir method (overlayfs). macOS has no overlayfs/zfs/schelk, so the large
# stateful prestates (e.g. config.state-actor-eest.full.amsterdam.stateful.yaml,
# ~77 GB) can't use anything but `copy` on the host — which is infeasible at that
# size. An OrbStack Linux machine has a real kernel (overlayfs works) and we run
# a DEDICATED dockerd inside it so benchmarkoor, dockerd, and the overlay mounts
# all share one filesystem namespace (the merged dir must be bind-mountable into
# the client containers — the host's shared Docker engine can't see VM-local
# overlay mounts).
#
# Prereqs: OrbStack installed (https://orbstack.dev). The repo is auto-shared
# into the machine at the same path, so no copying is needed.
#
# Usage:
# .hack/orbstack.sh [machine-name] # default: bench
#
# After it finishes the binary is at <repo>/bin/benchmarkoor (also symlinked onto
# PATH, so a bare `benchmarkoor` works). Run it INSIDE the machine as root
# (overlayfs mount needs CAP_SYS_ADMIN), e.g.:
# orb -m bench sudo benchmarkoor build \
# --config $(pwd)/examples/configuration/config.state-actor-eest.full.amsterdam.stateful.yaml --force
# orb -m bench sudo benchmarkoor run \
# --config $(pwd)/examples/configuration/config.state-actor-eest.full.amsterdam.stateful.yaml --limit-instance-id=geth
set -euo pipefail

MACHINE="${1:-bench}"
DISTRO="${ORBSTACK_DISTRO:-ubuntu}"

REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"

if ! command -v orb >/dev/null 2>&1; then
echo "error: 'orb' not found — install OrbStack first (https://orbstack.dev)" >&2
exit 1
fi

echo "==> Repo root: ${REPO_ROOT}"
echo "==> OrbStack machine: ${MACHINE} (${DISTRO})"

# 1. Create the machine if it doesn't already exist (idempotent).
if orb list 2>/dev/null | awk '{print $1}' | grep -qx "${MACHINE}"; then
echo "==> Machine '${MACHINE}' already exists, reusing it."
else
echo "==> Creating machine '${MACHINE}'..."
orb create "${DISTRO}" "${MACHINE}"
fi

# 2. Provision inside the machine: dedicated dockerd + Go toolchain, then build
# benchmarkoor natively. Everything below runs as root in the machine.
orb -m "${MACHINE}" sudo bash -s -- "${REPO_ROOT}" <<'PROVISION'
set -euo pipefail
REPO_ROOT="$1"

echo "==> apt: docker.io + golang-go + make + git"
export DEBIAN_FRONTEND=noninteractive
apt-get update -qq
# make + git let you run the repo's Makefile targets (e.g. `make build-core`,
# `make test-core`) inside the machine; git also stamps the version/commit.
apt-get install -y -qq docker.io golang-go make git

echo "==> Starting the machine's own dockerd"
systemctl enable --now docker
systemctl is-active --quiet docker || { echo "dockerd failed to start" >&2; exit 1; }

# A dedicated, VM-local docker daemon is the whole point — confirm it.
docker version --format ' dockerd {{.Server.Version}}' >/dev/null

echo "==> Go: $(go version)"
case "$(go version)" in
*go1.2[3-9]*|*go1.[3-9][0-9]*|*go[2-9].*) : ;;
*) echo "warning: Go < 1.23 detected; benchmarkoor needs >= 1.23. Install a newer Go." >&2 ;;
esac

echo "==> Building benchmarkoor (make build-core)"
cd "${REPO_ROOT}"
GOCACHE=/root/.cache/go-build GOPATH=/root/go make build-core
# The binary lands in ${REPO_ROOT}/bin/benchmarkoor. Symlink it onto PATH so a
# bare `benchmarkoor` works from anywhere and a later `make build-core` (rebuild
# after a code change) is picked up automatically — no stale copy.
ln -sf "${REPO_ROOT}/bin/benchmarkoor" /usr/local/bin/benchmarkoor
benchmarkoor --help >/dev/null \
&& echo "==> benchmarkoor built at ${REPO_ROOT}/bin/benchmarkoor (symlinked onto PATH at /usr/local/bin/benchmarkoor)"

echo "==> Verifying overlayfs works in this machine"
d="$(mktemp -d)"; mkdir -p "$d"/{low,up,work,merged}; echo ok > "$d/low/f"
mount -t overlay overlay -o "lowerdir=$d/low,upperdir=$d/up,workdir=$d/work" "$d/merged"
docker run --rm -v "$d/merged:/m" alpine cat /m/f >/dev/null && echo "==> overlayfs + dockerd bind-mount: OK"
umount "$d/merged"; rm -rf "$d"
PROVISION

cat <<EOF

==> Done. The '${MACHINE}' machine is ready (dedicated dockerd + overlayfs + benchmarkoor).

benchmarkoor is built at ${REPO_ROOT}/bin/benchmarkoor (symlinked onto PATH).
Run it inside the machine as root (the repo is shared at ${REPO_ROOT}):

orb -m ${MACHINE} sudo benchmarkoor build \\
--config ${REPO_ROOT}/examples/configuration/config.state-actor-eest.full.amsterdam.stateful.yaml --force

orb -m ${MACHINE} sudo benchmarkoor run \\
--config ${REPO_ROOT}/examples/configuration/config.state-actor-eest.full.amsterdam.stateful.yaml --limit-instance-id=geth

Tear down with: orb delete ${MACHINE}
EOF
60 changes: 60 additions & 0 deletions Dockerfile.eest-filler
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Dockerfile.eest-filler
#
# Builds the toolchain image referenced by `builder.eest_payloads.fill_image`:
# it carries only `uv` + python + the build toolchain — NOT the execution-specs
# repo. benchmarkoor clones execution-specs at build time (at the configured
# `eest_ref`, caching it on disk) and mounts the checkout into this container at
# /eest, then runs `uv run fill-stateful`. uv builds the venv into the mounted
# checkout on first use (cached across runs). This keeps the EEST version in
# config and changeable without rebuilding the image.
#
# fill-stateful drives a *live* EL client over testing_buildBlockV1, so — unlike
# the t8n-based `fill` — it needs NO evmone/eels transition-tool binary.
#
# Build:
# docker build -f Dockerfile.eest-filler -t ghcr.io/your-org/eest-fill-stateful:latest .
# # (podman build works identically)
#
# Then point your config at it:
# builder:
# eest_payloads:
# fill_image: ghcr.io/your-org/eest-fill-stateful:latest
# eest_ref: forks/amsterdam # optional; defaults to forks/amsterdam

ARG PYTHON_VERSION=3.12

FROM python:${PYTHON_VERSION}-slim-bookworm

# uv: copy the static binary from the official image (recommended pattern).
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /usr/local/bin/

# Runtime deps: git (fill-stateful reads its commit hash from the checkout, and
# uv resolves git deps); ca-certificates for HTTPS to PyPI; build-essential plus
# clang/libclang-dev/pkg-config for EEST dependencies without a prebuilt wheel.
# In particular `ethereum-execution[optimized]` pulls in rust-pyspec-glue, whose
# native mdbx-sys crate has no arm64 wheel and is compiled from source: its build
# script runs bindgen, which dlopens libclang. Cargo itself is bootstrapped by uv
# at build time, so only the clang toolchain has to be present in the image.
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
git \
ca-certificates \
build-essential \
clang \
libclang-dev \
pkg-config \
&& rm -rf /var/lib/apt/lists/*

# Point bindgen/clang-sys straight at the bookworm-default LLVM 14 libclang so it
# never falls back to its "couldn't find any valid shared libraries" failure. The
# base image is pinned to bookworm (above), so the LLVM major version is stable.
ENV LIBCLANG_PATH=/usr/lib/llvm-14/lib

ENV UV_NO_PROGRESS=1

# The execution-specs checkout is bind-mounted here by benchmarkoor at run time;
# the relative test paths (e.g. tests/benchmark/stateful) resolve against it.
WORKDIR /eest

# Standalone default; benchmarkoor overrides this with the full fill-stateful argv.
CMD ["uv", "--version"]
8 changes: 8 additions & 0 deletions _typos.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,11 @@ extend-exclude = ["go.mod"]
[default.extend-words]
PANC = "PANC"
ERRO = "ERRO"
BULD = "BULD"

# EIP-7928 block access lists. typos splits the identifier "BALs" into "BA"+"Ls"
# and flags "BA" as a typo of "BY"/"BE"; allow the whole identifier (and the
# singular "BAL") so the BAL terminology in comments/config passes.
[default.extend-identifiers]
BAL = "BAL"
BALs = "BALs"
Loading
Loading