leanQuickstart — operational runbook for the local multi-client devnet
lean-quickstart (github.com/blockblaz/lean-quickstart) is "a utility to quickly spin up
a localnet of lean (multi-client) nodes". It is tooling, not a spec or a library:
Shell scripts orchestrate genesis generation, per-client launch commands, and an optional
Prometheus/Grafana metrics stack, driven by a single validator-config.yaml. Multiple
different client implementations (Zeam, Ream, Lighthouse, …) run against one shared
genesis so you can test interop on a single local chain.
0. Core principle
- This skill grounds how to run the devnet — flags, config, genesis, metrics — not
protocol semantics. The chain behaviour is leanSpec's domain; this is the harness that
starts nodes.
- The authoritative source for how to run it is the upstream
README.md + the scripts
at main. They change (the repo is actively developed). Do not quote flags or
filenames from memory or from a stale local clone — read main and cite the SHA.
- "Run the devnet" = edit
validator-config.yaml, then invoke spin-node.sh. Everything
else (genesis, per-client commands, metrics) is wired from that config.
1. Always read lean-quickstart from the remote main (no local path assumptions)
The tooling evolves. Read the latest main of the canonical upstream directly from the
remote — this works for every developer and in CI, with no dependency on a local clone.
Repo: github.com/blockblaz/lean-quickstart (canonical; default branch main. Do not
use a personal fork.).
# Latest main commit — cite this SHA in your output:
gh api repos/blockblaz/lean-quickstart/commits/main --jq '.sha'
# Read the README (the authoritative quick-start) at main:
gh api "repos/blockblaz/lean-quickstart/contents/README.md?ref=main" --jq '.content' | base64 -d
# raw fallback (no gh):
curl -s https://raw.githubusercontent.com/blockblaz/lean-quickstart/main/README.md
# Read a specific script (e.g. the entry point) at main:
curl -s https://raw.githubusercontent.com/blockblaz/lean-quickstart/main/spin-node.sh
# Full tree at main:
gh api "repos/blockblaz/lean-quickstart/git/trees/main?recursive=1" --jq '.tree[].path'
No gh/curl? Use WebFetch on https://github.com/blockblaz/lean-quickstart/blob/main/<path>.
If you happen to have a local clone, you may use it for fast navigation/grep — but
git fetch origin first and read origin/main (clones drift onto feature branches and
forks). Never assume a specific clone path.
2. Quick start (the canonical command)
NETWORK_DIR=local-devnet ./spin-node.sh --node all --generateGenesis --popupTerminal
--node all — launch every node defined in the config; --node <name> launches a
single node by name.
--generateGenesis — (re)generate genesis state, validator keys, and config from
validator-config.yaml before starting (PQ hash-sig keys via ethpandaops/eth-beacon-genesis).
--popupTerminal — open each node's logs in its own terminal window.
NETWORK_DIR selects the network directory (local-devnet for local; ansible-devnet
for the remote/Ansible flow).
The authoritative, current flag set lives in spin-node.sh --help and the README at
main — confirm there before relying on any flag, as options change.
3. Topic → authoritative location map
Paths are relative to the lean-quickstart repo root, read at main.
| Topic |
Path in lean-quickstart |
| Main entry point / flags |
spin-node.sh; README "Quick Start" |
| Initial host setup |
set-up.sh |
| Genesis generation |
generate-genesis.sh (PQ hash-sig keys via eth-beacon-genesis) |
| Network/node config (local) |
local-devnet/genesis/validator-config.yaml |
| Network/node config (remote) |
ansible-devnet/genesis/validator-config.yaml |
| Config expansion (subnets) |
convert-validator-config.py, generate-subnet-config.py |
| Per-client launch commands |
client-cmds/<client>-cmd.sh (zeam, ream, qlean, lantern, lighthouse, grandine, ethlambda, gean, nlean, peam) |
| Remote (Ansible) deploy |
ansible-deploy.sh, run-ansible.sh, ansible/ |
| Metrics stack (run it) |
generate-prometheus-config.sh, metrics/docker-compose-metrics.yaml, metrics/grafana/ |
| Devnet test notes / retros |
TESTING_DEVNET3.md, docs/devnets/ |
4. How to use (running / configuring / answering)
- Read the README and
spin-node.sh --help at main first — never quote flags from
memory.
- Edit
validator-config.yaml (the single source of truth) to define which nodes, which
client implementations, and how many validators each.
- Run
spin-node.sh with the appropriate --node / --generateGenesis flags; bring up
metrics/docker-compose-metrics.yaml if you want the Prometheus/Grafana stack.
- In your output, cite the file/script + the
main commit SHA you checked.
5. Relationship to leanSpec, leanVM, leanMetrics & Verity
- leanSpec (separate skill) = consensus protocol & container shapes (the chain rules).
- leanVM (separate skill) = aggregation + zkVM proof internals.
- leanMetrics (separate skill) = the observability metric contract (names/types/
buckets/labels). This skill only covers running the bundled Prometheus/Grafana
stack, not what the metrics are.
- leanQuickstart (this skill) = the harness that boots and runs a local
multi-client devnet.
- Verity is pre-implementation, so it is not yet a node in
validator-config.yaml.
1---2name: leanquickstart3description: Ground every "spin up / run a local lean multi-client devnet" question in lean-quickstart — the utility for bootstrapping a localnet of Lean Ethereum multi-client nodes (github.com/blockblaz/lean-quickstart), always read from the latest remote main. It is operational tooling (Shell + Python + Ansible + Docker), not a spec or library; the source of truth for HOW to run it is the upstream README + scripts at main, which evolve. Use before running, configuring, or answering anything about starting a local Lean devnet for Verity. Triggers: "leanQuickstart", "lean-quickstart", "lean_quickstart", "localnet", "devnet", "ローカルネット", "デブネット", "spin-node", "spin-node.sh", "validator-config.yaml", "generate-genesis", "multi-client devnet", "マルチクライアント", and any work spinning up or running a local lean multi-client devnet for Verity. Negative triggers: Do NOT activate for consensus container shapes / fork choice / state transition (use the leanSpec skill). Do NOT activate for aggregation / zkVM / proof internals (use the le4---56# leanQuickstart — operational runbook for the local multi-client devnet78lean-quickstart (`github.com/blockblaz/lean-quickstart`) is "a utility to quickly spin up9a localnet of lean (multi-client) nodes". It is **tooling**, not a spec or a library:10Shell scripts orchestrate genesis generation, per-client launch commands, and an optional11Prometheus/Grafana metrics stack, driven by a single `validator-config.yaml`. Multiple12*different client implementations* (Zeam, Ream, Lighthouse, …) run against one shared13genesis so you can test interop on a single local chain.1415## 0. Core principle1617- This skill grounds **how to run the devnet** — flags, config, genesis, metrics — not18 protocol semantics. The chain behaviour is leanSpec's domain; this is the harness that19 starts nodes.20- The authoritative source for *how to run it* is the upstream `README.md` + the scripts21 at `main`. They change (the repo is actively developed). **Do not quote flags or22 filenames from memory or from a stale local clone** — read `main` and cite the SHA.23- "Run the devnet" = edit `validator-config.yaml`, then invoke `spin-node.sh`. Everything24 else (genesis, per-client commands, metrics) is wired from that config.2526## 1. Always read lean-quickstart from the remote `main` (no local path assumptions)2728The tooling evolves. Read the latest `main` of the canonical upstream directly from the29remote — this works for every developer and in CI, with no dependency on a local clone.3031Repo: `github.com/blockblaz/lean-quickstart` (canonical; default branch `main`. Do **not**32use a personal fork.).3334```bash35# Latest main commit — cite this SHA in your output:36gh api repos/blockblaz/lean-quickstart/commits/main --jq '.sha'3738# Read the README (the authoritative quick-start) at main:39gh api "repos/blockblaz/lean-quickstart/contents/README.md?ref=main" --jq '.content' | base64 -d40# raw fallback (no gh):41curl -s https://raw.githubusercontent.com/blockblaz/lean-quickstart/main/README.md4243# Read a specific script (e.g. the entry point) at main:44curl -s https://raw.githubusercontent.com/blockblaz/lean-quickstart/main/spin-node.sh4546# Full tree at main:47gh api "repos/blockblaz/lean-quickstart/git/trees/main?recursive=1" --jq '.tree[].path'48```4950No `gh`/`curl`? Use WebFetch on `https://github.com/blockblaz/lean-quickstart/blob/main/<path>`.5152If you happen to have a local clone, you *may* use it for fast navigation/grep — but53`git fetch origin` first and read `origin/main` (clones drift onto feature branches and54forks). Never assume a specific clone path.5556## 2. Quick start (the canonical command)5758```bash59NETWORK_DIR=local-devnet ./spin-node.sh --node all --generateGenesis --popupTerminal60```6162- `--node all` — launch **every node** defined in the config; `--node <name>` launches a63 single node by name.64- `--generateGenesis` — (re)generate genesis state, validator keys, and config from65 `validator-config.yaml` before starting (PQ hash-sig keys via `ethpandaops/eth-beacon-genesis`).66- `--popupTerminal` — open each node's logs in its own terminal window.67- `NETWORK_DIR` selects the network directory (`local-devnet` for local; `ansible-devnet`68 for the remote/Ansible flow).6970The **authoritative, current flag set** lives in `spin-node.sh --help` and the README at71`main` — confirm there before relying on any flag, as options change.7273## 3. Topic → authoritative location map7475Paths are relative to the lean-quickstart repo root, read at `main`.7677| Topic | Path in lean-quickstart |78|---|---|79| Main entry point / flags | `spin-node.sh`; README "Quick Start" |80| Initial host setup | `set-up.sh` |81| Genesis generation | `generate-genesis.sh` (PQ hash-sig keys via eth-beacon-genesis) |82| Network/node config (local) | `local-devnet/genesis/validator-config.yaml` |83| Network/node config (remote) | `ansible-devnet/genesis/validator-config.yaml` |84| Config expansion (subnets) | `convert-validator-config.py`, `generate-subnet-config.py` |85| Per-client launch commands | `client-cmds/<client>-cmd.sh` (zeam, ream, qlean, lantern, lighthouse, grandine, ethlambda, gean, nlean, peam) |86| Remote (Ansible) deploy | `ansible-deploy.sh`, `run-ansible.sh`, `ansible/` |87| Metrics stack (run it) | `generate-prometheus-config.sh`, `metrics/docker-compose-metrics.yaml`, `metrics/grafana/` |88| Devnet test notes / retros | `TESTING_DEVNET3.md`, `docs/devnets/` |8990## 4. How to use (running / configuring / answering)91921. Read the README and `spin-node.sh --help` at `main` first — never quote flags from93 memory.942. Edit `validator-config.yaml` (the single source of truth) to define which nodes, which95 client implementations, and how many validators each.963. Run `spin-node.sh` with the appropriate `--node` / `--generateGenesis` flags; bring up97 `metrics/docker-compose-metrics.yaml` if you want the Prometheus/Grafana stack.984. In your output, cite the **file/script + the `main` commit SHA** you checked.99100## 5. Relationship to leanSpec, leanVM, leanMetrics & Verity101102- **leanSpec** (separate skill) = consensus protocol & container shapes (the chain rules).103- **leanVM** (separate skill) = aggregation + zkVM proof internals.104- **leanMetrics** (separate skill) = the observability **metric contract** (names/types/105 buckets/labels). This skill only covers **running** the bundled Prometheus/Grafana106 stack, not what the metrics are.107- **leanQuickstart** (this skill) = the harness that **boots and runs** a local108 multi-client devnet.109- Verity is pre-implementation, so it is **not yet a node** in `validator-config.yaml`.