Skip to content

Commit 78e3688

Browse files
committed
oneshot local devnet guide w/ claude
1 parent 89c7fe8 commit 78e3688

2 files changed

Lines changed: 187 additions & 0 deletions

File tree

docs/guides/deploy/local.md

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
---
2+
description: Deploy an Evolve EVM chain locally for development and testing using local-da and Docker Compose.
3+
---
4+
5+
# 🏠 Local Development Deployment
6+
7+
This guide walks you through deploying a complete Evolve EVM chain on your local machine for development and testing. Unlike testnet and mainnet deployments, local dev uses the **local-da** mock DA layer so you have zero external dependencies.
8+
9+
<!-- markdownlint-disable MD033 -->
10+
<script setup>
11+
import constants from '../../.vitepress/constants/constants.js'
12+
</script>
13+
<!-- markdownlint-enable MD033 -->
14+
15+
## 🏗️ Architecture Overview
16+
17+
A local Evolve EVM deployment consists of three services running on your machine:
18+
19+
```mermaid
20+
graph TB
21+
subgraph "Sequencer Stack"
22+
SEQ_RETH[RETH Service<br/>:8545 JSON-RPC<br/>:8551 Engine API]
23+
SEQ_EVOLVE[EVOLVE Service<br/>--aggregator=true]
24+
SEQ_RETH <--> SEQ_EVOLVE
25+
end
26+
27+
subgraph "Local DA"
28+
LOCAL_DA[local-da<br/>:7980]
29+
end
30+
31+
SEQ_EVOLVE -->|Post Blobs| LOCAL_DA
32+
33+
USERS[Dev / Tests] --> SEQ_RETH
34+
35+
classDef sequencer fill:#e1f5fe
36+
classDef da fill:#fff3e0
37+
classDef user fill:#e8f5e8
38+
39+
class SEQ_RETH,SEQ_EVOLVE sequencer
40+
class LOCAL_DA da
41+
class USERS user
42+
```
43+
44+
**Key differences from testnet/mainnet:**
45+
46+
- `local-da` replaces Celestia — no tokens, no external network
47+
- Single sequencer only — no full nodes required
48+
- All services run on `localhost`
49+
50+
## 💻 Prerequisites {#prerequisites}
51+
52+
- [Go](https://golang.org/doc/install) {{ constants.golangVersion }} or later
53+
- [Docker](https://docs.docker.com/get-docker/) and [Docker Compose](https://docs.docker.com/compose/install/)
54+
- [just](https://github.com/casey/just#installation) (command runner)
55+
- [Git](https://git-scm.com/)
56+
57+
## 🛠️ Step 1 — Clone and Build {#clone-and-build}
58+
59+
```bash
60+
git clone --depth 1 --branch {{ constants.evolveLatestTag }} https://github.com/evstack/ev-node.git
61+
cd ev-node
62+
63+
# Build the EVM sequencer binary and local-da
64+
just build-evm
65+
just build-da
66+
```
67+
68+
After building you will have:
69+
70+
- `build/evm` — the Evolve EVM sequencer
71+
- `build/local-da` — the mock DA node
72+
73+
## 🌐 Step 2 — Start local-da {#start-local-da}
74+
75+
Open a terminal and start the local DA node:
76+
77+
```bash
78+
./build/local-da
79+
```
80+
81+
You should see:
82+
83+
```
84+
INF NewLocalDA: initialized LocalDA component=da
85+
INF Listening on component=da host=localhost maxBlobSize=1974272 port=7980
86+
INF server started component=da listening_on=localhost:7980
87+
```
88+
89+
Leave this running in its own terminal tab.
90+
91+
## ⚡ Step 3 — Start the EVM (RETH) Layer {#start-evm-layer}
92+
93+
Clone the `ev-reth` repository and start RETH using Docker Compose:
94+
95+
```bash
96+
git clone --depth 1 https://github.com/evstack/ev-reth.git
97+
cd ev-reth
98+
docker compose up -d
99+
```
100+
101+
Note the path to the JWT secret — you will need it in the next step:
102+
103+
```bash
104+
# Default location after docker compose starts
105+
ls ev-reth/execution/evm/docker/jwttoken/jwt.hex
106+
```
107+
108+
## 🚀 Step 4 — Initialize and Start the Sequencer {#start-sequencer}
109+
110+
Back in the `ev-node` directory, initialize the sequencer:
111+
112+
```bash
113+
./build/evm init \
114+
--evnode.node.aggregator=true \
115+
--evnode.signer.passphrase secret
116+
```
117+
118+
Then start it, pointing at local-da and the JWT secret from RETH:
119+
120+
```bash
121+
./build/evm start \
122+
--evnode.node.aggregator=true \
123+
--evnode.signer.passphrase secret \
124+
--evnode.da.address http://localhost:7980 \
125+
--evnode.node.block_time 1s \
126+
--evm.jwt-secret /path/to/ev-reth/execution/evm/docker/jwttoken/jwt.hex
127+
```
128+
129+
Replace `/path/to/ev-reth/` with the actual path to your cloned `ev-reth` directory.
130+
131+
You should see block production logs like:
132+
133+
```
134+
INF working in aggregator mode block_time=1000 component=main
135+
INF using pending block component=BlockManager height=1
136+
INF block marked as DA included blockHash=... blockHeight=1 module=BlockManager
137+
```
138+
139+
## ✅ Step 5 — Verify {#verify}
140+
141+
Query the JSON-RPC endpoint to confirm the chain is producing blocks:
142+
143+
```bash
144+
curl -s -X POST http://localhost:8545 \
145+
-H 'Content-Type: application/json' \
146+
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
147+
```
148+
149+
The `result` field should increment with each call as new blocks are produced.
150+
151+
## 🐳 Alternative: Docker Compose (all-in-one) {#docker-compose}
152+
153+
The [ev-toolbox](https://github.com/evstack/ev-toolbox/tree/main/ev-stacks) project provides a pre-configured Docker Compose stack that wires up RETH, the Evolve EVM sequencer, and local-da for you:
154+
155+
```bash
156+
git clone https://github.com/evstack/ev-toolbox.git
157+
cd ev-toolbox/ev-stacks/local
158+
docker compose up
159+
```
160+
161+
This is the fastest way to get a fully functional local environment without manually coordinating services.
162+
163+
## ⚙️ Configuration Reference {#configuration}
164+
165+
| Flag | Default | Description |
166+
|---|---|---|
167+
| `--evnode.node.aggregator` | `false` | Must be `true` for the sequencer |
168+
| `--evnode.signer.passphrase` || Passphrase protecting the signing key |
169+
| `--evnode.da.address` || DA node endpoint (`http://localhost:7980` for local-da) |
170+
| `--evnode.node.block_time` | `1s` | How often the sequencer produces blocks |
171+
| `--evm.jwt-secret` || Path to the JWT secret shared with RETH |
172+
| `--evm.eth-url` | `http://localhost:8545` | RETH JSON-RPC URL |
173+
| `--evm.engine-url` | `http://localhost:8551` | RETH Engine API URL |
174+
175+
## 🎉 Next Steps {#next-steps}
176+
177+
Once your local chain is running:
178+
179+
- [Testnet Deployment](./testnet.md) — deploy with real Celestia DA and a multi-node setup
180+
- [Single Sequencer Guide](../evm/single.md) — detailed sequencer configuration options
181+
- [Local DA Guide](../da/local-da.md) — more details on the `local-da` mock DA node
182+
- [Metrics](../metrics.md) — add Prometheus + Grafana monitoring
183+
184+
:::warning
185+
This setup is for development only. Do not use `local-da` or a passphrase-protected key in any production environment.
186+
:::

docs/guides/deploy/overview.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ When you're ready to test with real network conditions, you can deploy to testne
3838

3939
Choose the deployment approach that matches your current needs:
4040

41+
- [🏠 Local Development](./local.md) - Run everything on your machine with local-da (no external dependencies)
4142
- [🌐 Testnet Deployment](./testnet.md) - Deploy on testnet with external DA networks
4243

4344
:::warning Disclaimer

0 commit comments

Comments
 (0)