Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: local multi node test setting files #334

Merged
merged 2 commits into from
Oct 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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