Blast
Instructions to set up your blast 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 Github Documentation
- Official Documentation for Node Providers
Prerequisites
sudo apt-get install jq -ysnap install docker
Clone Repo
git clone https://github.com/blast-io/deployment.git blast-nodecd blast-node
Set Node Config Environment Variables
cp .env.example .env
Set the following config options in blast-node/.env
:
path to the directory that will store chain dataGETH_DATA_DIR=blast-geth-data # Your Ethereum L1 RPC endpointL1_RPC_URL="your_l1_rpc_url" # The type of RPC provider, valid options arealchemy, quicknode, infura, parity, nethermind, debug_geth, erigon, basic,any # Axelar Team recommends you to run your own L1_RPC_KIND="any"
path to the directory that will store chain dataGETH_DATA_DIR=blast-geth-data # Your Sepolia L1 RPC endpointL1_RPC_URL="your_l1_rpc_url" # The type of RPC provider, valid options arealchemy, quicknode, infura, parity, nethermind, debug_geth, erigon, basic,any # Axelar Team recommends you to run your own L1_RPC_KIND="any"
Start the node
docker compose up -d
This should show an output like this:
[+] Running 6/6 ✔ Network blast-node_blast-net Created 0.1s ✔ Network blast-node_default Created 0.1s ✔ Container blast-node-generate-jwt-1 Exited 1.0s ✔ Container blast-node-geth-init-1 Exited 1.8s ✔ Container blast-node-blast-geth-1 Started 2.0s ✔ Container blast-node-op-node-1 Started 2.3s 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 PORTSblast-node-blast-geth-1 blastio/blast-geth:sepolia "geth --datadir=/bla…" blast-geth 4 hours ago Up 4 hours 8545-8546/tcp, 30303/tcp, 0.0.0.0:9545-9546->9545-9546/tcp, :::9545-9546->9545-9546/tcp, 30303/udpblast-node-op-node-1 blastio/blast-optimism:sepolia "op-node --l1=https:…" op-node 4 hours ago Up 4 hours 0.0.0.0:9003->9003/tcp, :::9003->9003/tcp
Check logs
Verify blast geth logs
docker compose logs blast-geth --since 2m -f
blast-node-blast-geth-1 | INFO [02-27|07:43:45.734] Started P2P networking self="enode://54139a54494808b5f9703b3858fc8fe0aaffa5902d41b1fc61f6c92bc003743d87c81e115120a2d5061bb1852fd04fb2851bb235e660462d0c107b7bed640302@127.0.0.1:30303?discport=0"blast-node-blast-geth-1 | INFO [02-27|07:43:45.735] HTTP server started endpoint=[::]:9545 auth=false prefix= cors=* vhosts=*blast-node-blast-geth-1 | INFO [02-27|07:43:45.735] WebSocket enabled url=ws://[::]:9546blast-node-blast-geth-1 | INFO [02-27|07:43:45.735] WebSocket enabled url=ws://[::]:8551blast-node-blast-geth-1 | INFO [02-27|07:43:45.735] HTTP server started endpoint=[::]:8551 auth=true prefix= cors=localhost vhosts=*blast-node-blast-geth-1 | INFO [02-04|07:42:29.722] Chain head was updated number=39537 hash=26c5c6..e67efa root=14a631..1e99bf elapsed=5.40331ms age=2mo2w6dblast-node-blast-geth-1 | INFO [02-04|07:42:29.734] Starting work on payload id=0x95a98a726f1398eeblast-node-blast-geth-1 | INFO [02-04|07:42:29.751] Imported new potential chain segment number=39538 hash=219454..97cd30 blocks=1 txs=1 mgas=0.051 elapsed=16.713ms mgasps=3.022 age=2mo2w6d triedirty=0.00B
It will not import new headers until your op-node is synced, once your op-node is synced, your blast-geth logs should look like this
blast-node-blast-geth-1 | INFO [02-29|08:08:15.219] Starting work on payload id=0x48323feb74b0d35ablast-node-blast-geth-1 | INFO [02-29|08:08:15.237] Imported new potential chain segment number=3083 hash=96c535..584bd5 blocks=1 txs=1 mgas=0.047 elapsed=16.962ms mgasps=2.768 age=1mo3w1d snapdiffs=606.60KiB triedirty=0.00Bblast-node-blast-geth-1 | INFO [02-29|08:08:15.243] Chain head was updated number=3083 hash=96c535..584bd5 root=52730a..6a9c02 elapsed=5.42431ms age=1mo3w1dblast-node-blast-geth-1 | INFO [02-29|08:08:15.256] Starting work on payload id=0x180234ae531457a1blast-node-blast-geth-1 | INFO [02-29|08:08:15.274] Imported new potential chain segment number=3084 hash=9687bc..de7e94 blocks=1 txs=1 mgas=0.047 elapsed=16.911ms mgasps=2.776 age=1mo3w1d snapdiffs=606.78KiB triedirty=0.00Bblast-node-blast-geth-1 | INFO [02-29|08:08:15.285] Chain head was updated number=3084 hash=9687bc..de7e94 root=8081fb..43e327 elapsed=10.075637ms age=1mo3w1dblast-node-blast-geth-1 | INFO [02-29|08:08:15.307] Starting work on payload id=0x44c95802c3652dbd
Verify OP node logs
docker compose logs op-node --since 2m -f
You should see logs like
blast-node-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="Starting JSON-RPC server"blast-node-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="metrics disabled"blast-node-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="Starting execution engine driver"blast-node-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="Starting driver" sequencerEnabled=false sequencerStopped=falseblast-node-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="Rollup node started"blast-node-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="State loop started"blast-node-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="Loaded current L2 heads" unsafe=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 safe=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 finalized=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 unsafe_origin=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255 safe_origin=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255blast-node-op-node-1 | t=2024-02-27T07:43:47+0000 lvl=info msg="Walking back L1Block by number" curr=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255 next=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255 l2block=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0blast-node-op-node-1 | t=2024-02-27T07:43:47+0000 lvl=info msg="Hit finalized L2 head, returning immediately" unsafe=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 safe=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 finalized=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 unsafe_origin=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255 safe_origin=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255blast-node-op-node-1 | t=2024-02-27T07:43:47+0000 lvl=info msg="Sync progress" reason="reset derivation work" l2_finalized=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 l2_safe=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 l2_unsafe=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 l2_engineSyncTarget=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 l2_time=1,704,686,688 l1_derived=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255
Verify node sync status
RPC Endpoint
echo "$(curl -4 ifconfig.co):9545"
Method:
curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","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": "0x09A"}
Sync Status of Blast optimism Execution Node
You can check your status by connecting to geth console
docker exec -it blast-node-blast-geth-1 geth attach http://localhost:9545> eth.blockNumber94078 # it will show you the latest block - number here is just an example
> eth.syncingfalse
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.
Configure vald
In order for vald
to connect to your Blast node, your rpc_addr
should be exposed in
vald’s config.toml
start-with-bridge = true
start-with-bridge = true