Linea
Consensus chain
This chain is verified by Axelar validators. Before setting up this node,
set up your Axelar validator.
Once the node is running, connect it to vald as described in Verify consensus
chains.
Check the official documentation
The node setup steps below follow Linea's own documentation at the time of
writing and may be out of date. Check the official
documentation before you start. The Axelar-specific steps (connecting
the node to vald or ampd) are maintained here.
Instructions to set up your Linea node.
Requirements
- Setup your Axelar validator
- Minimum hardware requirements: 4 cores, 16GB RAM, 100GB Disk
- Ubuntu 22.04, Docker(tested on 22.04)
- Official Documentation
Prerequisites
sudo apt-get install jq -yInstall geth
Check the appropriate version for the network accordingly in their docs
# This is an example - check their docs and release page to opt for the right version
GETH_RELEASE=1.12.0-e501b3b0# verify correct version
echo $GETH_RELEASE
# create a temp dir for binaries
cd $HOME
mkdir binaries && cd binaries
# if you are on linux amd
wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-$GETH_RELEASE.tar.gz
tar -xvf geth-linux-amd64-$GETH_RELEASE.tar.gz
cd geth-linux-amd64-$GETH_RELEASE
chmod +x geth
sudo mv geth /usr/bin/
# verify version
geth version
cd $HOMEDownload genesis file
genesis.json https://docs.linea.build/files/geth/mainnet/genesis.json genesis.json https://docs.linea.build/files/geth/sepolia/genesis.json Initialize the node
cd $HOME
mkdir -p $HOME/.linea/data
geth --datadir $HOME/.linea/data init $HOME/.linea/config/genesis.jsonIt should give an output similar to this
INFO [07-16|15:48:00.683] Maximum peer count ETH=50 LES=0 total=50
INFO [07-16|15:48:00.685] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
INFO [07-16|15:48:00.690] Set global gas cap cap=50,000,000
INFO [07-16|15:48:00.690] Initializing the KZG library backend=gokzg
INFO [07-16|15:48:00.799] Defaulting to pebble as the backing database
INFO [07-16|15:48:00.799] Allocated cache and file handles database=$HOME/.linea/data/geth/chaindata cache=16.00MiB handles=16
INFO [07-16|15:48:00.847] Opened ancient database database=$HOME/.linea/data/geth/chaindata/ancient/chain readonly=false
INFO [07-16|15:48:00.847] Writing custom genesis block
INFO [07-16|15:48:00.861] Persisted trie from memory database nodes=356 size=50.85KiB time="761.943µs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=0 livesize=0.00B
INFO [07-16|15:48:00.867] Successfully wrote genesis state database=chaindata hash=b6762a..0ffbc6
INFO [07-16|15:48:00.867] Defaulting to pebble as the backing database
INFO [07-16|15:48:00.867] Allocated cache and file handles database=$HOME/.linea/data/geth/lightchaindata cache=16.00MiB handles=16
INFO [07-16|15:48:00.914] Opened ancient database database=$HOME/.linea/data/geth/lightchaindata/ancient/chain readonly=false
INFO [07-16|15:48:00.914] Writing custom genesis block
INFO [07-16|15:48:00.931] Persisted trie from memory database nodes=356 size=50.85KiB time="747.265µs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=0 livesize=0.00B
INFO [07-16|15:48:00.936] Successfully wrote genesis state database=lightchaindata hash=b6762a..0ffbc6Setup systemd
Set the necessary variables
BOOTNODES="enode://ca2f06aa93728e2883ff02b0c2076329e475fe667a48035b4f77711ea41a73cf6cb2ff232804c49538ad77794185d83295b57ddd2be79eefc50a9dd5c48bbb2e@3.23.106.165:30303,enode://eef91d714494a1ceb6e06e5ce96fe5d7d25d3701b2d2e68c042b33d5fa0e4bf134116e06947b3f40b0f22db08f104504dd2e5c790d8bcbb6bfb1b7f4f85313ec@3.133.179.213:30303,enode://cfd472842582c422c7c98b0f2d04c6bf21d1afb2c767f72b032f7ea89c03a7abdaf4855b7cb2dc9ae7509836064ba8d817572cf7421ba106ac87857836fa1d1b@3.145.12.13:30303"BOOTNODES="enode://6f20afbe4397e51b717a7c1ad3095e79aee48c835eebd9237a3e8a16951ade1fe0e66e981e30ea269849fcb6ba03d838da37f524fabd2a557474194a2e2604fa@18.221.100.27:31002,enode://ce1e0d8e0500cb5c0ac56bdcdafb2d6320c3a2c5125b5ccf12f5dfc9b47ee74acbcafc32559017613136c9c36a0ce74ba4f83b7fb8244f099f3b15708d9d3129@3.23.75.47:31000,enode://1b026a5eb0ae74300f58987d235ef0e3a550df963345cb3574be3b0b54378bd11f14dfd515a8976f2c2d2826090e9507b8ccc24f896a9ffffffcabcfd996a733@3.129.120.128:31001"Create the systemd service file /etc/systemd/system/geth-linea.service
The following settings will allow your node to be accessed publicly from any machine, so update the IP address from 0.0.0.0 to your vald machine.
sudo tee /etc/systemd/system/geth-linea.service &>/dev/null <<EOF
[Unit]
Description=Geth node
After=online.target
[Service]
Type=simple
User=$USER
ExecStart=/usr/bin/geth \
--datadir $HOME/.linea/data \
--networkid $NETWORK_ID \
--rpc.allow-unprotected-txs \
--txpool.accountqueue 50000 \
--txpool.globalqueue 50000 \
--txpool.globalslots 50000 \
--txpool.pricelimit 1000000 \
--txpool.pricebump 1 \
--txpool.nolocals \
--http --http.addr "0.0.0.0" --http.port 8545 --http.corsdomain '*' --http.api 'web3,eth,txpool,net' --http.vhosts='*' \
--ws --ws.addr "0.0.0.0" --ws.port 8546 --ws.origins '*' --ws.api 'eth,net,web3,txpool' \
--bootnodes $BOOTNODES \
--syncmode full \
--metrics --pprof --pprof.addr "0.0.0.0" --pprof.port 9545 \
--verbosity 3
Restart=always
RestartSec=3
LimitNOFILE=4096
[Install]
WantedBy=multi-user.target
EOFStart the service
sudo systemctl daemon-reload
sudo systemctl enable geth-linea
sudo systemctl restart geth-lineaCheck logs
# change log settings to persistent if not already
sed -i 's/#Storage=auto/Storage=persistent/g' /etc/systemd/journald.conf
sudo systemctl restart systemd-journald
journalctl -u geth-linea.service -f -n 100 -o catLogs should appear like this
INFO [07-16|15:59:06.904] Imported new chain segment number=730 hash=e63dd9..478f65 blocks=128 txs=150 mgas=132.120 elapsed=205.694ms mgasps=642.312 age=1d19h51m dirty=1.04MiB
INFO [07-16|15:59:07.113] Imported new chain segment number=858 hash=f81d81..7bf36a blocks=128 txs=133 mgas=17.657 elapsed=183.688ms mgasps=96.126 age=1d16h40m dirty=1.17MiB
INFO [07-16|15:59:07.364] Imported new chain segment number=986 hash=4a154d..315f98 blocks=128 txs=204 mgas=32.286 elapsed=202.001ms mgasps=159.830 age=1d12h53m dirty=1.23MiB
INFO [07-16|15:59:07.580] Imported new chain segment number=1114 hash=92b77b..1c2b95 blocks=128 txs=178 mgas=45.001 elapsed=183.949ms mgasps=244.637 age=1d7h33m dirty=1.24MiBVerify RPC
The Linea RPC is
RPC=$(curl -4 ifconfig.me):8545curl -X POST $RPC -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' | jqIf you get something like this in response of the above rpc call, your node is setup correctly
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"currentBlock": "0x10bcec",
"healedBytecodeBytes": "0x0",
"healedBytecodes": "0x0",
"healedTrienodeBytes": "0x0",
"healedTrienodes": "0x0",
"healingBytecode": "0x0",
"healingTrienodes": "0x0",
"highestBlock": "0x1792276",
"startingBlock": "0x1233f",
"syncedAccountBytes": "0x422a06f3",
"syncedAccounts": "0x5b14c0",
"syncedBytecodeBytes": "0x26c0e4d8",
"syncedBytecodes": "0x13cfd",
"syncedStorage": "0x38195bc",
"syncedStorageBytes": "0x2ef128d1b"
}
}Wait for "result" to become false before using it in vald config
{ "jsonrpc": "2.0", "id": 1, "result": false }Configure vald
In order for vald to connect to your Linea node, your rpc_addr should be exposed in
vald's config.toml
[[axelar_bridge_evm]] name = "linea" rpc_addr = "http://IP:PORT"
start-with-bridge = true
finality_override = "confirmation"[[axelar_bridge_evm]] name = "linea" rpc_addr = "http://IP:PORT"
start-with-bridge = true
finality_override = "confirmation"