From cefe892917cf57fd3cee0bfd0e951ecf24087b36 Mon Sep 17 00:00:00 2001 From: Sebastian <379651+czarly@users.noreply.github.com> Date: Sat, 27 Jan 2024 12:14:12 +0100 Subject: [PATCH] make a metis node --- metis.yml | 94 +++++++++++++++++++++++++++++++++++++++++++ metis/geth.env | 37 +++++++++++++++++ metis/scripts/geth.sh | 66 ++++++++++++++++++++++++++++++ 3 files changed, 197 insertions(+) create mode 100644 metis.yml create mode 100644 metis/geth.env create mode 100644 metis/scripts/geth.sh diff --git a/metis.yml b/metis.yml new file mode 100644 index 00000000..97d22dad --- /dev/null +++ b/metis.yml @@ -0,0 +1,94 @@ +version: "3.1" + +services: + metis-dtl: + image: metisdao/data-transport-layer:20230713210754 + restart: unless-stopped + stop_grace_period: 30s + environment: + URL: https://metisprotocol.github.io/metis-networks/andromeda-mainnet/addresses.json + DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT: "${METIS_L1_RPC:-https://eth.llamarpc.com}" + DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT: "https://andromeda.metis.io/?owner=1088" + DATA_TRANSPORT_LAYER__SYNC_FROM_L1: "false" + DATA_TRANSPORT_LAYER__SYNC_FROM_L2: "true" + DATA_TRANSPORT_LAYER__L2_CHAIN_ID: "1088" + DATA_TRANSPORT_LAYER__DB_PATH: /data/db + DATA_TRANSPORT_LAYER__SERVER_PORT: "7878" + DATA_TRANSPORT_LAYER__TRANSACTIONS_PER_POLLING_INTERVAL: "1000" + DATA_TRANSPORT_LAYER__CONFIRMATIONS: "0" + DATA_TRANSPORT_LAYER__POLLING_INTERVAL: "100" + DATA_TRANSPORT_LAYER__LOGS_PER_POLLING_INTERVAL: "2000" + DATA_TRANSPORT_LAYER__DANGEROUSLY_CATCH_ALL_ERRORS: "true" + DATA_TRANSPORT_LAYER__SERVER_HOSTNAME: "0.0.0.0" + expose: + - 7878 + volumes: + - metis-dtl:/data + healthcheck: + test: ["CMD-SHELL", "curl http://127.0.0.1:7878"] + interval: 5s + timeout: 3s + retries: 6 + networks: + - chains + + metis: + image: metisdao/l2geth:20230713220744 + entrypoint: ["sh", "/scripts/geth.sh"] + restart: unless-stopped + stop_grace_period: 2m + env_file: + - ./metis/geth.env + depends_on: + dtl: + condition: service_healthy + healthcheck: + test: ["CMD-SHELL", "curl http://127.0.0.1:8545"] + interval: 5s + timeout: 3s + retries: 6 + environment: + L2GETH_GENESIS_URL: https://metisprotocol.github.io/metis-networks/andromeda-mainnet/state-dump.latest.json + ROLLUP_CLIENT_HTTP: http://metis-dtl:7878 + L2_URL: https://andromeda.metis.io + SEQUENCER_CLIENT_HTTP: https://andromeda.metis.io + ETH1_CTC_DEPLOYMENT_HEIGHT: 13626959 + CHAIN_ID: 1088 + NETWORK_ID: 1088 + TARGET_GAS_LIMIT: 1100000000 + volumes: + - metis-l2geth:/root/.ethereum + - ./metis/scripts:/scripts + expose: + - 8546 + - 8545 + networks: + - chains + + metis-proxy: + restart: unless-stopped + image: nginx + depends_on: + - mantle-fullnode + expose: + - 80 + environment: + PROXY_HOST: metis + RPC_PORT: 8545 + WS_PORT: 8546 + networks: + - chains + volumes: + - ./nginx-proxy:/etc/nginx/templates + labels: + - "traefik.enable=true" + - "traefik.http.middlewares.metis-stripprefix.stripprefix.prefixes=/metis" + - "traefik.http.services.metis.loadbalancer.server.port=80" + - "traefik.http.routers.metis.entrypoints=websecure" + - "traefik.http.routers.metis.tls.certresolver=myresolver" + - "traefik.http.routers.metis.rule=Host(`$DOMAIN`) && PathPrefix(`/metis`)" + - "traefik.http.routers.metis.middlewares=metis-stripprefix, ipwhitelist" + +Volumes: + - metis-l2geth + - metis-dtl diff --git a/metis/geth.env b/metis/geth.env new file mode 100644 index 00000000..a21ee8cc --- /dev/null +++ b/metis/geth.env @@ -0,0 +1,37 @@ +USING_OVM=true +DATADIR=/root/.ethereum +NO_DISCOVER=true +NO_USB=true +GASPRICE=0 +GCMODE=full + +# only used internally to sign blocks,no need to keep this secret +BLOCK_SIGNER_PRIVATE_KEY=6587ae678cf4fc9a33000cdbf9f35226b71dcc6a4684a31203241f9bcfd55d27 +BLOCK_SIGNER_PRIVATE_KEY_PASSWORD=password +BLOCK_SIGNER_ADDRESS=0x00000398232E2064F896018496b4b44b3D62751F + +ROLLUP_BACKEND=l2 +ROLLUP_DISABLE_TRANSFERS=false +ROLLUP_ENABLE_L2_GAS_POLLING=false +ROLLUP_MAX_CALLDATA_SIZE=40000 +ROLLUP_SYNC_SERVICE_ENABLE=true +ROLLUP_TIMESTAMP_REFRESH=5m +ROLLUP_VERIFIER_ENABLE=true +ROLLUP_POLL_INTERVAL_FLAG=200ms + +ETH1_SYNC_SERVICE_ENABLE=true +ETH1_CONFIRMATION_DEPTH=0 +ETH1_CTC_DEPLOYMENT_HEIGHT=8 + +RPC_ADDR=0.0.0.0 +RPC_API=eth,net,web3 +RPC_CORS_DOMAIN=* +RPC_ENABLE=true +RPC_PORT=8545 +RPC_VHOSTS=* +RPC_GAS_CAP=11000000 +RPC_WRITE_TIMEOUT=5m +WS_ADDR=0.0.0.0 +WS_API=eth,net,web3 +WS_ORIGINS=* +WS=true \ No newline at end of file diff --git a/metis/scripts/geth.sh b/metis/scripts/geth.sh new file mode 100644 index 00000000..33000217 --- /dev/null +++ b/metis/scripts/geth.sh @@ -0,0 +1,66 @@ +#!/bin/sh +set -eou + +RETRIES=${RETRIES:-40} +VERBOSITY=${VERBOSITY:-3} + +if [ -z "$DATADIR" ]; then + echo "Must pass DATADIR" + exit 1 +fi +if [ -z "$BLOCK_SIGNER_PRIVATE_KEY" ]; then + echo "Must pass BLOCK_SIGNER_PRIVATE_KEY" + exit 1 +fi +if [ -z "$BLOCK_SIGNER_PRIVATE_KEY_PASSWORD" ]; then + echo "Must pass BLOCK_SIGNER_PRIVATE_KEY_PASSWORD" + exit 1 +fi +if [ -z "$L2GETH_GENESIS_URL" ]; then + echo "Must pass L2GETH_GENESIS_URL" + exit 1 +fi +if [[ -z $BLOCK_SIGNER_ADDRESS ]]; then + echo "Must pass BLOCK_SIGNER_ADDRESS" + exit 1 +fi + +echo "Running geth init" +echo "Retrieving genesis file $L2GETH_GENESIS_URL" +TEMP_DIR=$(mktemp -d) +wget -O "$TEMP_DIR"/genesis.json "$L2GETH_GENESIS_URL" +geth init --datadir=/"$DATADIR" "$TEMP_DIR"/genesis.json + +# Delete temp dir +rm -rf $TEMP_DIR + +# Check for an existing keystore folder. +# If it exists, assume it's correct and skip geth acount import step +GETH_KEYSTORE_DIR=$DATADIR/keystore +mkdir -p "$GETH_KEYSTORE_DIR" +GETH_KEYSTORE_KEYS=$(find "$GETH_KEYSTORE_DIR" -type f) + +if [ ! -z "$GETH_KEYSTORE_KEYS" ]; then + echo "$GETH_KEYSTORE_KEYS exist, skipping account import if any keys are present" +else + echo "$GETH_KEYSTORE_DIR missing, running account import" + echo -n "$BLOCK_SIGNER_PRIVATE_KEY_PASSWORD" >"$DATADIR"/password + echo -n "$BLOCK_SIGNER_PRIVATE_KEY" >"$DATADIR"/block-signer-key + geth account import \ + --datadir "$DATADIR" \ + --password "$DATADIR"/password \ + "$DATADIR"/block-signer-key +fi + +echo "l2geth setup complete" + +echo "Starting replica node" +exec geth \ + --datadir "$DATADIR" \ + --verbosity "$VERBOSITY" \ + --password "$DATADIR/password" \ + --allow-insecure-unlock \ + --unlock $BLOCK_SIGNER_ADDRESS \ + --mine \ + --miner.etherbase $BLOCK_SIGNER_ADDRESS \ + "$@"