Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 2 additions & 1 deletion chain/ev-node.genesis.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@
"start_time": "2025-09-09T10:50:02.349087636Z",
"initial_height": 1,
"proposer_address": "N89c6gm4fP8oW7OxEtHft7b7PFu8BRzrqkPRzVH04dA=",
"da_start_height": 7970386
"da_start_height": 7970386,
"da_epoch_forced_inclusion": 50
}
11 changes: 11 additions & 0 deletions deployment/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,3 +101,14 @@ docker compose logs -f
docker compose logs -f ev-node
docker compose logs -f ev-reth
```

## Second Full Node + ev-reth

The `ev-node-2` service runs as a full node with its own `ev-reth-2` instance and syncs from `ev-node` over P2P. Note: full nodes still require a working DA endpoint.

1) Start the stack and follow logs (the peer address is discovered via `evm net-info` on startup):

```bash
docker compose up -d ev-node-2
docker compose logs -f ev-node-2
```
10 changes: 9 additions & 1 deletion deployment/docker-compose/.env
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,12 @@ EV_RETH_WS_PORT="8546"
EV_NODE_P2P_PORT="7676"
EV_NODE_PROMETHEUS_PORT="26660"
EV_NODE_RPC_PORT="7331"
DA_ADDRESS=""
DA_ADDRESS=""
EV_RETH_2_PROMETHEUS_PORT="9002"
EV_RETH_2_ENGINE_PORT="8552"
EV_RETH_2_DISCOVERY_PORT="30304"
EV_RETH_2_RPC_PORT="8547"
EV_RETH_2_WS_PORT="8548"
EV_NODE_2_P2P_PORT="7677"
EV_NODE_2_PROMETHEUS_PORT="26661"
EV_NODE_2_RPC_PORT="7332"
3 changes: 3 additions & 0 deletions deployment/docker-compose/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
data/
/data
/snapshots
123 changes: 111 additions & 12 deletions deployment/docker-compose/compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ services:
volumes:
- ./ev-reth.genesis.json:/root/genesis.json:ro
- jwttoken:/root/jwt:ro
- ev-reth-data:/root/reth
- ./data/ev-reth:/root/reth
- ./snapshots:/snapshots
- ./init-1-ev-reth-snapshot.sh:/init-1-ev-reth-snapshot.sh
entrypoint: [/bin/sh, /init-1-ev-reth-snapshot.sh]
restart: "no"
Expand All @@ -34,7 +35,7 @@ services:
image: &image ghcr.io/evstack/ev-node-evm-single:v1.0.0-beta.11
env_file: .env
volumes:
- ev-node-data:/root/.evm
- ./data/ev-node:/root/.evm
- ./ev-node.genesis.json:/volumes/sequencer_export/genesis.json:ro
- ./ev-reth.genesis.json:/root/genesis.json:ro
- jwttoken:/root/jwt:ro
Expand All @@ -46,10 +47,11 @@ services:
image: *alpine
env_file: .env
volumes:
- ev-node-data:/root/.evm
- ./data/ev-node:/root/.evm
- ./ev-node.genesis.json:/volumes/sequencer_export/genesis.json:ro
- ./ev-reth.genesis.json:/root/genesis.json:ro
- jwttoken:/root/jwt:ro
- ./snapshots:/snapshots
- ./init-2-ev-node-snapshot.sh:/init-2-ev-node-snapshot.sh
entrypoint: [/bin/bash, /init-2-ev-node-snapshot.sh]
restart: "no"
Expand All @@ -70,7 +72,7 @@ services:
volumes:
- ./ev-reth.genesis.json:/root/genesis.json:ro
- jwttoken:/root/jwt:ro
- ev-reth-data:/root/reth
- ./data/ev-reth:/root/reth
entrypoint: /bin/sh -c
command:
- |
Expand Down Expand Up @@ -116,8 +118,67 @@ services:
retries: 3
start_period: 30s

# ev-reth-2:
# image: ghcr.io/evstack/ev-reth:v0.2.1
# depends_on:
# jwt-init:
# condition: service_completed_successfully
# init-1-snapshot-ev-reth:
# condition: service_completed_successfully
# env_file: .env
# network_mode: host
# restart: always
# volumes:
# - ./ev-reth.genesis.json:/root/genesis.json:ro
# - jwttoken:/root/jwt:ro
# - ./data/ev-reth-2:/root/reth
# entrypoint: /bin/sh -c
# command:
# - |
# ev-reth node \
# --engine.persistence-threshold 0 \
# --engine.memory-block-buffer-target 0 \
# --engine.always-process-payload-attributes-on-canonical-head \
# --chain /root/genesis.json \
# --metrics 0.0.0.0:${EV_RETH_2_PROMETHEUS_PORT} \
# --log.file.directory /root/logs \
# --authrpc.addr 0.0.0.0 \
# --authrpc.port ${EV_RETH_2_ENGINE_PORT} \
# --authrpc.jwtsecret /root/jwt/jwt.hex \
# --http --http.addr 0.0.0.0 --http.port ${EV_RETH_2_RPC_PORT} \
# --http.api "eth,net,web3,txpool" \
# --ws --ws.addr 0.0.0.0 --ws.port ${EV_RETH_2_WS_PORT} \
# --port ${EV_RETH_2_DISCOVERY_PORT} \
# --disable-discovery \
# --trusted-peers enode://e3e0025a64440eff4879b216766550d7237291cb94b79bb641b1e25933b08c9a3aada6583e25b320aebe84b643b85e14be934a8725eb6aacb74d6f65abfbeb74@fullnode-1-eden-testnet.binarybuilders.services:30313,enode://477544b9c4bc4136b9d25759b38be971c29dcf669105e02e8630f1e0407f58dc740137d3f21d02451d5f7b08bbbf31909cbd876af99818a34e64892e73498906@fullnode-2-eden-testnet.binarybuilders.services:30313 \
# --txpool.pending-max-count 200000 \
# --txpool.pending-max-size 200 \
# --txpool.queued-max-count 200000 \
# --txpool.queued-max-size 200 \
# --txpool.max-account-slots 2048 \
# --txpool.max-new-txns 2048 \
# --txpool.additional-validation-tasks 16 \
# --datadir /root/reth
# healthcheck:
# test:
# [
# CMD,
# curl,
# -X,
# POST,
# -H,
# "Content-Type: application/json",
# --data,
# '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}',
# "http://localhost:${EV_RETH_2_RPC_PORT}",
# ]
# interval: 5s
# timeout: 5s
# retries: 3
# start_period: 30s

ev-node:
image: *image
image: ghcr.io/evstack/ev-node-evm:v1.0.0-rc.1
env_file: .env
network_mode: host
restart: always
Expand All @@ -127,19 +188,21 @@ services:
init-2-snapshot-ev-node:
condition: service_completed_successfully
volumes:
- ev-node-data:/root/.evm
- ./data/ev-node:/root/.evm
- ./ev-node.genesis.json:/volumes/sequencer_export/genesis.json:ro
- ./ev-reth.genesis.json:/root/genesis.json:ro
- jwttoken:/root/jwt:ro
- ./entrypoint.fullnode.sh:/usr/bin/entrypoint.sh
- ./entrypoint.fullnode_main.sh:/usr/bin/entrypoint.sh
command:
- start
- --evnode.rpc.address=0.0.0.0:${EV_NODE_RPC_PORT}
- --evnode.instrumentation.prometheus
- --evnode.instrumentation.prometheus_listen_addr=:${EV_NODE_PROMETHEUS_PORT}
- --evnode.p2p.listen_address=/ip4/0.0.0.0/tcp/7676
- --evnode.p2p.peers=/ip4/157.180.53.133/tcp/7686/p2p/12D3KooWMCfKiRXrd3o1m8TBDknmjZFqnmgFpP6gfjhBBVwnuCXK/p2p/12D3KooWMCfKiRXrd3o1m8TBDknmjZFqnmgFpP6gfjhBBVwnuCXK,/ip4/157.180.53.70/tcp/7686/p2p/12D3KooWEpRjbVZuQVZNxaifZDZ3dGLV6Dj7fT5Eox95PQhgWsJ7/p2p/12D3KooWEpRjbVZuQVZNxaifZDZ3dGLV6Dj7fT5Eox95PQhgWsJ7
# - --evnode.log.level=debug
# - --evnode.node.stop_height=62038057
- --evm.jwt-secret-file=/root/jwt/jwt.hex
- --evnode.log.level=debug
environment:
- DA_HEADER_NAMESPACE=${DA_HEADER_NAMESPACE}
- DA_DATA_NAMESPACE=${DA_DATA_NAMESPACE}
Expand All @@ -153,10 +216,46 @@ services:
retries: 3
start_period: 30s

# ev-node-2:
# image: *image
# env_file: .env
# network_mode: host
# restart: always
# depends_on:
# ev-node:
# condition: service_started
# ev-reth-2:
# condition: service_started
# init-2-snapshot-ev-node:
# condition: service_completed_successfully
# volumes:
# - ./data/ev-node-2:/root/.evm
# - ./ev-node.genesis.json:/volumes/sequencer_export/genesis.json:ro
# - ./ev-reth.genesis.json:/root/genesis.json:ro
# - jwttoken:/root/jwt:ro
# - ./entrypoint.fullnode.sh:/usr/bin/entrypoint.sh
# command:
# - start
# - --evnode.rpc.address=0.0.0.0:${EV_NODE_2_RPC_PORT}
# - --evnode.instrumentation.prometheus
# - --evnode.instrumentation.prometheus_listen_addr=:${EV_NODE_2_PROMETHEUS_PORT}
# - --evnode.p2p.listen_address=/ip4/0.0.0.0/tcp/${EV_NODE_2_P2P_PORT}
# # - --evnode.log.level=debug
# environment:
# - DA_HEADER_NAMESPACE=
# - DA_DATA_NAMESPACE=
# - DA_ADDRESS=
# - EV_NODE_P2P_SOURCE_RPC=localhost:${EV_NODE_RPC_PORT}
# - EVM_ENGINE_URL=http://localhost:${EV_RETH_2_ENGINE_PORT}
# - EVM_ETH_URL=http://localhost:${EV_RETH_2_RPC_PORT}
# - EVM_JWT_SECRET_FILE=/root/jwt/jwt.hex
# healthcheck:
# test: [CMD, curl, "localhost:${EV_NODE_2_RPC_PORT}/health/live"]
# interval: 5s
# timeout: 5s
# retries: 3
# start_period: 30s

volumes:
ev-node-data:
driver: local
ev-reth-data:
driver: local
jwttoken:
driver: local
25 changes: 25 additions & 0 deletions deployment/docker-compose/entrypoint.fullnode.sh
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,31 @@ if [ -n "${DA_HEADER_NAMESPACE-}" ]; then
log "DEBUG" "Added DA header namespace flag: ${DA_HEADER_NAMESPACE}"
fi

# Auto-discover sequencer p2p address when not provided
if [ -z "${SEQUENCER_P2P_INFO-}" ] && [ -n "${EV_NODE_P2P_SOURCE_RPC-}" ]; then
log "INFO" "SEQUENCER_P2P_INFO not set, attempting discovery via evm net-info"
net_info=""
retry_count=0
max_retries=5
while [ "${retry_count}" -lt "${max_retries}" ] && [ -z "${net_info}" ]; do
net_info=$(evm-single net-info --evnode.rpc.address=${EV_NODE_P2P_SOURCE_RPC} 2>/dev/null || true)
if [ -n "${net_info}" ]; then
break
fi
retry_count=$((retry_count + 1))
sleep 2
done
p2p_addr=$(printf "%s\n" "${net_info}" | sed -n 's/.*\(\/ip4\/[^ ]*\/p2p\/[A-Za-z0-9]*\).*/\1/p' | head -n 1)

if [ -n "${p2p_addr}" ]; then
SEQUENCER_P2P_INFO="${p2p_addr}"
default_flags="${default_flags} --evnode.p2p.peers ${SEQUENCER_P2P_INFO}"
log "SUCCESS" "Discovered sequencer p2p address: ${SEQUENCER_P2P_INFO}"
else
log "WARNING" "Failed to discover sequencer p2p address from evm net-info"
fi
fi

default_flags="${default_flags} --home=${CONFIG_HOME}"

log "SUCCESS" "Configuration flags prepared successfully"
Expand Down
Loading
Loading