├── .github └── ISSUE_TEMPLATE │ └── help.yaml ├── .gitignore ├── README.md ├── config.md ├── docker-compose-mainnet.yml ├── docker-compose-sepolia.yml ├── mainnet ├── l1dtl.env └── l2geth.env └── sepolia ├── l1dtl.env └── l2geth.env /.github/ISSUE_TEMPLATE/help.yaml: -------------------------------------------------------------------------------- 1 | name: "deployment-help" 2 | description: ask for deployment help 3 | body: 4 | - type: input 5 | id: revision 6 | attributes: 7 | label: "What Git revision / release tag are you using?" 8 | validations: 9 | required: true 10 | 11 | - type: input 12 | id: hardware-specification 13 | attributes: 14 | label: "What is your hardware specification?" 15 | validations: 16 | required: true 17 | 18 | - type: input 19 | id: docker-revision 20 | attributes: 21 | label: "What Docker version are you using?" 22 | validations: 23 | required: true 24 | 25 | - type: input 26 | id: os-revision 27 | attributes: 28 | label: "What Linux distribution are you using?" 29 | validations: 30 | required: true 31 | 32 | - type: textarea 33 | id: problem 34 | attributes: 35 | label: "Describe what the problem is?" 36 | validations: 37 | required: true 38 | 39 | - type: textarea 40 | id: logs 41 | attributes: 42 | label: "If applicable, what are the logs from the server around the occurence of the problem?" 43 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | docker-compose.yml 2 | chaindata 3 | .env 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Metis Replica Node 2 | 3 | This repository is deprecated 4 | 5 | please use [metis-ansible](https://github.com/MetisProtocol/metis-ansible) and [metis-charts](https://github.com/metisprotocol/metis-charts) instead. 6 | -------------------------------------------------------------------------------- /config.md: -------------------------------------------------------------------------------- 1 | 2 | ## DTL Service Enviroment Config 3 | 4 | 5 | | Variable | Default | Description | 6 | | ------------------------------------------------------- | ----------- | -------------------------------------------------------------------------------------------------- | 7 | | URL | - | used for setting the address manager address | 8 | | DATA_TRANSPORT_LAYER__ADDRESS_MANAGER | - | Address of the AddressManager contract on L1., recommend using `URL` settting. | 9 | | DATA_TRANSPORT_LAYER__DB_PATH | /data/db | Path to the database for this service | 10 | | DATA_TRANSPORT_LAYER__POLLING_INTERVAL | 5000 | Period of time between execution loops. | 11 | | DATA_TRANSPORT_LAYER__DANGEROUSLY_CATCH_ALL_ERRORS | false | If true, will catch all errors without throwing. | 12 | | DATA_TRANSPORT_LAYER__CONFIRMATIONS | 12 | Number of confirmations to wait before accepting transactions as "canonical". | 13 | | DATA_TRANSPORT_LAYER__SERVER_HOSTNAME | localhost | Host to run the API on. | 14 | | DATA_TRANSPORT_LAYER__SERVER_PORT | 7878 | Port to run the API on. | 15 | | DATA_TRANSPORT_LAYER__SYNC_FROM_L1 | true | Whether or not to sync from L1. | 16 | | DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT | - | RPC endpoint for an L1 node. | 17 | | DATA_TRANSPORT_LAYER__LOGS_PER_POLLING_INTERVAL | 2000 | Logs to sync per polling interval. | 18 | | DATA_TRANSPORT_LAYER__SYNC_FROM_L2 | false | Whether or not to sync from L2. | 19 | | DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT | - | RPC endpoint for an L2 node. | 20 | | DATA_TRANSPORT_LAYER__TRANSACTIONS_PER_POLLING_INTERVAL | 1000 | Number of L2 transactions to query per polling interval. | 21 | | DATA_TRANSPORT_LAYER__L2_CHAIN_ID | - | L2 chain ID. | 22 | | DATA_TRANSPORT_LAYER__LEGACY_SEQUENCER_COMPATIBILITY | false | Whether or not to enable "legacy" sequencer sync (without the custom `eth_getBlockRange` endpoint) | 23 | | DATA_TRANSPORT_LAYER__NODE_ENV | development | Environment the service is running in: production, development, or test. | 24 | | DATA_TRANSPORT_LAYER__ETH_NETWORK_NAME | - | L1 Ethereum network the service is deployed to: mainnet, kovan, goerli. | 25 | | DATA_TRANSPORT_LAYER__L1_GAS_PRICE_BACKEND | l1 | Where to pull the l1 gas price from (l1 or l2) | 26 | | DATA_TRANSPORT_LAYER__DEFAULT_BACKEND | l1 | Where to sync transactions from (l1 or l2) | 27 | 28 | 29 | ## L2Geth Service Enviroment Config 30 | 31 | | Variable | Default | Description | 32 | | -------------------------- | --------------------- | ---------------------------------------------------------------------------------------------------------------- | 33 | | BLOCK_SIGNER_KEY | | only used internally to sign blocks,no need to keep this secret | 34 | | BLOCK_SIGNER_ADDRESS | | block signer adddress | 35 | | ROLLUP_CLIENT_HTTP | http://localhost:7878 | HTTP endpoint for the rollup client | 36 | | ROLLUP_POLL_INTERVAL_FLAG | 10s | Interval for polling with the rollup http client | 37 | | ROLLUP_TIMESTAMP_REFRESH | 3min | Interval for refreshing the timestamp | 38 | | ROLLUP_BACKEND | l1 | Sync backend for verifiers ("l1" or "l2"), defaults to l1 | 39 | | ROLLUP_VERIFIER_ENABLE | | Enable the verifier | 40 | | ROLLUP_MAX_CALLDATA_SIZE | | Maximum allowed calldata size for Queue Origin Sequencer Txs | 41 | | ROLLUP_ENFORCE_FEES | | Disable transactions with 0 gas price | 42 | | ROLLUP_FEE_THRESHOLD_DOWN | | Allow txs with fees below the current fee up to this amount, must be < 1 | 43 | | ROLLUP_FEE_THRESHOLD_UP | | Allow txs with fees above the current fee up to this amount, must be > 1 | 44 | | ETH1_SYNC_SERVICE_ENABLE | | Enable the sync service | 45 | | ETH1_CTC_DEPLOYMENT_HEIGHT | | Deployment of the canonical transaction chain | 46 | | NO_USB | | Disables monitoring for and managing USB hardware wallets | 47 | | NETWORK_ID | | Network identifier | 48 | | GCMODE | full | Blockchain garbage collection mode ("full", "archive") | 49 | | IPC_DISABLE | | Disable the IPC-RPC server | 50 | | RPC_ENABLE | | Enable the HTTP-RPC server | 51 | | RPC_ADDR | localhost | HTTP-RPC server listening interface | 52 | | RPC_PORT | 8545 | HTTP-RPC server listening port | 53 | | RPC_CORS_DOMAIN | | Comma separated list of domains from which to accept cross origin requests (browser enforced) | 54 | | RPC_VHOSTS | | Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard. | 55 | | RPC_API | | API's offered over the HTTP-RPC interface | 56 | | WS | | Enable the WS-RPC server | 57 | | WS_ADDR | 127.0.0.1 | WS-RPC server listening interface | 58 | | WS_PORT | 8546 | WS-RPC server listening port | 59 | | WS_API | | API's offered over the WS-RPC interface | 60 | | WS_ORIGINS | | Origins from which to accept websockets requests | 61 | | NO_DISCOVER | | Disables the peer discovery mechanism (manual peer addition) | 62 | | METRICS_ENABLE | | Enable metrics collection and reporting | 63 | | DATADIR | | Block data directory | 64 | 65 | 66 | BLOCK_SIGNER_KEY(**only used internally to sign blocks,no need to keep this secret**) 67 | 68 | 6587ae678cf4fc9a33000cdbf9f35226b71dcc6a4684a31203241f9bcfd55d27 69 | 70 | BLOCK_SIGNER_ADDRESS: 71 | 72 | 0x00000398232E2064F896018496b4b44b3D62751F -------------------------------------------------------------------------------- /docker-compose-mainnet.yml: -------------------------------------------------------------------------------- 1 | name: "metis-mainnet" 2 | 3 | services: 4 | l1dtl: 5 | image: metisdao/dtl:v0.1.2 6 | platform: linux/amd64 7 | stop_grace_period: 30s 8 | network_mode: host 9 | restart: unless-stopped 10 | volumes: 11 | - ./chaindata/l1dtl:/data 12 | env_file: 13 | - ./mainnet/l1dtl.env 14 | - .env 15 | healthcheck: 16 | test: ["CMD-SHELL", "curl http://127.0.0.1:7878"] 17 | interval: 5s 18 | timeout: 3s 19 | retries: 6 20 | logging: 21 | driver: "json-file" 22 | options: 23 | max-size: "2m" 24 | max-file: "10" 25 | 26 | l2geth: 27 | image: metisdao/l2geth:v0.1.2 28 | platform: linux/amd64 29 | restart: unless-stopped 30 | stop_grace_period: 2m 31 | network_mode: host 32 | env_file: 33 | - ./mainnet/l2geth.env 34 | depends_on: 35 | l1dtl: 36 | condition: service_healthy 37 | healthcheck: 38 | test: ["CMD", "is-l2geth-stalled"] 39 | interval: 10s 40 | timeout: 5s 41 | retries: 3 42 | start_period: 10s 43 | volumes: 44 | - ./chaindata/l2geth:/root/.ethereum 45 | logging: 46 | driver: "json-file" 47 | options: 48 | max-size: "2m" 49 | max-file: "10" 50 | -------------------------------------------------------------------------------- /docker-compose-sepolia.yml: -------------------------------------------------------------------------------- 1 | name: "metis-sepolia" 2 | 3 | services: 4 | l1dtl: 5 | image: metisdao/dtl:v0.1.2 6 | platform: linux/amd64 7 | container_name: l1dtl 8 | stop_grace_period: 30s 9 | restart: unless-stopped 10 | network_mode: host 11 | env_file: 12 | - ./sepolia/l1dtl.env 13 | - .env 14 | healthcheck: 15 | test: ["CMD-SHELL", "curl http://127.0.0.1:7878"] 16 | interval: 5s 17 | timeout: 5s 18 | retries: 5 19 | start_period: 5s 20 | volumes: 21 | - "./chaindata/l1dtl:/data" 22 | logging: 23 | driver: json-file 24 | options: 25 | max-size: 2m 26 | max-file: 10 27 | 28 | l2geth: 29 | image: metisdao/l2geth:v0.1.2 30 | platform: linux/amd64 31 | container_name: l2geth 32 | restart: unless-stopped 33 | network_mode: host 34 | stop_grace_period: 30s 35 | depends_on: 36 | l1dtl: 37 | condition: service_healthy 38 | healthcheck: 39 | test: ["CMD-SHELL", "is-l2geth-stalled"] 40 | interval: 30s 41 | timeout: 5s 42 | retries: 3 43 | start_period: 30s 44 | env_file: 45 | - ./sepolia/l2geth.env 46 | volumes: 47 | - "./chaindata/l2geth:/root/.ethereum" 48 | logging: 49 | driver: json-file 50 | options: 51 | max-size: 2m 52 | max-file: 10 53 | -------------------------------------------------------------------------------- /mainnet/l1dtl.env: -------------------------------------------------------------------------------- 1 | URL=https://metisprotocol.github.io/metis-networks/andromeda-mainnet/addresses.json 2 | DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT=https://andromeda.metis.io 3 | DATA_TRANSPORT_LAYER__SYNC_FROM_L1=true 4 | DATA_TRANSPORT_LAYER__SYNC_FROM_L2=false 5 | DATA_TRANSPORT_LAYER__L2_CHAIN_ID=1088 6 | DATA_TRANSPORT_LAYER__DB_PATH=/data/db 7 | DATA_TRANSPORT_LAYER__SERVER_PORT=7878 8 | DATA_TRANSPORT_LAYER__TRANSACTIONS_PER_POLLING_INTERVAL=1000 9 | DATA_TRANSPORT_LAYER__CONFIRMATIONS=12 10 | DATA_TRANSPORT_LAYER__POLLING_INTERVAL=10000 11 | DATA_TRANSPORT_LAYER__LOGS_PER_POLLING_INTERVAL=1000 12 | DATA_TRANSPORT_LAYER__DANGEROUSLY_CATCH_ALL_ERRORS=true 13 | DATA_TRANSPORT_LAYER__SERVER_HOSTNAME=0.0.0.0 14 | DATA_TRANSPORT_LAYER__L1_START_HEIGHT=13625200 15 | 16 | DATA_TRANSPORT_LAYER__MINIO_ENABLED=true 17 | DATA_TRANSPORT_LAYER__MINIO_BUCKET=metis-1088-prod 18 | DATA_TRANSPORT_LAYER__MINIO_ENDPOINT=memoapi.metis.io 19 | DATA_TRANSPORT_LAYER__MINIO_PORT=6083 20 | DATA_TRANSPORT_LAYER__MINIO_USE_SSL=true 21 | DATA_TRANSPORT_LAYER__MINIO_ACCESS_KEY=metisread 22 | DATA_TRANSPORT_LAYER__MINIO_SECRET_KEY=8uyywb*7y3 23 | 24 | DATA_TRANSPORT_LAYER__BATCH_INBOX_ADDRESS=0xff00000000000000000000000000000000001088 25 | DATA_TRANSPORT_LAYER__BATCH_INBOX_SENDER=0x1a9da0aeda630ddf2748a453bf6d92560762d914 26 | DATA_TRANSPORT_LAYER__DESEQBLOCK=16500000 27 | DATA_TRANSPORT_LAYER__BATCH_INBOX_START_INDEX=42647 28 | DATA_TRANSPORT_LAYER__BATCH_INBOX_L1_HEIGHT=19438451 29 | 30 | DATA_TRANSPORT_LAYER__SYNC_L1_BATCH=false 31 | -------------------------------------------------------------------------------- /mainnet/l2geth.env: -------------------------------------------------------------------------------- 1 | DATADIR=/root/.ethereum 2 | NO_USB=true 3 | VERBOSITY=3 4 | IPC_DISABLE=false 5 | MAX_PEER=150 6 | GCMODE=archive 7 | 8 | USING_OVM=true 9 | CHAIN_ID=1088 10 | NETWORK_ID=1088 11 | TARGET_GAS_LIMIT=1100000000 12 | 13 | ETH1_CTC_DEPLOYMENT_HEIGHT=13626959 14 | ETH1_SYNC_SERVICE_ENABLE=false 15 | 16 | ROLLUP_BACKEND=l1 17 | ROLLUP_CLIENT_HTTP=http://localhost:7878 18 | ROLLUP_MAX_CALLDATA_SIZE=40000 19 | ROLLUP_TIMESTAMP_REFRESH=10s 20 | ROLLUP_POLL_INTERVAL_FLAG=10s 21 | ROLLUP_ENFORCE_FEES=true 22 | 23 | # for geth.sh 24 | ROLLUP_STATE_DUMP_PATH=https://metisprotocol.github.io/metis-networks/andromeda-mainnet/state-dump.latest.json 25 | BLOCK_SIGNER_KEY=6587ae678cf4fc9a33000cdbf9f35226b71dcc6a4684a31203241f9bcfd55d27 26 | BLOCK_SIGNER_ADDRESS=0x00000398232E2064F896018496b4b44b3D62751F 27 | 28 | # for rpc/websocket/ipc 29 | RPC_ENABLE=true 30 | RPC_ADDR=0.0.0.0 31 | RPC_PORT=8545 32 | RPC_API=eth,net,web3,mvm,debug 33 | RPC_CORS_DOMAIN=* 34 | RPC_VHOSTS=* 35 | 36 | WS=true 37 | WS_ADDR=0.0.0.0 38 | WS_PORT=8546 39 | WS_API=eth,net,web3,mvm,debug 40 | WS_ORIGINS=* 41 | 42 | # seqset 43 | SEQSET_VALID_HEIGHT=15214531 44 | DESEQBLOCK=16500000 45 | SEQSET_CONTRACT=0x0fe382b74C3894B65c10E5C12ae60Bbd8FAf5b48 46 | SEQ_BRIDGE_URL=https://andromeda.metis.io 47 | BOOTNODES=enode://61b617d2549296b0b950efcf8c1d87227d454d44362e642dde37d83092a445f2b6a6fd651d611b2893249d1e9d15c8f1d4b067142cff53280a08c9c7565c29e2@3.22.33.68:30303,enode://524e335aaa2a4555fe2d54f07fc34da83d80b0407d86c606b76ce918f96a348cf91947f7c60b0eabd29f68d2669cc0ced1360636daa53d0ccc948e154d0ce21e@3.129.121.37:30303,enode://c4cc213e3c5cb57b1ea6e1aa0b8a28240b03a5fa4b65ff08c53faf448182ae161d68c78fe48040da1e5d9087c6f19b60644605c4c2d78845627f09b90207e56c@3.17.198.212:30303,enode://690969c716d2e4f55936a2801ab1d513598f8f2afa85be1c9f9c41e8ce1f07ee352dac2925f86fd54449d7bdd9bddc7342d33c0c46c604db19de63e21362f2cd@54.237.23.7:30303,enode://9bbe2b0d7e2cd7c3de7f9674fb95059026667e9b9ce717f927b4f53132dde131fab34995a984ed47328f867e5efea4e5a27dc6a90b6b1f4106f07be215e0ece5@54.174.30.211:30303,enode://2577f7c6ffafcdf311e2f79bcc56671825f00a265e5cd1f0224d8bd4b484ba1870930584f37593abfb910a76b51fa82a8b48c53d2511848680beb00c357cf3e0@52.20.251.43:30303,enode://5a41bbc2a57c90b443244bc2d9c4470ee84b7af21aa27256178e53a1772950c3bf9a2b6c1a761688064aaa8456f6b4e918918cda867ce59d007ff825bbefe61d@3.126.202.64:30303,enode://c0c2826d5bc7baeb2b8fe3aa8726d2572508142aa2476e2d2a667c7452a3dc78b47c1176522a9b4c3203902c3ae487ae4b656c7089334536d9c1468056799939@52.57.227.34:30303,enode://86fffa408fca0afc8c9f5cf3f5831d1bc39c2a49d3690ae5219001ff7bec08cac6932dc7e94c65186f7d46daa738449f2eb361d50cde15212a8e8c84eec62605@18.193.199.155:30303 48 | -------------------------------------------------------------------------------- /sepolia/l1dtl.env: -------------------------------------------------------------------------------- 1 | URL=https://metisprotocol.github.io/metis-networks/sepolia-testnet/addresses.json 2 | DATA_TRANSPORT_LAYER__ETH_NETWORK_NAME=sepolia 3 | DATA_TRANSPORT_LAYER__SYNC_FROM_L1=true 4 | DATA_TRANSPORT_LAYER__SYNC_FROM_L2=false 5 | DATA_TRANSPORT_LAYER__L2_CHAIN_ID=59902 6 | DATA_TRANSPORT_LAYER__DB_PATH=/data/db 7 | DATA_TRANSPORT_LAYER__CONFIRMATIONS=12 8 | DATA_TRANSPORT_LAYER__POLLING_INTERVAL=10000 9 | DATA_TRANSPORT_LAYER__TRANSACTIONS_PER_POLLING_INTERVAL=1000 10 | DATA_TRANSPORT_LAYER__LOGS_PER_POLLING_INTERVAL=1000 11 | DATA_TRANSPORT_LAYER__DANGEROUSLY_CATCH_ALL_ERRORS=true 12 | DATA_TRANSPORT_LAYER__SERVER_HOSTNAME=0.0.0.0 13 | DATA_TRANSPORT_LAYER__SERVER_PORT=7878 14 | DATA_TRANSPORT_LAYER__L1_START_HEIGHT=5375027 15 | 16 | DATA_TRANSPORT_LAYER__SYNC_L1_BATCH=false 17 | 18 | DATA_TRANSPORT_LAYER__MINIO_ENABLED=true 19 | DATA_TRANSPORT_LAYER__MINIO_BUCKET=metis-1088-tx 20 | DATA_TRANSPORT_LAYER__MINIO_ENDPOINT=metis.memosync.org 21 | DATA_TRANSPORT_LAYER__MINIO_PORT=6081 22 | DATA_TRANSPORT_LAYER__MINIO_USE_SSL=true 23 | DATA_TRANSPORT_LAYER__MINIO_ACCESS_KEY=readonly 24 | DATA_TRANSPORT_LAYER__MINIO_SECRET_KEY=read888& 25 | 26 | DATA_TRANSPORT_LAYER__BATCH_INBOX_ADDRESS=0xff00000000000000000000000001115511159902 27 | DATA_TRANSPORT_LAYER__BATCH_INBOX_SENDER=0x578c88eeee23db03e70adb2445f0043bec3c416e 28 | DATA_TRANSPORT_LAYER__DESEQBLOCK=600000 29 | DATA_TRANSPORT_LAYER__BATCH_INBOX_START_INDEX=1 30 | DATA_TRANSPORT_LAYER__BATCH_INBOX_L1_HEIGHT=5536000 31 | -------------------------------------------------------------------------------- /sepolia/l2geth.env: -------------------------------------------------------------------------------- 1 | DATADIR=/root/.ethereum 2 | NO_USB=true 3 | VERBOSITY=3 4 | IPC_DISABLE=false 5 | MAX_PEER=150 6 | GCMODE=archive 7 | 8 | USING_OVM=true 9 | NETWORK_ID=59902 10 | CHAIN_ID=59902 11 | TARGET_GAS_LIMIT=30000000 12 | 13 | ETH1_CTC_DEPLOYMENT_HEIGHT=5375027 14 | ETH1_SYNC_SERVICE_ENABLE=false 15 | 16 | ROLLUP_BACKEND=l1 17 | ROLLUP_CLIENT_HTTP=http://localhost:7878 18 | ROLLUP_MAX_CALLDATA_SIZE=40000 19 | ROLLUP_TIMESTAMP_REFRESH=10s 20 | ROLLUP_POLL_INTERVAL_FLAG=10s 21 | ROLLUP_ENFORCE_FEES=true 22 | 23 | # for geth.sh 24 | ROLLUP_STATE_DUMP_PATH=https://metisprotocol.github.io/metis-networks/sepolia-testnet/state-dump.latest.json 25 | BLOCK_SIGNER_KEY=6587ae678cf4fc9a33000cdbf9f35226b71dcc6a4684a31203241f9bcfd55d27 26 | BLOCK_SIGNER_ADDRESS=0x00000398232E2064F896018496b4b44b3D62751F 27 | 28 | # for rpc/websocket/ipc 29 | RPC_ENABLE=true 30 | RPC_ADDR=0.0.0.0 31 | RPC_PORT=8545 32 | RPC_API=eth,net,web3,mvm,debug 33 | RPC_CORS_DOMAIN=* 34 | RPC_VHOSTS=* 35 | 36 | WS=true 37 | WS_ADDR=0.0.0.0 38 | WS_PORT=8546 39 | WS_API=eth,net,web3,mvm,debug 40 | WS_ORIGINS=* 41 | 42 | # seqset 43 | SEQSET_VALID_HEIGHT=1000 44 | DESEQBLOCK=600000 45 | SEQSET_CONTRACT=0xdE8d56212118906a0CeCD331e842429714b4c47B 46 | SEQ_BRIDGE_URL=https://sepolia.metisdevops.link 47 | BOOTNODES=enode://0b07faff18115a46539fa34882bcae182ddcbf4dda135d3102d3cde8f3bd2b21928d9f65ad1c3c387aef4480d838ca090a5daea99e284802914dfb376a9d61a8@34.239.200.85:30303,enode://75d1da5e91369f56091b9358c921451c11523601341a5e25d7a779d4aaa720263d36ea408ac6aa4ee4b2c1a8f44a0bc2295de8c874ee289cc4428b54bfa7d85a@3.229.226.37:30303,enode://428037cd3656d83ac4dd11242926bb57879be4b3488ee3184d29654439095cb6d8824121d6fe2859398e06a259e959da017db81b5b67d9beb38052bbd59e1b88@34.206.236.62:30303 48 | --------------------------------------------------------------------------------