Authors: [Vikash Choubey | Dapplooker]
System Requirements
The Mode Mainnet archive node has a size of 562G on October 21st, 2024
Mode
Mode operates within Optimism Superchain ecosystem. It is powered by the OP Stack , leveraging the scalability and security of Optimism's Layer 2 infrastructure.
In this guide, we are walking through the process of setting up a Mode Mainnet archive node using Optimism's op-geth and op-node
.
Before you start, make sure that you have your own synced Ethereum L1 RPC URL (e.g. Erigon) and L1 Consensus Layer Beacon endpoint with all historical blobs data
(e.g. Lighthouse) ready. A beacon endpoint meeting this criteria is essential for syncing to start.
Hint: https://console.chainstack.com/user/account/create has a free plan enough to sync a node
Pre-Requisites
To run the archive node using Docker, we need the following installed:
Commands:
Copy sudo apt update -y && sudo apt upgrade -y && sudo apt auto-remove -y
sudo apt install docker.io docker-compose git ufw -y
Firewall Setting:
Set explicit default UFW rules
Copy sudo ufw default deny incoming
sudo ufw default allow outgoing
Allow SSH, HTTP and HTTPS
Copy sudo ufw allow 22/tcp
sudo ufw allow 80
sudo ufw allow 443
Allow Remote connection:
Copy sudo ufw allow from ${REMOTE.HOST.IP} to any port 8545
sudo ufw allow from ${REMOTE.HOST.IP} to any port 7545
Firewall Basic commands:
Running the node
Clone repo:
Copy cd /mnt/
git clone git@github.com:mode-network/rollup-node.git
Set Environment variable
Copy export CONDUIT_NETWORK = mode-mainnet-0
Download network configuration with
Copy cd /mnt/rollup-node
./download-config.py $CONDUIT_NETWORK
cp .env.example .env
Update Environment Variable (.env):
Copy OP_NODE_L1_ETH_RPC=
OP_NODE_L1_BEACON=
CONDUIT_NETWORK=mode-mainnet-0
Create Data Directory:
You can create a data directory wherever you want. For this tutorial, we have created it at /mnt/mode-data
Update Docker Compose file:
Copy services :
op-geth : # this is Optimism's geth client
...
volumes :
- /mnt/mode-data:/data # enable to have persistency between restarts
...
Example Docker Compose:
Copy version : '3.8'
services :
op-geth : # this is Optimism's geth client
pull_policy : always
build :
context : .
dockerfile : op-geth.Dockerfile
ports :
- 8545:8545 # RPC
- 8546:8546 # websocket
- 30303:30303 # P2P TCP (currently unused)
- 30303:30303/udp # P2P UDP (currently unused)
- 7301:6060 # metrics
env_file :
- .env.default
- networks/${CONDUIT_NETWORK:?set network}/.env
- .env
volumes :
#- ./geth-data/:/data # enable to have persistency between restarts
- ./networks/${CONDUIT_NETWORK:?set network}/genesis.json:/genesis.json
op-node :
pull_policy : always
build :
context : .
dockerfile : op-node.Dockerfile
depends_on :
- op-geth
ports :
- 7545:8545 # RPC
- 9222:9222 # P2P TCP
- 9222:9222/udp # P2P UDP
- 7300:7300 # metrics
- 6060:6060 # pprof
env_file :
- .env.default
- networks/${CONDUIT_NETWORK:?set network}/.env
- .env
volumes :
- ./networks/${CONDUIT_NETWORK:?set network}/rollup.json:/rollup.json
- ./networks/${CONDUIT_NETWORK:?set network}/genesis.json:/genesis.json
Start Services Containers:
Copy docker compose up -d --build
Check Status:
Below is the command for the request:
Copy curl -d '{"id":0,"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest",false]}' -H "Content-Type: application/json" http://localhost:8545 | jq .
You will see a response like:
Copy {
"jsonrpc" : "2.0" ,
"id" : 0 ,
"result" : {
"baseFeePerGas" : "0xfc" ,
"blobGasUsed" : "0x0" ,
"difficulty" : "0x0" ,
"excessBlobGas" : "0x0" ,
"extraData" : "0x" ,
"gasLimit" : "0x1c9c380" ,
"gasUsed" : "0xab57" ,
"hash" : "0xe479844f85d8dd6008b4aa9352ff3e3d0fa550235bf10bf4ae0c6e893dc13704" ,
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"miner" : "0x4200000000000000000000000000000000000011" ,
"mixHash" : "0x93aa8ce0f2f44eabacbb94058b5780cb6d645d457adba101540c6382ccf15f57" ,
"nonce" : "0x0000000000000000" ,
"number" : "0xdfaab9" ,
"parentBeaconBlockRoot" : "0x4f90158e2222808d53cad04b9b49ce98b3b52d311ec31b8234879a0fa81ab98c" ,
"parentHash" : "0x339d3321322b0f5f70bd69a0bf124025f9b980cd3b02b71b61e221c731521f54" ,
"receiptsRoot" : "0xf02f480a926e6a825c18788f6442060b973a4bb60ad88dbff3018b4982a1a071" ,
"sha3Uncles" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" ,
"size" : "0x347" ,
"stateRoot" : "0x017662cd279f827fcf1eef1c8c362bd4e7c069b36eb9d13a0e92bedbef94e16c" ,
"timestamp" : "0x6715d511" ,
"totalDifficulty" : "0x0" ,
"transactions" : [
"0xaf0ce001508b96ce0d38bb8b14480487a788181e74690b513920513e50f033d6"
] ,
"transactionsRoot" : "0x35ccc1581f44d178fb5d0059d8a8ee6198117deab115e020591a7979c1dcbc1a" ,
"uncles" : [] ,
"withdrawals" : [] ,
"withdrawalsRoot" : "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"
}
}
Sync Status:
Copy command -v jq & > /dev/null || { echo "jq is not installed" 1>&2 ; }
echo Latest synced block behind by: \
$((($( date +%s )-\
$( curl -s -d '{"id":0,"jsonrpc":"2.0","method":"optimism_syncStatus"}' -H "Content-Type: application/json" http://localhost:7545 |
jq -r .result.unsafe_l2.timestamp ))/60)) minutes
References: