Skip to content

Commit

Permalink
chore: local multi node test setting files (#334)
Browse files Browse the repository at this point in the history
* chore: local multi node setting

* docs: local multi node readme
  • Loading branch information
dudong2 authored Oct 1, 2021
1 parent 61fb3d4 commit f35dabc
Show file tree
Hide file tree
Showing 2 changed files with 195 additions and 86 deletions.
90 changes: 68 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,61 +31,107 @@ To learn about Cosmos SDK, please refer [Cosmos SDK Docs](https://github.com/cos

## Quick Start


**Build**
```
make build
make install
simd version # you can see the version!
# you can see the version!
simd version
```

 

**Configure**
```
sh init_node.sh sim
zsh init_node.sh sim {N(number of nodes), default=1}
```

 

**Run**
```
simd start # run a node
# run a node
simd start --home ~/.simapp/simapp0
# If N is larger than 1, run all node.
# simapp0 has other nodes as persistant_peer.
simd start --home ~/.simapp/simapp0
simd start --home ~/.simapp/simapp1
...
```

**Visit with your browser**
* Node: http://localhost:26657/
* REST: http://localhost:1317/swagger-ui/

 

## Follow Guide


**Create new account**
```
simd keys add {new-account-name} --keyring-backend test
simd keys list --keyring-backend test # check if new account was added successfully
simd keys add user0 --keyring-backend test --home ~/.simapp/simapp0
# check if new account was added successfully
simd keys list --keyring-backend test --home ~/.simapp/simapp0
```

Let the new, user and validator account address be new-addr, user-addr and val-addr each.
Let the user0 and validator0 **account address** be each
* **user0: link1lu5hgjp2gyvgdpf674aklzrpdeuyhjr4fsuqrj**
* **validator0: link146asaycmtydq45kxc8evntqfgepagygelel00h**

If you run multi node, home option's value can be ~/.simapp/simapp1, ~/.simapp/simapp2, ...
You can get same result whatever --home option you use

 

**Send funds(Bank)**
```
simd query bank balances {new-addr} # balances: "0"
simd query bank balances {user-addr} # balances: 100000000000stake, 100000000000ukrw
simd tx bank send {user-addr} {new-addr} 10000stake —keyring-backend test —chain-id sim
# send 10000stake to new-account from user-account
simd query bank balances {new-addr} # balances: 10000stake
simd query bank balances {user-addr} # balances: 99999990000stake, 100000000000ukrw
# user0 balances: "0"
simd query bank balances link1lu5hgjp2gyvgdpf674aklzrpdeuyhjr4fsuqrj --home ~/.simapp/simapp0
# validator0 balances: 90000000000stake, 100000000000ukrw
simd query bank balances link146asaycmtydq45kxc8evntqfgepagygelel00h --home ~/.simapp/simapp0
# send 10000stake from validator0 to user0
simd tx bank send link146asaycmtydq45kxc8evntqfgepagygelel00h link1lu5hgjp2gyvgdpf674aklzrpdeuyhjr4fsuqrj 10000000000stake --keyring-backend test --chain-id sim --home ~/.simapp/simapp0
# user0 balances: 10000000000stake
simd query bank balances link1lu5hgjp2gyvgdpf674aklzrpdeuyhjr4fsuqrj --home ~/.simapp/simapp0
# validator0 balances: 80000000000stake, 100000000000ukrw
simd query bank balances link146asaycmtydq45kxc8evntqfgepagygelel00h --home ~/.simapp/simapp0
```

 

**Staking(deligate)**
```
simd query staking validators # operator_address is Bech32 of val-addr(let it be val-addr-Bech32)
simd tx staking delegate {val-addr-Bech32} 1000stake --from {new-addr} --keyring-backend test --chain-id sim
# deligate 1000stake to validator
simd query staking validators # check if deligation was successful
simd tx staking unbond {val-addr-Bech32} 1000stake --from {new-addr} --keyring-backend test --chain-id sim
# undeligate 1000stake from validator
simd query staking validators # check if undeligation was successful
# Bech32 Val is operator address of validator0
simd debug addr link146asaycmtydq45kxc8evntqfgepagygelel00h --home ~/.simapp/simapp0
```
Let the **validator0 operator address** be **linkvaloper146asaycmtydq45kxc8evntqfgepagygeddajpy**

 

```
# deligate 10000000000stake to validator0
simd tx staking delegate linkvaloper146asaycmtydq45kxc8evntqfgepagygeddajpy 10000000000stake
--from link1lu5hgjp2gyvgdpf674aklzrpdeuyhjr4fsuqrj --keyring-backend test --chain-id sim --home ~/.simapp/simapp0
# check if deligation was successful
simd query staking validators --chain-id sim --home ~/.simapp/simapp0
# undeligate 10000000000stake from validator
simd tx staking unbond linkvaloper146asaycmtydq45kxc8evntqfgepagygeddajpy 10000000000stake --from link1lu5hgjp2gyvgdpf674aklzrpdeuyhjr4fsuqrj --keyring-backend test --chain-id sim --home ~/.simapp/simapp0
# check if undeligation was successful
simd query staking validators --chain-id sim --home ~/.simapp/simapp0
```

 

Test different commands to get a broader understanding of lbm

191 changes: 127 additions & 64 deletions init_node.sh
Original file line number Diff line number Diff line change
@@ -1,88 +1,151 @@
#!/bin/sh

display_usage() {
echo "\nMissing $1 parameter. Please check if all parameters were specified."
echo "\nUsage: ./run_node [CHAIN_ID]"
echo "\nExample: ./init_node $BINARY test-chain-id 26657 26656 6060 9090 \n"
echo "\nMissing $1 parameter. Please check if all parameters were specified."
echo "\nUsage: ./run_node [CHAIN_ID] [N, default=1]"
exit 1
}

KEYRING=--keyring-backend="test"
if [ -z "$1" ]; then
display_usage "[CHAIN_ID]"
fi

KEYRING="--keyring-backend=test"
SILENT=1

redirect() {
if [ "$SILENT" -eq 1 ]; then
if [ "${SILENT}" -eq 1 ]; then
"$@" > /dev/null 2>&1
else
"$@"
fi
}

BINARY=simd
CHAINID=$1
CHAINDIR=~/.simapp
RPCPORT=26657
P2PPORT=26656
PROFPORT=6060
GRPCPORT=9090
BASE_DIR=~/.simapp
CHAIN_DIR_PREFIX="${BASE_DIR}/simapp"
GENTXS_DIR="${BASE_DIR}/gentxs"
CHAIN_ID=$1
MONIKER_PREFIX="node"

if [ -z "$1" ]; then
display_usage "[CHAIN_ID]"
fi
# Control N node count
N=1
if [ -n "$2" ]; then
N=$2

echo "Creating $BINARY instance: home=$CHAINDIR | chain-id=$CHAINID | p2p=:$P2PPORT | rpc=:$RPCPORT | profiling=:$PROFPORT | grpc=:$GRPCPORT"

# Add dir for chain, exit if error
if ! mkdir -p $CHAINDIR 2>/dev/null; then
echo "Failed to create chain folder. Aborting..."
if [ "${N}" -le 0 ]; then
echo "N must be positive int. Aborting..."
exit 1
elif [ "${N}" -gt 10 ]; then
echo "N must be smaller than 10. Aborting..."
echo "If you need to create node more than 10, modify init_node.sh line 38"
exit 1
fi
fi

# Build genesis file incl account for passed address
coins="100000000000stake,100000000000ukrw"
delegate="100000000000stake"

redirect $BINARY --home $CHAINDIR --chain-id $CHAINID init $CHAINID
sleep 1
$BINARY --home $CHAINDIR keys add validator $KEYRING --output json > $CHAINDIR/validator_seed.json 2> /dev/null
sleep 1
$BINARY --home $CHAINDIR keys add user $KEYRING --recover --output json < user_mnemonic > $CHAINDIR/key_seed.json 2> /dev/null
sleep 1
redirect $BINARY --home $CHAINDIR add-genesis-account $($BINARY --home $CHAINDIR keys $KEYRING show user -a) $coins
sleep 1
redirect $BINARY --home $CHAINDIR add-genesis-account $($BINARY --home $CHAINDIR keys $KEYRING show validator -a) $coins
sleep 1
redirect $BINARY --home $CHAINDIR gentx validator $delegate $KEYRING --chain-id $CHAINID
sleep 1
redirect $BINARY --home $CHAINDIR collect-gentxs
sleep 1

# Check platform
platform='unknown'
unamestr=`uname`
if [ "$unamestr" = 'Linux' ]; then
platform='linux'
fi
VALIDATOR_PREFIX="validator"
COINS="100000000000stake,100000000000ukrw"
DELEGATE="10000000000stake"

# Set proper defaults and change ports (use a different sed for Mac or Linux)
echo "Change settings in config.toml file..."
if [ $platform = 'linux' ]; then
sed -i 's#"tcp://127.0.0.1:26657"#"tcp://0.0.0.0:'"$RPCPORT"'"#g' $CHAINDIR/config/config.toml
sed -i 's#"tcp://0.0.0.0:26656"#"tcp://0.0.0.0:'"$P2PPORT"'"#g' $CHAINDIR/config/config.toml
sed -i 's#"localhost:6060"#"localhost:'"$P2PPORT"'"#g' $CHAINDIR/config/config.toml
sed -i 's/timeout_commit = "5s"/timeout_commit = "1s"/g' $CHAINDIR/config/config.toml
sed -i 's/timeout_propose = "3s"/timeout_propose = "1s"/g' $CHAINDIR/config/config.toml
sed -i 's/index_all_keys = false/index_all_keys = true/g' $CHAINDIR/config/config.toml
sed -i 's/pruning = "default"/pruning = "nothing"/g' $CHAINDIR/config/app.toml
# sed -i '' 's#index-events = \[\]#index-events = \["message.action","send_packet.packet_src_channel","send_packet.packet_sequence"\]#g' $CHAINDIR/config/app.toml
else
sed -i '' 's#"tcp://127.0.0.1:26657"#"tcp://0.0.0.0:'"$RPCPORT"'"#g' $CHAINDIR/config/config.toml
sed -i '' 's#"tcp://0.0.0.0:26656"#"tcp://0.0.0.0:'"$P2PPORT"'"#g' $CHAINDIR/config/config.toml
sed -i '' 's#"localhost:6060"#"localhost:'"$P2PPORT"'"#g' $CHAINDIR/config/config.toml
sed -i '' 's/timeout_commit = "5s"/timeout_commit = "1s"/g' $CHAINDIR/config/config.toml
sed -i '' 's/timeout_propose = "3s"/timeout_propose = "1s"/g' $CHAINDIR/config/config.toml
sed -i '' 's/index_all_keys = false/index_all_keys = true/g' $CHAINDIR/config/config.toml
sed -i '' 's/pruning = "default"/pruning = "nothing"/g' $CHAINDIR/config/app.toml
# sed -i '' 's#index-events = \[\]#index-events = \["message.action","send_packet.packet_src_channel","send_packet.packet_sequence"\]#g' $CHAINDIR/config/app.toml
# Create base dir and gentxs dir
if ! mkdir -p ${GENTXS_DIR} 2> /dev/null; then
echo "Failed to create chain folder(${GENTXS_DIR}). Aborting..."
exit 1
fi

# Please do not use the TEST_MNEMONIC for production purpose
TEST_MNEMONIC="mind flame tobacco sense move hammer drift crime ring globe art gaze cinnamon helmet cruise special produce notable negative wait path scrap recall have"

# Initialize config files and genesis file
# Create genesis account and gentx
for ((i = 0; i < N; i++))
do
# ~/.simapp0, ~/.simapp1, ...
CHAIN_DIR="${CHAIN_DIR_PREFIX}${i}"

# Add dir for chain, exit if error
if ! mkdir -p ${CHAIN_DIR} 2>/dev/null; then
echo "Failed to create chain folder(${CHAIN_DIR}). Aborting..."
exit 1
fi

# Initialize configuration files and genesis file
# moniker is the name of your node
MONIKER="${MONIKER_PREFIX}${i}"
redirect ${BINARY} init ${MONIKER} --home ${CHAIN_DIR} --chain-id ${CHAIN_ID}

# Create N genesis account(with mnemonic), so N-th chain's N account is same with M-th chain's
for ((j = 0; j < N; j++))
do
VALIDATOR="${VALIDATOR_PREFIX}${j}"
${BINARY} keys add ${VALIDATOR} ${KEYRING} --home ${CHAIN_DIR} --recover --account ${j} --output json <<< ${TEST_MNEMONIC} >> ${CHAIN_DIR}/validator_seed.json 2> /dev/null
redirect ${BINARY} add-genesis-account $(${BINARY} --home ${CHAIN_DIR} keys ${KEYRING} show ${VALIDATOR} -a) ${COINS} --home ${CHAIN_DIR}
done

# Make gentx file and move it to GENTXS folder
VALIDATOR="${VALIDATOR_PREFIX}${i}"
redirect ${BINARY} gentx ${VALIDATOR} ${DELEGATE} ${KEYRING} --home ${CHAIN_DIR} --chain-id ${CHAIN_ID}
mv "${CHAIN_DIR}/config/gentx/$(ls ${CHAIN_DIR}/config/gentx | grep .json)" "${GENTXS_DIR}/${MONIKER}.json"
rm -r "${CHAIN_DIR}/config/gentx"
done

SRC_GENESIS_FIlE="${CHAIN_DIR_PREFIX}0/config/genesis.json"
RPC_PORT=26657
P2P_PORT=26656
PROF_PORT=6060
GRPC_PORT=9090

# Set genesis file and config(port, peer, ...)
CHAIN_0_DIR="${CHAIN_DIR_PREFIX}0"
for ((i = 0; i < N; i++))
do
CHAIN_DIR="${CHAIN_DIR_PREFIX}${i}"

# Set genesis file of 0-th chain dir and copy to other chains
# If we call collect-gentxs at each chains, genesis_time values can be different.
if [ ${i} -eq 0 ]; then
redirect ${BINARY} collect-gentxs --home ${CHAIN_DIR} --gentx-dir ${GENTXS_DIR}
else
cp ${SRC_GENESIS_FIlE} "${CHAIN_DIR}/config"
fi

MONIKER="${MONIKER_PREFIX}${i}"
MEMO=`sed 's/"//g' <<< \`cat ${GENTXS_DIR}/${MONIKER}.json | jq '.body.memo'\``
MEMO_SPLIT=(`echo ${MEMO} | tr ":" "\n"`)

# Set proper defaults and change ports (use a different sed for Mac or Linux)
if [ "`uname`" = "Linux" ]; then
sed -i 's#"tcp://127.0.0.1:26657"#"tcp://0.0.0.0:'"${RPC_PORT}"'"#g' ${CHAIN_DIR}/config/config.toml
sed -i 's#"tcp://0.0.0.0:26656"#"tcp://0.0.0.0:'"${P2P_PORT}"'"#g' ${CHAIN_DIR}/config/config.toml
sed -i 's#"localhost:6060"#"localhost:'"${PROF_PORT}"'"#g' ${CHAIN_DIR}/config/config.toml
sed -i 's/timeout_commit = "5s"/timeout_commit = "1s"/g' ${CHAIN_DIR}/config/config.toml
sed -i 's/timeout_propose = "3s"/timeout_propose = "1s"/g' ${CHAIN_DIR}/config/config.toml
sed -i 's/addr_book_strict = true/addr_book_strict = false/g' ${CHAIN_DIR}/config/config.toml # for local test
sed -i 's/allow_duplicate_ip = false/allow_duplicate_ip = true/g' ${CHAIN_DIR}/config/config.toml # allow duplicated ip

sed -i 's#'"${MEMO}"'#'"${MEMO_SPLIT[1]}"':'"${P2P_PORT}"'#g' ${CHAIN_0_DIR}/config/config.toml # change port of persistent_peers

sed -i 's/pruning = "default"/pruning = "nothing"/g' ${CHAIN_DIR}/config/app.toml
sed -i 's#"0.0.0.0:9090"#"0.0.0.0:'"${GRPC_PORT}"'"#g' ${CHAIN_DIR}/config/app.toml
else
sed -i '' 's#"tcp://127.0.0.1:26657"#"tcp://0.0.0.0:'"${RPC_PORT}"'"#g' ${CHAIN_DIR}/config/config.toml
sed -i '' 's#"tcp://0.0.0.0:26656"#"tcp://0.0.0.0:'"${P2P_PORT}"'"#g' ${CHAIN_DIR}/config/config.toml
sed -i '' 's#"localhost:6060"#"localhost:'"${PROF_PORT}"'"#g' ${CHAIN_DIR}/config/config.toml
sed -i '' 's/timeout_commit = "5s"/timeout_commit = "1s"/g' ${CHAIN_DIR}/config/config.toml
sed -i '' 's/timeout_propose = "3s"/timeout_propose = "1s"/g' ${CHAIN_DIR}/config/config.toml
sed -i '' 's/addr_book_strict = true/addr_book_strict = false/g' ${CHAIN_DIR}/config/config.toml # for local test
sed -i '' 's/allow_duplicate_ip = false/allow_duplicate_ip = true/g' ${CHAIN_DIR}/config/config.toml # allow duplicated ip

sed -i '' 's#'"${MEMO}"'#'"${MEMO_SPLIT[1]}"':'"${P2P_PORT}"'#g' ${CHAIN_0_DIR}/config/config.toml # change port of persistent_peers

sed -i '' 's/pruning = "default"/pruning = "nothing"/g' ${CHAIN_DIR}/config/app.toml
sed -i '' 's#"0.0.0.0:9090"#"0.0.0.0:'"${GRPC_PORT}"'"#g' ${CHAIN_DIR}/config/app.toml
fi

echo "${BINARY} instance: home ${CHAIN_DIR} | chain-id ${CHAIN_ID} | p2p=:${P2P_PORT} | rpc=:${RPC_PORT} | profiling=:${PROF_PORT} | grpc=:${GRPC_PORT}"
RPC_PORT=`expr ${RPC_PORT} + 2`
P2P_PORT=`expr ${P2P_PORT} + 2`
PROF_PORT=`expr ${PROF_PORT} + 1`
GRPC_PORT=`expr ${GRPC_PORT} + 1`
done

0 comments on commit f35dabc

Please sign in to comment.