Base
Instructions to set up your base node.
Requirements
- Setup your Axelar validator
- Minimum hardware requirements: 8 AWS vCPU+, 8GB RAM, 512GB of SSD free storage space.
- MacOS or Ubuntu 22.04 (tested on 22.04)
- Official Documentation
Prerequisites
sudo apt-get install jq -ysnap install docker
Clone Repo
git clone https://github.com/base-org/node base-nodecd base-node
Set node config
In docker-compose.yml, uncomment the right .env file according to the network you want to run it on
env_file:# select your network here:# - .env.sepolia - .env.mainnet
env_file:# select your network here: - .env.sepolia# - .env.mainnet
Set the following config options in base-node/.env.sepolia
or base-node/.env
:
# [recommended] replace with your preferred L1 (Ethereum, not Base) node RPC URL:OP_NODE_L1_ETH_RPC=https://rpc.sepolia.org
# [required] replace with your preferred L1 CL beacon endpoint:OP_NODE_L1_BEACON=https://your.sepolia.beacon.node/endpoint-here
You can setup a beacon endpoint using the instructions here, make sure to expose the endpoint to public
In lighthouse this needs passing of --http-address 0.0.0.0
while starting the service
Start the node
docker compose up -d
This should show an output like this:
[+] Running 3/3 ✔ Network base-node_default Created 0.1s ✔ Container base-node-geth-1 Started 0.4s ✔ Container base-node-node-1 Started 0.8s 11.2s
After it is done, verify by listing the services and their status
docker compose ps
You should see these 2 services running
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTSNAME IMAGE COMMAND SERVICE CREATED STATUS PORTSbase-node-geth-1 base-node-geth "bash ./geth-entrypo…" geth 16 seconds ago Up 15 seconds 0.0.0.0:7308->6060/tcp, :::7308->6060/tcp, 0.0.0.0:8525->8545/tcp, :::8525->8545/tcp, 0.0.0.0:8526->8546/tcp, :::8526->8546/tcp, 0.0.0.0:30308->30303/tcp, 0.0.0.0:30308->30303/udp, :::30308->30303/tcp, :::30308->30303/udpbase-node-node-1 base-node-node "bash ./op-node-entr…" node 16 seconds ago Up 15 seconds 0.0.0.0:6062->6060/tcp, :::6062->6060/tcp, 0.0.0.0:7320->7300/tcp, :::7320->7300/tcp, 0.0.0.0:7445->8545/tcp, :::7445->8545/tcp, 0.0.0.0:9242->9222/tcp, 0.0.0.0:9242->9222/udp, :::9242->9222/tcp, :::9242->9222/udp
Check logs
Verify OP geth logs
docker compose logs geth --since 20m -f
base-node-geth-1 | INFO [03-18|07:28:01.409] HTTP server started endpoint=[::]:8545 auth=false prefix= cors=* vhosts=*base-node-geth-1 | INFO [03-18|07:28:01.409] WebSocket enabled url=ws://[::]:8546base-node-geth-1 | INFO [03-18|07:28:01.409] WebSocket enabled url=ws://[::]:8551base-node-geth-1 | INFO [03-18|07:28:01.409] HTTP server started endpoint=[::]:8551 auth=true prefix= cors=localhost vhosts=*base-node-geth-1 | INFO [03-18|07:28:11.610] Looking for peers peercount=0 tried=156 static=0base-node-geth-1 | INFO [03-18|07:28:21.725] Looking for peers peercount=0 tried=122 static=0base-node-geth-1 | INFO [03-18|11:32:45.773] Forkchoice requested sync to new head number=11,986,109 hash=085c5c..61c7cabase-node-geth-1 | INFO [03-18|11:32:47.466] Forkchoice requested sync to new head number=11,986,110 hash=2f176f..8f3656base-node-geth-1 | INFO [03-18|11:32:49.476] Forkchoice requested sync to new head number=11,986,111 hash=e247cf..08c3fbbase-node-geth-1 | INFO [03-18|11:32:51.280] Forkchoice requested sync to new head number=11,986,112 hash=b6c25a..b7a064
Verify OP node logs
docker compose logs node --since 20m -f
You should see logs like
base-node-node-1 | t=2024-03-18T11:32:40+0000 lvl=info msg="Starting JSON-RPC server"base-node-node-1 | t=2024-03-18T11:32:40+0000 lvl=info msg="started metrics server" addr=[::]:7300base-node-node-1 | t=2024-03-18T11:32:40+0000 lvl=info msg="Starting execution engine driver"base-node-node-1 | t=2024-03-18T11:32:40+0000 lvl=info msg="Starting driver" sequencerEnabled=false sequencerStopped=falsebase-node-node-1 | t=2024-03-18T11:32:40+0000 lvl=info msg="Rollup node started"base-node-node-1 | t=2024-03-18T11:32:40+0000 lvl=info msg="State loop started"base-node-node-1 | t=2024-03-18T11:50:47+0000 lvl=info msg="Sync progress" reason="unsafe payload from sequencer while in EL sync" l2_finalized=0x0000000000000000000000000000000000000000000000000000000000000000:0 l2_safe=0x0000000000000000000000000000000000000000000000000000000000000000:0 l2_pending_safe=0x0000000000000000000000000000000000000000000000000000000000000000:0 l2_unsafe=0x6e8ea627774bbe62255b23938ea2639c251e5199cadc7eaee58412193423acfc:11986117 l2_time=1710761581 l1_derived=0x0000000000000000000000000000000000000000000000000000000000000000:0base-node-node-1 | t=2024-03-18T11:50:49+0000 lvl=info msg="Received signed execution payload from p2p" id=0x17e27490a5845c45d656d2a464a0c9aa1c764cc286d96bc2d17a108e2cbe2737:11986651 peer=16Uiu2HAm5zCUPtJdtbGF7XLQ8fsmsgWP9656wmMTSnnp5FoDdxDDbase-node-node-1 | t=2024-03-18T11:50:49+0000 lvl=info msg="Optimistically inserting unsafe L2 execution payload to drive EL sync" id=0x17e27490a5845c45d656d2a464a0c9aa1c764cc286d96bc2d17a108e2cbe2737:11986651
Verify node sync status
RPC Endpoint
echo "$(curl -4 ifconfig.co):8545"
Method:
Check your op node status at port 7545 by
curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"optimism_syncStatus","params":[],"id":1}' [rpc] | jq
If you get something like this in response to the above rpc call, your node is setup correctly
{ "jsonrpc": "2.0", "id": 1, "result": { "current_l1": { "hash": "0x24f7d66e8c80d0c6a598e9206ba1abc81264c1cc68afc14d8eca3f04fa81f921", "number": 323360, "parentHash": "0x99ce84a2d455425f0c3a68b2b83a74301810fc8c726cba384b08d9a79d9381d1", "timestamp": 1700059308 },.................... "engine_sync_target": { "hash": "0x7b7ed381aac9cec2a43b37c30779832cb8a82e044e38b4ada0f1c90719bd3d50", "number": 30955, "parentHash": "0x882503037e902b2476e1d4c308a895cc3b936c5ee19b45361dc26c9631d29ae0", "timestamp": 1700059286, "l1origin": { "hash": "0x49ee7a7398bc5010b48de111fc0ebc99d63d38ac8233202c913646d901e15213", "number": 323353 }, "sequenceNumber": 2 } }}
You can compare the block height on your node with explorer (mainnet or testnet), use your RPC node only when it has caught up with the latest block height.
Sync Status of Base optimism Execution Node
You can check your status by connecting to geth console
docker exec -it base-node-geth-1 geth attach http://localhost:8545> eth.blockNumber94078 # it will show you the latest block - number here is just an example
> eth.syncingtrue
Configure vald
In order for vald
to connect to your Base node, your rpc_addr
should be exposed in
vald’s config.toml
start-with-bridge = true
start-with-bridge = true