├── .env.mainnet ├── .env.testnet ├── .gitignore ├── README.md ├── compose.yml └── config ├── gasp-labs-1.json ├── gasp-labs-2.json ├── gasp-labs-avs.json └── logo.png /.env.mainnet: -------------------------------------------------------------------------------- 1 | # rollup-node process configs 2 | ROLLUP_NODE_BOOTNODE=/dns4/collator-01-p2p-rollup-prod.gasp.xyz/tcp/30333/p2p/12D3KooWCnxPCDhnSDfw3WQReZxkyJ5fuQUFzVHmQx4SwVkd2Ndo 3 | ROLLUP_NODE_CUSTOM_CHAINSPEC_URL=https://raw.githubusercontent.com/gasp-xyz/chainspec/f9604551934c498a6a814d84f2cd6c01803d24d7/rollup-dev-env-chainspecs/alpha-launch-f26183b-raw.json 4 | 5 | # gasp-avs operator configs 6 | CHAIN_ID=1 7 | AVS_DEPLOYMENT_BLOCK=21394442 8 | AVS_REGISTRY_COORDINATOR_ADDR=0x9A986296d45C327dAa5998519AE1B3757F1e6Ba1 9 | AVS_RPC_URL=https://avs-aggregator-prod.gasp.xyz 10 | OPT_IN_AT_STARTUP=false 11 | 12 | ############################################################################### 13 | ####### TODO: Operators please update below values for your node ############## 14 | ############################################################################### 15 | # Use private endpoints for the Ethereum node, e.g. Tenderly nodes 16 | ETH_RPC_URL= 17 | ETH_WS_URL= 18 | 19 | # Provide formatted JSON keys with password to decrypt the keys 20 | # If you have them stored in files, you can use the following command to format them correclty: 21 | # `jq -c '.' ecdsa.key.json` and `jq -c '.' bls.key.json` 22 | # Example values: 23 | # ECDSA_KEY_JSON='{"address":"9ef4db31c5a76f9de428bc15397e3af429b7d654","crypto":{"cipher":"aes-128-ctr","ciphertext":"f472d5e83e887f9bc82cd1e48f157cb7d213be2b63bef2f58d3e19b1247d6fe8","cipherparams":{"iv":"2629ef1bd82bb145fe822bf9e53f584e"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"3e24f1f58298dbc97dc4e219977eefed8b8cb8cc155ff31e4f1d716b4ffbb94e"},"mac":"f898cd129ec387d694a8b92bb48712c8b48cf44e87381f997269f886d9ce125f"},"id":"7af17ec2-e827-5cb7-b962-3816d739c4f4","version":3}' 24 | # BLS_KEY_JSON='{"pubKey":"E([19468314961342411094361522639716895982292311048840813288977711685419023216444,17276551549456630122471837811162107580038124192493249527560638750597218680642])","crypto":{"cipher":"aes-128-ctr","ciphertext":"84fc78532b398be82955d31e934c9fe834e85f82fc34c1f3e6d81bd434434ed8","cipherparams":{"iv":"5ddc9923e3b782fbef189673284dcb31"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"ede82937ff2b29d78e523180e384b786685cba8d7c4399594242c8e810151e65"},"mac":"8994c1161e75538694a9c922cd1648e562bcf453924c3889e85f72434fb96f5e"}}' 25 | 26 | # BLS key is used to sign Operator tasks, it is recommended to use a unique BLS key per AVS 27 | BLS_KEY_JSON= 28 | BLS_KEY_PASSWORD= 29 | 30 | # ECDSA key is used to sign opt-in/opt-out calls, it is not neccessary to provide the key when running the service 31 | # it is recommended to provide the key only when opting-in/out into AVS, and use public address when runnning 32 | # ECDSA_KEY_JSON= 33 | # ECDSA_KEY_PASSWORD= 34 | 35 | # provide the public address of the operator, has to match the one used to register into Eigenlayer and AVS 36 | # ECDSA_ADDRESS=0x9A986296d45C327dAa5998519AE1B3757F1e6Ba1 37 | ECDSA_ADDRESS= -------------------------------------------------------------------------------- /.env.testnet: -------------------------------------------------------------------------------- 1 | # rollup-node process configs 2 | ROLLUP_NODE_BOOTNODE=/dns4/collator-01-p2p-rollup-holesky-v3.gasp.xyz/tcp/30333/p2p/12D3KooWCcFLgTyzpSiiHp3x6dTX4wiwMUM7VBZ6JPJDWCuSAWc5 3 | ROLLUP_NODE_CUSTOM_CHAINSPEC_URL=https://raw.githubusercontent.com/gasp-xyz/chainspec/485165d5cac39607183994e9122404387dcdd49d/rollup-holesky-v3-3722076-raw.json 4 | 5 | # gasp-avs operator configs 6 | CHAIN_ID=17000 7 | AVS_DEPLOYMENT_BLOCK=3284417 8 | AVS_REGISTRY_COORDINATOR_ADDR=0xef5Ea04287c2BCd0A984563B055f39e650dF0e28 9 | AVS_RPC_URL=https://avs-aggregator-holesky-v3.gasp.xyz 10 | OPT_IN_AT_STARTUP=false 11 | 12 | ############################################################################### 13 | ####### TODO: Operators please update below values for your node ############## 14 | ############################################################################### 15 | # Use private endpoints for the Ethereum node, e.g. Tenderly nodes 16 | ETH_RPC_URL= 17 | ETH_WS_URL= 18 | 19 | # Provide formatted JSON keys with password to decrypt the keys 20 | # If you have them stored in files, you can use the following command to format them correclty: 21 | # `jq -c '.' ecdsa.key.json` and `jq -c '.' bls.key.json` 22 | # Example values: 23 | # ECDSA_KEY_JSON='{"address":"9ef4db31c5a76f9de428bc15397e3af429b7d654","crypto":{"cipher":"aes-128-ctr","ciphertext":"f472d5e83e887f9bc82cd1e48f157cb7d213be2b63bef2f58d3e19b1247d6fe8","cipherparams":{"iv":"2629ef1bd82bb145fe822bf9e53f584e"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"3e24f1f58298dbc97dc4e219977eefed8b8cb8cc155ff31e4f1d716b4ffbb94e"},"mac":"f898cd129ec387d694a8b92bb48712c8b48cf44e87381f997269f886d9ce125f"},"id":"7af17ec2-e827-5cb7-b962-3816d739c4f4","version":3}' 24 | # BLS_KEY_JSON='{"pubKey":"E([19468314961342411094361522639716895982292311048840813288977711685419023216444,17276551549456630122471837811162107580038124192493249527560638750597218680642])","crypto":{"cipher":"aes-128-ctr","ciphertext":"84fc78532b398be82955d31e934c9fe834e85f82fc34c1f3e6d81bd434434ed8","cipherparams":{"iv":"5ddc9923e3b782fbef189673284dcb31"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"ede82937ff2b29d78e523180e384b786685cba8d7c4399594242c8e810151e65"},"mac":"8994c1161e75538694a9c922cd1648e562bcf453924c3889e85f72434fb96f5e"}}' 25 | 26 | # BLS key is used to sign Operator tasks, it is recommended to use a unique BLS key per AVS 27 | BLS_KEY_JSON= 28 | BLS_KEY_PASSWORD= 29 | 30 | # ECDSA key is used to sign opt-in/opt-out calls, it is not neccessary to provide the key when running the service 31 | # it is recommended to provide the key only when opting-in/out into AVS, and use public address when runnning 32 | # ECDSA_KEY_JSON= 33 | # ECDSA_KEY_PASSWORD= 34 | 35 | # provide the public address of the operator, has to match the one used to register into Eigenlayer and AVS 36 | # ECDSA_ADDRESS=0x9A986296d45C327dAa5998519AE1B3757F1e6Ba1 37 | ECDSA_ADDRESS= 38 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | data 2 | operator_keys 3 | .env -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Installation of Finalizer Operator using docker 2 | 3 | Mainnet Gasp AVS Registry Contract: [0x9A986296d45C327dAa5998519AE1B3757F1e6Ba1](https://etherscan.io/address/0x9A986296d45C327dAa5998519AE1B3757F1e6Ba1) 4 | Testnet Gasp AVS Registry Contract: [0xb4dd45a08BFA6fBC19F7cD624cdfef87CE95e7AC](https://holesky.etherscan.io/address/0xb4dd45a08BFA6fBC19F7cD624cdfef87CE95e7AC) 5 | 6 | ### Prerequisites: 7 | * Docker installed 8 | * Eigenlayer CLI installed 9 | 10 | > NOTE: For any Docker based commands, if you have installed as root then you might have to append `sudo` in front of the command. 11 | 12 | ### System Requirements: 13 | * 2 vCPU Cores 14 | * 12 GB RAM 15 | * 200 GB SSD 16 | 17 | ### Core operations 18 | * Allowing the embedded Gasp rollup-node to sync 19 | * Register your operator to eigenlayer using [Eigenlayer CLI](https://github.com/Layr-Labs/eigenlayer-cli) 20 | * Deposit your stake at [Eigenlayer App](https://holesky.eigenlayer.xyz/), see [Eigenlayer stake guide](https://docs.eigenlayer.xyz/restaking-guides/restaking-user-guide) for more info\ 21 | AVS supports [ankrETH, mETH, stETH, ETHx, osETH, sfrxETH, rETH, WETH] tokens provided by EigenLayer, with minimum of `10 ETH` total stake for operator registration 22 | Max operators count is currently limited to 50, first come first served. 23 | Operators are required to run their nodes with provided docker image. If a registered operator does not provide responses, an automatic check will eventually eject them from the AVS operators active list. 24 | Operator stakes are updated regularly, if the stake drops below minimum required stake, operator will be ejected. 25 | 26 | ### Setup Operator 27 | The easiest way to set up is to clone the repo and follow the instructions below. 28 | 29 | #### Join Eigenlayer 30 | Deposit stake into eigenlayer using the [Eigenlayer App](https://holesky.eigenlayer.xyz/) and register on eigenlayer using the [Eigenlayer Cli](https://github.com/Layr-Labs/eigenlayer-cli) 31 | 32 | Please save the keys generated/used in this step - they will be required 33 | 34 | #### Clone our setup repo 35 | Clone this repo and execute the following commands: 36 | ```bash 37 | git clone https://github.com/gasp-xyz/avs-operator-setup.git 38 | cd avs-operator-setup 39 | ``` 40 | 41 | #### Prepare the the `.env` file 42 | 43 | Copy the `.env.mainnet` or `.env.testnet` file to `.env` file depending on the network where you plan to run `gasp-avs` operator. 44 | Update the `TODO` section in the `.env` file given in the root directory of the repository with your own details 45 | 46 | 47 | ECDSA_KEY_JSON ( content of the json `jq -c '.' /path/to/ecdsa.key.json` ) 48 | 49 | BLS_KEY_JSON ( content of the json `jq -c '.' /path/to/bls.key.json` ) 50 | 51 | BLS_KEY_PASSWORD 52 | 53 | ECDSA_KEY_PASSWORD 54 | 55 | Path for keys can be obtained by `eigenlayer operator keys list` 56 | 57 | 58 | #### Run operator to sync the Gasp node 59 | 60 | We need the target Gasp node synced to the Gasp blockchain network before the operator can function. To do this simply run the operator and it will wait for the Gasp node to sync before proceeding. 61 | 62 | ```bash 63 | docker compose up -d 64 | ``` 65 | Once the sync has completed, the operator will check the regsitration of the operator with the avs. Avs registration (opt-in) is different from the Eigenlayer registration. Since we haven't performed the avs registration yet, the operator will request you to complete avs registration first before proceeding (you can check the operator logs with `docker compose logs -f`). 66 | 67 | Now stop the operator with: 68 | 69 | ```bash 70 | docker compose down 71 | ``` 72 | 73 | It is recomended that the sync completes before you register with the avs - since you may get kicked for inactivity while the node is syncing 74 | 75 | #### Register with the AVS 76 | 77 | > NOTE: Operator registration may be temporarily paused by the Gasp team. If you receive an error message saying "Pausable: index is paused", please wait for an announcement when registration is reopened. 78 | 79 | ```bash 80 | # To register with the avs run the opt-in command 81 | docker compose run --rm gasp-avs /app/gasp-avs opt-in-avs 82 | ``` 83 | 84 | #### Run Operator 85 | 86 | Once the opt-in succeeds and the operator is registered, ( for security reasons ) the operator can remove `ECDSA_KEY_JSON` , `ECDSA_KEY_PASSWORD`, and set `ECDSA_ADDRESS` in the `.env` file. So that ecdsa keys are not exposed. 87 | 88 | ```bash 89 | # Start the operator 90 | docker compose up -d 91 | # Check the logs 92 | docker compose logs -f 93 | # Check `gasp-avs` status 94 | docker compose exec gasp-avs /app/gasp-avs print-status 95 | ``` 96 | 97 | ### Stop Operator 98 | 99 | ```bash 100 | docker compose down 101 | # You may also need to remove the `rollup-node` stored data 102 | # You can do this by running the following command: 103 | # docker compose down -v 104 | ``` 105 | ### Opt-out into AVS 106 | 107 | ```bash 108 | docker compose exec gasp-avs /app/gasp-avs opt-out 109 | ``` 110 | 111 | ### Upgrade your node 112 | Upgrade the AVS software for your `gasp-avs` operator service setup by following the steps below: 113 | 114 | ```bash 115 | cd avs-operator-setup 116 | git pull 117 | docker compose up -d 118 | ``` 119 | -------------------------------------------------------------------------------- /compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | gasp-avs: 3 | image: gaspxyz/gasp-avs:16323b6a2f7f01eb41ed8428a74758c8fd1c635e 4 | restart: unless-stopped 5 | env_file: .env 6 | volumes: 7 | - gasp-avs-data:/data 8 | environment: 9 | # Use RUST_LOG to control logging levels 10 | RUST_LOG: ${RUST_LOG:-info,substrate=warn} 11 | 12 | volumes: 13 | gasp-avs-data: -------------------------------------------------------------------------------- /config/gasp-labs-1.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gasp.labs #1", 3 | "website": "https://www.gasp.xyz/", 4 | "description": "Gasp Labs operator no.1", 5 | "logo": "https://raw.githubusercontent.com/gasp-xyz/avs-operator-setup/main/config/logo.png", 6 | "twitter": "https://twitter.com/gasp_xyz" 7 | } 8 | -------------------------------------------------------------------------------- /config/gasp-labs-2.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gasp.labs #2", 3 | "website": "https://www.gasp.xyz/", 4 | "description": "Gasp Labs operator no.2", 5 | "logo": "https://raw.githubusercontent.com/gasp-xyz/avs-operator-setup/main/config/logo.png", 6 | "twitter": "https://twitter.com/gasp_xyz" 7 | } 8 | -------------------------------------------------------------------------------- /config/gasp-labs-avs.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Gasp Finalizer", 3 | "website": "https://www.gasp.xyz/", 4 | "description": "Gasp is a cross-chain DEX and protocol designed for exchanging crypto assets between blockchains, such as Ethereum L2s and rollups, Solana, Bitcoin, RWA protocols, web3 gaming ecosystems, and much more. Gasp AVS ensures transaction finality through Ethereum’s crypto-economic security, providing a unified security framework that enhances the reliability and trustworthiness of cross-chain transactions.", 5 | "logo": "https://raw.githubusercontent.com/gasp-xyz/avs-operator-setup/main/config/logo.png", 6 | "twitter": "https://twitter.com/gasp_xyz" 7 | } 8 | -------------------------------------------------------------------------------- /config/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gasp-xyz/avs-operator-setup/8063481ba350acb4d4808a12ded13a3ab84eda06/config/logo.png --------------------------------------------------------------------------------