/metis-replica-node-guide

Metis replica node guide

Primary LanguageShell

Metis Andromeda Replica

You may not need this, you can use our public rpc.

It retrives data from L2 nodes, and no blocks lag behind.

Required

  • docker
  • docker-compose(version 2.x is required)

Recommended hardware specification

RAM: 8 GB

CPU: 4 core CPU

Storage: Minimum 100GB SSD (make sure it is extendable)

Setup a replica node

clone the repository

git clone https://github.com/ericlee42/metis-replica-node-guide

Change config

cp docker-compose-mainnet.yml docker-compose.yml

you should change DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT environment variable in the docker-compose.yml, it's your Ethereum mainnnet rpc endpoint(You can use infura public serivce).

Optional: change volumes

By default, replica node creates a chaindata directory in the current directory. You can change the volumes configuration in your compose file to customize the storage directory.

start the dtl service

docker-compose up -d dtl

If you get this log below, it means the start-up was successful

$ docker-compose logs --tail=10 dtl
{"level":30,"time":1640763281396,"msg":"Service L1_Data_Transport_Service is starting..."}
{"level":30,"time":1640763281400,"msg":"Service L1_Data_Transport_Service is initializing..."}
{"level":30,"time":1640763281400,"msg":"Initializing L1 Data Transport Service..."}
{"level":30,"time":1640763281470,"msg":"Service L1_Transport_Server is initializing..."}
{"level":30,"time":1640763281486,"defaultBackend":"l1","l1GasPriceBackend":"l1","msg":"HTTP Server Options"}
{"level":30,"time":1640763281487,"url":"YOUR_L1_RPC_ENDPOINT","msg":"HTTP Server L1 RPC Provider initialized"}
{"level":30,"time":1640763281487,"url":"https://andromeda.metis.io/?owner=1088","msg":"HTTP Server L2 RPC Provider initialized"}
{"level":30,"time":1640763281487,"msg":"Service L1_Transport_Server has initialized."}
{"level":30,"time":1640763281488,"msg":"Service L2_Ingestion_Service is initializing..."}
{"level":30,"time":1640763281489,"msg":"Service L2_Ingestion_Service has initialized."}
{"level":30,"time":1640763281490,"msg":"Service L1_Data_Transport_Service has initialized."}
{"level":30,"time":1640763281490,"msg":"Service L1_Transport_Server is starting..."}
{"level":30,"time":1640763281491,"msg":"Service L2_Ingestion_Service is starting..."}
{"level":30,"time":1640763281496,"host":"0.0.0.0","port":7878,"msg":"Server started and listening"}
{"level":30,"time":1640763281499,"msg":"Service L1_Transport_Server can stop now"}
{"level":30,"time":1640763283225,"fromBlock":0,"toBlock":1001,"msg":"Synchronizing unconfirmed transactions from Layer 2 (Metis)"}

start the l2geth service

docker-compose up -d l2geth

If you get this log below, it means the start-up was successful

$ docker-compose logs --tail=10 l2geth
DEBUG[12-29|07:37:22.445] Allowed origin(s) for WS RPC interface [*] 
INFO [12-29|07:37:22.445] WebSocket endpoint opened                url=ws://[::]:8546
INFO [12-29|07:37:23.259] Unlocked account                         address=0x00000398232E2064F896018496b4b44b3D62751F
INFO [12-29|07:37:23.259] Transaction pool price threshold updated price=0
INFO [12-29|07:37:23.259] Transaction pool price threshold updated price=0
INFO [12-29|07:37:23.259] Initializing Sync Service 
INFO [12-29|07:37:23.260] Sealing paused, waiting for transactions 
INFO [12-29|07:37:23.260] Set L2 Gas Price                         gasprice=40000000000
INFO [12-29|07:37:23.261] Set L1 Gas Price                         gasprice=150000000000
INFO [12-29|07:37:23.261] Set batch overhead                       overhead=2750
INFO [12-29|07:37:23.261] Set scalar                               scalar=40
INFO [12-29|07:37:23.261] Starting Verifier Loop                   poll-interval=15s timestamp-refresh-threshold=5m0s
INFO [12-29|07:37:23.391] Syncing transaction range                start=0 end=89000 backend=l2
DEBUG[12-29|07:37:24.528] Couldn't add port mapping                proto=tcp extport=30303 intport=30303 interface="UPnP or NAT-PMP" err="no UPnP or NAT-PMP router discovered"
INFO [12-29|07:37:38.274] Syncing transaction range                start=0 end=91100 backend=l2
INFO [12-29|07:37:53.248] Syncing transaction range                start=0 end=92923 backend=l2
INFO [12-29|07:38:08.247] Syncing transaction range                start=0 end=92923 backend=l2
INFO [12-29|07:38:23.231] Syncing transaction range                start=0 end=92924 backend=l2
INFO [12-29|07:38:38.224] Syncing transaction range                start=0 end=92926 backend=l2

Start proxy server

docker-compose up -d proxy

Proxy server is responsible for forwarding traffic to local replica and sequencer node

default timeout is 5s, you can change -timeout command argument to a bigger one.

RPC exmaple

$ # get chain id
$ curl -H 'Content-Type: application/json'  'http://localhost:8545' --data-raw '{"id": "1","jsonrpc": "2.0","method": "eth_chainId","params": []}'
{"jsonrpc":"2.0","id":"1","result":"0x440"}
$ # get block by block number
$ curl -H 'Content-Type: application/json'  'http://localhost:8545' --data-raw '{"id": "1","jsonrpc": "2.0","method": "eth_getBlockByNumber","params": ["latest",false]}'
{"jsonrpc":"2.0","id":"1","result":{"difficulty":"0x1","extraData":"0x000000000000000000000000000000000000000000000000000000000000000000000398232e2064f896018496b4b44b3d62751f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","gasLimit":"0x4190ab00","gasUsed":"0x0","hash":"0x9e3354e081a54a57190bdb8948a597c840ea5dd496b0322864d4585f4a716892","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x0","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x26f","stateRoot":"0x86c9b145f467994ffb6b07274d02bf7bb302a7caac27a97823e1c9f456e3c1e3","timestamp":"0x0","totalDifficulty":"0x1","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[]}}
$ # Send a raw trasaction
$ curl -H 'Content-Type: application/json' 'http://localhost:8545' --data-raw '{"id": "1","jsonrpc": "2.0","method": "eth_sendRawTransaction","params": ["0x"]}'

Note: The 8546 port is a read-only websocket port for now, you could not use it for eth_sendRawTransaction rpc method