Hermes для Namada IBC-channel / Namada_Install
Hermes v 1.7.4
В данном гайде будет установлен гермес версии v1.7.4 (fix от czarcas7ic). Начиная с версии v1.6.0 необходимо вносить изменения в конфиг файл, используемый в предыдущих версиях. Версия v1.7.4 (fix от czarcas7ic) помогает решить некоторые проблемы с газом, которые появились с крайним обновлением osmosis
Подготовка
Любой ретранслятор можно установить как на 1 сервер вместе с необходимыми нодами, так и на отдельный сервер, при этом даже не обязательно поднимать собственные ноды, а достаточно знать открытые RPC, gRPC и API рабочих нод. Но, поскольку успех ретрансляции сильно зависит от задержки и скорости ввода-вывода, то в настоящее время рекомендуется обслуживать узлы на том же компьютере, что и процесс ретрансляции
Поскольку процесс ретрансляции должен иметь возможность запрашивать сеть обратно по высоте в течение как минимум 2/3 unbonding period (trusting period = 2/3 от unbonding period), то рекомендуется использовать настройки прунинга, которые сохранят полное состояние цепочки в течение более длительного периода времени, чем период unbonding
То есть 14 дней от 21 или 10 дней от 14 или 1,3 дня от 2 дней
Необходимый прунинг можно посчитать по формуле 14 дней*24*60*60/ среднее время блока
- Для 14 дней pruning-keep-recent = 200000
- Для 10 дней pruning-keep-recent = 150000
- Для 1,3 дня pruning-keep-recent = 18720
- Для 1,5 часа pruning-keep-recent = 1000
P/s - у нас прунинг будет 1000/0/10 и попробуем немного обхитрить систему изменив конфиг следующим образом:
# Следует ли включать обнаружение неправильного поведения для клиентов. [По умолчанию: false] misbehaviour = false
Установка Hermes
Актуальную версию проверяем здесь
mkdir -p $HOME/.hermes
# install rust curl https://sh.rustup.rs -sSf | sh source "$HOME/.cargo/env"
cd git clone https://github.com/czarcas7ic/hermes && cd hermes git checkout v1.7.4-osmo-5 cargo build --release --bin hermes
cp $HOME/hermes/target/release/hermes $HOME/.cargo/bin/hermes hermes version #hermes 1.7.4+00f45397
Config
Копируем примерный конфиг ниже и заменяем на наши данные
Вы можете ознакомиться со всеми дополнительными флагами здесь - https://github.com/informalsystems/hermes/blob/master/config.toml
nano $HOME/.hermes/config.toml
[global] # укажите уровень детализации вывода журнала ретранслятора Default: 'info' # допустимые варианты 'error','warn','info','debug','trace' # заменити на свое warrior_node - а также порти log_level = 'info' [mode] [mode.clients] enabled = true refresh = true misbehaviour = false [mode.connections] enabled = false [mode.channels] enabled = false [mode.packets] enabled = true clear_interval = 100 clear_on_start = true tx_confirmation = true auto_register_counterparty_payee = false [rest] # Следует ли включать службу REST или нет. Значение по умолчанию: false enabled = false host = '0.0.0.0' port = 3000 [telemetry] # Следует ли включать службу телеметрии или нет. Значение по умолчанию: false enabled = false host = '0.0.0.0' port = 3001 [telemetry.buckets] [tracing_server] enabled = false port = 5555 [[chains]] ### CHAIN_1 Osmosis ### id = 'osmosis-1' rpc_addr = 'http://127.0.0.1:61575' grpc_addr = 'http://127.0.0.1:9999' event_source = { mode = 'push', url = 'ws://127.0.0.1:61557/websocket', batch_delay = '500ms' } rpc_timeout = '10s' account_prefix = 'osmo' key_name = 'wallet' address_type = { derivation = 'cosmos' } store_prefix = 'ibc' default_gas = 400000 max_gas = 5000000 gas_price = { price = 0.025, denom = 'uosmo' } gas_multiplier = 1.1 gas_price_multiplier = 1.1 max_gas_price = 0.6 max_msg_num = 30 max_tx_size = 180000 clock_drift = '15s' max_block_time = "30s" trusting_period = '14days' trust_threshold = { numerator = '1', denominator = '3' } memo_prefix = 'warrior_node' [chains.packet_filter] policy = 'allow' list = [ ['transfer', 'channel-222'], #PROVENANCE ] [[chains]] ### CHAIN_2 Provenance ### id = 'cosmos-1-testnet' rpc_addr = 'http://127.0.0.1:46610' grpc_addr = 'http://127.0.0.1:9292' event_source = { mode = 'push', url = 'ws://127.0.0.1:46610/websocket', batch_delay = '500ms' } rpc_timeout = '20s' account_prefix = 'pb' key_name = 'wallet' address_type = { derivation = 'cosmos' } store_prefix = 'ibc' default_gas = 800000 max_gas = 4000000 gas_price = { price = 1905, denom = 'nhash' } gas_multiplier = 1.5 max_msg_num = 30 max_tx_size = 180000 clock_drift = '15s' max_block_time = "30s" trusting_period = '14days' trust_threshold = { numerator = '1', denominator = '3' } memo_prefix = 'warrior_node' [chains.packet_filter] policy = 'allow' list = [ ['transfer', 'channel-7'], #OSMOSIS ]
Проверяем правильность конфигурации
hermes config validate # Success: "configuration is valid" hermes health-check # hermes evidence --chain <CHAIN_ID>
Добавляем кошельки в Hermes. За подробной информацией обращаемся сюда
ВАЖНО - ДЛЯ EVM сетей добавляем -hd-path "m/44'/60'/0'/0/0"
tee /etc/systemd/system/hermesd.service > /dev/null <<EOF [Unit] Description=hermes After=network-online.target [Service] User=$USER ExecStart=$(which hermes) start Restart=on-failure RestartSec=3 LimitNOFILE=65535 [Install] WantedBy=multi-user.target EOF
systemctl daemon-reload systemctl enable hermesd systemctl restart hermesd && journalctl -u hermesd -f -o cat
Дальше должны пойти подобные логи с хешами транзакций и баланс кошельков должен начать уменьшаться. Если есть такие логи, значит все настроено и работает
Полезные команды
# ВАРИАНТ 1 - предпочтительный способ создать новый канал используя существующее соединение (connection) # если оно было ранее создано для нужного чейна hermes create channel --a-chain ${CHAIN_ID_1} --a-connection <connection-0> --a-port transfer --b-port transfer --order unordered # ВАРИАНТ 2 - новый канал по новому соединению (connection) в случае, если вы специально хотите создать нового клиента и новое соединение как часть потока создания канала # это менее предпочтительный вариант, поскольку создание новых клиентов и подключений должно выполняться только при определенных обстоятельствах, чтобы не создавать избыточные ресурсы hermes create channel --a-chain ${CHAIN_ID_1} --b-chain ${CHAIN_ID_2} --a-port transfer --b-port transfer --order unordered --new-client-connection # ПРИМЕРЫ hermes create channel --a-chain namada-testnet-v3 --a-connection connection-0 --a-port transfer --b-port transfer --order unordered hermes create channel --a-chain namada-testnet-v3 --b-chain harmony-testnet-0 --a-port transfer --b-port transfer --order unordered --new-client-connection
Перед открытием канала убедитесь, что ранее не созданы другие каналы для нужных Вам сетей!!!
ВАЖНО - после создания канала нужно следить за ним, чтобы он не "замерз" (frozen). После замерзания канала его можно будет восстановить через proposal или придется открывать новый канал. Чтобы этого не произошло человеку, открывшему канал необходимо будет запускать скрипт автоматического обновления канала. Пример:
#!/bin/bash for((;;)); do hermes update client --host-chain namada-testnet-v3 --client 07-tendermint-39 sleep 5 echo "update TERITORI to GAIA client is done" sleep 5 hermes update client --host-chain harmony-testnet-001 --client 07-tendermint-1055 echo "update GAIA to TERITORI client is done" sleep 3600 done
hermes query channels --show-counterparty --chain jagrat
journalctl -u hermesd -f -o cat journalctl -fn 100 -u hermesd | grep "Ok" journalctl -u hermesd | grep "Ok"
systemctl stop hermesd && \ systemctl disable hermesd && \ rm /etc/systemd/system/hermesd.service && \ systemctl daemon-reload && \ cd $HOME && \ rm -rf .hermes && \ rm -rf $(which hermes)
#інсталюйте основні
sudo apt update; sudo apt upgrade -y
sudo apt install make clang pkg-config libssl-dev build-essential git jq llvm libudev-dev -y
#install rust
curl --proto '=https' --tlsv1.2 -sSf https://sh .rustup.rs | sh -s -- -y
джерело $HOME/.cargo/env
#встановити буфери протоколу
sudo apt update
sudo apt install protobuf-compiler
#set variables
CHAIN_ID="shielded-expedition. 88f17d1d14 "
KEY_NAME=" <ВАШЕ ІМ'Я КЛЮЧА> "
VAL_NAME =" <ВАШЕ ІМ'Я ВАЛІДАТОРА> "
ЕЛЕКТРОННА ПОШТА=" <ВАША ЕЛЕКТРОННА ПОШТА> "
#make variables permanent
echo 'export CHAIN_ID='\"${CHAIN_ID}\" >> $HOME/.bash_profile
echo 'export KEY_NAME='\"${KEY_NAME}\" >> $HOME/.bash_profile
echo 'export VAL_NAME ='\"${VAL_NAME}\" >> $HOME/.bash_profile
echo 'export EMAIL='\"${EMAIL}\" >> $HOME/.bash_profile
джерело $HOME/.bash_profile
#встановити попередньо скомпільовані двійкові файли Namada - v0.31.4
wget https://github.com/anoma/namada/releases/download/v0.31.6/namada-v0.31.6-Linux-x86_64.tar.gz
tar xf namada-* .tar.gz
sudo mv namada-v0.31.6-Linux-x86_64/namada* /usr/local/bin/
rm -rf namada*
#або скомпілюйте двійкові файли самостійно
git clone https://github.com/anoma/namada.git
cd namada
git checkout v0.31.6
make install
sudo chmod +x ~/.cargo/bin/namada*
sudo mv ~/.cargo/bin/namada* /usr/local/bin
#install CometBft
mkdir cometbft
wget https://github.com/cometbft/cometbft/releases/download/v0.37.2/cometbft_0.37.2_linux_amd64.tar.gz
tar xvf cometbft_0.37.2_linux_amd64.tar.gz -C ./cometbft
chmod +x cometbft/cometbft
sudo mv cometbft/cometbft /usr/local/bin/
rm -rf cometbft*
#ініціалізувати ланцюг і робочий каталог
namada client utils join-network --chain-id $CHAIN_ID
#додати службовий файл
sudo tee /etc/systemd/system/namadad.service << EOF
[Unit]
Description=Namada Node
After=network.target
[Service]
User=$USER
WorkingDirectory=$HOME/.local/share/namada
Type =simple
ExecStart=/usr/local/bin/namada --base-dir=$HOME/.local/share/namada node ledger run
Environment=NAMADA_CMT_STDOUT=true
Environment=TM_LOG_LEVEL=p2p:none,pex:error
RemainAfterExit=no
Restart =on-failure
RestartSec=10s
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
#add peers
peers="$(curl -s https://raw.githubusercontent.com/AlexToTheMoon/AM-Solutions/main/files/namada-peers.txt)"
sed -i "s#^persistent_peers *=.* #persistent_peers = \"$peers\"#;" $HOME/.local/share/namada/shielded-expedition.88f17d1d14/config.toml
#add seeds
seeds="tcp://[email protected]:26656,\
tcp://2cdf24 [email protected]: 12904,\
tcp://[email protected]:26656"
sed -i "s#^seeds *=.*#seeds = \"$seeds\"#;" $HOME/.local/share/namada/shielded-expedition.88f17d1d14/config.toml
#addrbook
wget -qO $HOME/.local/share/namada/shielded-expedition.88f17d1d14/cometbft/config/addrbook.json https:/ /snapshots.theamsolutions.info/nam-addrbook.json
#enable Namada service
sudo systemctl enable namadad.service
sudo systemctl daemon-reload
sudo systemctl restart namadad.service
#перевірте журнали
sudo journalctl -u namadad.service -fn 50 -o cat
#повний статус вузла (якщо ви не використовуєте стандартний порт 26657, змініть на правильний)
curl localhost:26657/status
#sync status (false = вузол синхронізовано)
curl -s localhost:26657/status | jq .result.sync_info.catching_up
ЗНІМОК ДАНИХ
(оновлюється кожні 4 години)
#check snapshot date/time : curl -s https://snapshots.theamsolutions.info/ | egrep -o ">namada-snap*.*tar" | tr -d ">"
#run node from snapshot
snap=$(curl -s https://snapshots.theamsolutions.info/ | egrep -o ">namada-snap*.*tar" | tr -d ">")
workd="$HOME/ .local/share/namada/shielded-expedition.88f17d1d14"
wget -P $HOME https://snapshots.theamsolutions.info/${snap}
sudo systemctl stop namadad.service
cp ${workd}/cometbft/data/priv_validator_state. json ~/priv_validator_state.jsonNBAK
rm -rf ${workd}/db/ ${workd}/cometbft/data/ ${workd}/cometbft/data/ ${workd}/tx_wasm_cache ${workd}/vp_wasm_cache
tar xf ~/ ${snap} -C ${workd}; rm ~/${snap}
cp ~/priv_validator_state.jsonNBAK ${workd}/cometbft/data/priv_validator_state.json
sudo systemctl перезапустити namadad.service
НАЛАШТУВАННЯ ВАЛІДАТОРА
(Вузол повинен бути синхронізований)
#генерувати новий ключ
namadaw gen --alias "${KEY_NAME}"
#або відновити ключ із мнемоніки
namadaw derive --alias "${KEY_NAME}"
#check key address
namadaw find --alias "${KEY_NAME}"
#list all the keys
namadaw list
#check balance
namadac balance --owner "${KEY_NAME}" --node http://localhost:26657
#initialize validator
namadac init-validator \
--alias "${VAL_NAME}" \
--account-keys "${KEY_NAME}" \
--signing-keys "${KEY_NAME}" \
--commission-rate 0.1 \
- -max-commission-rate-change 0.1 \
--email "${EMAIL}" \
--node http://localhost:26657
#bond токени до вашого валідатора
namadac bond \
--source "${KEY_NAME}" \
--validator "${VAL_NAME}" \
--amount 1000 \
--node http://localhost:26657
#query TX
namadac tx-result --tx-hash <TX HASH> --node tcp://149.50.96.147:26657
#знайти ключ перевірки
namadac find-validator --tm-address=$(curl -s localhost:26657 /status | jq -r .result.validator_info.address) --node http://localhost:26657
#відправити кошти
namada transfer --target <RECEIVER-KEY(nam1..)> --source <SENDER-KEY(NAME )> --amount 100 --token NAM --node http://localhost:26657
#check validator konsensus status
namadac validator-state --validator " <адреса валідатора tham1...> " --node http://localhost:26657
#unjail validator
namadac unjail-validator --validator " <адреса валідатора tham1... > " --node http://localhost:26657