Join an existing Ethereum devnet (ethpandaops or custom) with a local Lodestar beacon node using engineMock. Use for syncing, debugging, testing serving/sync changes, or monitoring devnet activity without running an execution client.
Resources
1Install
npx skillscat add lodekeeper/dotfiles/join-devnet Install via the SkillsCat registry.
Join Devnet
Run a local Lodestar beacon node against a live Ethereum devnet using --execution.engineMock. No execution client needed — useful for testing CL changes, sync behavior, req/resp serving, and debugging.
Quick Start
cd ~/lodestar-epbs-devnet-0 # or whichever worktree has your branch
# Basic — join epbs-devnet-0 with default ports
./scripts/run-devnet-beacon.sh
# With supernode (all custody columns — needed for PeerDAS/post-Fulu)
./scripts/run-devnet-beacon.sh --supernode
# Different devnet
./scripts/run-devnet-beacon.sh --devnet epbs-devnet-1
# Custom ports (for multi-node setups)
./scripts/run-devnet-beacon.sh --port 9201 --rest-port 9701 --data-dir runs/node-b/beacon-data --log-dir runs/node-b
# Preview command without executing
./scripts/run-devnet-beacon.sh --dry-runScript Location
The script lives at scripts/run-devnet-beacon.sh in the Lodestar worktree. Copy it to any worktree that needs it.
A reference copy is also at: ~/.openclaw/workspace/skills/join-devnet/scripts/run-devnet-beacon.sh
How It Works
- Auto-downloads artifacts from
https://config.<devnet>.ethpandaops.io/if missing:config.yaml— chain parametersgenesis.ssz— genesis statebootstrap_nodes.txt— bootnode ENRs
- Starts Lodestar with
--execution.engineMock --eth1=false(no EL needed) - Connects to devnet via bootnodes + discovery
- Syncs from genesis (or from checkpoint if you add
--checkpointSyncUrl) - Writes PID file for easy cleanup
Options
| Flag | Default | Description |
|---|---|---|
--devnet NAME |
epbs-devnet-0 |
Devnet name (matches ethpandaops URL pattern) |
--artifacts DIR |
devnet-artifacts/$DEVNET |
Path to config/genesis/bootnodes |
--data-dir DIR |
runs/$DEVNET/beacon-data |
Beacon chain database |
--log-dir DIR |
runs/$DEVNET |
Log files directory |
--port PORT |
9200 |
libp2p TCP port |
--rest-port PORT |
9700 |
REST API port |
--supernode |
off | Enable all custody columns (needed for post-Fulu batches) |
--log-level LEVEL |
info |
Console log level |
--extra-flags "..." |
none | Additional lodestar flags |
--dry-run |
off | Print command without running |
Multi-Node Setup
Run two nodes on the same machine (e.g., for e2e serve+sync testing):
# Node A — syncs from devnet, serves data
./scripts/run-devnet-beacon.sh --supernode --port 9200 --rest-port 9700 \
--data-dir runs/e2e/node-a/beacon-data --log-dir runs/e2e/node-a
# Wait for Node A to sync...
# Get Node A's peer ID:
A_PEER=$(curl -s http://127.0.0.1:9700/eth/v1/node/identity | jq -r '.data.peer_id')
# Node B — syncs exclusively from Node A
./scripts/run-devnet-beacon.sh --port 9201 --rest-port 9701 \
--data-dir runs/e2e/node-b/beacon-data --log-dir runs/e2e/node-b \
--extra-flags "--discv5=false --directPeers /ip4/127.0.0.1/tcp/9200/p2p/$A_PEER --targetPeers 1"Note: Strict direct-peer mode may hit a yamux stream-handshake bug (
Too many messages for missing streams). Use mixed-peer discovery instead for reliable testing. See #8999.
Monitoring
# Sync progress
curl -s http://127.0.0.1:9700/eth/v1/node/syncing | jq
# Peer count
curl -s http://127.0.0.1:9700/eth/v1/node/peer_count | jq
# Node identity (peer ID, ENR)
curl -s http://127.0.0.1:9700/eth/v1/node/identity | jq
# Follow logs
tail -f runs/epbs-devnet-0/run.out
# Stop
kill $(cat runs/epbs-devnet-0/beacon.pid)Downloading Artifacts Manually
If auto-download fails (private devnet, auth required):
DEVNET=epbs-devnet-0
mkdir -p devnet-artifacts/$DEVNET
curl -sL https://config.${DEVNET}.ethpandaops.io/cl/config.yaml > devnet-artifacts/$DEVNET/config.yaml
curl -sL https://config.${DEVNET}.ethpandaops.io/cl/genesis.ssz > devnet-artifacts/$DEVNET/genesis.ssz
curl -sL https://config.${DEVNET}.ethpandaops.io/cl/bootstrap_nodes.txt > devnet-artifacts/$DEVNET/bootstrap_nodes.txtCommon Issues
| Problem | Fix |
|---|---|
EADDRINUSE on port |
Another node on same port. Use lsof -iTCP:<port> -sTCP:LISTEN to find it, kill it, or use different --port |
headState does not exist on restart |
Stale data dir from different branch. Delete --data-dir and restart |
Too many messages for missing streams |
yamux bug in small peer sets. Use normal discovery, not --directPeers isolation |
| No peers found | Check bootstrap_nodes.txt exists and devnet is still running |
protocol selection failed for envelope requests |
Remote peer doesn't support execution_payload_envelopes_by_range (not on ePBS fork) |
Devnet Explorer
Most ethpandaops devnets have a Dora explorer:
https://dora.<devnet-name>.ethpandaops.io/