# Deploy Andromeda
## Operator
### Environment Setup
- Clone project từ branch cần chạy:
- `git clone -b L2AMM-73-Operator-synchronization_test git@github.com:KyberNetwork/Andromeda-AMM-Operator.git`
- Libs install:
- `sudo apt install build-essential libssl-dev pkg-config libpq-dev`
- Install docker:
```
sudo apt-get update &&
sudo apt-get remove docker docker-engine docker.io &&
sudo apt install docker.io &&
sudo systemctl start docker &&
sudo systemctl enable docker &&
docker --version
```
- Install docker-compose:
```
sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose &&
sudo chmod +x /usr/local/bin/docker-compose &&
docker-compose --version
```
- Set permission for docker:
```
sudo gpasswd -a $USER docker &&
newgrp docker
```
- Set permission for Postgres log folder:
`chmod -R 777 volumes/postgres/log/`
- Install Rust & Diesel:
```
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh &&
source $HOME/.cargo/env &&
cargo install diesel_cli --no-default-features --features postgres
```
- Thay đổi các evironment variable trong dev.env file [here](https://gist.github.com/devnmhoang/3fd9c53de5b71d394fc81c4acddafc40) cho phù hợp và chép đè vào env/dev.env của project.
### Các evironment variable trong dev.env cần phải thay cho từng operator
```
- PROVER_SERVER_URL: luôn là <IP_OPERATOR_1:8088> của Prover data chạy trên Operator 1 (Ex: http://10.148.0.140:8088)
- OPERATOR_EDDSA_PRIVATE_KEY: EDDSA private key của operator
- OPERATOR_EDDSA_PUB_KEY: EDDSA pub key của operator
- CONTRACT_ADDR: Smart contract address dùng chung toàn hệ thống. Phải có 0x phía trước
- OPERATOR_PRIVATE_KEY: ETH private key dùng để sign và gửi tx lên L1
- OPERATOR_COMMIT_ETH_ADDRESS: ETH address
- ETH_IS_ENABLED: Cho phép gửi Tx lên L1
- SIMULATE_SEND_RECEIVE_ETHEREUM: Giá lập Tx luôn được gửi thành công
- MAX_BLOCKS_IN_BATCH: Số block trong 1 batch
- MAX_OPERATIONS_IN_BLOCK: Số operation trong 1 block
- MAX_TXS_IN_BLOCK: Số tx trong 1 block
- BLOCK_TIME_MS: Thời gian tạo 1 block mới
- PROVER_BLOCK_QUEUE_WAIT_TIMEOUT: Thời gian chờ 1 proof hoàn thành
```
Thông tin về key tương ứng cho từng operator được lưu ở file này [Keys](https://gist.github.com/devnmhoang/e9563cdd273e57010c0b519e13c2b481)
- `OPERATOR_EDDSA_PRIVATE_KEY` là `EDDSA private key`. Lưu ý không có `0x` phía trước
- `OPERATOR_EDDSA_PUB_KEY` là `EDDSA public key`. Lưu ý không có `0x` phía trước
- `OPERATOR_PRIVATE_KEY` là `ETH private key`. Lưu ý không có `0x` phía trước
- `OPERATOR_COMMIT_ETH_ADDRESS` là `ETH address`. Phải có 0x phía trước
#### Chú ý
- Đối với operator 1 thi
`ETH_IS_ENABLED`=true
`SIMULATE_SEND_RECEIVE_ETHEREUM`=false
- Đối với các operator khác thì
`ETH_IS_ENABLED`=false
`SIMULATE_SEND_RECEIVE_ETHEREUM`=true
- Hiện tại `OPERATOR_URL_WHITELIST` sẽ chứa các url của các operator được cho phép tham gia vào quá trình consensus. Cần thêm vào sau khi biết IP của các operator. Lưu ý là thứ tự URL phải theo thứ tự từ operator 1 đến 21 để tương ứng với `OPERATOR_PUBKEY_WHITELIST`
- Ex: `OPERATOR_URL_WHITELIST=http://0.0.0.0:3001,http://0.0.0.0:3002,http://0.0.0.0:3003,http://0.0.0.0:3004`
### Để chạy 1 stress operator (Hiện tại chỉ dành cho Operator 1)
- Chạy postgres docker:
- `make db-init`
- Chờ tầm 20s để docker khởi động và chạy tiếp lệnh sau
- Tạo DB và chạy migration:
- `make db-setup`
- Bắt đầu chạy operator bằng lệnh:
- `make run-stress-test DB=... STRESS_TEST_SCENARIO=... NUMBER_USERS=... TXS_PER_BLOCK=... BLOCKS_PER_BATCH=... BLOCK_TIME=... FUNDING_ACC=... L2_SC_ADDR=...`
- `DB`: loại DB sử dụng (postgres/memdb)
- `STRESS_TEST_SCENARIO`: kịch bản test (add_swap hoặc add_swap_remove)
- `NUMBER_USERS`: số lượng user được tạo ra để test
- `TXS_PER_BLOCK`: số lượng tx trong 1 block
- `BLOCKS_PER_BATCH`: số lượng block trong 1 batch
- `BLOCK_TIME`: thời gian tạo 1 block (đơn vị miliseconds)
- `GAS_LIMIT`: Gas limit cho 1 block
- `FUNDING_ACC`: Private key của Account để gửi token cho user được tạo ra
- `L2_SC_ADDR`: Address của SC đã deploy
- Ex: `make run-stress-test DB=postgres STRESS_TEST_SCENARIO=add_swap NUMBER_USERS=5 TXS_PER_BLOCK=8 BLOCKS_PER_BATCH=4 BLOCK_TIME=2000 FUNDING_ACC=992578b0a7be3d48c9bade5a083066c5a118c11aa7807d2dffe48d5c414d3414 L2_SC_ADDR=0x4D82D2D3570FEE4F6D23a17C73856810F5b3EA39`
- Log sẽ được lưu ờ: `tmp/logs/node.log`
- Setup LogRotate cho log ở `tmp/logs/node.log`
### Để chạy 1 normal operator
- Chạy postgres docker:
- `make db-init`
- Chờ tầm 20s để docker khởi động và chạy tiếp lệnh sau
- Tạo DB và chạy migration:
- `make db-setup`
- Bắt đầu chạy operator:
- `make run DB=postgres`
- Log sẽ được lưu ờ: `tmp/logs/node.log`
- Setup LogRotate cho log ở `tmp/logs/node.log`
## Prover
### Environment Setup:
- Install Rust:
```
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh &&
source $HOME/.cargo/env
```
- Clone project từ branch:
- `git clone -b L2AMM-73-Operator-synchronization_test git@github.com:KyberNetwork/Andromeda-AMM-Operator.git`
- Tạo `setup` folder & Download setup files:
```
mkdir setup && cd setup &&
curl https://universal-setup.ams3.digitaloceanspaces.com/setup_2%5E20.key > setup_2^20.key &&
curl https://universal-setup.ams3.digitaloceanspaces.com/setup_2%5E21.key > setup_2^21.key &&
curl https://universal-setup.ams3.digitaloceanspaces.com/setup_2%5E22.key > setup_2^22.key &&
curl https://universal-setup.ams3.digitaloceanspaces.com/setup_2%5E23.key > setup_2^23.key &&
curl https://universal-setup.ams3.digitaloceanspaces.com/setup_2%5E24.key > setup_2^24.key &&
curl https://universal-setup.ams3.digitaloceanspaces.com/setup_2%5E25.key > setup_2^25.key &&
curl https://universal-setup.ams3.digitaloceanspaces.com/setup_2%5E26.key > setup_2^26.key
```
- Prover chỉ quan tâm các evironment variable ở dưới nên các variable khác không ảnh hưởng
- `PROVER_SERVER_URL`: luôn là <IP_OPERATOR_1:8088> của Prover data chạy trên Operator 1 (Ex: http://10.148.0.140:8088)
- `REQ_SERVER_TIMEOUT`: Timeout cho 1 request
- `MAX_BLOCKS_IN_BATCH`: Số block trong 1 batch
- `MAX_OPERATIONS_IN_BLOCK`: Số operation trong 1 block
- `MAX_TXS_IN_BLOCK`: Số tx trong 1 block
### Chạy Prover
- Chạy prover bằng lệnh `nohup bin/prover.sh "prover_1" &> prover_server.log` (Thay "prover_1" thành 2,3 cho các prover khác)
- Setup LogRotate cho log ở `prover_server.log`
- Khi chạy thành công thì prover sẽ bắn 1 request đến Prover data chạy cùng với Operator 1 qua port 8088 để register. Sau đó sẽ bắt đầu nhận job để tính toán.