Skip to content

🏠 Local Development Deployment

This guide walks you through deploying a complete Evolve EVM chain on your local machine using ev-toolbox. It uses the local-da mock DA layer so there are no external dependencies or token costs.

🏗️ How it works

The local stack is split into two Docker Compose stacks that share a Docker network (evstack_shared):

The da-local stack is started first because it creates the shared Docker network that the sequencer stack joins.

💻 Prerequisites

🛠️ Step 1 — Clone ev-toolbox

bash
git clone --depth 1 https://github.com/evstack/ev-toolbox.git
cd ev-toolbox/ev-stacks/stacks

🌐 Step 2 — Start local-da

The da-local stack must be started first. It creates the evstack_shared Docker network that the sequencer stack joins.

bash
cd da-local
docker compose up -d

Verify it is running:

bash
docker logs local-da

Expected output:

INF NewLocalDA: initialized LocalDA component=da
INF Listening on component=da host=0.0.0.0 maxBlobSize=1970176 port=7980
INF server started component=da listening_on=0.0.0.0:7980

🔑 Step 3 — Create the passphrase file

The sequencer signs blocks with a key protected by a passphrase. Create the passphrase file in the single-sequencer directory:

bash
cd ../single-sequencer
echo -n "devpassword" > passphrase

TIP

For local development, any string works as a passphrase. Keep it simple — you will not need it again unless you restart with a wiped volume.

🚀 Step 4 — Start the sequencer

Make the entrypoint script executable (required after git clone on some systems), then start the stack using the local-DA variant of the compose file:

bash
chmod +x entrypoint.sequencer.sh
docker compose -f docker-compose.da.local.yml up -d

Monitor startup:

bash
docker compose -f docker-compose.da.local.yml logs -f

A healthy startup looks like:

single-sequencer  | 🚀 INIT: Starting EVM Sequencer initialization
single-sequencer  | ✅ SUCCESS: Sequencer initialization completed
single-sequencer  | ✅ SUCCESS: Exported genesis.json to /volumes/sequencer_export/genesis.json
single-sequencer  | ✅ SUCCESS: Successfully retrieved genesis hash: 0x6aec2...
single-sequencer  | 🚀 INIT: Starting EVM sequencer with command: evm start ...
single-sequencer  | INF Starting aggregator node component=main
single-sequencer  | INF produced block component=executor height=1
single-sequencer  | INF produced block component=executor height=2

DA submission errors

You may see errors like DA layer submission failed: method 'blob.Submit' not found. This is a known version mismatch between the current local-da Docker images and ev-node-evm. It is non-fatal — blocks are produced and the JSON-RPC is fully functional for local development. You can ignore these errors.

✅ Step 5 — Verify

The sequencer JSON-RPC port (8545) is not exposed to the host by default. To expose it for local testing, create an override file:

bash
cat > docker-compose.override.yml << 'EOF'
services:
  ev-reth-sequencer:
    ports:
      - "8545:8545"
EOF

docker compose -f docker-compose.da.local.yml -f docker-compose.override.yml up -d

Then query the chain:

bash
curl -s -X POST http://localhost:8545 \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'

The result field (a hex block number) should increment with each call as new blocks are produced.

🔍 Useful commands

bash
# Check container status
docker ps

# Follow all sequencer logs
docker compose -f docker-compose.da.local.yml logs -f

# Follow just the ev-node logs (block production)
docker logs -f single-sequencer

# Follow just the reth logs
docker logs -f ev-reth-sequencer

# Stop everything
docker compose -f docker-compose.da.local.yml down
cd ../da-local && docker compose down

⚙️ Configuration

All configuration is via environment variables in .env and the docker-compose.da.local.yml file.

VariableDefaultDescription
SEQUENCER_EV_RETH_PROMETHEUS_PORT9000Host port for ev-reth Prometheus metrics
SEQUENCER_EV_NODE_PROMETHEUS_PORT26660Host port for ev-node Prometheus metrics
DA_SIGNING_ADDRESSES(empty)DA signing addresses — leave empty for local-da
EVM_BLOCK_TIME500msHow often the sequencer produces blocks (set in compose)

To change the block time or other settings, edit docker-compose.da.local.yml directly or add them to your docker-compose.override.yml.

🎉 Next Steps

Once your local chain is running:

WARNING

This setup is for development only. The local-da mock does not provide real data availability guarantees. Do not use it for any production environment.

Released under the APACHE-2.0 License