From 25714c6a17674caea19078478354a3816419b942 Mon Sep 17 00:00:00 2001 From: raulk Date: Tue, 24 Oct 2023 18:33:28 +0100 Subject: [PATCH 01/31] improve localnet.md --- docs/localnet.md | 64 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 20 deletions(-) diff --git a/docs/localnet.md b/docs/localnet.md index c001623d..9c77d2d3 100644 --- a/docs/localnet.md +++ b/docs/localnet.md @@ -1,16 +1,33 @@ # Local Testnets -Prerequisites: +Setting up a Fendermint local testnet is a way to get started quickly with IPC. + +This guide offers two flavours: + +- A single node deployment: useful for developing smart contracts and testing the APIs. +- A 4 node testnet: useful for testing consensus, checkpointing, and more. + +## Prerequisites + +On Linux (links and instructions for Ubuntu): + +- Install developer tools: `sudo apt install build-essential`. +- Install Rust. See [instructions](https://www.rust-lang.org/tools/install). +- Install cargo-make: `cargo install --force cargo-make`. +- Install Docker. See [instructions](https://docs.docker.com/engine/install/ubuntu/). + +## Build Fendermint + ```bash -make build docker-build +make actors-bundle build docker-build ``` ## Single node deployment -To run IPC in the local rootnet just perform the following : +To run IPC in the local rootnet just perform the following: + ```bash cargo make --makefile ./infra/Makefile.toml testnode - ``` It will create three docker containers (cometbft, fendermint, and eth-api). @@ -21,13 +38,15 @@ cargo make --makefile ./infra/Makefile.toml testnode-down ``` ## Local 4-nodes deployment -To run IPC in the local rootnet with 4 nodes perform the following command : + +To run IPC in the local rootnet with 4 nodes perform the following command: + ```bash cargo make --makefile ./infra/Makefile.toml testnet - ``` To stop the network: + ```bash cargo make --makefile ./infra/Makefile.toml testnet-down ``` @@ -35,27 +54,32 @@ cargo make --makefile ./infra/Makefile.toml testnet-down The testnet contains four logical nodes. Each node consists of cometbft, fendermint, and ethapi containers. The Docker internal network is `192.167.10.0/24`. -ETH-API is accessible on the following interfaces on the Docker internal network: +The Ethereum API is accessible on the following endpoints on the Docker internal network: + - `192.167.10.10:8545` or `ethapi-node0:8545` - `192.167.10.11:8545` or `ethapi-node1:8545` - `192.167.10.12:8545` or `ethapi-node2:8545` - `192.167.10.13:8545` or `ethapi-node3:8545` -and on the following interfaces from the host machine: +And on the following endpoints from the host machine: + - `127.0.0.1:8545` - `127.0.0.1:8546` - `127.0.0.1:8547` - `127.0.0.1:8548` -## Deployment process - -The deployment process is as follows: -- Remove all docker containers, files, networks, etc. from the previous deployment -- Create all necessary directories -- Initialize CometBFT testnet by creating `config` and `data` directories using `cometbft` tools -- Read cometbft nodes private keys,derive node IDs and store in `config.toml` for each node -- Create the `genesis` file for Fendermint -- Share the genesis among all Fendermint nodes -- Run Fendermint application in 4 containers -- Run CometBFT in 4 containers -- Run Eth API in 4 containers \ No newline at end of file +## What's happening behind the scenes + +> For a 4-node deployment. + +The deployment process performs the following steps: + +- Remove all Docker containers, files, networks, etc. from any previous deployments. +- Create all necessary directories. +- Initialize CometBFT testnet by creating `config` and `data` directories using `cometbft` tools. +- Read CometBFT nodes private keys, derive node IDs and store them in `config.toml` for each node. +- Create the `genesis` file for Fendermint. +- Share the genesis among all Fendermint nodes. +- Run Fendermint application in 4 containers. +- Run CometBFT in 4 containers. +- Run Eth API in 4 containers. From 7fd2c4332e13996e5a97d67522ced60074abb4c6 Mon Sep 17 00:00:00 2001 From: raulk Date: Tue, 24 Oct 2023 18:38:53 +0100 Subject: [PATCH 02/31] add Foundry as a prerequisite. We really shouldn't be needing this... --- docs/localnet.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/localnet.md b/docs/localnet.md index 9c77d2d3..218d49ac 100644 --- a/docs/localnet.md +++ b/docs/localnet.md @@ -15,6 +15,7 @@ On Linux (links and instructions for Ubuntu): - Install Rust. See [instructions](https://www.rust-lang.org/tools/install). - Install cargo-make: `cargo install --force cargo-make`. - Install Docker. See [instructions](https://docs.docker.com/engine/install/ubuntu/). +- Install Foundry. See [instructions](https://book.getfoundry.sh/getting-started/installation). ## Build Fendermint From 38c53615e46aab49e8a4019295a0b9ee4d56a21c Mon Sep 17 00:00:00 2001 From: raulk Date: Tue, 24 Oct 2023 20:26:04 +0100 Subject: [PATCH 03/31] add `pkg-config` dependency --- docs/localnet.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/localnet.md b/docs/localnet.md index 218d49ac..79c229ae 100644 --- a/docs/localnet.md +++ b/docs/localnet.md @@ -11,7 +11,7 @@ This guide offers two flavours: On Linux (links and instructions for Ubuntu): -- Install developer tools: `sudo apt install build-essential`. +- Install developer tools: `sudo apt install build-essential pkg-config`. - Install Rust. See [instructions](https://www.rust-lang.org/tools/install). - Install cargo-make: `cargo install --force cargo-make`. - Install Docker. See [instructions](https://docs.docker.com/engine/install/ubuntu/). From aae11794eebe449a1ca782319d00b08462c5a3b6 Mon Sep 17 00:00:00 2001 From: raulk Date: Tue, 24 Oct 2023 20:34:07 +0100 Subject: [PATCH 04/31] `libssl-dev` package --- docs/localnet.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/localnet.md b/docs/localnet.md index 79c229ae..41b0520f 100644 --- a/docs/localnet.md +++ b/docs/localnet.md @@ -11,7 +11,7 @@ This guide offers two flavours: On Linux (links and instructions for Ubuntu): -- Install developer tools: `sudo apt install build-essential pkg-config`. +- Install system packages: `sudo apt install build-essential pkg-config libssl-dev`. - Install Rust. See [instructions](https://www.rust-lang.org/tools/install). - Install cargo-make: `cargo install --force cargo-make`. - Install Docker. See [instructions](https://docs.docker.com/engine/install/ubuntu/). From a10dd444cf67312bea6fcd00e114174b4fdb6b15 Mon Sep 17 00:00:00 2001 From: raulk Date: Tue, 24 Oct 2023 21:59:29 +0100 Subject: [PATCH 05/31] add more system packages. --- docs/localnet.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/localnet.md b/docs/localnet.md index 41b0520f..d6f6b580 100644 --- a/docs/localnet.md +++ b/docs/localnet.md @@ -11,7 +11,7 @@ This guide offers two flavours: On Linux (links and instructions for Ubuntu): -- Install system packages: `sudo apt install build-essential pkg-config libssl-dev`. +- Install system packages: `sudo apt install build-essential clang cmake pkg-config libssl-dev protobuf-compiler`. - Install Rust. See [instructions](https://www.rust-lang.org/tools/install). - Install cargo-make: `cargo install --force cargo-make`. - Install Docker. See [instructions](https://docs.docker.com/engine/install/ubuntu/). From a632095edcd2970da98ccf7c07409aa9020a0ac1 Mon Sep 17 00:00:00 2001 From: raulk Date: Wed, 25 Oct 2023 00:17:09 +0100 Subject: [PATCH 06/31] localnet scripts: use Docker image to prepare genesis. Currently, these scripts build a Docker image. Simultaneously, they also expect a local Fendermint binary. It is strictly used to craft the genesis block. This is suboptimal because it requires duplicate compilation work, thus slowing down the user who just wants to get started quickly. The cargo graphs involved here are also quite heavy (1200+ packages), and some dependencies like rocksdb can take over 20min to compile. This PR adapts the testnode target/tasks to use the Fendermint binary inside the Docker image. In the future, the Docker image can be downloaded to make getting from zero to hero even breezier. TODO: adapt the testnet targets. This will require a bit more work since they use loops within scripts. --- infra/Makefile.toml | 6 ++-- infra/scripts/testnode.toml | 56 +++++++++++++++---------------------- 2 files changed, 26 insertions(+), 36 deletions(-) diff --git a/infra/Makefile.toml b/infra/Makefile.toml index 12dfb667..e9ac4207 100644 --- a/infra/Makefile.toml +++ b/infra/Makefile.toml @@ -21,10 +21,10 @@ FM_DIR="${BASE_DIR}/fendermint" CMT_DIR="${BASE_DIR}/cometbft" GENESIS_FILE="${FM_DIR}/genesis.json" -KEYS_DIR="${FM_DIR}/keys" +KEYS_RELDIR="keys" KEY_NAME="validator_key" -PUB_KEY_PATH="${KEYS_DIR}/${KEY_NAME}.pk" -PRIV_KEY_PATH="${KEYS_DIR}/${KEY_NAME}.sk" +PUB_KEY_PATH="${KEYS_RELDIR}/${KEY_NAME}.pk" +PRIV_KEY_PATH="${KEYS_RELDIR}/${KEY_NAME}.sk" NETWORK_NAME = "${CHAIN_NAME}" diff --git a/infra/scripts/testnode.toml b/infra/scripts/testnode.toml index cf87846c..9c3e0126 100644 --- a/infra/scripts/testnode.toml +++ b/infra/scripts/testnode.toml @@ -13,7 +13,7 @@ dependencies = [ "fendermint-start", "cometbft-start", "cometbft-wait", - "ethapi-start" + "ethapi-start", ] [tasks.testnode-network-create] @@ -63,52 +63,42 @@ dependencies = [ "testnode-script-new-account", "testnode-script-add-validator", "testnode-script-new-gateway", + "testnode-script-write-genesis", "testnode-script-export-keys" ] [tasks.testnode-script-new-genesis] -cwd = "./target/release" -script = """ -./fendermint genesis --genesis-file ${GENESIS_FILE} new --chain-name ${CHAIN_NAME} --base-fee ${BASE_FEE} --timestamp ${TIMESTAMP} --power-scale 3 -""" +extend = "fendermint-run" +env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json new --chain-name ${CHAIN_NAME} --base-fee ${BASE_FEE} --timestamp ${TIMESTAMP} --power-scale 3" } [tasks.testnode-script-new-key] -cwd = "./target/release" -script=""" -mkdir -p $KEYS_DIR - -./fendermint key gen --out-dir $KEYS_DIR --name $KEY_NAME; -chmod 600 ${PRIV_KEY_PATH} -""" +extend = "fendermint-run" +env = { "ENTRY" = "fendermint", "CMD" = "key gen --out-dir /data/${KEYS_RELDIR} --name ${KEY_NAME}" } +script.pre = "mkdir -p ${BASE_DIR}/${KEYS_RELDIR}" +script.post = "chmod 600 ${BASE_DIR}/${PRIV_KEY_PATH}" [tasks.testnode-script-new-account] -cwd = "./target/release" -script=""" -./fendermint genesis --genesis-file ${GENESIS_FILE} add-account --public-key ${PUB_KEY_PATH} --balance ${BALANCE} -""" - +extend = "fendermint-run" +env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-account --public-key /data/${PUB_KEY_PATH} --balance ${BALANCE}" } [tasks.testnode-script-add-validator] -cwd = "./target/release" -script = """ -./fendermint genesis --genesis-file ${GENESIS_FILE} add-validator --public-key ${PUB_KEY_PATH} --power 1 -""" +extend = "fendermint-run" +env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-validator --public-key /data/${PUB_KEY_PATH} --power 1" } [tasks.testnode-script-new-gateway] -cwd = "./target/release" -script = """ -./fendermint genesis --genesis-file ${GENESIS_FILE} ipc gateway --subnet-id /r0 \ +extend = "fendermint-run" +env = { "ENTRY" = "fendermint", "CMD" = """genesis --genesis-file /data/genesis.json ipc gateway --subnet-id /r0 \ --bottom-up-check-period 10 \ --msg-fee 10 \ --majority-percentage 67 \ - --min-collateral 1 -""" + --min-collateral 1""" } -[tasks.testnode-script-export-keys] -cwd = "./target/release" -script = """ -./fendermint genesis --genesis-file ${GENESIS_FILE} into-tendermint --out ${CMT_DIR}/config/genesis.json +[tasks.testnode-script-write-genesis] +extend = "fendermint-run" +env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json into-tendermint --out /data/genesis.committed.json" } +script.post = "cp ${BASE_DIR}/genesis.committed.json ${CMT_DIR}/config/genesis.json" -./fendermint key into-tendermint --secret-key ${PRIV_KEY_PATH} --out ${CMT_DIR}/config/priv_validator_key.json -chmod 600 ${CMT_DIR}/config/priv_validator_key.json -""" \ No newline at end of file +[tasks.testnode-script-export-keys] +extend = "fendermint-run" +env = { "ENTRY" = "fendermint", "CMD" = "key into-tendermint --secret-key /data/${PRIV_KEY_PATH} --out /data/priv_validator_key.json" } +script.post = "cp ${BASE_DIR}/priv_validator_key.json ${CMT_DIR}/config/priv_validator_key.json; chmod 600 ${CMT_DIR}/config/priv_validator_key.json" \ No newline at end of file From f43177bc6fc5d2ca44c81475c9b30d9a67bdfa0c Mon Sep 17 00:00:00 2001 From: raulk Date: Wed, 25 Oct 2023 20:09:39 +0100 Subject: [PATCH 07/31] create eth account; print report. --- infra/scripts/testnode.toml | 43 +++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/infra/scripts/testnode.toml b/infra/scripts/testnode.toml index 9c3e0126..08118048 100644 --- a/infra/scripts/testnode.toml +++ b/infra/scripts/testnode.toml @@ -14,13 +14,13 @@ dependencies = [ "cometbft-start", "cometbft-wait", "ethapi-start", + "testnode-report", ] [tasks.testnode-network-create] env = { "NETWORK_NAME"="${NETWORK_NAME}"} extend = "docker-network-create" - [tasks.testnode-init] dependencies = [ "node-clear", @@ -60,7 +60,7 @@ run_task = { name = [ dependencies = [ "testnode-script-new-genesis", "testnode-script-new-key", - "testnode-script-new-account", + "testnode-script-new-accounts", "testnode-script-add-validator", "testnode-script-new-gateway", "testnode-script-write-genesis", @@ -73,14 +73,21 @@ env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.js [tasks.testnode-script-new-key] extend = "fendermint-run" -env = { "ENTRY" = "fendermint", "CMD" = "key gen --out-dir /data/${KEYS_RELDIR} --name ${KEY_NAME}" } -script.pre = "mkdir -p ${BASE_DIR}/${KEYS_RELDIR}" +env = { "ENTRY" = "fendermint", "CMD" = "key gen --out-dir /data/${KEYS_SUBDIR} --name ${KEY_NAME}" } +script.pre = "mkdir -p ${BASE_DIR}/${KEYS_SUBDIR}" script.post = "chmod 600 ${BASE_DIR}/${PRIV_KEY_PATH}" -[tasks.testnode-script-new-account] +[tasks.testnode-script-new-accounts] +dependencies = ["testnode-script-new-account-f1", "testnode-script-new-account-eth"] + +[tasks.testnode-script-new-account-f1] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-account --public-key /data/${PUB_KEY_PATH} --balance ${BALANCE}" } +[tasks.testnode-script-new-account-eth] +extend = "fendermint-run" +env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-account --kind ethereum --public-key /data/${PUB_KEY_PATH} --balance ${BALANCE}" } + [tasks.testnode-script-add-validator] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-validator --public-key /data/${PUB_KEY_PATH} --power 1" } @@ -101,4 +108,28 @@ script.post = "cp ${BASE_DIR}/genesis.committed.json ${CMT_DIR}/config/genesis.j [tasks.testnode-script-export-keys] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "key into-tendermint --secret-key /data/${PRIV_KEY_PATH} --out /data/priv_validator_key.json" } -script.post = "cp ${BASE_DIR}/priv_validator_key.json ${CMT_DIR}/config/priv_validator_key.json; chmod 600 ${CMT_DIR}/config/priv_validator_key.json" \ No newline at end of file +script.post = "cp ${BASE_DIR}/priv_validator_key.json ${CMT_DIR}/config/priv_validator_key.json; chmod 600 ${CMT_DIR}/config/priv_validator_key.json" + +[tasks.testnode-report] +script = """cat << EOF +############################ +# # +# Testnode ready! 🚀 # +# # +############################ + +Eth API: http://0.0.0.0:8545 +Accounts: +$(jq '.accounts[] | "\\(.meta.Account.owner): \\(.balance) coins units"' ${BASE_DIR}/genesis.json) + +Both accounts use the same private key @ ${BASE_DIR}/${PRIV_KEY_PATH} +Private key (hex ready to import in MetaMask): +$(cat ${BASE_DIR}/${PRIV_KEY_PATH} | base64 -d | xxd -p -c 1000000) + +Chain ID: $(curl -s --location --request POST 'http://localhost:8545/' --header 'Content-Type: application/json' --data-raw '{ "jsonrpc":"2.0", "method":"eth_chainId", "params":[], "id":1 }' | jq -r '.result' | xargs printf "%d") + +--- +Fendermint API: http://localhost:26658 +CometBFT API serving on: http://0.0.0.0:26657 +EOF +""" \ No newline at end of file From 1d46594f5ad44974e3e3e29af12fb4c1ec212c00 Mon Sep 17 00:00:00 2001 From: raulk Date: Wed, 25 Oct 2023 20:18:00 +0100 Subject: [PATCH 08/31] correct typo. --- docs/localnet.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/localnet.md b/docs/localnet.md index d6f6b580..2eea8f4a 100644 --- a/docs/localnet.md +++ b/docs/localnet.md @@ -20,7 +20,7 @@ On Linux (links and instructions for Ubuntu): ## Build Fendermint ```bash -make actors-bundle build docker-build +make actor-bundle build docker-build ``` ## Single node deployment From 8594b38aefb41873406524154998b52f4c413465 Mon Sep 17 00:00:00 2001 From: raulk Date: Wed, 25 Oct 2023 20:59:50 +0100 Subject: [PATCH 09/31] drop 'script'. --- infra/scripts/testnode.toml | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/infra/scripts/testnode.toml b/infra/scripts/testnode.toml index 08118048..e3d0871c 100644 --- a/infra/scripts/testnode.toml +++ b/infra/scripts/testnode.toml @@ -58,41 +58,41 @@ run_task = { name = [ # the genesis file with necessary entities and cryptographic keys. [tasks.testnode-config] dependencies = [ - "testnode-script-new-genesis", - "testnode-script-new-key", - "testnode-script-new-accounts", - "testnode-script-add-validator", - "testnode-script-new-gateway", - "testnode-script-write-genesis", - "testnode-script-export-keys" + "testnode-new-genesis", + "testnode-new-key", + "testnode-new-accounts", + "testnode-add-validator", + "testnode-new-gateway", + "testnode-write-genesis", + "testnode-export-keys" ] -[tasks.testnode-script-new-genesis] +[tasks.testnode-new-genesis] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json new --chain-name ${CHAIN_NAME} --base-fee ${BASE_FEE} --timestamp ${TIMESTAMP} --power-scale 3" } -[tasks.testnode-script-new-key] +[tasks.testnode-new-key] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "key gen --out-dir /data/${KEYS_SUBDIR} --name ${KEY_NAME}" } script.pre = "mkdir -p ${BASE_DIR}/${KEYS_SUBDIR}" script.post = "chmod 600 ${BASE_DIR}/${PRIV_KEY_PATH}" -[tasks.testnode-script-new-accounts] -dependencies = ["testnode-script-new-account-f1", "testnode-script-new-account-eth"] +[tasks.testnode-new-accounts] +dependencies = ["testnode-new-account-f1", "testnode-new-account-eth"] -[tasks.testnode-script-new-account-f1] +[tasks.testnode-new-account-f1] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-account --public-key /data/${PUB_KEY_PATH} --balance ${BALANCE}" } -[tasks.testnode-script-new-account-eth] +[tasks.testnode-new-account-eth] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-account --kind ethereum --public-key /data/${PUB_KEY_PATH} --balance ${BALANCE}" } -[tasks.testnode-script-add-validator] +[tasks.testnode-add-validator] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-validator --public-key /data/${PUB_KEY_PATH} --power 1" } -[tasks.testnode-script-new-gateway] +[tasks.testnode-new-gateway] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = """genesis --genesis-file /data/genesis.json ipc gateway --subnet-id /r0 \ --bottom-up-check-period 10 \ @@ -100,12 +100,12 @@ env = { "ENTRY" = "fendermint", "CMD" = """genesis --genesis-file /data/genesis. --majority-percentage 67 \ --min-collateral 1""" } -[tasks.testnode-script-write-genesis] +[tasks.testnode-write-genesis] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json into-tendermint --out /data/genesis.committed.json" } script.post = "cp ${BASE_DIR}/genesis.committed.json ${CMT_DIR}/config/genesis.json" -[tasks.testnode-script-export-keys] +[tasks.testnode-export-keys] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "key into-tendermint --secret-key /data/${PRIV_KEY_PATH} --out /data/priv_validator_key.json" } script.post = "cp ${BASE_DIR}/priv_validator_key.json ${CMT_DIR}/config/priv_validator_key.json; chmod 600 ${CMT_DIR}/config/priv_validator_key.json" From 7000ce19e6bbb31f8e19263b4bf6d13ac2686d5e Mon Sep 17 00:00:00 2001 From: raulk Date: Thu, 26 Oct 2023 12:41:06 +0100 Subject: [PATCH 10/31] fixes; increase wait time. --- infra/Makefile.toml | 8 ++++---- infra/scripts/fendermint.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/infra/Makefile.toml b/infra/Makefile.toml index e9ac4207..48083696 100644 --- a/infra/Makefile.toml +++ b/infra/Makefile.toml @@ -21,10 +21,10 @@ FM_DIR="${BASE_DIR}/fendermint" CMT_DIR="${BASE_DIR}/cometbft" GENESIS_FILE="${FM_DIR}/genesis.json" -KEYS_RELDIR="keys" +KEYS_SUBDIR="keys" KEY_NAME="validator_key" -PUB_KEY_PATH="${KEYS_RELDIR}/${KEY_NAME}.pk" -PRIV_KEY_PATH="${KEYS_RELDIR}/${KEY_NAME}.sk" +PUB_KEY_PATH="${KEYS_SUBDIR}/${KEY_NAME}.pk" +PRIV_KEY_PATH="${KEYS_SUBDIR}/${KEY_NAME}.sk" NETWORK_NAME = "${CHAIN_NAME}" @@ -42,7 +42,7 @@ ETHAPI_HOST_PORT = 8545 # If this wasn't present, any wait task is skipped. CARGO_MAKE_WAIT_MILLISECONDS = 5000 # This wait time seems to work locally. -CMT_WAIT_MILLIS = 10000 +CMT_WAIT_MILLIS = 20000 # Keep example logs to a minimum. VERBOSITY = "" diff --git a/infra/scripts/fendermint.toml b/infra/scripts/fendermint.toml index 966c5af5..de4b226a 100644 --- a/infra/scripts/fendermint.toml +++ b/infra/scripts/fendermint.toml @@ -3,7 +3,7 @@ extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "run", "FLAGS" = "-d" } [tasks.fendermint-run] -script = """ +script.main = """ docker run \ ${FLAGS} \ --name ${FM_CONTAINER_NAME} \ From 5ddd1cb8670906d1967b3a533f6600be1f2c245a Mon Sep 17 00:00:00 2001 From: raulk Date: Thu, 26 Oct 2023 12:46:10 +0100 Subject: [PATCH 11/31] improve testnode report. --- infra/scripts/testnode.toml | 56 ++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/infra/scripts/testnode.toml b/infra/scripts/testnode.toml index e3d0871c..f36224ce 100644 --- a/infra/scripts/testnode.toml +++ b/infra/scripts/testnode.toml @@ -58,41 +58,41 @@ run_task = { name = [ # the genesis file with necessary entities and cryptographic keys. [tasks.testnode-config] dependencies = [ - "testnode-new-genesis", - "testnode-new-key", - "testnode-new-accounts", - "testnode-add-validator", - "testnode-new-gateway", - "testnode-write-genesis", - "testnode-export-keys" + "testnode-script-new-genesis", + "testnode-script-new-key", + "testnode-script-new-accounts", + "testnode-script-add-validator", + "testnode-script-new-gateway", + "testnode-script-write-genesis", + "testnode-script-export-keys" ] -[tasks.testnode-new-genesis] +[tasks.testnode-script-new-genesis] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json new --chain-name ${CHAIN_NAME} --base-fee ${BASE_FEE} --timestamp ${TIMESTAMP} --power-scale 3" } -[tasks.testnode-new-key] +[tasks.testnode-script-new-key] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "key gen --out-dir /data/${KEYS_SUBDIR} --name ${KEY_NAME}" } script.pre = "mkdir -p ${BASE_DIR}/${KEYS_SUBDIR}" script.post = "chmod 600 ${BASE_DIR}/${PRIV_KEY_PATH}" -[tasks.testnode-new-accounts] -dependencies = ["testnode-new-account-f1", "testnode-new-account-eth"] +[tasks.testnode-script-new-accounts] +dependencies = ["testnode-script-new-account-f1", "testnode-script-new-account-eth"] -[tasks.testnode-new-account-f1] +[tasks.testnode-script-new-account-f1] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-account --public-key /data/${PUB_KEY_PATH} --balance ${BALANCE}" } -[tasks.testnode-new-account-eth] +[tasks.testnode-script-new-account-eth] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-account --kind ethereum --public-key /data/${PUB_KEY_PATH} --balance ${BALANCE}" } -[tasks.testnode-add-validator] +[tasks.testnode-script-add-validator] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-validator --public-key /data/${PUB_KEY_PATH} --power 1" } -[tasks.testnode-new-gateway] +[tasks.testnode-script-new-gateway] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = """genesis --genesis-file /data/genesis.json ipc gateway --subnet-id /r0 \ --bottom-up-check-period 10 \ @@ -100,12 +100,12 @@ env = { "ENTRY" = "fendermint", "CMD" = """genesis --genesis-file /data/genesis. --majority-percentage 67 \ --min-collateral 1""" } -[tasks.testnode-write-genesis] +[tasks.testnode-script-write-genesis] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json into-tendermint --out /data/genesis.committed.json" } script.post = "cp ${BASE_DIR}/genesis.committed.json ${CMT_DIR}/config/genesis.json" -[tasks.testnode-export-keys] +[tasks.testnode-script-export-keys] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "key into-tendermint --secret-key /data/${PRIV_KEY_PATH} --out /data/priv_validator_key.json" } script.post = "cp ${BASE_DIR}/priv_validator_key.json ${CMT_DIR}/config/priv_validator_key.json; chmod 600 ${CMT_DIR}/config/priv_validator_key.json" @@ -118,18 +118,24 @@ script = """cat << EOF # # ############################ -Eth API: http://0.0.0.0:8545 +Eth API: +\thttp://0.0.0.0:8545 + Accounts: -$(jq '.accounts[] | "\\(.meta.Account.owner): \\(.balance) coins units"' ${BASE_DIR}/genesis.json) +$(jq -r '.accounts[] | "\t\\(.meta.Account.owner): \\(.balance) coin units"' ${BASE_DIR}/genesis.json) -Both accounts use the same private key @ ${BASE_DIR}/${PRIV_KEY_PATH} Private key (hex ready to import in MetaMask): -$(cat ${BASE_DIR}/${PRIV_KEY_PATH} | base64 -d | xxd -p -c 1000000) +\t$(cat ${BASE_DIR}/${PRIV_KEY_PATH} | base64 -d | xxd -p -c 1000000) + +Note: both accounts use the same private key @ ${BASE_DIR}/${PRIV_KEY_PATH} + +Chain ID: +\t$(curl -s --location --request POST 'http://localhost:8545/' --header 'Content-Type: application/json' --data-raw '{ "jsonrpc":"2.0", "method":"eth_chainId", "params":[], "id":1 }' | jq -r '.result' | xargs printf "%d") -Chain ID: $(curl -s --location --request POST 'http://localhost:8545/' --header 'Content-Type: application/json' --data-raw '{ "jsonrpc":"2.0", "method":"eth_chainId", "params":[], "id":1 }' | jq -r '.result' | xargs printf "%d") +Fendermint API: +\thttp://localhost:26658 ---- -Fendermint API: http://localhost:26658 -CometBFT API serving on: http://0.0.0.0:26657 +CometBFT API: +\thttp://0.0.0.0:26657 EOF """ \ No newline at end of file From 80e0e446f45a0dd374f5fbe3249aee06a9c96b93 Mon Sep 17 00:00:00 2001 From: raulk Date: Wed, 25 Oct 2023 20:59:50 +0100 Subject: [PATCH 12/31] drop 'script'. --- infra/scripts/testnode.toml | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/infra/scripts/testnode.toml b/infra/scripts/testnode.toml index f36224ce..80dd1b85 100644 --- a/infra/scripts/testnode.toml +++ b/infra/scripts/testnode.toml @@ -58,41 +58,41 @@ run_task = { name = [ # the genesis file with necessary entities and cryptographic keys. [tasks.testnode-config] dependencies = [ - "testnode-script-new-genesis", - "testnode-script-new-key", - "testnode-script-new-accounts", - "testnode-script-add-validator", - "testnode-script-new-gateway", - "testnode-script-write-genesis", - "testnode-script-export-keys" + "testnode-new-genesis", + "testnode-new-key", + "testnode-new-accounts", + "testnode-add-validator", + "testnode-new-gateway", + "testnode-write-genesis", + "testnode-export-keys" ] -[tasks.testnode-script-new-genesis] +[tasks.testnode-new-genesis] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json new --chain-name ${CHAIN_NAME} --base-fee ${BASE_FEE} --timestamp ${TIMESTAMP} --power-scale 3" } -[tasks.testnode-script-new-key] +[tasks.testnode-new-key] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "key gen --out-dir /data/${KEYS_SUBDIR} --name ${KEY_NAME}" } script.pre = "mkdir -p ${BASE_DIR}/${KEYS_SUBDIR}" script.post = "chmod 600 ${BASE_DIR}/${PRIV_KEY_PATH}" -[tasks.testnode-script-new-accounts] -dependencies = ["testnode-script-new-account-f1", "testnode-script-new-account-eth"] +[tasks.testnode-new-accounts] +dependencies = ["testnode-new-account-f1", "testnode-new-account-eth"] -[tasks.testnode-script-new-account-f1] +[tasks.testnode-new-account-f1] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-account --public-key /data/${PUB_KEY_PATH} --balance ${BALANCE}" } -[tasks.testnode-script-new-account-eth] +[tasks.testnode-new-account-eth] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-account --kind ethereum --public-key /data/${PUB_KEY_PATH} --balance ${BALANCE}" } -[tasks.testnode-script-add-validator] +[tasks.testnode-add-validator] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-validator --public-key /data/${PUB_KEY_PATH} --power 1" } -[tasks.testnode-script-new-gateway] +[tasks.testnode-new-gateway] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = """genesis --genesis-file /data/genesis.json ipc gateway --subnet-id /r0 \ --bottom-up-check-period 10 \ @@ -100,12 +100,12 @@ env = { "ENTRY" = "fendermint", "CMD" = """genesis --genesis-file /data/genesis. --majority-percentage 67 \ --min-collateral 1""" } -[tasks.testnode-script-write-genesis] +[tasks.testnode-write-genesis] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json into-tendermint --out /data/genesis.committed.json" } script.post = "cp ${BASE_DIR}/genesis.committed.json ${CMT_DIR}/config/genesis.json" -[tasks.testnode-script-export-keys] +[tasks.testnode-export-keys] extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "key into-tendermint --secret-key /data/${PRIV_KEY_PATH} --out /data/priv_validator_key.json" } script.post = "cp ${BASE_DIR}/priv_validator_key.json ${CMT_DIR}/config/priv_validator_key.json; chmod 600 ${CMT_DIR}/config/priv_validator_key.json" From 5a8aabb72223b9311aceb6c472099379d7aae932 Mon Sep 17 00:00:00 2001 From: raulk Date: Thu, 26 Oct 2023 16:57:43 +0100 Subject: [PATCH 13/31] infra: make testnet targets use Docker images. This also removes a significant amount of logic duplication between the testnode and testnet variants. More cleanup is needed. --- infra/Makefile.toml | 3 + infra/scripts/fendermint.toml | 14 +++ infra/scripts/genesis.toml | 40 +++++++++ infra/scripts/testnet.toml | 159 ++++++++++++---------------------- infra/scripts/testnode.toml | 62 +++---------- 5 files changed, 121 insertions(+), 157 deletions(-) create mode 100644 infra/scripts/genesis.toml diff --git a/infra/Makefile.toml b/infra/Makefile.toml index 48083696..13b831da 100644 --- a/infra/Makefile.toml +++ b/infra/Makefile.toml @@ -3,6 +3,7 @@ extend = [ { path = "scripts/cometbft.toml" }, { path = "scripts/fendermint.toml" }, { path = "scripts/ethapi.toml" }, + { path = "scripts/genesis.toml"}, { path = "scripts/node.toml" }, { path = "scripts/testnet.toml" }, { path = "scripts/testnode.toml" } @@ -26,6 +27,8 @@ KEY_NAME="validator_key" PUB_KEY_PATH="${KEYS_SUBDIR}/${KEY_NAME}.pk" PRIV_KEY_PATH="${KEYS_SUBDIR}/${KEY_NAME}.sk" +COMETBFT_SUBDIR = "cometbft" + NETWORK_NAME = "${CHAIN_NAME}" CMT_CONTAINER_NAME = "${NETWORK_NAME}-cometbft" diff --git a/infra/scripts/fendermint.toml b/infra/scripts/fendermint.toml index de4b226a..eaf796c3 100644 --- a/infra/scripts/fendermint.toml +++ b/infra/scripts/fendermint.toml @@ -20,6 +20,20 @@ docker run \ """ dependencies = ["docker-network-create", "fendermint-deps"] +[tasks.fendermint-tool] +script.main = """ +docker run \ + ${FLAGS} \ + --init \ + --user $(id -u) \ + --volume ${BASE_DIR}:/data \ + --env LOG_LEVEL=info \ + --entrypoint ${ENTRY} \ + ${FM_DOCKER_IMAGE} \ + ${CMD} +""" +dependencies = ["fendermint-deps"] + [tasks.fendermint-deps] script = """ # Check if the image exists diff --git a/infra/scripts/genesis.toml b/infra/scripts/genesis.toml new file mode 100644 index 00000000..a665fb28 --- /dev/null +++ b/infra/scripts/genesis.toml @@ -0,0 +1,40 @@ +[tasks.genesis-new] +extend = "fendermint-tool" +env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json new --chain-name ${CHAIN_NAME} --base-fee ${BASE_FEE} --timestamp ${TIMESTAMP} --power-scale 3" } + +## Takes: +## - KEYS_SUBDIR: directory under /data where to store the key. +## - KEY_NAME: name of the key. +[tasks.genesis-new-key] +extend = "fendermint-tool" +env = { "ENTRY" = "fendermint", "CMD" = "key gen --out-dir /data/${KEYS_SUBDIR} --name ${KEY_NAME}" } +script.pre = "mkdir -p ${BASE_DIR}/${KEYS_SUBDIR}" +script.post = "chmod 600 ${BASE_DIR}/${KEYS_SUBDIR}/${KEY_NAME}.sk" + +[tasks.genesis-new-accounts] +dependencies = ["genesis-new-account-f1", "genesis-new-account-eth"] + +[tasks.genesis-new-account-f1] +extend = "fendermint-tool" +env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-account --public-key /data/${PUB_KEY_PATH} --balance ${BALANCE}" } + +[tasks.genesis-new-account-eth] +extend = "fendermint-tool" +env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-account --kind ethereum --public-key /data/${PUB_KEY_PATH} --balance ${BALANCE}" } + +[tasks.genesis-add-validator] +extend = "fendermint-tool" +env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-validator --public-key /data/${PUB_KEY_PATH} --power 1" } + +[tasks.genesis-new-gateway] +extend = "fendermint-tool" +env = { "ENTRY" = "fendermint", "CMD" = """genesis --genesis-file /data/genesis.json ipc gateway --subnet-id /r0 \ + --bottom-up-check-period 10 \ + --msg-fee 10 \ + --majority-percentage 67 \ + --min-collateral 1""" } + +[tasks.genesis-write] +extend = "fendermint-tool" +env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json into-tendermint --out /data/genesis.committed.json" } +script.post = "cp ${BASE_DIR}/genesis.committed.json ${CMT_DIR}/config/genesis.json" diff --git a/infra/scripts/testnet.toml b/infra/scripts/testnet.toml index 2f970c14..492a4eee 100644 --- a/infra/scripts/testnet.toml +++ b/infra/scripts/testnet.toml @@ -6,7 +6,6 @@ dependencies = [ "testnet-down", "testnet-init", "fendermint-deps", - "testnet-config", "testnet-up" ] @@ -41,100 +40,82 @@ export GID [tasks.testnet-init] dependencies = [ "testnet-clear", - "testnet-network-create", + "docker-network-create", "cometbft-pull", "testnet-mkdir", - "testnet-cometbft-init", + "genesis-new", + "testnet-init-nodes", + "genesis-write", + "testnet-copy-genesis", + "testnet-setup-persistent-peers", ] -[tasks.testnet-network-create] -env = { "NETWORK_NAME"="${NETWORK_NAME}"} -extend = "docker-network-create" +[tasks.testnet-init-nodes] +script_runner = "@duckscript" +script = """ +nodes = range 0 4 -[tasks.testnet-clear] -script=""" -echo clearing all IPC data -rm -rf ${BASE_DIR} -""" +for i in ${nodes} + NUMBER = set ${i} + NODE_DIR = set "node${NUMBER}" + KEYS_SUBDIR = set "${NODE_DIR}/keys" + KEY_NAME = set "validator${NUMBER}" -[tasks.testnet-mkdir] -script=""" -mkdir -p $BASE_DIR -mkdir -p $BASE_DIR/out + mkdir -p ${BASE_DIR}/${NODE_DIR} + mkdir -p ${BASE_DIR}/${NODE_DIR}/fendermint + mkdir -p ${BASE_DIR}/${NODE_DIR}/cometbft -for i in $(seq 0 3); do - mkdir -p $BASE_DIR/node${i} - mkdir -p $BASE_DIR/node${i}/fendermint - mkdir -p $BASE_DIR/node${i}/cometbft -done -""" + set_env NODE_DIR ${NODE_DIR} + set_env NUMBER ${NUMBER} -[tasks.testnet-cometbft-init] -dependencies = ["testnet-cometbft-init-node0", "testnet-cometbft-init-node1", "testnet-cometbft-init-node2", "testnet-cometbft-init-node3"] + cm_run_task testnet-node-cometbft-init -[tasks.testnet-cometbft-init-node0] -extend = "cometbft-init" -env = { "CMD" = "init", "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/node0/cometbft", "CMT_CONTAINER_NAME" = "cometbft-node0", "FLAGS" = "-a STDOUT -a STDERR --rm"} + set_env KEYS_SUBDIR ${KEYS_SUBDIR} + set_env KEY_NAME ${KEY_NAME} -[tasks.testnet-cometbft-init-node1] -extend = "cometbft-init" -env = { "CMD" = "init", "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/node1/cometbft", "CMT_CONTAINER_NAME" = "cometbft-node1", "FLAGS" = "-a STDOUT -a STDERR --rm" } + cm_run_task genesis-new-key -[tasks.testnet-cometbft-init-node2] -extend = "cometbft-init" -env = { "CMD" = "init", "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/node2/cometbft", "CMT_CONTAINER_NAME" = "cometbft-node2", "FLAGS" = "-a STDOUT -a STDERR --rm" } + set_env PUB_KEY_PATH "${KEYS_SUBDIR}/${KEY_NAME}.pk" + set_env PRIV_KEY_PATH "${KEYS_SUBDIR}/${KEY_NAME}.sk" -[tasks.testnet-cometbft-init-node3] -extend = "cometbft-init" -env = { "CMD" = "init", "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/node3/cometbft", "CMT_CONTAINER_NAME" = "cometbft-node3", "FLAGS" = "-a STDOUT -a STDERR --rm" } + cm_run_task genesis-new-accounts + cm_run_task genesis-add-validator -[tasks.testnet-config] -dependencies = [ - "testnet-script-new-genesis", - "testnet-script-add-peers", - "testnet-script-new-key", - "testnet-script-new-account", - "testnet-script-new-gateway", - "testnet-script-share-genesis" -] + set_env COMETBFT_SUBDIR ${NODE_DIR}/cometbft -[tasks.testnet-script-new-genesis] -cwd = "./target/release" -script = """ -./fendermint genesis --genesis-file $BASE_DIR/genesis.json \ - new --chain-name ${CHAIN_NAME} --base-fee ${BASE_FEE} --timestamp ${TIMESTAMP} --power-scale 3 + cm_run_task testnet-add-peer + cm_run_task testnode-export-keys +end -cat $BASE_DIR/genesis.json +release ${nodes} """ -[tasks.testnet-script-new-key] -cwd = "./target/release" +[tasks.testnet-clear] script=""" -for i in $(seq 0 3); do - mkdir -p $BASE_DIR/node${i}/fendermint/keys - ./fendermint key gen --out-dir $BASE_DIR/node${i}/fendermint/keys --name validator${i}_key -done +echo clearing all IPC data +rm -rf ${BASE_DIR} """ -[tasks.testnet-script-new-account] -cwd = "./target/release" +[tasks.testnet-mkdir] script=""" -for i in $(seq 0 3); do -./fendermint genesis --genesis-file $BASE_DIR/genesis.json add-account \ - --public-key $BASE_DIR/node${i}/fendermint/keys/validator${i}_key.pk --balance ${BALANCE} -done +mkdir -p $BASE_DIR +mkdir -p $BASE_DIR/out """ -[tasks.testnet-script-add-peers] -cwd = "./target/release" -script=""" -for i in $(seq 0 3); do - ./fendermint key add-peer \ - --node-key-file $BASE_DIR/node${i}/cometbft/config/node_key.json \ - --network-addr 192.167.10.$((${i}+2)):26656 \ - --local-peers-file $BASE_DIR/peers -done +[tasks.testnet-node-cometbft-init] +extend = "cometbft-init" +env = { "CMD" = "init", "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/${NODE_DIR}/cometbft", "CMT_CONTAINER_NAME" = "cometbft-node0", "FLAGS" = "-a STDOUT -a STDERR --rm"} + +[tasks.testnet-add-peer] +extend = "fendermint-tool" +env = { "ENTRY" = "fendermint", "CMD" = """key add-peer \ + --node-key-file /data/${COMETBFT_SUBDIR}/config/node_key.json \ + --network-addr 192.167.10.$((${NUMBER}+2)):26656 \ + --local-peers-file /data/peers \ +""" } +[tasks.testnet-setup-persistent-peers] +script=""" unset CMT_PERSISTENT_PEERS export CMT_PERSISTENT_PEERS=`cat $BASE_DIR/peers` echo Persistent peers: $CMT_PERSISTENT_PEERS @@ -144,41 +125,9 @@ for i in $(seq 0 3); do done """ -[tasks.testnet-script-new-gateway] -cwd = "./target/release" -script = """ -for i in $(seq 0 3); do - ./fendermint genesis \ - --genesis-file $BASE_DIR/genesis.json add-validator \ - --public-key $BASE_DIR/node${i}/fendermint/keys/validator${i}_key.pk \ - --power 1 -done - -./fendermint genesis --genesis-file $BASE_DIR/genesis.json ipc gateway \ - --subnet-id /r0 \ - --bottom-up-check-period 10 \ - --msg-fee 10 \ - --majority-percentage 67 \ - --min-collateral 1 - -./fendermint \ - genesis --genesis-file $BASE_DIR/genesis.json \ - into-tendermint --out $BASE_DIR/out/genesis.json - -for i in $(seq 0 3); do - ./fendermint key into-tendermint \ - --secret-key $BASE_DIR/node${i}/fendermint/keys/validator${i}_key.sk \ - --out $BASE_DIR/node${i}/cometbft/config/priv_validator_key.json -done - -echo "GENESIS:" -cat $BASE_DIR/genesis.json -""" - -[tasks.testnet-script-share-genesis] -cwd = "./target/release" +[tasks.testnet-copy-genesis] script = """ for i in $(seq 0 3); do - cp $BASE_DIR/out/genesis.json $BASE_DIR/node${i}/cometbft/config/genesis.json + cp $BASE_DIR/genesis.committed.json $BASE_DIR/node${i}/cometbft/config/genesis.json done """ diff --git a/infra/scripts/testnode.toml b/infra/scripts/testnode.toml index 80dd1b85..d640b79e 100644 --- a/infra/scripts/testnode.toml +++ b/infra/scripts/testnode.toml @@ -6,7 +6,7 @@ workspace = false dependencies = [ "testnode-down", "testnode-init", - "testnode-network-create", + "docker-network-create", "cometbft-init", "fendermint-deps", "testnode-config", @@ -17,10 +17,6 @@ dependencies = [ "testnode-report", ] -[tasks.testnode-network-create] -env = { "NETWORK_NAME"="${NETWORK_NAME}"} -extend = "docker-network-create" - [tasks.testnode-init] dependencies = [ "node-clear", @@ -58,57 +54,19 @@ run_task = { name = [ # the genesis file with necessary entities and cryptographic keys. [tasks.testnode-config] dependencies = [ - "testnode-new-genesis", - "testnode-new-key", - "testnode-new-accounts", - "testnode-add-validator", - "testnode-new-gateway", - "testnode-write-genesis", + "genesis-new", + "genesis-new-key", + "genesis-new-accounts", + "genesis-add-validator", + "genesis-new-gateway", + "genesis-write", "testnode-export-keys" ] -[tasks.testnode-new-genesis] -extend = "fendermint-run" -env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json new --chain-name ${CHAIN_NAME} --base-fee ${BASE_FEE} --timestamp ${TIMESTAMP} --power-scale 3" } - -[tasks.testnode-new-key] -extend = "fendermint-run" -env = { "ENTRY" = "fendermint", "CMD" = "key gen --out-dir /data/${KEYS_SUBDIR} --name ${KEY_NAME}" } -script.pre = "mkdir -p ${BASE_DIR}/${KEYS_SUBDIR}" -script.post = "chmod 600 ${BASE_DIR}/${PRIV_KEY_PATH}" - -[tasks.testnode-new-accounts] -dependencies = ["testnode-new-account-f1", "testnode-new-account-eth"] - -[tasks.testnode-new-account-f1] -extend = "fendermint-run" -env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-account --public-key /data/${PUB_KEY_PATH} --balance ${BALANCE}" } - -[tasks.testnode-new-account-eth] -extend = "fendermint-run" -env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-account --kind ethereum --public-key /data/${PUB_KEY_PATH} --balance ${BALANCE}" } - -[tasks.testnode-add-validator] -extend = "fendermint-run" -env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-validator --public-key /data/${PUB_KEY_PATH} --power 1" } - -[tasks.testnode-new-gateway] -extend = "fendermint-run" -env = { "ENTRY" = "fendermint", "CMD" = """genesis --genesis-file /data/genesis.json ipc gateway --subnet-id /r0 \ - --bottom-up-check-period 10 \ - --msg-fee 10 \ - --majority-percentage 67 \ - --min-collateral 1""" } - -[tasks.testnode-write-genesis] -extend = "fendermint-run" -env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json into-tendermint --out /data/genesis.committed.json" } -script.post = "cp ${BASE_DIR}/genesis.committed.json ${CMT_DIR}/config/genesis.json" - [tasks.testnode-export-keys] -extend = "fendermint-run" -env = { "ENTRY" = "fendermint", "CMD" = "key into-tendermint --secret-key /data/${PRIV_KEY_PATH} --out /data/priv_validator_key.json" } -script.post = "cp ${BASE_DIR}/priv_validator_key.json ${CMT_DIR}/config/priv_validator_key.json; chmod 600 ${CMT_DIR}/config/priv_validator_key.json" +extend = "fendermint-tool" +env = { "ENTRY" = "fendermint", "CMD" = "key into-tendermint --secret-key /data/${PRIV_KEY_PATH} --out /data/${COMETBFT_SUBDIR}/config/priv_validator_key.json" } +script.post = "chmod 600 ${BASE_DIR}/${COMETBFT_SUBDIR}/config/priv_validator_key.json" [tasks.testnode-report] script = """cat << EOF From baee14174e941b43cf97deb88c2a53621b478e6a Mon Sep 17 00:00:00 2001 From: raulk Date: Thu, 26 Oct 2023 19:40:05 +0100 Subject: [PATCH 14/31] rework subnet commands; fix merge snafu. --- infra/scripts/subnet.toml | 34 ++++++++-------------------------- infra/scripts/testnet.toml | 32 -------------------------------- 2 files changed, 8 insertions(+), 58 deletions(-) diff --git a/infra/scripts/subnet.toml b/infra/scripts/subnet.toml index 07cb3268..2899b51b 100644 --- a/infra/scripts/subnet.toml +++ b/infra/scripts/subnet.toml @@ -2,15 +2,12 @@ # Child subnet peer ######################################################################################################################## - [tasks.child-validator] -env = {"BASE_DIR"="${HOME}/.ipc/${NODE_NAME}", "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/cometbft", "FM_DIR"="${BASE_DIR}/fendermint", "CMT_CONTAINER_NAME" = "cometbft-${NODE_NAME}", "ETHAPI_CONTAINER_NAME" = "eth-${NODE_NAME}", "FM_CONTAINER_NAME"= "fendermint-${NODE_NAME}", "GENESIS_FILE"="${FM_DIR}/genesis.json" } - +env = { "BASE_DIR"="${HOME}/.ipc/${NODE_NAME}", "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/cometbft", "FM_DIR"="${BASE_DIR}/fendermint", "CMT_CONTAINER_NAME" = "cometbft-${NODE_NAME}", "ETHAPI_CONTAINER_NAME" = "eth-${NODE_NAME}", "FM_CONTAINER_NAME"= "fendermint-${NODE_NAME}", "GENESIS_FILE"="${FM_DIR}/genesis.json" } run_task = "validator-run" [tasks.child-validator-down] -env = {"BASE_DIR"="${HOME}/.ipc/${NODE_NAME}", "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/cometbft", "FM_DIR"="${BASE_DIR}/fendermint", "CMT_CONTAINER_NAME" = "cometbft-${NODE_NAME}", "ETHAPI_CONTAINER_NAME" = "eth-${NODE_NAME}", "FM_CONTAINER_NAME"= "fendermint-${NODE_NAME}", "GENESIS_FILE"="${FM_DIR}/genesis.json" } - +env = { "BASE_DIR"="${HOME}/.ipc/${NODE_NAME}", "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/cometbft", "FM_DIR"="${BASE_DIR}/fendermint", "CMT_CONTAINER_NAME" = "cometbft-${NODE_NAME}", "ETHAPI_CONTAINER_NAME" = "eth-${NODE_NAME}", "FM_CONTAINER_NAME"= "fendermint-${NODE_NAME}", "GENESIS_FILE"="${FM_DIR}/genesis.json" } run_task = "testnode-down" [tasks.validator-run] @@ -18,7 +15,7 @@ workspace = false dependencies = [ "testnode-down", "node-init", - "testnode-network-create", + "docker-network-create", "cometbft-init", "fendermint-deps", "subnet-config", @@ -33,25 +30,10 @@ dependencies = [ # Merge everything and test [tasks.subnet-config] dependencies = [ - "subnet-genesis", - "subnet-fm-prepare", + "subnet-fetch-genesis", + "genesis-write", ] - -[tasks.subnet-genesis] -cwd = "./target/release" -script = """ - -./fendermint --network=${NETWORK_TYPE} genesis --genesis-file ${GENESIS_FILE} ipc from-parent --subnet-id ${SUBNET_ID} -p ${PARENT_ENDPOINT} --parent-gateway ${PARENT_GATEWAY} --parent-registry ${PARENT_REGISTRY} --base-fee ${BASE_FEE} --power-scale ${POWER_SCALE} - -""" - -[tasks.subnet-fm-prepare] -cwd = "./target/release" -script = """ - -./fendermint --network=${NETWORK_TYPE} genesis --genesis-file ${GENESIS_FILE} into-tendermint --out ${CMT_DIR}/config/genesis.json - -./fendermint --network=${NETWORK_TYPE} key into-tendermint --secret-key ${VALIDATOR_PRIV_KEY} --out ${CMT_DIR}/config/priv_validator_key.json -chmod 600 ${CMT_DIR}/config/priv_validator_key.json -""" +[tasks.subnet-fetch-genesis] +extend = "fendermint-tool" +env = { "ENTRY" = "fendermint", "CMD" = "--network=${NETWORK_TYPE} genesis --genesis-file ${GENESIS_FILE} ipc from-parent --subnet-id ${SUBNET_ID} -p ${PARENT_ENDPOINT} --parent-gateway ${PARENT_GATEWAY} --parent-registry ${PARENT_REGISTRY} --base-fee ${BASE_FEE} --power-scale ${POWER_SCALE}" } diff --git a/infra/scripts/testnet.toml b/infra/scripts/testnet.toml index 003c827c..827ed228 100644 --- a/infra/scripts/testnet.toml +++ b/infra/scripts/testnet.toml @@ -114,39 +114,7 @@ env = { "ENTRY" = "fendermint", "CMD" = """key add-peer \ --local-peers-file /data/peers \ """ } -<<<<<<< HEAD [tasks.testnet-setup-persistent-peers] -======= -[tasks.testnet-cometbft-init-node2] -extend = "cometbft-init" -env = { "CMD" = "init", "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/node2/cometbft", "CMT_CONTAINER_NAME" = "cometbft-node2", "FLAGS" = "-a STDOUT -a STDERR --rm" } - -[tasks.testnet-cometbft-init-node3] -extend = "cometbft-init" -env = { "CMD" = "init", "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/node3/cometbft", "CMT_CONTAINER_NAME" = "cometbft-node3", "FLAGS" = "-a STDOUT -a STDERR --rm" } - -[tasks.testnet-config] -dependencies = [ - "testnet-script-new-genesis", - "testnet-script-add-peers", - "testnet-script-new-key", - "testnet-script-new-account", - "testnet-script-new-gateway", - "testnet-script-share-genesis" -] - -[tasks.testnet-script-new-genesis] -cwd = "./target/release" -script = """ -./fendermint genesis --genesis-file $BASE_DIR/genesis.json \ - new --chain-name ${SUBNET_ID} --base-fee ${BASE_FEE} --timestamp ${TIMESTAMP} --power-scale ${POWER_SCALE} - -cat $BASE_DIR/genesis.json -""" - -[tasks.testnet-script-new-key] -cwd = "./target/release" ->>>>>>> main script=""" unset CMT_PERSISTENT_PEERS export CMT_PERSISTENT_PEERS=`cat $BASE_DIR/peers` From ebbb93b339792e780aa9a26ecc28b24e785709bf Mon Sep 17 00:00:00 2001 From: raulk Date: Fri, 27 Oct 2023 00:35:13 +0100 Subject: [PATCH 15/31] slashes break things. --- infra/Makefile.toml | 7 ++++--- infra/scripts/fendermint.toml | 2 +- infra/scripts/genesis.toml | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/infra/Makefile.toml b/infra/Makefile.toml index 010a1153..1b39b82a 100644 --- a/infra/Makefile.toml +++ b/infra/Makefile.toml @@ -16,6 +16,9 @@ default_to_workspace = false [env] # General network-specific parameters SUBNET_ID = { value = "/r0", condition = { env_not_set = ["SUBNET_ID"] }} +# The network name is derived from the SUBNET_ID, replacing slashes with dashes, and dropping the first dash if any. +NETWORK_NAME = { script = ["echo ${SUBNET_ID/\\//-} | sed -E 's/^-//1'"] } + BALANCE = { value = "1000", condition = { env_not_set = ["BALANCE"] }} BASE_FEE = { value = "1000", condition = { env_not_set = ["BASE_FEE"] }} TIMESTAMP = { value = "1680101412", condition = { env_not_set = ["TIMESTAMP"] }} @@ -37,7 +40,7 @@ TOPDOWN_CHAIN_HEAD_DELAY = { value = "10", condition = { env_not_set = ["TOPDOWN BOOTSTRAPS = { value = "", condition = { env_not_set = ["BOOTSTRAPS"] } } # Deployment-related -BASE_DIR="${HOME}/.ipc/${SUBNET_ID}" +BASE_DIR="${HOME}/.ipc/${NETWORK_NAME}" FM_DIR="${BASE_DIR}/fendermint" CMT_DIR="${BASE_DIR}/cometbft" @@ -49,8 +52,6 @@ PRIV_KEY_PATH="${KEYS_SUBDIR}/${KEY_NAME}.sk" COMETBFT_SUBDIR = "cometbft" -NETWORK_NAME = "${SUBNET_ID}" - CMT_CONTAINER_NAME = "${NETWORK_NAME}-cometbft" FM_CONTAINER_NAME = "${NETWORK_NAME}-fendermint" ETHAPI_CONTAINER_NAME = "${NETWORK_NAME}-ethapi" diff --git a/infra/scripts/fendermint.toml b/infra/scripts/fendermint.toml index 27e98d9c..a87b0a6b 100644 --- a/infra/scripts/fendermint.toml +++ b/infra/scripts/fendermint.toml @@ -35,7 +35,7 @@ docker run \ --volume ${BASE_DIR}:/data \ --env FM_DATA_DIR=/data/fendermint/data \ --env FM_CHAIN_NAME=${NETWORK_NAME} \ - --env FM_IPC__SUBNET_ID=${NETWORK_NAME} \ + --env FM_IPC__SUBNET_ID=${SUBNET_ID} \ --env FM_IPC__TOPDOWN__CHAIN_HEAD_DELAY=${TOPDOWN_CHAIN_HEAD_DELAY} \ --env FM_IPC__TOPDOWN__PARENT_HTTP_ENDPOINT=${PARENT_ENDPOINT} \ --env FM_IPC__TOPDOWN__PARENT_REGISTRY=${PARENT_REGISTRY} \ diff --git a/infra/scripts/genesis.toml b/infra/scripts/genesis.toml index 30719131..18648f8d 100644 --- a/infra/scripts/genesis.toml +++ b/infra/scripts/genesis.toml @@ -1,6 +1,6 @@ [tasks.genesis-new] extend = "fendermint-tool" -env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json new --chain-name ${SUBNET_ID} --base-fee ${BASE_FEE} --timestamp ${TIMESTAMP} --power-scale ${POWER_SCALE}" } +env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json new --chain-name ${NETWORK_NAME} --base-fee ${BASE_FEE} --timestamp ${TIMESTAMP} --power-scale ${POWER_SCALE}" } ## Takes: ## - KEYS_SUBDIR: directory under /data where to store the key. From 1dfbb2d31c790e7cac54740df340cb0660392ba4 Mon Sep 17 00:00:00 2001 From: raulk Date: Fri, 27 Oct 2023 20:04:41 +0100 Subject: [PATCH 16/31] add network type. --- infra/scripts/fendermint.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/infra/scripts/fendermint.toml b/infra/scripts/fendermint.toml index a87b0a6b..b3e07d4b 100644 --- a/infra/scripts/fendermint.toml +++ b/infra/scripts/fendermint.toml @@ -57,6 +57,7 @@ docker run \ --env LOG_LEVEL=info \ --entrypoint ${ENTRY} \ ${FM_DOCKER_IMAGE} \ + --network=${NETWORK_TYPE} \ ${CMD} """ dependencies = ["fendermint-deps"] From 53a3c5661d3a36109747dcb40b65dc1e7c29ed8a Mon Sep 17 00:00:00 2001 From: raulk Date: Fri, 27 Oct 2023 23:30:44 +0100 Subject: [PATCH 17/31] fixes. --- infra/docker-compose.yml | 30 ++++++++++++++++-------------- infra/scripts/fendermint.toml | 6 +++++- infra/scripts/testnet.toml | 18 ++++++++---------- 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/infra/docker-compose.yml b/infra/docker-compose.yml index f7166e31..5936cddf 100644 --- a/infra/docker-compose.yml +++ b/infra/docker-compose.yml @@ -1,4 +1,20 @@ services: + fendermint-node: + container_name: fendermint-node${NODE_ID} + user: ${UID}:${GID} + image: "fendermint:latest" + environment: + - FM_DATA_DIR=/data/fendermint/data + - FM_CHAIN_NAME=$NETWORK_NAME + - TENDERMINT_RPC_URL=http://cometbft-node${NODE_ID}:26657 + - LOG_LEVEL=info + - NETWORK_TYPE=$NETWORK_TYPE + volumes: + - $BASE_DIR/node${NODE_ID}:/data + networks: + testnet: + ipv4_address: ${FMT_NODE_ADDR} + cometbft-node: container_name: cometbft-node${NODE_ID} user: ${UID}:${GID} @@ -22,20 +38,6 @@ services: testnet: ipv4_address: ${CMT_NODE_ADDR} - fendermint-node: - container_name: fendermint-node${NODE_ID} - user: ${UID}:${GID} - image: "fendermint:latest" - environment: - - FM_DATA_DIR=/data/fendermint/data - - FM_CHAIN_NAME=$SUBNET_ID - - LOG_LEVEL=info - volumes: - - $BASE_DIR/node${NODE_ID}:/data - networks: - testnet: - ipv4_address: ${FMT_NODE_ADDR} - ethapi-node: container_name: ethapi-node${NODE_ID} user: ${UID}:${GID} diff --git a/infra/scripts/fendermint.toml b/infra/scripts/fendermint.toml index a1475500..b3b833f1 100644 --- a/infra/scripts/fendermint.toml +++ b/infra/scripts/fendermint.toml @@ -15,9 +15,11 @@ docker run \ --env FM_CHAIN_NAME=${NETWORK_NAME} \ --env TENDERMINT_RPC_URL=http://${CMT_CONTAINER_NAME}:26657 \ --env LOG_LEVEL=info \ + --env RUST_BACKTRACE=1 \ --entrypoint ${ENTRY} \ ${FM_DOCKER_IMAGE} \ - --network=${NETWORK_TYPE} ${CMD} + --network=${NETWORK_TYPE} \ + ${CMD} """ dependencies = ["docker-network-create", "fendermint-deps"] @@ -49,6 +51,7 @@ docker run \ --env FM_TENDERMINT_RPC_URL=http://${CMT_CONTAINER_NAME}:26657 \ --env TENDERMINT_RPC_URL=http://${CMT_CONTAINER_NAME}:26657 \ --env LOG_LEVEL=info \ + --env RUST_BACKTRACE=1 \ --entrypoint ${ENTRY} \ ${FM_DOCKER_IMAGE} \ --network=${NETWORK_TYPE} \ @@ -64,6 +67,7 @@ docker run \ --user $(id -u) \ --volume ${BASE_DIR}:/data \ --env LOG_LEVEL=info \ + --env RUST_BACKTRACE=1 \ --entrypoint ${ENTRY} \ ${FM_DOCKER_IMAGE} \ --network=${NETWORK_TYPE} \ diff --git a/infra/scripts/testnet.toml b/infra/scripts/testnet.toml index 827ed228..c87ff6ff 100644 --- a/infra/scripts/testnet.toml +++ b/infra/scripts/testnet.toml @@ -22,12 +22,6 @@ export BASE_DIR=$BASE_DIR """ [tasks.testnet-down] -dependencies = [ - "testnet-docker-compose-down", - "docker-network-rm", -] - -[tasks.testnet-docker-compose-down] script = """ export CMT_PERSISTENT_PEERS="UNDEFINED" if [ -z $GID ]; then GID=$(id -g); fi @@ -68,7 +62,7 @@ for i in ${nodes} set_env NODE_DIR ${NODE_DIR} set_env NUMBER ${NUMBER} - cm_run_task testnet-node-cometbft-init + cm_run_task testnet-cometbft-init set_env KEYS_SUBDIR ${KEYS_SUBDIR} set_env KEY_NAME ${KEY_NAME} @@ -83,7 +77,11 @@ for i in ${nodes} set_env COMETBFT_SUBDIR ${NODE_DIR}/cometbft + IP_LAST = calc ${NUMBER}+2 + NETWORK_ADDR = set "192.167.10.${IP_LAST}:26656" + set_env NETWORK_ADDR ${NETWORK_ADDR} cm_run_task testnet-add-peer + cm_run_task testnode-export-keys end @@ -102,15 +100,15 @@ mkdir -p $BASE_DIR mkdir -p $BASE_DIR/out """ -[tasks.testnet-node-cometbft-init] +[tasks.testnet-cometbft-init] extend = "cometbft-init" -env = { "CMD" = "init", "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/${NODE_DIR}/cometbft", "CMT_CONTAINER_NAME" = "cometbft-node0", "FLAGS" = "-a STDOUT -a STDERR --rm"} +env = { "CMD" = "init", "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/${NODE_DIR}/cometbft", "CMT_CONTAINER_NAME" = "cometbft-node${NUMBER}", "FLAGS" = "-a STDOUT -a STDERR --rm"} [tasks.testnet-add-peer] extend = "fendermint-tool" env = { "ENTRY" = "fendermint", "CMD" = """key add-peer \ --node-key-file /data/${COMETBFT_SUBDIR}/config/node_key.json \ - --network-addr 192.167.10.$((${NUMBER}+2)):26656 \ + --network-addr ${NETWORK_ADDR} \ --local-peers-file /data/peers \ """ } From 5e87eab5ab36016fb3efb84e35ae4b4ec423ed71 Mon Sep 17 00:00:00 2001 From: raulk Date: Fri, 27 Oct 2023 23:34:19 +0100 Subject: [PATCH 18/31] fix env var NETWORK_TYPE => FM_NETWORK. --- infra/Makefile.toml | 2 +- infra/docker-compose.yml | 2 +- infra/scripts/fendermint.toml | 6 +++--- infra/scripts/subnet.toml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/infra/Makefile.toml b/infra/Makefile.toml index caab93cd..ae2d1401 100644 --- a/infra/Makefile.toml +++ b/infra/Makefile.toml @@ -33,7 +33,7 @@ NODE_NAME = { value = "ipc-node", condition = { env_not_set = ["NODE_NAME"] } } PARENT_ENDPOINT = { value = "https://api.calibration.node.glif.io/rpc/v1", condition = { env_not_set = ["PARENT_ENDPOINT"] } } PARENT_GATEWAY = { value = "0x56948d2CFaa2EF355B8C08Ac925202db212146D1", condition = { env_not_set = ["PARENT_GATEWAY"] } } PARENT_REGISTRY = { value = "0x6A4884D2B6A597792dC68014D4B7C117cca5668e", condition = { env_not_set = ["PARENT_REGISTRY"] } } -NETWORK_TYPE = { value = "test", condition = { env_not_set = ["NETWORK_TYPE"] } } +FM_NETWORK = { value = "test", condition = { env_not_set = ["FM_NETWORK"] } } VALIDATOR_PRIV_KEY = { value = "~/.ipc/priv.key", condition = { env_not_set = ["VALIDATOR_PRIV_KEY"] } } TOPDOWN_CHAIN_HEAD_DELAY = { value = "10", condition = { env_not_set = ["TOPDOWN_CHAIN_HEAD_DELAY"] } } # Comma-separated list of bootstrap nodes to be used by the CometBFT node. diff --git a/infra/docker-compose.yml b/infra/docker-compose.yml index 5936cddf..3cb19357 100644 --- a/infra/docker-compose.yml +++ b/infra/docker-compose.yml @@ -8,7 +8,7 @@ services: - FM_CHAIN_NAME=$NETWORK_NAME - TENDERMINT_RPC_URL=http://cometbft-node${NODE_ID}:26657 - LOG_LEVEL=info - - NETWORK_TYPE=$NETWORK_TYPE + - FM_NETWORK=$FM_NETWORK volumes: - $BASE_DIR/node${NODE_ID}:/data networks: diff --git a/infra/scripts/fendermint.toml b/infra/scripts/fendermint.toml index b3b833f1..3887fa79 100644 --- a/infra/scripts/fendermint.toml +++ b/infra/scripts/fendermint.toml @@ -18,7 +18,7 @@ docker run \ --env RUST_BACKTRACE=1 \ --entrypoint ${ENTRY} \ ${FM_DOCKER_IMAGE} \ - --network=${NETWORK_TYPE} \ + --network=${FM_NETWORK} \ ${CMD} """ dependencies = ["docker-network-create", "fendermint-deps"] @@ -54,7 +54,7 @@ docker run \ --env RUST_BACKTRACE=1 \ --entrypoint ${ENTRY} \ ${FM_DOCKER_IMAGE} \ - --network=${NETWORK_TYPE} \ + --network=${FM_NETWORK} \ ${CMD} """ dependencies = ["docker-network-create", "fendermint-deps"] @@ -70,7 +70,7 @@ docker run \ --env RUST_BACKTRACE=1 \ --entrypoint ${ENTRY} \ ${FM_DOCKER_IMAGE} \ - --network=${NETWORK_TYPE} \ + --network=${FM_NETWORK} \ ${CMD} """ dependencies = ["fendermint-deps"] diff --git a/infra/scripts/subnet.toml b/infra/scripts/subnet.toml index 2899b51b..69314728 100644 --- a/infra/scripts/subnet.toml +++ b/infra/scripts/subnet.toml @@ -36,4 +36,4 @@ dependencies = [ [tasks.subnet-fetch-genesis] extend = "fendermint-tool" -env = { "ENTRY" = "fendermint", "CMD" = "--network=${NETWORK_TYPE} genesis --genesis-file ${GENESIS_FILE} ipc from-parent --subnet-id ${SUBNET_ID} -p ${PARENT_ENDPOINT} --parent-gateway ${PARENT_GATEWAY} --parent-registry ${PARENT_REGISTRY} --base-fee ${BASE_FEE} --power-scale ${POWER_SCALE}" } +env = { "ENTRY" = "fendermint", "CMD" = "--network=${FM_NETWORK} genesis --genesis-file ${GENESIS_FILE} ipc from-parent --subnet-id ${SUBNET_ID} -p ${PARENT_ENDPOINT} --parent-gateway ${PARENT_GATEWAY} --parent-registry ${PARENT_REGISTRY} --base-fee ${BASE_FEE} --power-scale ${POWER_SCALE}" } From 321534c8f15cfad2b7bfe5f5fdf7a0e7382c0418 Mon Sep 17 00:00:00 2001 From: raulk Date: Mon, 30 Oct 2023 12:52:01 +0300 Subject: [PATCH 19/31] pull fendermint image from remote. --- infra/Makefile.toml | 4 +++- infra/scripts/fendermint.toml | 4 ++++ infra/scripts/subnet.toml | 1 + infra/scripts/testnet.toml | 1 + infra/scripts/testnode.toml | 1 + 5 files changed, 10 insertions(+), 1 deletion(-) diff --git a/infra/Makefile.toml b/infra/Makefile.toml index ae2d1401..c94c9457 100644 --- a/infra/Makefile.toml +++ b/infra/Makefile.toml @@ -57,7 +57,9 @@ FM_CONTAINER_NAME = "${NETWORK_NAME}-fendermint" ETHAPI_CONTAINER_NAME = "${NETWORK_NAME}-ethapi" CMT_DOCKER_IMAGE = "cometbft/cometbft:v0.37.x" -FM_DOCKER_IMAGE = "fendermint:latest" +FM_DOCKER_TAG = "latest" +FM_DOCKER_IMAGE = "fendermint:${FM_DOCKER_TAG}" +FM_REMOTE_DOCKER_IMAGE = "ghcr.io/consensus-shipyard/fendermint:${FM_DOCKER_TAG}" TEST_DATA_DIR = "${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/fendermint/testing/smoke-test/test-data" TEST_SCRIPTS_DIR = "${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/fendermint/testing/smoke-test/scripts" ACTORS_BUNDLE = "${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/../builtin-actors/output/bundle.car" diff --git a/infra/scripts/fendermint.toml b/infra/scripts/fendermint.toml index 3887fa79..fb074634 100644 --- a/infra/scripts/fendermint.toml +++ b/infra/scripts/fendermint.toml @@ -2,6 +2,10 @@ extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "run", "FLAGS" = "-d" } +[tasks.fendermint-pull] +command = "docker" +args = ["pull", "${FM_REMOTE_DOCKER_IMAGE}"] + [tasks.fendermint-run] script.main = """ docker run \ diff --git a/infra/scripts/subnet.toml b/infra/scripts/subnet.toml index 69314728..5af6ae5c 100644 --- a/infra/scripts/subnet.toml +++ b/infra/scripts/subnet.toml @@ -14,6 +14,7 @@ run_task = "testnode-down" workspace = false dependencies = [ "testnode-down", + "fendermint-pull", "node-init", "docker-network-create", "cometbft-init", diff --git a/infra/scripts/testnet.toml b/infra/scripts/testnet.toml index c87ff6ff..10ad7df6 100644 --- a/infra/scripts/testnet.toml +++ b/infra/scripts/testnet.toml @@ -34,6 +34,7 @@ export GID [tasks.testnet-init] dependencies = [ "testnet-clear", + "fendermint-pull", "docker-network-create", "cometbft-pull", "testnet-mkdir", diff --git a/infra/scripts/testnode.toml b/infra/scripts/testnode.toml index d640b79e..09dddf40 100644 --- a/infra/scripts/testnode.toml +++ b/infra/scripts/testnode.toml @@ -5,6 +5,7 @@ workspace = false dependencies = [ "testnode-down", + "fendermint-pull", "testnode-init", "docker-network-create", "cometbft-init", From 51d2edc0ab3a410832cc0907404b2ffe6af651c5 Mon Sep 17 00:00:00 2001 From: raulk Date: Mon, 30 Oct 2023 13:14:27 +0300 Subject: [PATCH 20/31] fix substitution. --- infra/Makefile.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/infra/Makefile.toml b/infra/Makefile.toml index c94c9457..bed78202 100644 --- a/infra/Makefile.toml +++ b/infra/Makefile.toml @@ -15,9 +15,9 @@ default_to_workspace = false [env] # General network-specific parameters -SUBNET_ID = { value = "/r0", condition = { env_not_set = ["SUBNET_ID"] }} +SUBNET_ID = { value = "/r0", condition = { env_not_set = ["SUBNET_ID"] } } # The network name is derived from the SUBNET_ID, replacing slashes with dashes, and dropping the first dash if any. -NETWORK_NAME = { script = ["echo ${SUBNET_ID/\\//-} | sed -E 's/^-//1'"] } +NETWORK_NAME = { script = ["echo $SUBNET_ID | sed -e 's/\\//-/g' -e 's/^-//1'"] } BALANCE = { value = "1000", condition = { env_not_set = ["BALANCE"] }} BASE_FEE = { value = "1000", condition = { env_not_set = ["BASE_FEE"] }} From 03f27af88c46dd5089d9821731d864d2e72dc126 Mon Sep 17 00:00:00 2001 From: raulk Date: Mon, 30 Oct 2023 13:17:57 +0300 Subject: [PATCH 21/31] FM_PULL_SKIP to skip pulling Fendermint image. --- infra/scripts/fendermint.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/infra/scripts/fendermint.toml b/infra/scripts/fendermint.toml index fb074634..99242b00 100644 --- a/infra/scripts/fendermint.toml +++ b/infra/scripts/fendermint.toml @@ -3,6 +3,7 @@ extend = "fendermint-run" env = { "ENTRY" = "fendermint", "CMD" = "run", "FLAGS" = "-d" } [tasks.fendermint-pull] +condition = { env_not_set = ["FM_PULL_SKIP"], fail_message = "Skipped pulling fendermint Docker image." } command = "docker" args = ["pull", "${FM_REMOTE_DOCKER_IMAGE}"] From b3fb1647386fb7138237606c45cc94c5707d6903 Mon Sep 17 00:00:00 2001 From: raulk Date: Mon, 30 Oct 2023 13:29:43 +0300 Subject: [PATCH 22/31] move build prerequisites to new 'Build from source' section. ... since the infra scripts now use Docker images. --- README.md | 14 ++++++++++++-- docs/localnet.md | 13 +++++-------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 96a27bb1..24713b60 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ Fendermint is an effort to implement [IPC with Tendermint Core](https://docs.google.com/document/d/1cFoTdoRuYgxmWJia6K-b5vmEj-4MvyHCNvShZpyconU/edit#). There is a preliminary [roadmap](https://docs.google.com/spreadsheets/d/1eVwkHEPGNg0js8DKRDIX7sugf5JqbI9zRBddIqzJFfI/edit#gid=0) that lays out the tasks towards implementing subnets that run IPLD and FVM under the Filecoin rootnet, sharing components with the Lotus/Eudico based implementation. ## Quick Start + - [Local testnets](./docs/localnet.md) ## Docs @@ -10,8 +11,19 @@ Fendermint is an effort to implement [IPC with Tendermint Core](https://docs.goo Please have a look in the [docs](./docs/README.md) to see an overview of the project, how to run the components, and previous demos. ## IPC + Fendermint is built with support for [IPC](https://github.com/consensus-shipyard/ipc) by design. If you are looking to deploy the infrastructure Fendermint-based IPC subnet, refer to the [IPC main repo](https://github.com/consensus-shipyard/ipc), or have a look at the [IPC infrastructure docs](./docs/ipc.md). +## Building from source + +**Linux.** Install the following pre-requisites (instructions for Ubuntu): + +- Install system packages: `sudo apt install build-essential clang cmake pkg-config libssl-dev protobuf-compiler`. +- Install Rust. See [instructions](https://www.rust-lang.org/tools/install). +- Install cargo-make: `cargo install --force cargo-make`. +- Install Foundry. See [instructions](https://book.getfoundry.sh/getting-started/installation). +- Install Docker (if you intend to build Docker images). See [instructions](https://docs.docker.com/engine/install/ubuntu/). + ## Testing The following command runs unit and integration tests: @@ -28,7 +40,6 @@ while the next command builds docker images and runs an end-to-end test using th make e2e ``` - ## IPC Solidity Actors We generate Rust bindings for the Solidity actors we need to invoke from the [ipc-solidity-actors](https://github.com/consensus-shipyard/ipc-solidity-actors) library, some of which are deployed during the genesis process. The bindings live in [ipc_actors](./fendermint/vm/ipc_actors/), and are generated automatically during the build, or with the following command: @@ -47,7 +58,6 @@ To test whether the genesis process works, we can run the following unit test: cargo test --release -p fendermint_vm_interpreter load_genesis ``` - ## Pre-built Docker Image The CI build publishes a [Docker image](https://github.com/consensus-shipyard/fendermint/pkgs/container/fendermint) to Github Container Registry upon a successful build on the `main` branch. This is the same image as the one used in the End-to-End tests; it contains the built-in actor bundle and IPC Solidity actors, ready to be deployed during genesis. diff --git a/docs/localnet.md b/docs/localnet.md index 2eea8f4a..363ee795 100644 --- a/docs/localnet.md +++ b/docs/localnet.md @@ -11,17 +11,14 @@ This guide offers two flavours: On Linux (links and instructions for Ubuntu): -- Install system packages: `sudo apt install build-essential clang cmake pkg-config libssl-dev protobuf-compiler`. -- Install Rust. See [instructions](https://www.rust-lang.org/tools/install). -- Install cargo-make: `cargo install --force cargo-make`. - Install Docker. See [instructions](https://docs.docker.com/engine/install/ubuntu/). -- Install Foundry. See [instructions](https://book.getfoundry.sh/getting-started/installation). -## Build Fendermint +## Docker images -```bash -make actor-bundle build docker-build -``` +These commands will pull various Docker images from remote repositories, including `fendermint:latest`, by default. + +- To override which fendermint Docker image to pull, set the `FM_DOCKER_TAG` env variable to the desired tag. +- To use an image built locally, set the `FM_PULL_SKIP` env variable to some value, e.g. `FM_PULL_SKIP=true`. ## Single node deployment From d9ccb5013eaaf794fb89311dee19987422fa1285 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Mon, 30 Oct 2023 19:12:17 +0100 Subject: [PATCH 23/31] FIX: remove duplicate --network flag --- infra/scripts/subnet.toml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/infra/scripts/subnet.toml b/infra/scripts/subnet.toml index 5af6ae5c..ce3b3e2b 100644 --- a/infra/scripts/subnet.toml +++ b/infra/scripts/subnet.toml @@ -26,9 +26,6 @@ dependencies = [ "ethapi-start" ] -# Subnet validator -# ENV variable for where things are put. -# Merge everything and test [tasks.subnet-config] dependencies = [ "subnet-fetch-genesis", @@ -37,4 +34,4 @@ dependencies = [ [tasks.subnet-fetch-genesis] extend = "fendermint-tool" -env = { "ENTRY" = "fendermint", "CMD" = "--network=${FM_NETWORK} genesis --genesis-file ${GENESIS_FILE} ipc from-parent --subnet-id ${SUBNET_ID} -p ${PARENT_ENDPOINT} --parent-gateway ${PARENT_GATEWAY} --parent-registry ${PARENT_REGISTRY} --base-fee ${BASE_FEE} --power-scale ${POWER_SCALE}" } +env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file ${GENESIS_FILE} ipc from-parent --subnet-id ${SUBNET_ID} -p ${PARENT_ENDPOINT} --parent-gateway ${PARENT_GATEWAY} --parent-registry ${PARENT_REGISTRY} --base-fee ${BASE_FEE} --power-scale ${POWER_SCALE}" } From cd91a38c47945325901b5b4f5acdcc38a97eee8d Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Mon, 30 Oct 2023 19:27:37 +0100 Subject: [PATCH 24/31] FIX: add cargo-make as a dependency for localnet --- docs/localnet.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/localnet.md b/docs/localnet.md index 363ee795..34bd729c 100644 --- a/docs/localnet.md +++ b/docs/localnet.md @@ -12,6 +12,8 @@ This guide offers two flavours: On Linux (links and instructions for Ubuntu): - Install Docker. See [instructions](https://docs.docker.com/engine/install/ubuntu/). +- Install Rust. See [instructions](https://www.rust-lang.org/tools/install). +- Install cargo-make: `cargo install --force cargo-make`. ## Docker images From cbbb9b01617e3d2973ebff11cd74f7269cb01165 Mon Sep 17 00:00:00 2001 From: raulk Date: Mon, 30 Oct 2023 14:37:41 +0300 Subject: [PATCH 25/31] small edits. --- docs/localnet.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/localnet.md b/docs/localnet.md index 34bd729c..7b4310c8 100644 --- a/docs/localnet.md +++ b/docs/localnet.md @@ -19,8 +19,8 @@ On Linux (links and instructions for Ubuntu): These commands will pull various Docker images from remote repositories, including `fendermint:latest`, by default. -- To override which fendermint Docker image to pull, set the `FM_DOCKER_TAG` env variable to the desired tag. -- To use an image built locally, set the `FM_PULL_SKIP` env variable to some value, e.g. `FM_PULL_SKIP=true`. +- To override which Fendermint Docker image to pull, set the `FM_DOCKER_TAG` env variable to the desired tag. +- To use a local Fendermint image, set the `FM_PULL_SKIP` env variable to some value, e.g. `FM_PULL_SKIP=true`. ## Single node deployment From 46b4240060841f545b05f1cc90fac9a545b9418c Mon Sep 17 00:00:00 2001 From: raulk Date: Mon, 30 Oct 2023 21:30:34 +0300 Subject: [PATCH 26/31] infra: subnet validator now loads private key correctly. You'll need to place it under ~/.ipc/keys/validator_key.sk --- infra/scripts/subnet.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/infra/scripts/subnet.toml b/infra/scripts/subnet.toml index ce3b3e2b..5bd4d5fc 100644 --- a/infra/scripts/subnet.toml +++ b/infra/scripts/subnet.toml @@ -29,6 +29,7 @@ dependencies = [ [tasks.subnet-config] dependencies = [ "subnet-fetch-genesis", + "testnode-export-keys", "genesis-write", ] From 9bce2c547d47122a8dc7323274c284f1346d11bb Mon Sep 17 00:00:00 2001 From: raulk Date: Mon, 30 Oct 2023 23:08:45 +0300 Subject: [PATCH 27/31] extract bootstrap infra scripts. --- infra/Makefile.toml | 3 ++- infra/scripts/bootstrap.toml | 11 +++++++++++ infra/scripts/node.toml | 12 ------------ 3 files changed, 13 insertions(+), 13 deletions(-) create mode 100644 infra/scripts/bootstrap.toml diff --git a/infra/Makefile.toml b/infra/Makefile.toml index bed78202..a5c61444 100644 --- a/infra/Makefile.toml +++ b/infra/Makefile.toml @@ -7,7 +7,8 @@ extend = [ { path = "scripts/node.toml" }, { path = "scripts/testnet.toml" }, { path = "scripts/testnode.toml" }, - { path = "scripts/subnet.toml" } + { path = "scripts/subnet.toml" }, + { path = "scripts/bootstrap.toml" }, ] [config] diff --git a/infra/scripts/bootstrap.toml b/infra/scripts/bootstrap.toml new file mode 100644 index 00000000..89ae3557 --- /dev/null +++ b/infra/scripts/bootstrap.toml @@ -0,0 +1,11 @@ +[tasks.bootstrap] +env = { "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/bootstrap/cometbft", "CMT_CONTAINER_NAME" = "cometbft-${NODE_NAME}-bootstrap" } +run_task = "new-node" + +[tasks.bootstrap-id] +env = { "CMT_CONTAINER_NAME" = "cometbft-${NODE_NAME}-bootstrap" } +run_task = "cometbft-node-id" + +[tasks.bootstrap-down] +env = { "CMT_CONTAINER_NAME" = "cometbft-${NODE_NAME}-bootstrap" } +run_task = "node-down" \ No newline at end of file diff --git a/infra/scripts/node.toml b/infra/scripts/node.toml index 82a00140..91c46892 100644 --- a/infra/scripts/node.toml +++ b/infra/scripts/node.toml @@ -2,18 +2,6 @@ # Node helpers ######################################################################################################################## -[tasks.bootstrap] -env = { "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/bootstrap/cometbft", "CMT_CONTAINER_NAME" = "cometbft-${NODE_NAME}-bootstrap" } -run_task = "new-node" - -[tasks.bootstrap-id] -env = { "CMT_CONTAINER_NAME" = "cometbft-${NODE_NAME}-bootstrap" } -run_task = "cometbft-node-id" - -[tasks.bootstrap-down] -env = { "CMT_CONTAINER_NAME" = "cometbft-${NODE_NAME}-bootstrap" } -run_task = "node-down" - [tasks.node-down] dependencies = [ "cometbft-stop", From a0f7158cd52c761a38474bd76966579b08e93f69 Mon Sep 17 00:00:00 2001 From: raulk Date: Mon, 30 Oct 2023 23:09:37 +0300 Subject: [PATCH 28/31] normalize .ipc directory structure to /. --- infra/Makefile.toml | 7 +++---- infra/scripts/genesis.toml | 12 ++++++------ infra/scripts/testnet.toml | 29 ++++++++--------------------- infra/scripts/testnode.toml | 6 +++--- 4 files changed, 20 insertions(+), 34 deletions(-) diff --git a/infra/Makefile.toml b/infra/Makefile.toml index a5c61444..0493f1f9 100644 --- a/infra/Makefile.toml +++ b/infra/Makefile.toml @@ -35,17 +35,16 @@ PARENT_ENDPOINT = { value = "https://api.calibration.node.glif.io/rpc/v1", condi PARENT_GATEWAY = { value = "0x56948d2CFaa2EF355B8C08Ac925202db212146D1", condition = { env_not_set = ["PARENT_GATEWAY"] } } PARENT_REGISTRY = { value = "0x6A4884D2B6A597792dC68014D4B7C117cca5668e", condition = { env_not_set = ["PARENT_REGISTRY"] } } FM_NETWORK = { value = "test", condition = { env_not_set = ["FM_NETWORK"] } } -VALIDATOR_PRIV_KEY = { value = "~/.ipc/priv.key", condition = { env_not_set = ["VALIDATOR_PRIV_KEY"] } } TOPDOWN_CHAIN_HEAD_DELAY = { value = "10", condition = { env_not_set = ["TOPDOWN_CHAIN_HEAD_DELAY"] } } # Comma-separated list of bootstrap nodes to be used by the CometBFT node. BOOTSTRAPS = { value = "", condition = { env_not_set = ["BOOTSTRAPS"] } } # Deployment-related BASE_DIR="${HOME}/.ipc/${NETWORK_NAME}" -FM_DIR="${BASE_DIR}/fendermint" -CMT_DIR="${BASE_DIR}/cometbft" +FM_DIR="${BASE_DIR}/${NODE_NAME}/fendermint" +CMT_DIR="${BASE_DIR}/${NODE_NAME}/cometbft" -GENESIS_FILE="${FM_DIR}/genesis.json" +GENESIS_FILE="${BASE_DIR}/genesis.json" KEYS_SUBDIR="keys" KEY_NAME="validator_key" PUB_KEY_PATH="${KEYS_SUBDIR}/${KEY_NAME}.pk" diff --git a/infra/scripts/genesis.toml b/infra/scripts/genesis.toml index 18648f8d..88798065 100644 --- a/infra/scripts/genesis.toml +++ b/infra/scripts/genesis.toml @@ -7,24 +7,24 @@ env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.js ## - KEY_NAME: name of the key. [tasks.genesis-new-key] extend = "fendermint-tool" -env = { "ENTRY" = "fendermint", "CMD" = "key gen --out-dir /data/${KEYS_SUBDIR} --name ${KEY_NAME}" } -script.pre = "mkdir -p ${BASE_DIR}/${KEYS_SUBDIR}" -script.post = "chmod 600 ${BASE_DIR}/${KEYS_SUBDIR}/${KEY_NAME}.sk" +env = { "ENTRY" = "fendermint", "CMD" = "key gen --out-dir /data/${NODE_NAME}/${KEYS_SUBDIR} --name ${KEY_NAME}" } +script.pre = "mkdir -p ${BASE_DIR}/${NODE_NAME}/${KEYS_SUBDIR}" +script.post = "chmod 600 ${BASE_DIR}/${NODE_NAME}/${KEYS_SUBDIR}/${KEY_NAME}.sk" [tasks.genesis-new-accounts] dependencies = ["genesis-new-account-f1", "genesis-new-account-eth"] [tasks.genesis-new-account-f1] extend = "fendermint-tool" -env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-account --public-key /data/${PUB_KEY_PATH} --balance ${BALANCE}" } +env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-account --public-key /data/${NODE_NAME}/${PUB_KEY_PATH} --balance ${BALANCE}" } [tasks.genesis-new-account-eth] extend = "fendermint-tool" -env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-account --kind ethereum --public-key /data/${PUB_KEY_PATH} --balance ${BALANCE}" } +env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-account --kind ethereum --public-key /data/${NODE_NAME}/${PUB_KEY_PATH} --balance ${BALANCE}" } [tasks.genesis-add-validator] extend = "fendermint-tool" -env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-validator --public-key /data/${PUB_KEY_PATH} --power 1" } +env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json add-validator --public-key /data/${NODE_NAME}/${PUB_KEY_PATH} --power 1" } [tasks.genesis-new-gateway] extend = "fendermint-tool" diff --git a/infra/scripts/testnet.toml b/infra/scripts/testnet.toml index 10ad7df6..30096efd 100644 --- a/infra/scripts/testnet.toml +++ b/infra/scripts/testnet.toml @@ -52,32 +52,20 @@ nodes = range 0 4 for i in ${nodes} NUMBER = set ${i} - NODE_DIR = set "node${NUMBER}" - KEYS_SUBDIR = set "${NODE_DIR}/keys" - KEY_NAME = set "validator${NUMBER}" + NODE_NAME = set "node${NUMBER}" - mkdir -p ${BASE_DIR}/${NODE_DIR} - mkdir -p ${BASE_DIR}/${NODE_DIR}/fendermint - mkdir -p ${BASE_DIR}/${NODE_DIR}/cometbft + mkdir -p ${BASE_DIR}/${NODE_NAME} + mkdir -p ${BASE_DIR}/${NODE_NAME}/fendermint + mkdir -p ${BASE_DIR}/${NODE_NAME}/cometbft - set_env NODE_DIR ${NODE_DIR} + set_env NODE_NAME ${NODE_NAME} set_env NUMBER ${NUMBER} cm_run_task testnet-cometbft-init - - set_env KEYS_SUBDIR ${KEYS_SUBDIR} - set_env KEY_NAME ${KEY_NAME} - cm_run_task genesis-new-key - - set_env PUB_KEY_PATH "${KEYS_SUBDIR}/${KEY_NAME}.pk" - set_env PRIV_KEY_PATH "${KEYS_SUBDIR}/${KEY_NAME}.sk" - cm_run_task genesis-new-accounts cm_run_task genesis-add-validator - set_env COMETBFT_SUBDIR ${NODE_DIR}/cometbft - IP_LAST = calc ${NUMBER}+2 NETWORK_ADDR = set "192.167.10.${IP_LAST}:26656" set_env NETWORK_ADDR ${NETWORK_ADDR} @@ -97,18 +85,17 @@ rm -rf ${BASE_DIR} [tasks.testnet-mkdir] script=""" -mkdir -p $BASE_DIR -mkdir -p $BASE_DIR/out +mkdir -p ${BASE_DIR} """ [tasks.testnet-cometbft-init] extend = "cometbft-init" -env = { "CMD" = "init", "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/${NODE_DIR}/cometbft", "CMT_CONTAINER_NAME" = "cometbft-node${NUMBER}", "FLAGS" = "-a STDOUT -a STDERR --rm"} +env = { "CMD" = "init", "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/${NODE_NAME}/cometbft", "CMT_CONTAINER_NAME" = "cometbft-node${NUMBER}", "FLAGS" = "-a STDOUT -a STDERR --rm"} [tasks.testnet-add-peer] extend = "fendermint-tool" env = { "ENTRY" = "fendermint", "CMD" = """key add-peer \ - --node-key-file /data/${COMETBFT_SUBDIR}/config/node_key.json \ + --node-key-file /data/${NODE_NAME}/${COMETBFT_SUBDIR}/config/node_key.json \ --network-addr ${NETWORK_ADDR} \ --local-peers-file /data/peers \ """ } diff --git a/infra/scripts/testnode.toml b/infra/scripts/testnode.toml index 09dddf40..8698a381 100644 --- a/infra/scripts/testnode.toml +++ b/infra/scripts/testnode.toml @@ -66,8 +66,8 @@ dependencies = [ [tasks.testnode-export-keys] extend = "fendermint-tool" -env = { "ENTRY" = "fendermint", "CMD" = "key into-tendermint --secret-key /data/${PRIV_KEY_PATH} --out /data/${COMETBFT_SUBDIR}/config/priv_validator_key.json" } -script.post = "chmod 600 ${BASE_DIR}/${COMETBFT_SUBDIR}/config/priv_validator_key.json" +env = { "ENTRY" = "fendermint", "CMD" = "key into-tendermint --secret-key /data/${NODE_NAME}/${PRIV_KEY_PATH} --out /data/${NODE_NAME}/${COMETBFT_SUBDIR}/config/priv_validator_key.json" } +script.post = "chmod 600 ${BASE_DIR}/${NODE_NAME}/${COMETBFT_SUBDIR}/config/priv_validator_key.json" [tasks.testnode-report] script = """cat << EOF @@ -84,7 +84,7 @@ Accounts: $(jq -r '.accounts[] | "\t\\(.meta.Account.owner): \\(.balance) coin units"' ${BASE_DIR}/genesis.json) Private key (hex ready to import in MetaMask): -\t$(cat ${BASE_DIR}/${PRIV_KEY_PATH} | base64 -d | xxd -p -c 1000000) +\t$(cat ${BASE_DIR}/${NODE_NAME}/${PRIV_KEY_PATH} | base64 -d | xxd -p -c 1000000) Note: both accounts use the same private key @ ${BASE_DIR}/${PRIV_KEY_PATH} From daed22c2e0d298958b80956145a0ea8ce1990de3 Mon Sep 17 00:00:00 2001 From: raulk Date: Mon, 30 Oct 2023 23:10:09 +0300 Subject: [PATCH 29/31] rework subnet infra scripts. --- infra/scripts/subnet.toml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/infra/scripts/subnet.toml b/infra/scripts/subnet.toml index 5bd4d5fc..9b385fd1 100644 --- a/infra/scripts/subnet.toml +++ b/infra/scripts/subnet.toml @@ -2,15 +2,10 @@ # Child subnet peer ######################################################################################################################## -[tasks.child-validator] -env = { "BASE_DIR"="${HOME}/.ipc/${NODE_NAME}", "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/cometbft", "FM_DIR"="${BASE_DIR}/fendermint", "CMT_CONTAINER_NAME" = "cometbft-${NODE_NAME}", "ETHAPI_CONTAINER_NAME" = "eth-${NODE_NAME}", "FM_CONTAINER_NAME"= "fendermint-${NODE_NAME}", "GENESIS_FILE"="${FM_DIR}/genesis.json" } -run_task = "validator-run" - [tasks.child-validator-down] -env = { "BASE_DIR"="${HOME}/.ipc/${NODE_NAME}", "NETWORK_NAME"="${NETWORK_NAME}", "CMT_DIR" = "${BASE_DIR}/cometbft", "FM_DIR"="${BASE_DIR}/fendermint", "CMT_CONTAINER_NAME" = "cometbft-${NODE_NAME}", "ETHAPI_CONTAINER_NAME" = "eth-${NODE_NAME}", "FM_CONTAINER_NAME"= "fendermint-${NODE_NAME}", "GENESIS_FILE"="${FM_DIR}/genesis.json" } run_task = "testnode-down" -[tasks.validator-run] +[tasks.child-validator] workspace = false dependencies = [ "testnode-down", @@ -29,10 +24,16 @@ dependencies = [ [tasks.subnet-config] dependencies = [ "subnet-fetch-genesis", + "subnet-convert-eth-key", "testnode-export-keys", "genesis-write", ] +[tasks.subnet-convert-eth-key] +extend = "fendermint-tool" +env = { "ENTRY" = "fendermint", "CMD" = "key eth-to-fendermint --secret-key /data/${NODE_NAME}/${KEYS_SUBDIR}/eth.sk --name validator_key --out-dir /data/${NODE_NAME}/${KEYS_SUBDIR}" } +script.pre = "mkdir ${BASE_DIR}/${NODE_NAME}/${KEYS_SUBDIR}; cp ${PRIVATE_KEY_PATH} ${BASE_DIR}/${NODE_NAME}/keys/eth.sk" + [tasks.subnet-fetch-genesis] extend = "fendermint-tool" -env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file ${GENESIS_FILE} ipc from-parent --subnet-id ${SUBNET_ID} -p ${PARENT_ENDPOINT} --parent-gateway ${PARENT_GATEWAY} --parent-registry ${PARENT_REGISTRY} --base-fee ${BASE_FEE} --power-scale ${POWER_SCALE}" } +env = { "ENTRY" = "fendermint", "CMD" = "genesis --genesis-file /data/genesis.json ipc from-parent --subnet-id ${SUBNET_ID} -p ${PARENT_ENDPOINT} --parent-gateway ${PARENT_GATEWAY} --parent-registry ${PARENT_REGISTRY} --base-fee ${BASE_FEE} --power-scale ${POWER_SCALE}" } From 867fad24b05a257bc7f4e7ea3cb9b7cc8fad7749 Mon Sep 17 00:00:00 2001 From: raulk Date: Mon, 30 Oct 2023 23:59:06 +0300 Subject: [PATCH 30/31] CI: test infra scripts. --- .github/workflows/infra-test.yaml | 41 +++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .github/workflows/infra-test.yaml diff --git a/.github/workflows/infra-test.yaml b/.github/workflows/infra-test.yaml new file mode 100644 index 00000000..592ea826 --- /dev/null +++ b/.github/workflows/infra-test.yaml @@ -0,0 +1,41 @@ +name: Infra test + +on: + workflow_call: + + ## TMP TODO REMOVE Only for testing + pull_request: + branches: + - '**' + # To add ready_for_review as a trigger we need to list all the defaults. + types: + - opened + - reopened + - synchronize + - ready_for_review + +jobs: + test: + name: Test infra scripts + runs-on: ubuntu-latest + steps: + - name: Check out the project + uses: actions/checkout@v4 + - name: Install Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: nightly + components: rustfmt + - name: Install cargo-make + run: | + cargo install --force cargo-make + - name: Run testnode + run: | + cargo make --makefile ./infra/Makefile.toml testnode + ## TODO run a smoke test + cargo make --makefile ./infra/Makefile.toml testnode-down + - name: Run testnet + run: | + cargo make --makefile ./infra/Makefile.toml testnet + ## TODO run a smoke test + cargo make --makefile ./infra/Makefile.toml testnet-down \ No newline at end of file From 9bef0fc32245054c1d36c2b3879fc8bd2deb2fd8 Mon Sep 17 00:00:00 2001 From: raulk Date: Tue, 31 Oct 2023 00:27:28 +0300 Subject: [PATCH 31/31] alias remotely pulled image. --- infra/scripts/fendermint.toml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/infra/scripts/fendermint.toml b/infra/scripts/fendermint.toml index 99242b00..a37fd428 100644 --- a/infra/scripts/fendermint.toml +++ b/infra/scripts/fendermint.toml @@ -4,8 +4,10 @@ env = { "ENTRY" = "fendermint", "CMD" = "run", "FLAGS" = "-d" } [tasks.fendermint-pull] condition = { env_not_set = ["FM_PULL_SKIP"], fail_message = "Skipped pulling fendermint Docker image." } -command = "docker" -args = ["pull", "${FM_REMOTE_DOCKER_IMAGE}"] +script = """ + docker pull ghcr.io/consensus-shipyard/fendermint:${FM_DOCKER_TAG} + docker tag ghcr.io/consensus-shipyard/fendermint:${FM_DOCKER_TAG} fendermint:${FM_DOCKER_TAG} +""" [tasks.fendermint-run] script.main = """