#!/bin/bash DEST=${3:-"$PWD/conf"} BACKUP=$DEST/backup DEPLOY=$BACKUP/deploy WORKDEPLOY=$DEST/deploy if [ -d $BACKUP ]; then echo "Directory $BACKUP already exist; please backup" exit; fi if [ -d $WORKDEPLOY ]; then echo "Directory $WORKDEPLOY already exist; please backup" exit; fi flag=true read -p "Please input validator count:" N while $flag do expr $N + 0 &>/dev/null [ $? -eq 0 ] && flag=false || read -p "please input validator count as integer:" N done ipAddrs=() for i in $(seq 1 $N) do while read -p "please input validator $i ip address:" addr do if [[ "$addr" =~ ^(([1-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))\.){3}([1-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))$ ]]; then ipAddrs=(${ipAddrs[@]} $addr) break else echo "invalid ip addr: $addr" fi done done #echo ${ipAddrs[@]} flag=true read -p "please input a chain-id:" chainId while $flag do expr $chainId + 0 &>/dev/null [ $? -eq 0 ] && flag=false || read -p "please input a chain-id as integer:" chainId done genesisAccountList=() declare -A accountMapAmount allFlag=true while $allFlag do accflag=true flag=true read -p "please add genesis account:" account while $accflag do if [[ -z $account ]]; then echo "You pressed ENTER with no input text" && flag=false && accflag=false && allFlag=false && break ; fi account="${account,,}" if [[ "$account" =~ ^[0-9a-f]{40}$ ]] || [[ "$account" =~ ^0x[0-9a-f]{40}$ ]] ; then read -p "please input amount for $account:" amount while $flag do # echo $account # echo $amount if [[ $amount =~ ^[1-9][0-9]*[0-9]?$ ]] ; then if [[ -z $amount ]]; then echo "You pressed ENTER with no input text" && flag=false && accflag=false && allFlag=false && break ; fi flag=false accflag=false genesisAccountList=(${genesisAccountList[@]} $account) accountMapAmount[$account]=$amount else read -p "please input a valid amount for $account:" amount fi done else read -p "please add a valid genesis account:" account fi done done flag=true read -p "Please input sync node count:" syncN while $flag do expr $syncN + 0 &>/dev/null [ $? -eq 0 ] && flag=false || read -p "please input sync node count as integer:" syncN done rm -rf ~/.cmp* cmpcli config keyring-backend test cmpcli config chain-id $chainId cmpcli config output json cmpcli config indent true cmpcli config trust-node true #8545 rest server unlock addr cmpcli keys add restunlock for i in $(seq 1 $N) do cmpcli keys add mykey$i dest=$DEPLOY/node$i mkdir -p $dest echo "Generating and init node dir for node$i" cmpd init node$i --chain-id $chainId --home $dest done mainDest=$DEPLOY/node1 # echo ${genesisAccountList[@]} # echo ${!accountMapAmount[@]} # echo ${accountMapAmount[@]} for i in "${!genesisAccountList[@]}"; do # printf "%s\t------------%s \n" "${genesisAccountList[$i]}" "${accountMapAmount[${genesisAccountList[$i]}]}" demon="cmp" coin="${accountMapAmount[${genesisAccountList[$i]}]}$demon" cmpd add-genesis-account ${genesisAccountList[$i]} $coin,1coin0,1coin1,1coin2,1coin3,1coin4 --home $mainDest done Node1Dir="" for i in $(seq 1 $N) do dest=$DEPLOY/node$i ipaddr=${ipAddrs[$(($i-1))]} cmpd add-genesis-account $(cmpcli keys show mykey$i -a) 1000000000000000000cmp,1coin0,1coin1,1coin2,1coin3,1coin4 --home $dest cmpd gentx --name mykey$i --home $dest --ip $ipaddr --node-id $(cmpd metaversegraph show-node-id --home $dest) --keyring-backend test --amount 1000000000000000000cmp if [ $i -eq 1 ] ; then Node1Dir=$dest cmpd add-genesis-account $(cmpcli keys show restunlock -a) 1cmp,1coin0,1coin1,1coin2,1coin3,1coin4 --home $dest genesisAccountList=(${genesisAccountList[@]} $(cmpcli keys show restunlock -a)) accountMapAmount[$(cmpcli keys show restunlock -a)]=1 else cp $dest/config/gentx/* $Node1Dir/config/gentx/ cmpd add-genesis-account $(cmpcli keys show mykey$i -a) 1000000000000000000cmp,1coin0,1coin1,1coin2,1coin3,1coin4 --home $Node1Dir fi genesisAccountList=(${genesisAccountList[@]} $(cmpcli keys show mykey$i -a)) accountMapAmount[$(cmpcli keys show mykey$i -a)]=1000000000000000000 done cmpd collect-gentxs --home $Node1Dir for i in $(seq 1 $N) do dest=$DEPLOY/node$i if [ $i -ne 1 ] ; then rm -f $dest/config/genesis.json cp $Node1Dir/config/genesis.json $dest/config/ fi done os=`uname -a` mac='Darwin' for i in $(seq 1 $N) do dest=$DEPLOY/node$i if [[ $os =~ $mac ]];then gsed -i 's/addr_book_strict = true/addr_book_strict = false/g' $dest/config/config.toml gsed -i 's/"max_validators": 100,/"max_validators": '$N',/g' $dest/config/genesis.json else sed -i 's/addr_book_strict = true/addr_book_strict = false/g' $dest/config/config.toml sed -i 's/"max_validators": 100,/"max_validators": '$N',/g' $dest/config/genesis.json fi done mkdir -p $BACKUP/clicfg.all.address cp -R ~/.cmpcli/* $BACKUP/clicfg.all.address mkdir -p $BACKUP/clicfg mkdir -p $BACKUP/clicfg/keyring-test-cmp unlockAddr=$(cmpcli keys parse $(cmpcli keys show restunlock -a |awk '{print substr ($0, 3)}') | jq .formats[0] | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/') addrFileEndStr=".address" cp -R ~/.cmpcli/config/ $BACKUP/clicfg/config/ cp -R ~/.cmpcli/keyring-test-cmp/$unlockAddr$addrFileEndStr $BACKUP/clicfg/keyring-test-cmp/ cp -R ~/.cmpcli/keyring-test-cmp/restunlock.info $BACKUP/clicfg/keyring-test-cmp/ rm -rf ~/.cmpcli/ for i in $(seq 1 $N) do dest=$DEPLOY/node$i cp -R $BACKUP/clicfg $dest done rm -rf $BACKUP/clicfg offsetN=$N endN=$(($offsetN + $syncN)) for i in $(seq $(($offsetN+1)) $endN) do dest=$DEPLOY/node$i mkdir -p $dest echo "Generating and init node dir for node$i" cmpd init node$i --chain-id $chainId --home $dest done Node1Dir=$DEPLOY/node1 for i in $(seq $(($offsetN+1)) $endN) do dest=$DEPLOY/node$i if [ $i -ne 1 ] ; then rm -f $dest/config/genesis.json rm -f $dest/config/config.toml cp $Node1Dir/config/genesis.json $dest/config/ cp $Node1Dir/config/config.toml $dest/config/ fi done cp -R $DEPLOY $DEST cat >$PWD/docker-compose.yml << EOF version: '3.8' services: EOF for i in $(seq 1 $N) do cat >>$PWD/docker-compose.yml << EOF node$i: image: cmpd/node:latest environment: - ID=$i ports: - target: 26656 published: 26656 protocol: tcp mode: host - target: 26657 published: 26657 protocol: tcp mode: host - target: 8545 published: 8545 protocol: tcp mode: host volumes: - /home/ubuntu/CMPChain/chain/network/conf/deploy:/cmp deploy: replicas: 1 restart_policy: condition: on-failure placement: constraints: - node.hostname == node-$i EOF done echo -e "\n------Enjoy it!------\n\n" total=0 printf "%s\t%s\t\t\t\t\t\t%s\n" "idx" "account" "amount(cmp)" for i in "${!genesisAccountList[@]}"; do printf "%s\t%s\t%s\n" "${i}" "${genesisAccountList[$i]}" "${accountMapAmount[${genesisAccountList[$i]}]}" amount=${accountMapAmount[${genesisAccountList[$i]}]} total=$(echo $total + $amount |bc) done demon="cmp" coin="$total$demon" echo "total: $coin " printf "validator ip list: %s \n" "${ipAddrs[@]}" printf "chain Id: %s\n" "$chainId" printf "There are private keys and genesis in directory: %s, please backup the directory.\n" $BACKUP