COSMOS
September 26

Zenrock

Web Discord Github

Details

Обновления

Genesis стартует с версии zenrockd-4.7.1

UPD 🕊 на v (Высота обновления: )

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

# обновляем репозитории
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.22.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
ufw allow 26656 comment p2p_port

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

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

В настоящее время для работы ноды необходимо запустить два отдельных клиента:

  • zenrockd, consensus client
  • zenrock-sidecar, oracle
# при необходимости создаем каталог go/bin/
mkdir -p $HOME/go/bin/
cd $HOME
mkdir -p zenrock && cd zenrock

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

curl -o zenrockd https://releases.gardia.zenrocklabs.io/zenrockd-4.7.1
chmod +x $HOME/zenrock/zenrockd
mv $HOME/zenrock/zenrockd $HOME/go/bin/
zenrockd version --long | grep -e version -e commit
# version: 4.7.1
# commit: dbf453ce6e010d87f1571142b0e8a84062764e27

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

zenrockd init UTSA_guide --chain-id gardia-2

Genesis

curl -s https://rpc.gardia.zenrocklabs.io/genesis | jq .result.genesis > $HOME/.zrchain/config/genesis.json

# Проверим genesis
sha256sum ~/.zrchain/config/genesis.json
# 85baddb3e1cb6b349aee2d79050b88f781ee34c0d0fc51d9ee2fecd04877ca3c

Скачиваем Addr book

wget -O $HOME/.zrchain/config/addrbook.json "https://share106-7.utsa.tech/zenrock/addrbook.json"

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

zenrockd config set client chain-id gardia-2
#zenrockd config set client keyring-backend test

sed -i 's|minimum-gas-prices =.*|minimum-gas-prices = "0urock"|g' $HOME/.zrchain/config/app.toml

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

peers="5458b7a316ab673afc34404e2625f73f0376d9e4@zenrock-testnet-peer.itrocket.net:11656,[email protected]:26656,[email protected]:26656"
sed -i -e "s|^persistent_peers *=.*|persistent_peers = \"$peers\"|" $HOME/.zrchain/config/config.toml
seeds="50ef4dd630025029dde4c8e709878343ba8a27fa@zenrock-testnet-seed.itrocket.net:56656"
sed -i.bak -e "s/^seeds =.*/seeds = \"$seeds\"/" $HOME/.zrchain/config/config.toml

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

(ОПЦИОНАЛЬНО) Настраиваем прунинг

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

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

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

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

# добавляем пир
peers="[email protected]:26656"
sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.zrchain/config/config.toml
SNAP_RPC=https://t-zenrock.archive.rpc.utsa.tech:443

LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 1000)); \
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/.zrchain/config/config.toml

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

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

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

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

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

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

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

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

Snapshot Archive

type: archive | time: every 1 days | pruning: nothing | indexer: kv

🌐 https://share106-7.utsa.tech/zenrock/

systemctl stop zenrockd

cp $HOME/.zrchain/data/priv_validator_state.json $HOME/.zrchain/priv_validator_state.json.backup

rm -rf $HOME/.zrchain/data
rm -rf $HOME/.zrchain/wasm

# скачиваем
curl -o - -L https://share106-7.utsa.tech/zenrock/zenrock_archive_testnet.tar.lz4 | lz4 -c -d - | tar -x -C $HOME/.zrchain/

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

systemctl restart zenrockd

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

Сервис validator sidecar позволяет проверяющим голосовать за данные oracle в процессе согласования в CometBFT

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

# создаем необходимые директории
mkdir -p $HOME/.zrchain/sidecar/bin
mkdir -p $HOME/.zrchain/sidecar/keys

Устанавливаем бинарный файл

wget -O $HOME/.zrchain/sidecar/bin/zenrock-sidecar https://releases.gardia.zenrocklabs.io/validator_sidecar-1.2.3
chmod +x $HOME/.zrchain/sidecar/bin/zenrock-sidecar

Копируем zenrock-validators

cd $HOME
git clone https://github.com/zenrocklabs/zenrock-validators

Задаем наш пароль для кошельков sidecar

read -p "Enter password for the keys: " key_pass

Build BLS binary

cd $HOME/zenrock-validators/utils/keygen/bls/
go mod tidy
go build

Создаем BLS key

bls_output_file=$HOME/.zrchain/sidecar/keys/bls.key.json
$HOME/zenrock-validators/utils/keygen/bls/bls --password $key_pass -output-file $bls_output_file

Build ecdsa binary

cd $HOME/zenrock-validators/utils/keygen/ecdsa/
go mod tidy
go build

Создаем ecdsa key

ecdsa_output_file=$HOME/.zrchain/sidecar/keys/ecdsa.key.json
ecdsa_creation=$($HOME/zenrock-validators/utils/keygen/ecdsa/ecdsa --password $key_pass -output-file $ecdsa_output_file)
ecdsa_address=$(echo "$ecdsa_creation" | grep "Public address" | cut -d: -f2)
echo "ecdsa address: $ecdsa_address"
#Public address:  0xe766944B5a25B1DE938eF19D15D1F5d3B4fe6E2D

ВАЖНО - для продолжения необходимо пополнить созданный ecdsa key тестовыми токенами Ethereum Holesky

Можно воспользоваться краном - https://stakely.io/faucet/ethereum-holesky-testnet-eth

ВАЖНО - для продолжения необходимо зарегистрироваться на https://app.infura.io или другом агрегаторе, чтобы получить следующие эндпойнты:

Опытным путем замечено, что бесплатные эндпойнты на infura не работают стабильно

Задаем переменные

EIGEN_OPERATOR_CONFIG="$HOME/.zrchain/sidecar/eigen_operator_config.yaml"
TESTNET_HOLESKY_ENDPOINT="<HTTPS_TESTNET_HOLESKY_ENDPOINT>"
MAINNET_ENDPOINT="<HTTPS_MAINNET_ENDPOINT>"
OPERATOR_VALIDATOR_ADDRESS_TBD="<ADDR_zenrockVALOPER>"
OPERATOR_ADDRESS_TBU=$ecdsa_address
ETH_RPC_URL="<HTTPS_TESTNET_HOLESKY_ENDPOINT>"
ETH_WS_URL="<WSS_TESTNET_HOLESKY_ENDPOINT>"
ECDSA_KEY_PATH=$ecdsa_output_file
BLS_KEY_PATH=$bls_output_file

Копируем исходные конфигурационные файлы

cp $HOME/zenrock-validators/configs/eigen_operator_config.yaml $HOME/.zrchain/sidecar/
cp $HOME/zenrock-validators/configs/config.yaml $HOME/.zrchain/sidecar/

Меняем данные в config.yaml

sed -i "s|EIGEN_OPERATOR_CONFIG|$EIGEN_OPERATOR_CONFIG|g" "$HOME/.zrchain/sidecar/config.yaml"
sed -i "s|TESTNET_HOLESKY_ENDPOINT|$TESTNET_HOLESKY_ENDPOINT|g" "$HOME/.zrchain/sidecar/config.yaml"
sed -i "s|MAINNET_ENDPOINT|$MAINNET_ENDPOINT|g" "$HOME/.zrchain/sidecar/config.yaml"

Меняем данные в eigen_operator_config.yaml

sed -i "s|OPERATOR_VALIDATOR_ADDRESS_TBD|$OPERATOR_VALIDATOR_ADDRESS_TBD|g" "$HOME/.zrchain/sidecar/eigen_operator_config.yaml"
sed -i "s|OPERATOR_ADDRESS_TBU|$OPERATOR_ADDRESS_TBU|g" "$HOME/.zrchain/sidecar/eigen_operator_config.yaml"
sed -i "s|ETH_RPC_URL|$ETH_RPC_URL|g" "$HOME/.zrchain/sidecar/eigen_operator_config.yaml"
sed -i "s|ETH_WS_URL|$ETH_WS_URL|g" "$HOME/.zrchain/sidecar/eigen_operator_config.yaml"
sed -i "s|ECDSA_KEY_PATH|$ECDSA_KEY_PATH|g" "$HOME/.zrchain/sidecar/eigen_operator_config.yaml"
sed -i "s|BLS_KEY_PATH|$BLS_KEY_PATH|g" "$HOME/.zrchain/sidecar/eigen_operator_config.yaml"

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

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

[Service]
User=$USER
ExecStart=$HOME/.zrchain/sidecar/bin/zenrock-sidecar
Restart=on-failure
RestartSec=30
LimitNOFILE=65535
Environment="OPERATOR_BLS_KEY_PASSWORD=$key_pass"
Environment="OPERATOR_ECDSA_KEY_PASSWORD=$key_pass"
Environment="SIDECAR_CONFIG_FILE=$HOME/.zrchain/sidecar/config.yaml"

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

Не забываем сохранить директорию $HOME/.zrchain/sidecar/

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

1. Получаем свой pubkey

zenrockd comet show-validator
# {"@type":"/cosmos.crypto.ed25519.PubKey","key":"ZXONS7NNjLWH4HePBOoHKDAYeLXQO5iUwpCRQSi1poI="}

2. Создаем validator.json

nano $HOME/.zrchain/validator.json

3. Вставляем наш конфиг

{
  "pubkey": {#pubkey},
  "amount": "1000000urock",
  "moniker": "moniker",
  "identity": "",
  "website": "",
  "security": "",
  "details": "",
  "commission-rate": "0.05",
  "commission-max-rate": "0.25",
  "commission-max-change-rate": "0.05",
  "min-self-delegation": "1"
}

4. Отправляем транзакцию

zenrockd tx validation create-validator $HOME/.zrchain/validator.json \
    --from=<key-name> \
    --chain-id=gardia-2 \
    --gas auto --gas-adjustment 1.5 --gas-prices 27urock

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

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

Информация

# проверить логи
journalctl -u zenrockd -f -o cat
# проверить статус
curl localhost:$PORT/status | jq
# проверить баланс
zenrockd q bank balances <address>
# проверить pubkey валидатора
zenrockd tendermint show-validator
# проверить валидатора
zenrockd query staking validator <valoper_address>
zenrockd query staking validators --limit 1000000 -o json | jq '.validators[] | select(.description.moniker=="<name_moniker>")' | jq
# проверка информации по TX_HASH
zenrockd query tx <TX_HASH>
# параметры сети
zenrockd q slashing params

Транзакции

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

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

# заделегировать себе в стейк еще (так отправляется 1 монетa)
zenrockd tx validation delegate zenvaloper1z2rrhln32vxdylu2273yllrclv884x8uptwh32 1000000urock --from=lesnik_utsa_wallet --gas auto --gas-adjustment 1.4 --gas-prices 27urock -y

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

# вывести список кошельков
zenrockd keys list
# показать ключ аккаунта
zenrockd keys show <name_wallet> --bech acc
# показать ключ валидатора
zenrockd keys show <name_wallet> --bech val
# показать ключ консенсуса
zenrockd keys show <name_wallet> --bech cons
# показать все поддерживаемые адреса
zenrockd debug addr <wallet_addr>
# показать приватный ключ
zenrockd keys export <name_wallet> --unarmored-hex --unsafe
zenrockd keys unsafe-export-eth-key <name_wallet>
# запрос учетной записи
zenrockd q auth account $(zenrockd keys show <name_wallet> -a) -o text
# удалить кошелек
zenrockd keys delete <name_wallet>

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

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

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

# проголосовать за предложение 
zenrockd tx gov vote 1 yes --from <name_wallet> --gas auto --gas-adjustment 1.4 --gas-prices 27urock -y

Peers and RPC

FOLDER=.zrchain

# узнать свой peer
PORTR=$(grep -A 3 "\[p2p\]" ~/$FOLDER/config/config.toml | egrep -o ":[0-9]+") && \
echo $(zenrockd tendermint show-node-id)@$(wget -qO- eth0.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])

Удалить

systemctl stop zenrockd
systemctl stop zenrock-sidecar

systemctl disable zenrockd
systemctl disable zenrock-sidecar

rm /etc/systemd/system/zenrockd.service
rm /etc/systemd/system/zenrock-sidecar.service

systemctl daemon-reload

cd $HOME
rm -rf .zrchain zenrock zenrock-validators
rm -rf $(which zenrockd)
rm -rf $(which zenrock-sidecar)
Поддержим природу вместе: 0xa7476EC14cD663C742d527113638C77a1631Cc89 cosmos1m2mm7kzvw6m3464h94ryqg8xvr6tyeyyecppnq