UNPKG

@maticnetwork/matic-cli

Version:

Testing toolkit to setup, manage and operate Polygon networks

418 lines (285 loc) • 14.6 kB
# Testing Toolkit šŸ— A set of CLIs, tools and tests to set up, manage and operate Polygon devnets. The **Testing Toolkit** is built on top of `express-cli`, an extension of `matic-cli` which uses `terraform` to deploy, test and monitor any devnet on AWS stacks from any local system. It currently supports **only** devnets running `v0.3.x` stacks. The `express-cli` interacts with `terraform` to create a fully working setup on AWS. This setup is composed by a set of `EC2 VM` instances running a specific `ubuntu 22.04 ami`, mounted with `gp3 disks` , and a `public-subnet` with its `VPC`. In case the infrastructure already exists, `matic-cli` can be used as a standalone tool to deploy Polygon stacks on pre-configured VMs. Please, refer to the section of this file you are more interested in (`express-cli` or `matic-cli`) ## `express-cli` ### Requirements To use the `express-cli` you have to execute the following steps. - [install aws cli](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) - [install terraform](https://learn.hashicorp.com/tutorials/terraform/install-cli) on your local machine - use [nvm](https://github.com/nvm-sh/nvm#installing-and-updating) to switch to the proper `node` version, `v16.17.1`, by running `nvm use` from the root folder - install `express-cli` and `matic-cli` locally with command `npm i` - generate a keypair on AWS EC2 and download its certificate locally (`.pem` file) - copy `secret.tfvars.example` to `secret.tfvar` with command `cp secret.tfvars.example secret.tfvars` and check the commented file for details - **If you are a Polygon employee**, connect to the company VPN - modify `secret.tfvar` with addresses of the allowed IPs (as specified in `secret.tfvars.example` file) - copy `.env.example` to `.env` with command `cp .env.example .env` and check the heavily commented file for details - make sure `PEM_FILE_PATH` points to a correct AWS key certificate, the one you downloaded in the previous steps - define the number of nodes (`TF_VAR_VALIDATOR_COUNT` and `TF_VAR_SENTRY_COUNT`) and adjust the `DEVNET_BOR_USERS` accordingly - use `TF_VAR_DOCKERZIED=no` to have one VM per node, otherwise the stack will run on one VM only in a dockerized environment - (optional) replace `TF_VAR_VM_NAME` with your own identifier (it can be any string, default is "polygon-user") - (optional) replace `TF_VAR_DISK_SIZE_GB` with your preferred disk size in GB (default is 100 GB) - `VERBOSE=true` prints logs from the remote machines. If set to `false`, only `express-cli` and `matic-cli` logs will be shown - **If you are a Polygon employee**, please refer to [this page](https://www.notion.so/polygontechnology/Testing-Toolkit-d47e098641d14c80b2e9a90b3b1b88d9) for more info ### Auth Configuration As a prerequisite, you need to configure authentication on `aws` This will create the folder `~/.aws` in your system To do so, please run ```bash aws configure sso ``` This command will interactively ask for some configs **If you are a Polygon employee**, please use the following - SSO session name: leave empty - SSO start URL: https://polygon-technology.awsapps.com/start#/ - SSO region: us-east-1 The browser will open and authorize your request. Please allow it. In case there are multiple accounts available to you, please select > posv1-devnet Then, the command will ask for other configs, please use - CLI default client Region: us-west-2 - CLI default output format: json - CLI profile name: default Note that it's **mandatory** to use `CLI profile name: default`, as used by `terraform` in `express-cli` (for more context see [this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs)) Here an output example ```bash SSO session name (Recommended): WARNING: Configuring using legacy format (e.g. without an SSO session). Consider re-running "configure sso" command and providing a session name. SSO start URL [None]: https://polygon-technology.awsapps.com/start#/ SSO region [None]: us-east-1 Attempting to automatically open the SSO authorization page in your default browser. If the browser does not open or you wish to use a different device to authorize this request, open the following URL: https://device.sso.us-east-1.amazonaws.com/ Then enter the code: <CODE-HERE> There are 2 AWS accounts available to you. Using the account ID <ACCOUNT_ID> The only role available to you is: <AWSRole> (<AWS_ROLE_ID>) Using the role name "<AWS_ROLE>" CLI default client Region [None]: us-west-2 CLI default output format [None]: json CLI profile name [<PROFILE_NAME_AND_ID>]: default To use this profile, specify the profile name using --profile, as shown: aws s3 ls --profile default ``` Now you can log into aws by running the following command. It needs to be executed every time the token expires. ```bash aws sso login ``` Congrats! You're all set to use `express-cli` commands. ### Commands Instructions to run `express-cli`. For the list of commands, please run `express-cli --help` First off, you need to `--init` terraform on your local machine, by executing the following command. - `./bin/express-cli --init` - Initializes a new devnet folder with terraform and creates some git-ignored files locally. This step is mandatory before running any other command. The new devnet folder created will be `devnet-<id>` where `id` is a monotonically increasing count for the devnets. Once created, you can `cd deployments/devnet-<id>` and run the other commands. This allows you to work with multiple devnets at once. Then, a remote devnet can be created with the `--start` command, as follows. - `../../bin/express-cli --start` - Creates the desired remote setup, based on the preferences defined in the `.env.devnet<id>` file - `--start` command can be used also to target an existing AWS setup. If changes to `.env.devnet<id>` file are detected, the previous devnet will be destroyed and a new one created, reusing the same AWS VMs To destroy the remote devnet, you can execute the `--destroy` command. - `../../bin/express-cli --destroy` - Destroys the remote setup and delete the dedicated VMs The `express-cli` also comes with additional utility commands, listed below. Some of them are only available for non-dockerized devnets. - `../../bin/express-cli --update-all [index]` - Fetches `heimdall` and `bor` branches defined as `HEIMDALL_BRANCH` and `BOR_BRANCH` in `.env.devnet<id>` file, pulls relative changes and restarts those services on the remote machines. If an integer `index` is used, the job will be performed only on the VM corresponding to that index. - `../../bin/express-cli --update-bor [index]` - Fetches `bor` branch defined as `BOR_BRANCH` in `.env.devnet<id>` file, pulls relative changes and restarts it on the remote machines. If an integer `index` is used, the job will be performed only on the VM corresponding to that index. - `../../bin/express-cli --update-heimdall [index]` - Fetches `heimdall` branch defined as `HEIMDALL_BRANCH` in `.env.devnet<id>` file, pulls relative changes and restarts it on the remote machines. If an integer `index` is used, the job will be performed only on the VM corresponding to that index. - `../../bin/express-cli --restart-all [index]` - Restarts `bor` and `heimdall` on all the remote machines. If an integer `index` is used, the job will be performed only on the VM corresponding to that index. - `../../bin/express-cli --restart-bor [index]` - Restarts `bor` on all the remote machines. If an integer `index` is used, the job will be performed only on the VM corresponding to that index. - `../../bin/express-cli --restart-heimdall [index]` - Restarts `heimdall` on all the remote machines. If an integer `index` is used, the job will be performed only on the VM corresponding to that index. - `../../bin/express-cli --cleanup` - Cleans up `ganache`, `bor`, `heimdall` and `bridge`, redeploys all the contracts and restarts all the services The `express-cli` also provides additional testing commands, listed here. - `../../bin/express-cli --send-state-sync` - Create a `state-sync` transaction on the remote network - ` ../../bin/express-cli --monitor [exit]` - Monitors the reception of state-syncs and checkpoints to make sure the whole network is in a healthy state. If `--send-state-sync` hasn't been used before, only checkpoints will be detected. Monitor the setup. If `exit` string is passed the process terminates when at least one `stateSync` and one `checkpoint` are detected. - ` ../../bin/express-cli --instances-stop` - Stop the AWS EC2 VM instances associated with the deployed devnet. - ` ../../bin/express-cli --instances-start` - Start the (previously stopped) AWS EC2 VM instances associated with the deployed devnet. Also, it starts all services, such as ganache, heimdall, and bor - `../../bin/express-cli --stress [fund]` - Runs the stress tests on remote nodes. The string `fund` is needed when stress tests are ran for the first time, to fund the accounts - `../../bin/express-cli --setup-datadog` - Sets up datadog on the nodes and gets them ready to send metrics to Datadog Dashboard. `DD_API_KEY` env var is required for this. - `../../bin/express-cli --chaos [intensity]` - Adds dedicated chaos(de-peering) to the network. The `intensity` parameter is optional and can be set from `1` to `10`. If not set, `5` is used. - `../../bin/express-cli --rewind [numberOfBlocks]` - Rewinds the chain by a defined number of blocks (not greater than `128`). Default `numberOfBlocks` value is `100`. - `../../bin/express-cli --eip-1559-test [index]` - Executes a test to send EIP 1559 tx. In case of a non-dockerized devnet, if an integer [index] is specified, it will use that VM to send the tx. Otherwise, it will target the first VM. ## `matic-cli` `matic-cli` has to be installed on a `ubuntu` VM (_host_) and - through a config file - it will point to other VMs' IPs (_remotes_). - Host machine will run a Polygon node (`bor` and `heimdall`) and a layer 1 node (`ganache`) - Remote machines will only run a Polygon node each ### Requirements Please, make sure to install the following software/packages on the VMs. - Build Essentials (_host_ and _remotes_) ```bash sudo apt update sudo apt install build-essential ``` - Go 1.18+ (_host_ and _remotes_) ```bash wget https://raw.githubusercontent.com/maticnetwork/node-ansible/master/go-install.sh bash go-install.sh --remove bash go-install.sh ``` - Rabbitmq (_host_ and _remotes_) ```bash sudo apt install rabbitmq-server ``` - Docker (_host_ and _remotes_, only needed in case of a docker setup) - https://docs.docker.com/engine/install/ubuntu/ - https://docs.docker.com/engine/install/linux-postinstall/) - Node v16.17.1 (only _host_) ```bash curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash nvm install 16.17.1 ``` - Npm (only _host_) ```bash sudo apt update sudo apt install nodejs npm ``` - Python 2 (only _host_) ```bash sudo apt install python2 && alias python="/usr/bin/python2 ``` - Solc v0.5.16 (only _host_) ```bash sudo snap install solc ``` - Ganache CLI (only _host_) ```bash sudo npm install -g ganache ``` ### Usage On the _host_ machine, please run ```bash cd ~ git clone https://github.com/maticnetwork/matic-cli.git cd matic-cli npm i mkdir devnet cd devnet ``` #### Local dockerized network Adjust the [docker configs](configs/devnet/docker-setup-config.yaml) and run ```bash ../bin/matic-cli setup devnet -c ../configs/devnet/docker-setup-config.yaml ``` Once the setup is done, follow these steps for local docker deployment - Move to devnet folder ```bash cd matic-cli/devnet ``` - Start ganache ```bash bash docker-ganache-start.sh ``` - Start `heimdall` instances (it will run all services - rabbitmq, heimdall, bridge, server) ```bash bash docker-heimdall-start-all.sh ``` - Setup `bor` ```bash bash docker-bor-setup.sh ``` - Start bor ```bash bash docker-bor-start-all.sh ``` - Deploy contracts on Child chain ```bash bash ganache-deployment-bor.sh ``` - Sync contract addresses to Main chain ```bash bash ganache-deployment-sync.sh ``` Logs will be stored under `logs/` folder Note: in case of docker setup, we have provided [some additional scripts](src/setup/devnet/templates/docker/README.md) which might be helpful. #### Remote network Adjust the [remote configs](configs/devnet/remote-setup-config.yaml) and run ```bash ../bin/matic-cli setup devnet -c ../configs/devnet/remote-setup-config.yaml ``` Alternatively, this step can be executed interactively with ```bash ../bin/matic-cli setup devnet -i ``` Once the setup is done, follow these steps for remote deployment In this case, the stack is already running, you would just need to deploy/sync some contracts, as follows: - Move to devnet folder ```bash cd matic-cli/devnet ``` - Deploy contracts on Child chain ```bash bash ganache-deployment-bor.sh ``` - Sync contract addresses to Main chain ```bash bash ganache-deployment-sync.sh ``` #### Clean setup Stop al services, remove the `matic-cli/devnet` folder, and you can start the process once again #### Notes 1. The ganache URL hostname will be used for ganache `http://<host-machine-ip>:9545` 2. Make sure that the _host_ machine has access to remote machines for transferring the data To persist ssh key for remote access, please run: ```bash eval "$(ssh-agent -s)" ssh-add `<.pem file>` ``` 3. We have provided the default config values [here](configs/devnet) to ensure smooth functioning of the process Please check the relative [README](configs/README.md) for more accurate description of such configs These files are used as templates and dynamically modified by `express-cli`, hence they should not be deleted nor any modification remotely pushed Therefore, they are under `.gitignore`, and in case you do not want those changes to be reflected in your local `git`, you can use the commands ```bash git update-index --assume-unchanged configs/devnet/remote-setup-config.yaml git update-index --assume-unchanged configs/devnet/docker-setup-config.yaml ``` to undo, please use ```bash git update-index --no-assume-unchanged configs/devnet/remote-setup-config.yaml git update-index --no-assume-unchanged configs/devnet/docker-setup-config.yaml ``` ## License MIT