MAINNET
September 26, 2024

Zenrock

🪓 Telegram канал UTSA 🪓 Telegram чат UTSA

Web Discord Github

Details

Обновления

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

UPD 🕊 на v5.16.10 (Высота обновления: 1730150)

cd $HOME/zenrock
wget https://github.com/Zenrock-Foundation/zrchain/releases/download/v5.16.10/zenrockd
chmod +x zenrockd
$HOME/zenrock/zenrockd version --long | grep -e version -e commit
# version: 5.16.10
# commit: 

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

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

UPD 🕊 на v5.16.18 (Высота обновления: 1732400)

cd $HOME/zenrock
wget https://github.com/Zenrock-Foundation/zrchain/releases/download/v5.16.18/zenrockd
chmod +x zenrockd
$HOME/zenrock/zenrockd version --long | grep -e version -e commit
# version: 5.16.18
# commit: 42b9da8cdbece8d150793b1ef0391d32432c4ae9

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

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

UPD 🕊 на v5.16.20 (Высота обновления: 1740850)

cd $HOME/zenrock
wget https://github.com/Zenrock-Foundation/zrchain/releases/download/v5.16.20/zenrockd
chmod +x zenrockd
$HOME/zenrock/zenrockd version --long | grep -e version -e commit
# version: 5.16.20
# commit: 07cc3836e3e24cd617f3ff091186e0844b7f8dd9

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

systemctl restart zenrockd && journalctl -u zenrockd -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.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

cd $HOME/zenrock
wget https://github.com/Zenrock-Foundation/zrchain/releases/download/v5.16.20/zenrockd

chmod +x zenrockd
mv $HOME/zenrock/zenrockd $HOME/go/bin/

zenrockd version --long | grep -e version -e commit
# version: 5.16.20
# commit: 07cc3836e3e24cd617f3ff091186e0844b7f8dd9

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

zenrockd init UTSA_guide --chain-id diamond-1

Genesis

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

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

Скачиваем Addr book

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

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

zenrockd config set client chain-id diamond-1
#zenrockd config set client keyring-backend os

sed -i 's|minimum-gas-prices =.*|minimum-gas-prices = "0.01urock"|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="2f037a6461c012f3296ab1815b3c47843bcd7c3a@zenrock-mainnet-peer.itrocket.net:59656,36840303211712d936647da0f74d1498a7e298d1@34.251.37.55:26656,5ad8a5de6318529994da817043b268ef617e37ba@54.216.86.166:26656"
sed -i -e "s|^persistent_peers *=.*|persistent_peers = \"$peers\"|" $HOME/.zrchain/config/config.toml
seeds="e6c3373d68c504bd89bf77c27a8ac30597afeb2d@zenrock-mainnet-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="48f518867d52a0d635436441ff8df4c1582caeac@8.52.201.252:36656"
sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.zrchain/config/config.toml
SNAP_RPC=https://m-zenrock.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

type: pruned | time: every 1 days | pruning: 1000/10 | indexer: kv

🌐 https://share.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://share.utsa.tech/zenrock/zenrock.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://github.com/Zenrock-Foundation/zrchain/releases/download/v5.16.22/validator_sidecar
chmod +x $HOME/.zrchain/sidecar/bin/zenrock-sidecar

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

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

Копируем zenrock-validators

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

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

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

Создаем конфигурационный файл config.yaml

Замените на свои значения следующие переменные:

nano $HOME/.zrchain/sidecar/config.yaml
enabled: true
grpc_port: 9191
zrchain_rpc: "localhost:9190"
state_file: "cache.json"
operator_config: "/root/.zrchain/sidecar/eigen_operator_config.yaml"
network: "mainnet"
eth_oracle:
  rpc:
    local: "http://127.0.0.1:8545"
    testnet: "<https://rpc-endpoint-holesky-here> "
    mainnet: "<https://rpc-endpoint-mainnet-here>"
  contract_addrs:
    service_manager: "0x4ca852BD78D9B7295874A7D223023Bff011b7EB3"
    price_feeds:
      btc: "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c"
      eth: "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419"
    zenbtc:
      controller:
        mainnet: "0xa87bE298115bE701A12F34F9B4585586dF052008"
      token:
        ethereum:
          mainnet: "0x2fE9754d5D28bac0ea8971C0Ca59428b8644C776"
  network_name:
    mainnet: "Ethereum Mainnet"
    testnet: "Holešky Ethereum Testnet"
solana_rpc:
  testnet: "https://api.testnet.solana.com"
  mainnet: "https://api.mainnet-beta.solana.com/"
proxy_rpc:
  url:
  user:
  password:
neutrino:
  path: "/root/.zrchain/sidecar/root-data/neutrino"

Создаем конфигурационный файл eigen_operator_config.yaml

Замените на свои значения следующие переменные:

  • <ETH MAIN ENDPOINT HERE>
  • <ETH MAIN WSS ENDPOINT HERE>
  • <VALUE FROM STEP - ECDSA key>
  • <VALUE FROM STEP - zenvaloper address>
nano $HOME/.zrchain/sidecar/eigen_operator_config.yaml
register_operator_on_startup: true
register_on_startup: true
production: true

ecdsa_private_key_store_path: /root/.zrchain/sidecar/keys/ecdsa.key.json
bls_private_key_store_path: /root/.zrchain/sidecar/keys/bls.key.json

aggregator_server_ip_port_address: avs-aggregator.diamond.zenrocklabs.io:8090

eth_rpc_url: <ETH MAIN ENDPOINT HERE>
eth_ws_url: <ETH MAIN WSS ENDPOINT HERE>

enable_metrics: true
eigen_metrics_ip_port_address: 0.0.0.0:9292
enable_node_api: true
node_api_ip_port_address: 0.0.0.0:9191

operator_address: <VALUE FROM STEP - ECDSA key>
operator_validator_address: <VALUE FROM STEP - zenvaloper address>

avs_registry_coordinator_address: 0xFbFECE8f29f499c32206d8bFfA57da2b124790C7
operator_state_retriever_address: 0x03d0452e70711f169eB6B6F5Ab33d8571c313ef6

token_strategy_addr: 0xa5430Ca83713F877B77b54d5A24FD3D230DF854B

Создаем сервисный файл 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=diamond-1 \
    --fees 20urock

Не забываем сохранить 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
# показать valcons валидатора
zenrockd tendermint show-address

Транзакции

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

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

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

# отправить транзакцию
zenrockd tx bank send <name_wallet> <address> 1000000urock --fees=500000urock -y

# выйти из jail
zenrockd tx slashing unjail --from lesnik_utsa_wallet --fees 20urock

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

# вывести список кошельков
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> --fees 20urock -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