From 01c4d8b541c28d5c9c1525b453415420f173c5fb Mon Sep 17 00:00:00 2001 From: zemyblue Date: Thu, 23 Jul 2020 11:57:59 +0900 Subject: [PATCH 1/5] Add a script to generate new validator and add new validator to the chain --- scripts/add_validator.sh | 83 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 scripts/add_validator.sh diff --git a/scripts/add_validator.sh b/scripts/add_validator.sh new file mode 100644 index 000000000..4f5807f5b --- /dev/null +++ b/scripts/add_validator.sh @@ -0,0 +1,83 @@ +#!/bin/sh +# This script generate new validator and add new validator to the chain +# warning: if you input p2p port, abci, api and promethus port is set automatelly +# +# Process +# 1. generate new validator with keys +# 2. get genesis.json from persistent_seed +# 3. change config.toml +# - set port +# - open prometheus port +# - allow duplicate ip to perform multi in node same device. +# 4. send tx whitch add new validator +# 5. start new validator + +if [ "$#" -ne 3 ]; then + echo "generate new validator script" + echo "" + echo "usage: $0 [path] [p2p port] [persistent_peer]" + echo "" + echo "Example" + echo "$0 ./single1 26677 c8029828535291adbd1782e8aad41c121019e163@localhost:26656" + exit 2 +fi + +TENDERMINT="../build/tendermint" +# HOME_PATH="./single3" +HOME_PATH=$1 +# P2P_PORT=26677 +P2P_PORT=$2 +# PERSISTENT_PEERS='c8029828535291adbd1782e8aad41c121019e163@localhost:26656' +PERSISTENT_PEERS=$3 + +ORIGIN_URL=$(echo $PERSISTENT_PEERS | cut -d '@' -f 2 ) +ABCI_PORT=$(( $P2P_PORT + 1 )) +API_PORT=$(( $P2P_PORT + 2 )) +PROMETHEUS_PORT=$(( $P2P_PORT + 3)) + + +# generate new node with private key +${TENDERMINT} init --home=${HOME_PATH} +# show node id +echo "show node id: " +$TENDERMINT show_node_id --home=${HOME_PATH} + +# cat $HOME_PATH/config/genesis.json +# get genesis and save genesis file +curl -s "$ORIGIN_URL/genesis" | jq ".result.genesis" > $HOME_PATH/config/genesis.json + +# ======================= +# change config ports +# proxy(abci) +# proxy_app = "tcp://127.0.0.1:26658" +# [rpc] - api +# laddr = "tcp://127.0.0.1:26657" +# [p2p] +# laddr = "tcp://0.0.0.0:26656" +# allow_duplicate_ip = true +# [instrumentation] +# prometheus = false +# prometheus_listen_addr = ":26660" +# add persistent_peers +# persistent_peers = "ID@localhost:26656" +sed -i'.back' -e "s/26658/$ABCI_PORT/" \ + -e "s/26657/${API_PORT}/" \ + -e "s/26656/${P2P_PORT}/" \ + -e "/prometheus = false/s/false/true/" \ + -e "/allow_duplicate_ip = false/s/false/true/" \ + -e "s/26660/${PROMETHEUS_PORT}/" \ + $HOME_PATH/config/config.toml + +sed -i'.back' -e "s/persistent_peers = \"\"/persistent_peers = \"${PERSISTENT_PEERS}\"/" \ + $HOME_PATH/config/config.toml + +# show transaction for adding new validator +# get public address +echo "Get public address of new validator node" +PUBLIC_ADDR=$(sudo bash -c "cat ${HOME_PATH}/config/priv_validator_key.json" | jq -r ".pub_key.value") + +# send tx whitch add new validator +curl -G --data-urlencode 'tx="val:'${PUBLIC_ADDR}'!10"' http://localhost:26657/broadcast_tx_sync + +# run new validator +$TENDERMINT node --proxy_app=persistent_kvstore --home=$HOME_PATH From 90089d00fb96a79cb72df4bad367d6a0015ab1b1 Mon Sep 17 00:00:00 2001 From: zemyblue Date: Thu, 23 Jul 2020 14:21:15 +0900 Subject: [PATCH 2/5] Fix: `add_validator.sh` script error --- scripts/add_validator.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) mode change 100644 => 100755 scripts/add_validator.sh diff --git a/scripts/add_validator.sh b/scripts/add_validator.sh old mode 100644 new mode 100755 index 4f5807f5b..a5998e778 --- a/scripts/add_validator.sh +++ b/scripts/add_validator.sh @@ -1,6 +1,8 @@ #!/bin/sh # This script generate new validator and add new validator to the chain -# warning: if you input p2p port, abci, api and promethus port is set automatelly +# warning: +# 1. if you input p2p port, abci, api and promethus port is set automatelly +# 2. if you set multi validator in one device, the `allow_duplicate_ip` of all validator's config should be true. # # Process # 1. generate new validator with keys @@ -22,7 +24,7 @@ if [ "$#" -ne 3 ]; then exit 2 fi -TENDERMINT="../build/tendermint" +TENDERMINT="./build/tendermint" # HOME_PATH="./single3" HOME_PATH=$1 # P2P_PORT=26677 @@ -30,12 +32,11 @@ P2P_PORT=$2 # PERSISTENT_PEERS='c8029828535291adbd1782e8aad41c121019e163@localhost:26656' PERSISTENT_PEERS=$3 -ORIGIN_URL=$(echo $PERSISTENT_PEERS | cut -d '@' -f 2 ) +ORIGIN_URL=$(echo $PERSISTENT_PEERS | cut -d '@' -f 2 | cut -d ':' -f 1 )":26657" ABCI_PORT=$(( $P2P_PORT + 1 )) API_PORT=$(( $P2P_PORT + 2 )) PROMETHEUS_PORT=$(( $P2P_PORT + 3)) - # generate new node with private key ${TENDERMINT} init --home=${HOME_PATH} # show node id From 95b89d10c458cc7ec6cbf247ec663cd9c63c4a53 Mon Sep 17 00:00:00 2001 From: zemyblue Date: Mon, 27 Jul 2020 19:21:05 +0900 Subject: [PATCH 3/5] Add `Validators` in metric of consensus. --- consensus/metrics.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/consensus/metrics.go b/consensus/metrics.go index b4bb7f652..ef79493f5 100644 --- a/consensus/metrics.go +++ b/consensus/metrics.go @@ -26,6 +26,8 @@ type Metrics struct { Rounds metrics.Gauge // ValidatorOrVoter: voter + // Number of validators + Validators metrics.Gauge // Number of voters. Voters metrics.Gauge // Total power of all voters. @@ -83,6 +85,12 @@ func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics { Help: "Number of rounds.", }, labels).With(labelsAndValues...), + Validators: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ + Namespace: namespace, + Subsystem: MetricsSubsystem, + Name: "validators", + Help: "Number of validators.", + }, labels).With(labelsAndValues...), Voters: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ Namespace: namespace, Subsystem: MetricsSubsystem, @@ -193,6 +201,7 @@ func NopMetrics() *Metrics { Rounds: discard.NewGauge(), + Validators: discard.NewGauge(), Voters: discard.NewGauge(), VotersPower: discard.NewGauge(), VoterPower: discard.NewGauge(), From e8a8fe0acc7a88b73f587eab503b724e2674d925 Mon Sep 17 00:00:00 2001 From: zemyblue Date: Mon, 27 Jul 2020 19:22:26 +0900 Subject: [PATCH 4/5] Add the setting of `addr_book_strict` of config change to false --- scripts/add_validator.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/add_validator.sh b/scripts/add_validator.sh index a5998e778..d0d742667 100755 --- a/scripts/add_validator.sh +++ b/scripts/add_validator.sh @@ -66,6 +66,7 @@ sed -i'.back' -e "s/26658/$ABCI_PORT/" \ -e "s/26656/${P2P_PORT}/" \ -e "/prometheus = false/s/false/true/" \ -e "/allow_duplicate_ip = false/s/false/true/" \ + -e "/addr_book_strict = true/s/true/false/" \ -e "s/26660/${PROMETHEUS_PORT}/" \ $HOME_PATH/config/config.toml From c2a552124fa39f2655fd450f596537871820576d Mon Sep 17 00:00:00 2001 From: zemyblue Date: Tue, 28 Jul 2020 14:23:30 +0900 Subject: [PATCH 5/5] Add `ValidatorsPower` in consensus metrics --- consensus/metrics.go | 9 +++++++++ consensus/state.go | 2 ++ scripts/add_validator.sh | 6 +++--- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/consensus/metrics.go b/consensus/metrics.go index ef79493f5..e315fd1f7 100644 --- a/consensus/metrics.go +++ b/consensus/metrics.go @@ -28,6 +28,8 @@ type Metrics struct { // ValidatorOrVoter: voter // Number of validators Validators metrics.Gauge + // Total power of all validators. + ValidatorsPower metrics.Gauge // Number of voters. Voters metrics.Gauge // Total power of all voters. @@ -91,6 +93,12 @@ func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics { Name: "validators", Help: "Number of validators.", }, labels).With(labelsAndValues...), + ValidatorsPower: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ + Namespace: namespace, + Subsystem: MetricsSubsystem, + Name: "validators_power", + Help: "Total power of all validators.", + }, labels).With(labelsAndValues...), Voters: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ Namespace: namespace, Subsystem: MetricsSubsystem, @@ -202,6 +210,7 @@ func NopMetrics() *Metrics { Rounds: discard.NewGauge(), Validators: discard.NewGauge(), + ValidatorsPower: discard.NewGauge(), Voters: discard.NewGauge(), VotersPower: discard.NewGauge(), VoterPower: discard.NewGauge(), diff --git a/consensus/state.go b/consensus/state.go index 02d09db01..bb049d2b5 100644 --- a/consensus/state.go +++ b/consensus/state.go @@ -1521,6 +1521,8 @@ func (cs *State) pruneBlocks(retainHeight int64) (uint64, error) { } func (cs *State) recordMetrics(height int64, block *types.Block) { + cs.metrics.Validators.Set(float64(cs.Validators.Size())) + cs.metrics.ValidatorsPower.Set(float64(cs.Validators.TotalStakingPower())) cs.metrics.Voters.Set(float64(cs.Voters.Size())) cs.metrics.VotersPower.Set(float64(cs.Voters.TotalVotingPower())) diff --git a/scripts/add_validator.sh b/scripts/add_validator.sh index d0d742667..68d330d71 100755 --- a/scripts/add_validator.sh +++ b/scripts/add_validator.sh @@ -74,12 +74,12 @@ sed -i'.back' -e "s/persistent_peers = \"\"/persistent_peers = \"${PERSISTENT_PE $HOME_PATH/config/config.toml # show transaction for adding new validator -# get public address +# get public key echo "Get public address of new validator node" -PUBLIC_ADDR=$(sudo bash -c "cat ${HOME_PATH}/config/priv_validator_key.json" | jq -r ".pub_key.value") +PUBLIC_KEY=$(sudo bash -c "cat ${HOME_PATH}/config/priv_validator_key.json" | jq -r ".pub_key.value") # send tx whitch add new validator -curl -G --data-urlencode 'tx="val:'${PUBLIC_ADDR}'!10"' http://localhost:26657/broadcast_tx_sync +curl -G --data-urlencode 'tx="val:'${PUBLIC_KEY}'!10"' http://localhost:26657/broadcast_tx_sync # run new validator $TENDERMINT node --proxy_app=persistent_kvstore --home=$HOME_PATH