COSMOS WIKI
December 27, 2023

Hermes v 1.7.4

В данном гайде будет установлен гермес версии v1.7.4 (fix от czarcas7ic). Начиная с версии v1.6.0 необходимо вносить изменения в конфиг файл, используемый в предыдущих версиях. Версия v1.7.4 (fix от czarcas7ic) помогает решить некоторые проблемы с газом, которые появились с крайним обновлением osmosis

Гайд по установке hermes ранних версий можно найти здесь - https://teletype.in/@lesnik13utsa/k3PdYH_Jbcb

Подготовка

Любой ретранслятор можно установить как на 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

Polkachu к примеру для relayer использует 40000/2000

Установка 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'
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:61757'
grpc_addr = 'http://127.0.0.1:9960'
event_source = { mode = 'push', url = 'ws://127.0.0.1:61757/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 = 'lesnik_utsa'
[chains.packet_filter]
policy = 'allow'
list = [
  ['transfer', 'channel-222'], #PROVENANCE
]

[[chains]]
### CHAIN_2 Provenance ###
id = 'pio-mainnet-1'

rpc_addr = 'http://127.0.0.1:46657'
grpc_addr = 'http://127.0.0.1:9290'
event_source = { mode = 'push', url = 'ws://127.0.0.1:46657/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 = 'lesnik_utsa'
[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"

Создаем service

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 teritori-testnet-v3 --a-connection connection-0 --a-port  transfer --b-port transfer --order unordered
hermes create channel --a-chain teritori-testnet-v3 --b-chain theta-testnet-001 --a-port transfer --b-port transfer --order unordered --new-client-connection

Перед открытием канала убедитесь, что ранее не созданы другие каналы для нужных Вам сетей!!!

ВАЖНО - после создания канала нужно следить за ним, чтобы он не "замерз" (frozen). После замерзания канала его можно будет восстановить через proposal или придется открывать новый канал. Чтобы этого не произошло человеку, открывшему канал необходимо будет запускать скрипт автоматического обновления канала. Пример:

#!/bin/bash
for((;;)); do
  hermes update client --host-chain teritori-testnet-v3 --client 07-tendermint-39
sleep 5
  echo "update TERITORI to GAIA client is done"
sleep 5
  hermes update client --host-chain theta-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)