diff --git a/README.md b/README.md index e9245da321..8ab51139f7 100644 --- a/README.md +++ b/README.md @@ -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 + diff --git a/init_node.sh b/init_node.sh index c31687379a..0d93ec4e9e 100644 --- a/init_node.sh +++ b/init_node.sh @@ -1,17 +1,20 @@ #!/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 "$@" @@ -19,70 +22,130 @@ redirect() { } 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 +