cosmos
June 9, 2022

Пошаговая инструкция по созданию валидатора в сети Cosmos + Linux

Базовые настройки сервера

sudo apt-get update && sudo apt-get upgrade -y

sudo apt-get install -y build-essential curl wget ncdu git

sudo apt install ufw -y

sudo ufw allow 22:65535/tcp

sudo ufw allow 22:65535/udp

sudo ufw allow 22 

sudo ufw deny out from any to 10.0.0.0/8

#sudo ufw deny out from any to 172.16.0.0/12

sudo ufw deny out from any to 192.168.0.0/16

sudo ufw deny out from any to 100.64.0.0/10

sudo ufw deny out from any to 198.18.0.0/15

sudo ufw deny out from any to 169.254.0.0/16

Устанавливаем Golang ("Go")

Предварительно узнать какая версия необходима для проекта. Актуальную версию проверяем тут - https://go.dev/dl/

Go (Golang) — это компилируемый многопоточный язык программирования от Google с открытым исходным кодом. Считается языком общего назначения, но основное применение — разработка веб-сервисов и клиент-серверных приложений. По данным GitHub, в конце 2021 года вошел в пятерку востребованных языков, опередив PHP, TypeScript и C#.

На примере версии go1.18.3

Скачиваем:
wget https://go.dev/dl/go1.18.3.linux-amd64.tar.gz

Разархивируем: 
sudo tar -C /usr/local -xzf go1.18.3.linux-amd64.tar.gz

Создаем дирректории для Go:
mkdir -p $HOME/go/bin

Добавляем путь для переменной PATH (необходимо для многоразового использования):
PATH=$PATH:/usr/local/go/bin 

Дозаписываем путь Go в файл .bash_profile (необходимо для многоразового использования):
echo "export PATH=$PATH:$(go env GOPATH)/bin" >> ~/.bash_profile 

Запускаем команды из файла
source ~/.bash_profile

Проверить командой:
go version 

На выходе должны получить такое значение:
"go version go1.18.3 linux/amd64"

Инициализируем ноду

Предварительно находим путь к бинарному файлу ноды. Запускаем установку.

На примере Mainet ноды KiChain

Клонируем репозиторий из github:
git clone https://github.com/KiFoundation/ki-tools.git

Переходим к скаченной папке:
cd ki-tools

Переключаемся на актуальную версию:
git checkout -b v2.0.1 tags/2.0.1 

Производим установку:
make install
Подробнее о работе с командами git - https://gist.github.com/rdnvndr/cb21a06c5a71fd71213aed1619380b8e
Проверяем версию установленной ноды:
kid version --long --log_level info

Настраиваем директорию ноды

Задаем путь для родительской папки NODE_ROOT:
export NODE_ROOT= <расположение по вашему выбору>

Создаем папки /kid, /kilogs:
mkdir -p $NODE_ROOT/kid $NODE_ROOT/kilogs

Переходим к родительской папке:
cd $NODE_ROOT

Шаг выше можно пропустить. В этом случае узел будет создан в директории умолчанию./home/<user>/.kid/

Инициализируем ноду, чтобы создать необходимые файлы конфигурации

kid init [moniker name] --chain-id keychain-2

Скачиваем Genesis

Файл genesis - это файл JSON, который определяет начальное состояние вашего блокчейна. Это можно рассматривать как высоту 0вашего блокчейна. Первый блок на высоте 1будет ссылаться на файл genesis в качестве родителя.

Состояние, определенное в файле genesis, содержит всю необходимую информацию, такую как начальное распределение токенов, время генезиса, параметры по умолчанию и многое другое.

Подробнее про genesis файл можно почитать тут.

Скачиваем genesis файл из "https://raw.githubusercontent.com/KiFoundation/ki-networks/v0.1/Mainnet/kichain-2/genesis.json" в директорию ./kid/config/genesis.json

curl https://raw.githubusercontent.com/KiFoundation/ki-networks/v0.1/Mainnet/kichain-2/genesis.json > ./kid/config/genesis.json

Hash genesis файла можно узнать следующей командой:

jq -S -c -M '' /.kid/config/genesis.json | shasum -a 256

На выходе должны получить примерно такое выражение:
99855fdf89f5c697f8be2ecc587d79c77259e05d68268928797083bdaa614a80

Настраиваем конфигурацию ноды

Настройка seed & peers

Скачиваем и устанавливаем файлом или прописываем вручную (обычно расположен в config, формат json):

seeds="[email protected]:26656"
 
peers="[email protected]:26656,[email protected]:26656,[email protected]:26656,[email protected]:26656,[email protected]:26656,[email protected]:26656" 

sed -i -e "s/^seeds *=.*/seeds = \"$seeds\"/; s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" ~/.kid/config/config.toml

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

Переменные: цена газа, тикер токена, директория файла

sed -i 's/^minimum-gas-prices *=.*/minimum-gas-prices = "0.025uxki"/g' ~/.kid/config/app.toml

Настраиваем прунинг командами в app.toml

На кастом значения: recent - 100, every - 0, interval - 10

Необходимо для экономии места на диске

sed -i 's/pruning = "default"/pruning = "custom"/g' ~/.kid/config/app.toml 
sed -i 's/pruning-keep-recent = "0"/pruning-keep-recent = "100"/g' ~/.kid/config/app.toml 
sed -i 's/pruning-interval = "0"/pruning-interval = "10"/g' ~/.kid/config/app.toml

Создаем сервисный файл

sudo tee <<EOF >/dev/null /etc/systemd/system/kid.service 
[Unit] 
Description=Kichain Node 
After=network-online.target 
[Service] 
User=$USER 
ExecStart=$(which kid) start 
Restart=on-failure 
RestartSec=3 
LimitNOFILE=4096 
[Install] 
WantedBy=multi-user.target 
EOF
Что такое сервисный файл статья

Если вы создаете ноду не со старта сети, можете использовать State sync или Snapshot. Для того чтобы ускорить процесс синхронизации с последними блоками. Snapshot - фото статус блокчейна. State sync - при подключении указывается доверенная высота блока, доверенная нода и происходит ускоренная синхронизация (если разархирование происходит не сразу - нужно позаботиться о месте на диске, т.к сначала снэпшот скачивается и далее разархивируется). Пример для майнет ноды Kichain - https://nodejumper.io/kichain/sync.

Перезагрузка ноды, вывод логов

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

Создаем или восстанавливаем кошелек

Создать кошелек (обязательно сохраняем seed)
kid keys add <name_wallet> 

Восстановить кошелек (после команды вставить seed) 
kid keys add <name_wallet> --recover

Получаем тестовые токены

Смотрите дискорд проекта; Краны; Формы

Создаем валидатора

Создание валидатора возможно только после полной синхронизации ноды и собственной делегации

В командах ниже все, что в <> меняем на свое значение и убираем <>. (1000000uxki = 1ki)

kid tx staking create-validator \ 
--commission-max-change-rate=0.1 \ 
--commission-max-rate=0.1 \ 
--commission-rate=0.1 \ 
--min-self-delegation=1 \ 
--amount=1000000uxki \ 
--pubkey `kid tendermint show-validator 
--home ./kid/` \ 
--moniker=<YOUR_MONIKER> \ 
--chain-id=kichain-2 \ 
--gas-prices="0.025uxki" \ 
--from=<WALLET_NAME>

Обязательно сохраняем файл с приватным ключом ".json"

Другие подкоманды создания/редактирования валидатора.

Обновление версии ноды

Ранее мы установили ноду Kichain версии v2.0.1, представим ситуацию когда нам необходимо обновится до версии v2.0.2

Останавливаем ноду:
sudo systemctl stop kid 

Удаляем устаревший репозиторий:
sudo rm -rf $HOME/ki-tools

Копируем обновленый репозиторий:
git clone https://github.com/KiFoundation/ki-tools.git

Переходим в директорию ki-tools:
cd ki-tools

Устанавливаем и проверяем новую ветку:
git checkout -b v2.0.2 tags/2.0.2

Устанавливаем обновление:
make install 

Проверяем установленную версию:
kid version --long --log_level info  

Перезагружаем систему и выводим логи:
sudo systemctl restart kid && journalctl -u kid -f -o cat

Добавляем лого к своему валидатору

Для mintscan:

  1. Клонируем к себе в гитхаб репозиторий - https://github.com/cosmostation/cosmostation_token_resource
  2. Находим нужную сеть в папке moniker
  3. Через add file/upload file добавляем своё лого, название файла обязательно должно быть valoperadress.png и только png
  4. Pull request

Для других экплореров:

  1. Регистрируемся на сайте https://keybase.io/, подтверждаем почту, оформляем свой аккаунт
  2. Получаем свой PGP key, можно через виндоус терминал
  3. Вставляем код в терминал, со своими значениями (вместо значения 1A1A2B2B3C3C4D4D подставляем собственное):
kid tx staking edit-validator \ 
--moniker "MONIKER_NAME" \ 
--identity "1A1A2B2B3C3C4D4D" \ 
--details "ANY_TEXT" \ 
--node `grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")" $HOME/.kid/config/config.toml` \ 
--from "$ki_wallet_name"

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

https://docs.google.com/spreadsheets/d/1haiuoi_TS8iYhEa9F2satd1MeXigiWiD07pY9Ir6LK4/edit#gid=0

info:

ps -eF - Можно посмотреть какие процессы запущены на сервере

kid status 2>&1 - инфа о ноде

kid status 2>&1 | jq.SyncInfo - инфа о синхре

kid status 2>&1 | jq ."SyncInfo"."latest_block_height" - инфа о последнем блоке

nano .kid/config/app.toml - управление портами
nano .kid/config/config.toml - управление портами

sudo journalctl -u kid -f -o cat - проверить логи

kid q bank balances <address> - проверить баланс

kid query staking validator <valoper_address> - проверить валидатора

kid query staking validators --limit 1000000 -o json | jq '.validators[] | select(.description.moniker=="<name_moniker>")' | jq - проверить валидатора

kid query tx <TX_HASH> - проверка информации по TX_HASH

kid q staking params - параметры сети

kid q slashing params - параметры сети

kid q slashing signing-info $(kid tendermint show-validator) - проверить сколько блоков пропущено валидатором и с какого блока актив

kid query txs --events='create_validator.validator=<your_valoper_address>' -o=json | jq .txs[0].txhash -r - узнать транзакцию создания валидатора (заменить свой valoper_address)

transactions:

kid tx distribution withdraw-rewards <valoper_address> --from <name_wallet> --fees 5555uxki --commission -y - собрать комиссионные + реварды

kid tx staking delegate <valoper_address> 1000000uxki --from <name_wallet> --fees 5555uxki -y - заделегировать себе в стейк еще (так отправляется 1 монетa)

kid tx staking redelegate <src-validator-addr> <dst-validator-addr> 1000000uxki --from <name_wallet> --fees 5555uxki -y - ределегирование на другого валидатора

kid tx staking unbond <addr_valoper> 1000000uxki --from <name_wallet> --fees 5555uxki -y - unbond

kid tx bank send <name_wallet> <address> 1000000uxki --fees 5555uxki -y - отправить монеты на другой адрес

kid tx slashing unjail --from <name_wallet> --fees 5555uxki -y - выбраться из тюрьмы

kid q distribution commission $(kid keys show $WALLET --bech val -a) - позволяет пользователям запрашивать комиссионные вознаграждения валидатора по адресу

kid q distribution rewards $(kid keys show $WALLET -a) - позволяет пользователям запрашивать вознаграждение делегатора

wallet:

kid keys list - вывести список кошельков

kid keys show <name_wallet> --bech acc - показать ключ аккаунта

kid keys show <name_wallet> --bech val - показать ключ валидатора

kid keys show <name_wallet> --bech cons - показать ключ консенсуса

kid q auth account $(quicksilverd keys show <name_wallet> -a) -o text - запрос учетной записи

kid keys delete <name_wallet> - удалить кошелек

delete node:

sudo systemctl stop kid && \ sudo systemctl disable kid && \ rm /etc/systemd/system/kid.service && \ sudo systemctl daemon-reload && \ cd $HOME && \ rm -rf .ki .ki-tools ki-chain-2 && \ rm -rf $(which kid)

governance:

kid q gov proposals - список proposals

kid q gov proposals --voter <ADDRESS> - посмотреть результат голосования

kid tx gov vote 1 yes --from <name_wallet> --fees 5550uxki - проголосовать за предложение

kid tx gov deposit 1 1000000uxki --from <name_wallet> --fees 5550uxki - внести депозит в предложение

active set:

kid q staking validators -o json --limit=1000 \ | jq '.validators[] | select(.status=="BOND_STATUS_BONDED")' \ | jq -r '.tokens + " - " + .description.moniker' \ | sort -gr | nl

not active set:

kid q staking validators -o json --limit=1000 \ | jq '.validators[] | select(.status=="BOND_STATUS_UNBONDED")' \ | jq -r '.tokens + " - " + .description.moniker' \ | sort -gr | nl

peers:

curl -s http://localhost:26657/net_info | jq -r '.result.peers[] | "\(.node_info.id)@\(.remote_ip):\(.node_info.listen_addr | split(":")[2])"' | wc -l - проверка количества пиров

curl -s http://localhost:26657/net_info | jq '.result.peers[].node_info.moniker' - cписок моникеров подключенных пиров

chek vote power online:

curl -s localhost:26657/consensus_state | jq '.result.round_state.height_vote_set[0].prevotes_bit_array'

check transaction from adress:

kid q txs --events transfer.sender=<ADDRESS> 2>&1 | jq | grep txhash - поиск всех исходящих транзакций по адресу

kid q txs --events transfer.recipient=<ADDRESS> 2>&1 | jq | grep txhash - поиск всех входящих транзакций по адресу

Полезные ссылки

Базовые методы управления текстом в терминале
Полезная документация cosmos network