Пошаговая инструкция по созданию валидатора в сети 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:
- Клонируем к себе в гитхаб репозиторий - https://github.com/cosmostation/cosmostation_token_resource
- Находим нужную сеть в папке moniker
- Через add file/upload file добавляем своё лого, название файла обязательно должно быть valoperadress.png и только png
- Pull request
Для других экплореров:
- Регистрируемся на сайте https://keybase.io/, подтверждаем почту, оформляем свой аккаунт
- Получаем свой PGP key, можно через виндоус терминал
- Вставляем код в терминал, со своими значениями (вместо значения
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 | 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 - запрос учетной записи
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