February 3, 2023

Babylon

Web Discord Github

Babylon — это новый проект Cosmos, видение которого состоит в том, чтобы использовать безопасность биткойнов для повышения безопасности зон Cosmos и других цепочек PoS

Details

# проверяем статус prevotes/precommits
FOLDER=.babylond

# узнать порт RPC
echo -e "\033[0;32m$(grep -A 3 "\[rpc\]" ~/$FOLDER/config/config.toml | egrep -o ":[0-9]+")\033[0m"

PORT=<ввести свой порт>

# Проверка prevotes/precommits. Пригодится при обновах
curl -s localhost:$PORT/consensus_state | jq '.result.round_state.height_vote_set[0].prevotes_bit_array' && \
curl -s localhost:$PORT/consensus_state | jq '.result.round_state.height_vote_set[0].precommits_bit_array'

UPD 🕊 на

Высота обновления:

cd $HOME/babylon
git pull
git checkout 
make build
$HOME/babylon/build/babylond version --long | grep -e version -e commit
# 
# commit: 

# ПОСЛЕ ОСТАНОВКИ СЕТИ НА НУЖНОМ БЛОКЕ!!!
systemctl stop babylond
mv $HOME/babylon/build/babylond $(which babylond)
babylond version --long | grep -e version -e commit
# 

systemctl restart babylond && journalctl -u babylond -f -o cat

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

# обновляем репозитории
apt update && apt upgrade -y

# устанавливаем необходимые утилиты
apt install curl iptables build-essential git wget jq make gcc nano tmux htop nvme-cli pkg-config libssl-dev libleveldb-dev tar clang bsdmainutils ncdu unzip libleveldb-dev -y

File2Ban - подробнее здесь и здесь

# устанавливаем и копируем конфиг, который будет иметь больший приоритет
apt install fail2ban -y && \
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local && \
nano /etc/fail2ban/jail.local
# раскомментировать и добавить свой IP: ignoreip = 127.0.0.1/8 ::1 <ip>
systemctl restart fail2ban

# проверяем status 
systemctl status fail2ban
# проверяем, какие jails активны (по умолчанию только sshd)
fail2ban-client status
# проверяем статистику по sshd
fail2ban-client status sshd
# смотрим логи
tail /var/log/fail2ban.log
# останавливаем работу и удаляем с автозагрузки
#systemctl stop fail2ban && systemctl disable fail2ban

Устанавливаем GO

ver="1.20.3" && \
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

Новая установка ноды

ВАЖНО — в командах ниже все, что в <> меняем на свое значение и убираем сами <>

Устанавливаем бинарники

git clone https://github.com/babylonchain/babylon && cd babylon
git checkout v0.7.2
make install

babylond version --long | grep -e version -e commit
# v0.7.2
# commit: fee9407953347b6f78c9dc63c3dd141d936f4f04

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

babylond init UTSA_guide --chain-id bbn-test-2

Скачиваем Genesis

#wget -O $HOME/.babylond/config/genesis.json "https://snapshots.kjnodes.com/babylon-testnet/genesis.json"
wget https://github.com/babylonchain/networks/raw/main/bbn-test-2/genesis.tar.bz2
tar -xjf genesis.tar.bz2 && rm genesis.tar.bz2
mv genesis.json ~/.babylond/config/genesis.json

# Проверим генезис
sha256sum ~/.babylond/config/genesis.json
# 091bd1c0ec67178faae923eb3b21020d6d4b5844de31bf314d7936168b3aa18c

Проверяем, что состояние валидатора на начальном этапе

cd && cat .babylond/data/priv_validator_state.json
{
  "height": "0",
  "round": 0,
  "step": 0
}

# если нет, то выполняем команду
babylond tendermint unsafe-reset-all --home $HOME/.babylond

Скачиваем Addr book

wget -O $HOME/.babylond/config/addrbook.json "https://share101.utsa.tech/babylon/addrbook.json"

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

В настоящее время валидаторы могут использовать только test серверную часть keyring, потому что им необходимо автоматически отправлять транзакции, содержащие подписи BLS. В будущем Babylon будет поддерживать другие типы зашифрованных бэкэндов, предоставляемых Cosmos SDK для валидаторов

# правим конфиг, благодаря чему мы можем больше не использовать флаг chain-id для каждой команды CLI в client.toml
babylond config chain-id bbn-test-2

# при необходимости настраиваем keyring-backend в client.toml 
# В настоящее время в babylon валидаторы могут использовать только keyring backend=test
babylond config keyring-backend test

# настраиваем минимальную цену за газ в app.toml
sed -i.bak -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.00001ubbn\"/;" ~/.babylond/config/app.toml

# добавляем seeds/bpeers/peers в config.toml
external_address=$(wget -qO- eth0.me)
sed -i.bak -e "s/^external_address *=.*/external_address = \"$external_address:26656\"/" $HOME/.babylond/config/config.toml

peers=""
sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.babylond/config/config.toml

#bpeers=""
#sed -i.bak -e "s/^bootstrap-peers *=.*/bootstrap-peers = \"$bpeers\"/" $HOME/.babylond/config/config.toml

seeds="8da45f9ff83b4f8dd45bbcb4f850999637fbfe3b@seed0.testnet.babylonchain.io:26656"
sed -i.bak -e "s/^seeds =.*/seeds = \"$seeds\"/" $HOME/.babylond/config/config.toml

# при необходимости увеличиваем количество входящих и исходящих пиров для подключения, за исключением постоянных пиров в config.toml
# может помочь при падении ноды, но увеличивает нагрузку
sed -i 's/max_num_inbound_peers =.*/max_num_inbound_peers = 50/g' $HOME/.babylond/config/config.toml
sed -i 's/max_num_outbound_peers =.*/max_num_outbound_peers = 25/g' $HOME/.babylond/config/config.toml

# настраиваем фильтрацию "плохих" peers
sed -i -e "s/^filter_peers *=.*/filter_peers = \"true\"/" $HOME/.babylond/config/config.toml
# consensus
sed -i -e "s/^timeout_commit *=.*/timeout_commit = \"10s\"/" $HOME/.babylond/config/config.toml
#sed -i -e "s/^timeout_propose *=.*/timeout_propose = \"10s\"/" $HOME/.babylond/config/config.toml
#sed -i -e "s/^create_empty_blocks_interval *=.*/create_empty_blocks_interval = \"10s\"/" $HOME/.babylond/config/config.toml
#sed -i 's/create_empty_blocks = .*/create_empty_blocks = true/g' ~/.babylond/config/config.toml
#sed -i 's/timeout_broadcast_tx_commit = ".*s"/timeout_broadcast_tx_commit = "10s"/g' ~/.babylond/config/config.tom

В app.toml в самом низу конфигурации nano $HOME/.babylond/config/app.toml найдите раздел Babylon Bitcoin configuration в котором добавьте название вашего кошелька к параметру key-name = ""

Также проверьте, чтобы btc-config Network: mainnet

(ОПЦИОНАЛЬНО) Настраиваем прунинг одной командой вapp.toml

pruning="custom"
pruning_keep_recent="1000"
pruning_interval="10"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.babylond/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.babylond/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.babylond/config/app.toml

(ОПЦИОНАЛЬНО) Выкл индексацию вconfig.toml

indexer="null"
sed -i -e "s/^indexer *=.*/indexer = \"$indexer\"/" $HOME/.babylond/config/config.toml

(ОПЦИОНАЛЬНО) Вкл/выкл снэпшоты вapp.toml

# По умолчанию снэпшоты выключены "snapshot-interval=0"
snapshot_interval=1000
sed -i.bak -e "s/^snapshot-interval *=.*/snapshot-interval = \"$snapshot_interval\"/" ~/.babylond/config/app.toml

(ОПЦИОНАЛЬНО) Смена портов #для 2 ноды

# config.toml
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:36658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:36657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:6061\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:36656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":36660\"%" $HOME/.babylond/config/config.toml

# app.toml
sed -i.bak -e "s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:9190\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:9191\"%; s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:1327\"%" $HOME/.babylond/config/app.toml

# client.toml
sed -i.bak -e "s%^node = \"tcp://localhost:26657\"%node = \"tcp://localhost:36657\"%" $HOME/.babylond/config/client.toml

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

Подробнее о смене портов здесь

(ОПЦИОНАЛЬНО) State Sync


# при необходимости скачиваем wasm
curl -L https://share101.utsa.tech/babylon/wasm-babylon.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.babylond --strip-components 2
# добавляем пир
peers="[email protected]:61456"
sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.babylond/config/config.toml
SNAP_RPC=https://t-babylon.rpc.utsa.tech:443

LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 100)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash)

echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH

sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"| ; \
s|^(seeds[[:space:]]+=[[:space:]]+).*$|\1\"\"|" $HOME/.babylond/config/config.toml
systemctl restart babylond && journalctl -u babylond -f -o cat

Важно - для разных блокчейнов нужно разное количество RAM для успешного старта со State sync

systemctl stop babylond
babylond tendermint unsafe-reset-all --home $HOME/.babylond --keep-addr-book

(ОПЦИОНАЛЬНО) Snapshot

systemctl stop babylond

cp $HOME/.babylond/data/priv_validator_state.json $HOME/.babylond/priv_validator_state.json.backup
babylond tendermint unsafe-reset-all --home $HOME/.babylond --keep-addr-book

# download wasm if necessary
#curl -L https://share101.utsa.tech/okp4/wasm-okp4.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.babylond --strip-components 2
# download snapshot (data)
#curl -L https://share101.utsa.tech/babylon/snap-babylon.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.babylond --strip-components 2

mv $HOME/.babylond/priv_validator_state.json.backup $HOME/.babylond/data/priv_validator_state.json

systemctl restart babylond && journalctl -u babylond -f -o cat

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

tee /etc/systemd/system/babylond.service > /dev/null <<EOF
[Unit]
Description=babylond
After=network-online.target

[Service]
User=$USER
ExecStart=$(which babylond) start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable babylond
systemctl restart babylond && journalctl -u babylond -f -o cat

Если после старта нода долго не может подцепиться к пирам, то ищем новые пиры или просим addrbook.json в дискорд

# стопаем ноду, удаляем адресную книгу и сбрасываем данные
systemctl stop babylond
rm $HOME/.babylond/config/addrbook.json
babylond tendermint unsafe-reset-all --home $HOME/.babylond

# перезагружаем ноду
systemctl restart babylond && journalctl -u babylond -f -o cat

Создаем или восстанавливаем кошелек и сохраняем вывод

# создать кошелек
babylond keys add <name_wallet> --keyring-backend test

# восстановить кошелек (после команды вставить seed)
babylond keys add <name_wallet> --recover --keyring-backend test

# восстановить кошелек для EVM сетей
#babylond keys add <name_wallet> --recover --coin-type 118 --algo secp256k1

Не забываем сохранить seed !!!

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

1. Сначала создаем ключ BLS

Ожидается, что валидаторы будут отправлять подпись BLS в конце каждой эпохи. Для этого у валидатора должна быть пара ключей BLS для подписи информации
babylond create-bls-key $(babylond keys show <name_wallet> -a)
Эта команда создаст ключ BLS и добавит его в файл priv_validator_key.json
Это тот же файл, в котором хранится закрытый ключ, который валидатор использует для подписи блоков. Пожалуйста, убедитесь, что этот файл защищен должным образом!

2. Добавляем название кошелька в app.toml

В самом низу конфигурации nano $HOME/.babylond/config/app.toml найдите раздел Babylon Bitcoin configuration в котором добавьте название вашего кошелька к параметру key-name = ""

sed -i -e "s|^key-name *=.*|key-name = \"<name_wallet>\"|" $HOME/.babylond/config/app.toml

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

systemctl restart babylond && journalctl -u babylond -f -o cat

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

babylond tx checkpointing create-validator \
--chain-id bbn-test-2 \
--commission-rate 0.05 \
--commission-max-rate 0.2 \
--commission-max-change-rate 0.1 \
--min-self-delegation "1000000" \
--amount 1000000ubbn \
--pubkey $(babylond tendermint show-validator) \
--moniker "<name_moniker>" \
--from <name_wallet> \
--fees 2ubbn
Note: In order to become an active validator, you need to have more ubbn tokens bonded than the last validator ordered by the tokens bonded (or the validator set to not be full) as well as have at least 10000000ubbn bonded.
В Babylon стать валидатором можно только после окончания эпохи. Для тестовой сети эпоха длится около 30 минут

Не забываем сохранить priv_validator_key.json !!!

Подробнее о создании/редактировании валидатора можно почитать здесь

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

Для добавления лого в mintscan (ТОЛЬКО ДЛЯ MINTSCAN):

  • форк https://github.com/cosmostation/chainlist
  • в папке Moniker находим название проекта
  • через add file/upload file добавляем свою аватарку. название файла обязательно должно быть валопер.png . и только png
  • PR

Информация

# проверить блоки
babylond status 2>&1 | jq ."SyncInfo"."latest_block_height"

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

# проверить статус
curl localhost:26657/status

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

# проверить pubkey валидатора
babylond tendermint show-validator

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

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

# параметры сети
babylond q staking params
babylond q slashing params

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

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

# просмотр активного сета
babylond q staking validators -o json --limit=1000 \
| jq '.validators[] | select(.status=="BOND_STATUS_BONDED")' \
| jq -r '.tokens + " - " + .description.moniker' \
| sort -gr | nl

# просмотр неактивного сета
babylond q staking validators -o json --limit=1000 \
| jq '.validators[] | select(.status=="BOND_STATUS_UNBONDED")' \
| jq -r '.tokens + " - " + .description.moniker' \
| sort -gr | nl

Транзакции

# собрать реварды со всех валидаторов, которым делегировали (без комиссии)
babylond tx distribution withdraw-all-rewards --from <name_wallet> --fees 2ubbn -y

# собрать реварды c отдельного валидатора или реварды + комиссию со своего валидатора
babylond tx distribution withdraw-rewards <valoper_address> --from <name_wallet> --fees 2ubbn --commission -y

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

# ределегирование на другого валидатора
babylond tx epoching redelegate <src-validator-addr> <dst-validator-addr> 1000000ubbn --from <name_wallet> --fees 2ubbn -y

# unbond 
babylond tx epoching unbond <addr_valoper> 1000000ubbn --from <name_wallet> --fees 2ubbn -y

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

# выбраться из тюрьмы
babylond tx slashing unjail --from <name_wallet> --fees 2ubbn -y

! Если транзакции не отправляются с ошибкой account sequence mismatch, expected 18, got 17: incorrect account sequence, то добавьте в команду ключ -s 18 (номер замените на тот, который ждет sequence)

Работа с кошельками

# вывести список кошельков
babylond keys list

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

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

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

# показать все поддерживаемые адреса
babylond debug addr <wallet_addr>

# показать приватный ключ
babylond keys export <name_wallet> --unarmored-hex --unsafe

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

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

Удалить ноду

systemctl stop babylond && \
systemctl disable babylond && \
rm /etc/systemd/system/babylond.service && \
systemctl daemon-reload && \
cd $HOME && \
rm -rf .babylond babylon && \
rm -rf $(which babylond)

ГОВЕРНАНС (подробнее здесь)

# список proposals
babylond q gov proposals

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

# проголосовать за предложение 
babylond tx gov vote 1 yes --from <name_wallet> --fees 555ubbn

# внести депозит в предложение
babylond tx gov deposit 1 1000000ubbn --from <name_wallet> --fees 555ubbn

# создать предложение
babylond tx gov submit-proposal --title="Randomly reward" --description="Reward 10 testnet participants who completed more than 3 tasks" --type="Text" --deposit="11000000grain" --from=<name_wallet> --fees 500ubbn

Peers and RPC

FOLDER=.babylond

# узнать свой peer
PORTR=$(grep -A 3 "\[p2p\]" ~/$FOLDER/config/config.toml | egrep -o ":[0-9]+") && \
echo $(babylond tendermint show-node-id)@$(curl ifconfig.me)$PORTR

# узнать порт RPC
echo -e "\033[0;32m$(grep -A 3 "\[rpc\]" ~/$FOLDER/config/config.toml | egrep -o ":[0-9]+")\033[0m"

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

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

# Проверка prevotes/precommits. Пригодится при обновах
curl -s localhost:$PORT/consensus_state | jq '.result.round_state.height_vote_set[0].prevotes_bit_array' && \
curl -s localhost:$PORT/consensus_state | jq '.result.round_state.height_vote_set[0].precommits_bit_array'

# check prevote of your validator
curl -s localhost:$PORT/consensus_state -s | grep $(curl -s localhost:26657/status | jq -r .result.validator_info.address[:12])