Ноды
October 25, 2022

Установка ноды OKP4

OKP4 is a domain-specific layer-1 dedicated to trust-minimized data sharing.
The blockchain orchestrates assets shared by participants into the Dataverse: data, algorithms, software, storage and computation to enable a new generation of applications.
Any contributor earns rewards thanks to these new value chains.

Сайт проекта | Документация проекта | Discord | GitHub | Explorer
Telegram канал сообщества Starnodes

Награды

На данный момент идет фаза подготовки к оплачиваемому тестнету. Сейчас нужно установить ноду и подать заявку на участие. Форма для подачи откроется 2го ноября.

Системные требования

4 CPU 8 RAM 200 SSD

Используемые порты: 26657,26656,6060,9090,9091 tcp

Подготовка сервера

Обновим пакеты системы:

sudo apt update && sudo apt upgrade -y

Установим необходимое программное обеспечение:

sudo apt install curl chrony tar wget clang pkg-config libssl-dev libleveldb-dev jq build-essential bsdmainutils git make ncdu htop screen unzip bc htop mc -y

Установка GO:

cd $HOME && \
ver="1.19.2" && \
wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz" && \
sudo rm -rf /usr/local/go && \
sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz" && \
rm "go$ver.linux-amd64.tar.gz" && \
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile && \
source $HOME/.bash_profile && \
go version

Установка ноды:

Установка переменных:

# Введите номер космос ноды на вашем сервере (0, если первая установка)
# По умолчанию: NODES_NUM="0"
NODES_NUM="0"

MONIKER="moniker"
WALLET="moniker_wallet"
WEBSITE="https://starnodes.ru"
IDENTITY=""
DETAILS="t.me/starnodes_ru"
SECURITY_CONTACT=""

# Ниже менять не нужно

TIKER=okp4d && \
CHAIN=okp4-nemeton && \
TOKEN=uknow && \
PROJECT=okp4d && \
CONFIG=.okp4d && \
DENOM=1000000 && \
PROJECT_REPOSITORY_PATH="https://github.com/okp4/okp4d.git" && \
BRANCH="v2.2.0" && \
NODE="http://localhost:$((NODES_NUM+26))657"

Экспорт переменных:

echo "export MONIKER=$MONIKER" >> $HOME/.bash_profile && \
echo "export WALLET=$WALLET" >> $HOME/.bash_profile && \
echo "export WEBSITE=$WEBSITE" >> $HOME/.bash_profile && \
echo "export IDENTITY=$IDENTITY" >> $HOME/.bash_profile && \
echo "export DETAILS=$DETAILS" >> $HOME/.bash_profile && \
echo "export SECURITY_CONTACT=$SECURITY_CONTACT" >> $HOME/.bash_profile && \
echo "export NODES_NUM=$NODES_NUM" >> $HOME/.bash_profile && \
echo "export TIKER=$TIKER" >> $HOME/.bash_profile && \
echo "export CHAIN=$CHAIN" >> $HOME/.bash_profile && \
echo "export TOKEN=$TOKEN" >> $HOME/.bash_profile && \
echo "export PROJECT=$PROJECT" >> $HOME/.bash_profile && \
echo "export CONFIG=$CONFIG" >> $HOME/.bash_profile && \
echo "export PROJECT_REPOSITORY_PATH=$PROJECT_REPOSITORY_PATH" >> $HOME/.bash_profile && \
echo "export BRANCH=$BRANCH" >> $HOME/.bash_profile && \
echo "export NODE=$NODE" >> $HOME/.bash_profile && \
source $HOME/.bash_profile

Установка бинарников:

git clone $PROJECT_REPOSITORY_PATH $PROJECT && \
cd $PROJECT && \
git checkout $BRANCH && \
make install && \
$TIKER version
# 2.2.0

Инициализация:

$TIKER init $MONIKER --chain-id $CHAIN && \
$TIKER config chain-id $CHAIN && \
$TIKER config keyring-backend test && \
$TIKER config node $NODE

Добавить кошелек:

# Add wallet 
$TIKER keys add $WALLET
# Or recover
$TIKER keys add $WALLET --recover

Дополнительные переменные:

VALOPER=$($TIKER keys show $WALLET --bech val -a) && \
ADDRESS=$($TIKER keys show $WALLET --address) && \
echo "export VALOPER=$VALOPER" >> $HOME/.bash_profile && \
echo "export ADDRESS=$ADDRESS" >> $HOME/.bash_profile && \
source $HOME/.bash_profile

Пиры и сиды:

PEERS="[email protected]:6040,[email protected]:26656,[email protected]:16656,[email protected]:26656,[email protected]:36656,[email protected]:12656,[email protected]:26858,[email protected]:26656,[email protected]:11684,[email protected]:16656,[email protected]:27363,[email protected]:23856"
#SEEDS="[email protected]:26656,[email protected]:26656,[email protected]:26656"
sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/; s/^seeds *=.*/seeds = \"$SEEDS\"/" $HOME/$CONFIG/config/config.toml

Настраиваем фильтрацию "плохих" peers:

sed -i.bak -e "s/^filter_peers *=.*/filter_peers = \"true\"/" $HOME/$CONFIG/config/config.toml

При необходимости увеличиваем количество входящих и исходящих пиров для подключения. Это может помочь при падении ноды, но увеличит нагрузку.

sed -i.bak 's/max_num_inbound_peers =.*/max_num_inbound_peers = 50/g' $HOME/$CONFIG/config/config.toml 
sed -i.bak 's/max_num_outbound_peers =.*/max_num_outbound_peers = 50/g' $HOME/$CONFIG/config/config.toml

Настроим внешний IP address:

external_address=$(wget -qO- eth0.me)
sed -i.bak -e "s/^external_address *=.*/external_address = \"$external_address:26656\"/" $HOME/$CONFIG/config/config.toml

Настраиваем минимальную цену за газ в app.toml

min_gas=0.0001
sed -i.bak -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"$min_gas$TOKEN\"/;" $HOME/$CONFIG/config/app.toml

Скачать генезис и адрес бук:

wget -O $HOME/$CONFIG/config/genesis.json https://raw.githubusercontent.com/okp4/networks/main/chains/nemeton/genesis.json
wget -O $HOME/$CONFIG/config/addrbook.json https://api.nodes.guru/okp4_addrbook.json

Проверить хеш сумму:

sha256sum $HOME/$CONFIG/config/genesis.json
# c2e8fff161850e419e1cb1bef3648c0ed0db961b7713151f10f2509e3fc2ff40

Оптимизация места на диске:

https://gist.github.com/Danil00524/70038a9ef2c1d64ad0767f0bf71c7ecf

# Memory optimization. Removes unused data from the database. | ONE COMMAND
indexer="null" && \
snapshot_interval="0" && \
pruning="custom" && \
pruning_keep_recent="100" && \
pruning_keep_every="0" && \
pruning_interval="10" && \
sed -i.bak -e "s/^indexer *=.*/indexer = \"$indexer\"/" $HOME/$CONFIG/config/config.toml && \
sed -i.bak -e "s/^snapshot-interval *=.*/snapshot-interval = \"$snapshot_interval\"/" $HOME/$CONFIG/config/app.toml && \
sed -i.bak -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/$CONFIG/config/app.toml && \
sed -i.bak -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/$CONFIG/config/app.toml && \
sed -i.bak -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/$CONFIG/config/app.toml && \
sed -i.bak -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/$CONFIG/config/app.toml

Создание службы и запуск ноды:

# Create service | ONE COMMAND
sudo tee /etc/systemd/system/$TIKER.service > /dev/null <<EOF
[Unit]
Description=$PROJECT Node
After=network.target

[Service]
User=$USER
Type=simple
ExecStart=$(which $TIKER) start
Restart=on-failure
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

Запуск службы:

sudo systemctl daemon-reload && \
sudo systemctl enable $TIKER && \
sudo systemctl restart $TIKER && \
sudo journalctl -u $TIKER -f -o cat

Дождитесь пока нода синхронизируется, ответ команды ниже должен быть false:

curl -s $NODE/status | jq .result.sync_info.catching_up

Создание валидатора:

Запросите тестовые токены на адрес кошелька:

https://faucet.okp4.network/

Адрес можно посмотреть командой:

echo $ADDRESS

Убедитесь что баланс кошелька пополнен:

$TIKER q bank balances $ADDRESS

Теперь создайте валидатора:

# You can change the amount for your own. 1 token is 1000000. You need minimum 1 token for creating.
# You can change the commission-rate for your own. 5% is 0.05
$TIKER tx staking create-validator \
  --amount=990000$TOKEN \
  --pubkey=$($TIKER tendermint show-validator) \
  --moniker=$MONIKER \
  --chain-id=$CHAIN \
  --commission-rate="0.10" \
  --commission-max-rate="0.20" \
  --commission-max-change-rate="0.05" \
  --min-self-delegation=500000 \
  --fees=500$TOKEN \
  --from=$WALLET \
  --identity=$IDENTITY \
  --website=$WEBSITE \
  --details=$DETAILS \
  --security-contact=$SECURITY_CONTACT \
  -y

Сделайте бэкап ключа валидатора:

mkdir -p /home/$PROJECT/
cp $HOME/$CONFIG/config/priv_validator_key.json /home/$PROJECT/

Explorer блокчейна для проверки статуса валидатора.

Обновить ноду:

# Example: v2.2.0
TAG_NAME=v2.2.0
BRANCH_NAME=v2.2.0

sudo systemctl stop $TIKER && \
cd $PROJECT && \
git pull; \
git checkout tags/$TAG_NAME -b $BRANCH_NAME && \
make clean; \
make install && \
sudo systemctl restart $TIKER && \
journalctl -u $TIKER -f -o cat

Удалить ноду:

# SAVE YOUR $HOME/$CONFIG/config/priv_validator_key.json 

sudo systemctl stop $TIKER && \
sudo systemctl disable $TIKER; \
sudo rm /etc/systemd/system/$TIKER.service; \
sudo systemctl daemon-reload && \
cd $HOME && \
rm -rf $CONFIG $PROJECT; \
sudo rm $(which $TIKER)

Полезные команды:

Статус ноды

# Service logs
journalctl -u $TIKER -f -o cat

# Service control
systemctl status $TIKER
systemctl stop $TIKER
systemctl start $TIKER
systemctl restart $TIKER

# Check node status
curl -s $NODE/status

# Check synchronization of your node, if the result is false, the node is synchronized
curl -s $NODE/status | jq .result.sync_info.catching_up

# Check consensus (AFTER START)
curl -s $NODE/consensus_state  | jq '.result.round_state.height_vote_set[0].prevotes_bit_array'

# Connected peers
curl -s $NODE/net_info | jq -r '.result.peers[] | "\(.node_info.id)@\(.remote_ip):\(.node_info.listen_addr | split(":")[2])"' | wc -l

# Jail, tombstoned, start_height, index_offset
$TIKER q slashing signing-info $($TIKER tendermint show-validator)

# Get peer (e.g. [email protected]:26656
echo "$($TIKER tendermint show-node-id)@$(curl ifconfig.me):$(curl -s $NODE/status | jq -r '.result.node_info.listen_addr' | cut -d':' -f3)"

Кошельки

# Get wallet address
echo $ADDRESS

# Get eth wallet private key
$TIKER keys unsafe-export-eth-key $WALLET

# Get balance
$TIKER q bank balances $ADDRESS

# Send tokens. 1 token = 1000000 (Cosmos)
$TIKER tx bank send $WALLET <ADDRESS_TO> <TOKENS_COUNT>$TOKEN --fees 500$TOKEN

Голосование

# Vote
$TIKER tx gov vote <PROPOSAL_ID> <yes|no> --from $WALLET --fees 5000$TOKEN -y

# Check all voted proposals
$TIKER q gov proposals --voter $ADDRESS

Действия с валидатором

# Get validator address (valoper)
echo $VALOPER

# Edit validator
$TIKER tx staking edit-validator --website="<YOUR_WEBSITE>" --details="<YOUR_DESCRIPTION>" --moniker="<YOUR_NEW_MONIKER>" --from=$WALLET --fees 500$TOKEN

# Unjail
$TIKER tx slashing unjail --from $WALLET --fees 500$TOKEN

# Bond more tokens (if you want increase your validator stake you should bond more to your valoper address):
$TIKER tx staking delegate $VALOPER <TOKENS_COUNT>$TOKEN --from $WALLET --fees 500$TOKEN -y

# Undelegate
$TIKER tx staking unbond $VALOPER <TOKENS_COUNT>$TOKEN --from $WALLET --fees 500$TOKEN -y

# Ределегировать награды на другого валидатора
$TIKER tx staking redelegate <src-validator-addr> <dst-validator-addr> 1000000$TOKEN --from $WALLET --fees 500$TOKEN -y

# собрать реварды со всех валидаторов, которым делегировали (без комиссии) 
# Take rewards from all walidators without commission
$TIKER tx distribution withdraw-all-rewards --from $WALLET --fees 500$TOKEN -y 

# собрать реварды + комиссию со своего или другого валидатора 
# Take rewards and commission from your validator
$TIKER tx distribution withdraw-rewards $VALOPER --from $WALLET --fees 500$TOKEN --commission -y

# Reset private validator file to genesis state and delete addrbook.json
$TIKER tendermint unsafe-reset-all --home $HOME/$CONFIG

## All validators info
# List of all active validators | ONE COMMAND
$TIKER q staking validators -o json --limit=1000 \
| jq '.validators[] | select(.status=="BOND_STATUS_BONDED")' \
| jq -r '.tokens + " - " + .description.moniker' \
| sort -gr | nl

# List of all inactive validators | ONE COMMAND
$TIKER q staking validators -o json --limit=1000 \
| jq '.validators[] | select(.status=="BOND_STATUS_UNBONDED")' \
| jq -r '.tokens + " - " + .description.moniker' \
| sort -gr | nl

# параметры сети
# Network options
$TIKER q staking params 
$TIKER q slashing params

@starnodes_ru - наш канал в Telegram с новостями и гайдами по тестнетам.
@starnodes_chat - канал, куда можно обратиться за помощью.