From 662b4d2fffefd4709effde2bc2bdc5e8b6961951 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Tue, 17 May 2022 10:52:32 +0200 Subject: [PATCH] Modified docker setup to start 2 validators in local consensus (#1270) it was mostly for my own needs, but figured I might create separate PR for that --- docker-compose.yml | 216 ++++++++++++++++------------- docker/mnemonic_echo/entrypoint.sh | 11 +- docker/validator/init_and_start.sh | 39 ++++-- 3 files changed, 156 insertions(+), 110 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index c171939da4..5e979080f6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,106 +1,122 @@ version: '3.7' -x-bech32-prefix: &BECH32_PREFIX - nymt -x-wasmd-version: &WASMD_VERSION - v0.21.0 -x-wasmd-commit-hash: &WASMD_COMMIT_HASH - 1d436638af7cacb5aeeb7248b57b085c64f3ae35 + +x-network: &NETWORK + BECH32_PREFIX: nymt + DENOM: nymt + STAKE_DENOM: nyxt + WASMD_VERSION: v0.26.0 + WASMD_COMMIT_HASH: dc5ef6fe84f0a5e3b0894692a18cc48fb5b00adf services: - genesis_validator: - build: - context: docker/validator - args: - BECH32_PREFIX: *BECH32_PREFIX - WASMD_VERSION: *WASMD_VERSION - WASMD_COMMIT_HASH: *WASMD_COMMIT_HASH - image: validator:latest - ports: - - "26657:26657" - - "1317:1317" - container_name: genesis_validator - volumes: - - "genesis_volume:/genesis_volume" - environment: - BECH32_PREFIX: *BECH32_PREFIX - WASMD_VERSION: *WASMD_VERSION - command: ["genesis"] - secondary_validator: - build: - context: docker/validator - args: - BECH32_PREFIX: *BECH32_PREFIX - WASMD_VERSION: *WASMD_VERSION - image: validator:latest - volumes: - - "genesis_volume:/genesis_volume:ro" - environment: - BECH32_PREFIX: *BECH32_PREFIX - WASMD_VERSION: *WASMD_VERSION - depends_on: - - "genesis_validator" - command: ["secondary"] - mixnet_contract: - build: docker/mixnet_contract - image: contract:latest - volumes: - - ".:/nym" - vesting_contract: - build: docker/vesting_contract - image: vesting_contract:latest - volumes: - - ".:/nym" - contract_uploader: - build: docker/typescript_client - image: contract_uploader:typescript - volumes: - - "genesis_volume:/genesis_volume:ro" - - "contract_volume:/contract_volume" - - ".:/nym" - depends_on: - - "genesis_validator" - - "secondary_validator" - - "mixnet_contract" - environment: - BECH32_PREFIX: *BECH32_PREFIX - mnemonic_echo: - build: docker/mnemonic_echo - image: mnemonic_echo:latest - volumes: - - "genesis_volume:/genesis_volume:ro" - depends_on: - - "genesis_validator" + genesis_validator: + build: + context: docker/validator + args: *NETWORK + image: validator:latest + ports: + - "26657:26657" + - "1317:1317" + container_name: genesis_validator + volumes: + - "genesis_volume:/genesis_volume" + - "genesis_nymd:/root/.nymd" + environment: *NETWORK + networks: + localnet: + ipv4_address: 172.168.10.2 + command: [ "genesis" ] + secondary_validator: + build: + context: docker/validator + args: *NETWORK + image: validator:latest + ports: + - "36657:26657" + - "2317:1317" + volumes: + - "genesis_volume:/genesis_volume" + - "secondary_nymd:/root/.nymd" + environment: *NETWORK + networks: + localnet: + ipv4_address: 172.168.10.3 + depends_on: + - "genesis_validator" + command: [ "secondary" ] + # mixnet_contract: + # build: docker/mixnet_contract + # image: contract:latest + # volumes: + # - ".:/nym" + # vesting_contract: + # build: docker/vesting_contract + # image: vesting_contract:latest + # volumes: + # - ".:/nym" + # contract_uploader: + # build: docker/typescript_client + # image: contract_uploader:typescript + # volumes: + # - "genesis_volume:/genesis_volume:ro" + # - "contract_volume:/contract_volume" + # - ".:/nym" + # depends_on: + # - "genesis_validator" + # - "secondary_validator" + # - "mixnet_contract" + # environment: + # BECH32_PREFIX: *BECH32_PREFIX + mnemonic_echo: + build: docker/mnemonic_echo + image: mnemonic_echo:latest + volumes: + - "genesis_volume:/genesis_volume:ro" + depends_on: + - "genesis_validator" + - "secondary_validator" - mongo: - image: mongo:latest - command: - - --storageEngine=wiredTiger - volumes: - - mongo_data:/data/db - block_explorer: - build: - context: https://github.com/forbole/big-dipper.git#v0.41.x-7 - image: block_explorer:v0.41.x-7 - ports: - - "3080:3000" - depends_on: - - "mongo" - environment: - ROOT_URL: ${APP_ROOT_URL:-http://localhost} - MONGO_URL: mongodb://mongo:27017/meteor - PORT: 3000 - METEOR_SETTINGS: ${METEOR_SETTINGS} - explorer: - build: - context: docker/explorer - image: explorer:latest - ports: - - "3040:3000" - depends_on: - - "genesis_validator" - - "block_explorer" +# mongo: +# image: mongo:latest +# command: +# - --storageEngine=wiredTiger +# volumes: +# - mongo_data:/data/db +# block_explorer: +# build: +# context: https://github.com/forbole/big-dipper.git#v0.41.x-7 +# image: block_explorer:v0.41.x-7 +# ports: +# - "3080:3000" +# depends_on: +# - "mongo" +# environment: +# ROOT_URL: ${APP_ROOT_URL:-http://localhost} +# MONGO_URL: mongodb://mongo:27017/meteor +# PORT: 3000 +# METEOR_SETTINGS: ${METEOR_SETTINGS} +# explorer: +# build: +# context: docker/explorer +# image: explorer:latest +# ports: +# - "3040:3000" +# depends_on: +# - "genesis_validator" +# - "block_explorer" volumes: - genesis_volume: - contract_volume: - mongo_data: + genesis_volume: + genesis_nymd: + secondary_nymd: + +# contract_volume: +# mongo_data: + + +networks: + localnet: + driver: bridge + ipam: + driver: default + config: + - subnet: 172.168.10.0/25 \ No newline at end of file diff --git a/docker/mnemonic_echo/entrypoint.sh b/docker/mnemonic_echo/entrypoint.sh index 051a81583b..8c8a94aec3 100755 --- a/docker/mnemonic_echo/entrypoint.sh +++ b/docker/mnemonic_echo/entrypoint.sh @@ -1,9 +1,16 @@ #!/bin/sh -# Wait for the mnemonic to be generated +# Wait for the mnemonic(s) to be generated while ! [ -s /genesis_volume/genesis_mnemonic ]; do sleep 1 done -echo "This is the current mnemonic:" +while ! [ -s /genesis_volume/secondary_mnemonic ]; do + sleep 1 +done + +echo "This is the current genesis mnemonic:" cat /genesis_volume/genesis_mnemonic + +echo "This is the current secondary mnemonic:" +cat /genesis_volume/secondary_mnemonic diff --git a/docker/validator/init_and_start.sh b/docker/validator/init_and_start.sh index dbe15a1307..722e7224d2 100755 --- a/docker/validator/init_and_start.sh +++ b/docker/validator/init_and_start.sh @@ -6,17 +6,29 @@ PASSPHRASE=passphrase cd /root if [ "$1" = "genesis" ]; then - if [ ! -d "/root/.nymd" ]; then + if [ ! -f "/root/.nymd/config/genesis.json" ]; then ./nymd init nymnet --chain-id nymnet 2> /dev/null - sed -i 's/minimum-gas-prices = ""/minimum-gas-prices = "0.025u'"${BECH32_PREFIX}"'"/' /root/.nymd/config/app.toml + # staking/governance token is hardcoded in config, change this + sed -i "s/\"stake\"/\"u${STAKE_DENOM}\"/" /root/.nymd/config/genesis.json + sed -i 's/minimum-gas-prices = ""/minimum-gas-prices = "0.025u'"${DENOM}"'"/' /root/.nymd/config/app.toml sed -i '0,/enable = false/s//enable = true/g' /root/.nymd/config/app.toml sed -i 's/cors_allowed_origins = \[\]/cors_allowed_origins = \["*"\]/' /root/.nymd/config/config.toml sed -i 's/create_empty_blocks = true/create_empty_blocks = false/' /root/.nymd/config/config.toml sed -i 's/laddr = "tcp:\/\/127.0.0.1:26657"/laddr = "tcp:\/\/0.0.0.0:26657"/' /root/.nymd/config/config.toml - yes "${PASSPHRASE}" | ./nymd keys add node_admin 2>&1 >/dev/null | tail -n 1 > /genesis_volume/genesis_mnemonic - ADDRESS=$(yes "${PASSPHRASE}" | ./nymd keys show node_admin -a) - yes "${PASSPHRASE}" | ./nymd add-genesis-account "${ADDRESS}" 1000000000000000u${BECH32_PREFIX},1000000000000000stake - yes "${PASSPHRASE}" | ./nymd gentx node_admin 1000000000stake --chain-id nymnet 2> /dev/null + +# create accounts + yes "${PASSPHRASE}" | ./nymd keys add node_admin 2>&1 >/dev/null | tail -n 1 > /root/.nymd/mnemonic + yes "${PASSPHRASE}" | ./nymd keys add secondary 2>&1 >/dev/null | tail -n 1 > /root/.nymd/secondary_mnemonic + cp /root/.nymd/mnemonic /genesis_volume/genesis_mnemonic + cp /root/.nymd/secondary_mnemonic /genesis_volume/secondary_mnemonic + +# add genesis accounts with some initial tokens + GENESIS_ADDRESS=$(yes "${PASSPHRASE}" | ./nymd keys show node_admin -a) + SECONDARY_ADDRESS=$(yes "${PASSPHRASE}" | ./nymd keys show secondary -a) + yes "${PASSPHRASE}" | ./nymd add-genesis-account "${GENESIS_ADDRESS}" 1000000000000000u"${DENOM}",1000000000000000u"${STAKE_DENOM}" + yes "${PASSPHRASE}" | ./nymd add-genesis-account "${SECONDARY_ADDRESS}" 1000000000000000u"${DENOM}",1000000000000000u"${STAKE_DENOM}" + + yes "${PASSPHRASE}" | ./nymd gentx node_admin 1000000000u"${STAKE_DENOM}" --chain-id nymnet 2> /dev/null ./nymd collect-gentxs 2> /dev/null ./nymd validate-genesis > /dev/null cp /root/.nymd/config/genesis.json /genesis_volume/genesis.json @@ -26,7 +38,7 @@ if [ "$1" = "genesis" ]; then fi ./nymd start elif [ "$1" = "secondary" ]; then - if [ ! -d "/root/.nymd" ]; then + if [ ! -f "/root/.nymd/config/genesis.json" ]; then ./nymd init nymnet --chain-id nym-secondary 2> /dev/null # Wait until the genesis node writes the genesis.json to the shared volume @@ -34,16 +46,27 @@ elif [ "$1" = "secondary" ]; then sleep 1 done +# wait for the actual validator to start up + sleep 5 + cp /genesis_volume/genesis.json /root/.nymd/config/genesis.json GENESIS_PEER=$(cat /root/.nymd/config/genesis.json | grep '"memo"' | cut -d'"' -f 4) + GENESIS_IP=$(cat /root/.nymd/config/genesis.json | grep '"memo"' | cut -d'@' -f2 | cut -d: -f1) sed -i 's/persistent_peers = ""/persistent_peers = "'"${GENESIS_PEER}"'"/' /root/.nymd/config/config.toml sed -i 's/minimum-gas-prices = ""/minimum-gas-prices = "0.025u'"${BECH32_PREFIX}"'"/' /root/.nymd/config/app.toml sed -i '0,/enable = false/s//enable = true/g' /root/.nymd/config/app.toml sed -i 's/cors_allowed_origins = \[\]/cors_allowed_origins = \["*"\]/' /root/.nymd/config/config.toml sed -i 's/create_empty_blocks = true/create_empty_blocks = false/' /root/.nymd/config/config.toml sed -i 's/laddr = "tcp:\/\/127.0.0.1:26657"/laddr = "tcp:\/\/0.0.0.0:26657"/' /root/.nymd/config/config.toml - yes "${PASSPHRASE}" | ./nymd keys add node_admin 2> mnemonic > /dev/null + +# import mnemonic generated by the genesis validator (have a local copy for ease of use) + cp /genesis_volume/secondary_mnemonic /root/.nymd/mnemonic + { cat /root/.nymd/mnemonic; echo "${PASSPHRASE}"; echo "${PASSPHRASE}"; } | ./nymd keys add node_admin --recover #> /dev/null ./nymd validate-genesis > /dev/null + +# create validator +# don't even ask about those sleeps... + { echo "${PASSPHRASE}"; sleep 10; yes; sleep 10; } | ./nymd tx staking create-validator --amount=10000000u"${STAKE_DENOM}" --fees 100000u"${DENOM}" --pubkey="$(./nymd tendermint show-validator)" --moniker="secondary" --commission-rate="0.10" --commission-max-rate="0.20" --commission-max-change-rate="0.01" --min-self-delegation="1" --chain-id=nymnet --from=node_admin -b async --node http://"${GENESIS_IP}":26657 else echo "Validator already initialized, starting with the existing configuration." echo "If you want to re-init the validator, destroy the existing container"