COSMOS WIKI
February 1, 2023

IBC - CW20 (wasm)

В данном руководстве будет описано как настроить ретранслятор между сетями Aura и Nois для передачи данных через wasm CW20. На момент написания статьи Nois еще не передает токены ICS 20. Использование Hermes для передачи токенов ICS 20 ранее было описано в данной статье

Ниже будет 2 способа запуска - через Hermes и через Ts-relayer. Можно выбрать любой из способов, но важно понимать, что Hermes в будущем удобнее масштабировать

HERMES

Подготовка

Hermes можно установить как на 1 сервер вместе с необходимыми нодами, так и на отдельный сервер, при этом даже не обязательно поднимать собственные ноды, а достаточно знать открытые RPC рабочих нод. Но, поскольку успех ретрансляции сильно зависит от задержки и скорости ввода-вывода, то в настоящее время рекомендуется обслуживать узлы на том же сервере, где запущен процесс ретрансляции. При этом есть разница между тем какой сервер используется. Существует прямая связь между мощностью процессора, скоростью интернета и количеством переданных данных

Поскольку процесс ретрансляции должен иметь возможность запрашивать сеть обратно по высоте в течение как минимум 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 - Не рекомендуется использовать pruning-keep-recent менее 1 суток

P/s - Также не рекомендуется самим открывать каналы с маленьким значением trusting period

Прежде всего нам необходимо:

- установить две необходимые ноды и полностью синхронизировать их. В данном примере устанавливаем Aura и Nois

- minimum-gas-prices на Aura настраиваем на 0,0025; на Nois настраиваем на 0.05

- RPC должны быть открыты и доступны Hermes (как это сделать можно узнать здесь)

- индексация должна быть настроена в положение indexer = "kv" (если, не меняли, то пропускаем этот пункт)

- проверить наличие токенов на кошельках. Лучше всего использовать одну и ту же мнемонику во всех сетях, не используйте свои адреса ретрансляции ни для чего другого, потому что это может привести к ошибкам в последовательности несогласованных учетных записей

Установка Hermes

Актуальную версию проверяем здесь

mkdir -p $HOME/.hermes/bin

wget https://github.com/informalsystems/hermes/releases/download/v1.0.0/hermes-v1.0.0-x86_64-unknown-linux-gnu.tar.gz && \
tar -C $HOME/.hermes/bin/ -vxzf hermes-v1.0.0-x86_64-unknown-linux-gnu.tar.gz && \
echo 'export PATH="$HOME/.hermes/bin:$PATH"' >> $HOME/.bash_profile && \
source $HOME/.bash_profile

# check version
hermes version
# hermes 1.0.0+ed4dd8c

Настройка Hermes

Для начала задаем переменную для кошелька. Данные ниже даны для примера!!!

MNEMONIC="way festival bargain mass swear flat fish help dinosaur flat lemon dry fish fiber belt year smoke glimpse extra fancy acquire method help universe"

Создаем config файл

Меняем на свои значения RPC_ADDR, GRPC_ADDR, websocket_addr, account_prefix, memo_prefix. Значение 127.0.0.1 заменяем на IP адрес сервера в случае установки Hermes отдельно от нод. Активные каналы с Nois проверяем здесь https://ibc.nois.network/connections

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

[rest]
# Следует ли включать службу REST или нет. Значение по умолчанию: false
enabled = true
host = '127.0.0.1'
port = 3000

[telemetry]
# Следует ли включать службу телеметрии или нет. Значение по умолчанию: false
enabled = true
host = '127.0.0.1'
port = 3001

[[chains]]
### CHAIN_1 - NOIS ###
id = 'nois-testnet-003'
rpc_addr = 'http://127.0.0.1:60857'
grpc_addr = 'http://127.0.0.1:9790'
websocket_addr = 'ws://127.0.0.1:60857/websocket'
rpc_timeout = '10s'
account_prefix = 'nois'
key_name = 'wallet'
#address_type = { derivation = 'cosmos' }
store_prefix = 'ibc'
max_gas = 3500000
gas_price = { price = 0.05, denom = 'unois' }
gas_multiplier = 1.2
max_msg_num = 15
max_tx_size = 180000
clock_drift = '5s'
max_block_time = '6s'
trusting_period = '31hours'
trust_threshold = { numerator = '1', denominator = '3' }
memo_prefix = 'lesnik_utsa#4480 (UTSA Relayer)'
[chains.packet_filter]
policy = 'allow'
list = [
#  ['wasm.nois1s9ly26evj8ehurptws5d6dm4a9g2z0htcqvlvn95kc30eucl4s5sd8hkgp', 'channel-25'], #AURA-v3
#  ['wasm.nois1s9ly26evj8ehurptws5d6dm4a9g2z0htcqvlvn95kc30eucl4s5sd8hkgp', 'channel-24'], #AURA-v3
#  ['wasm.nois1td3zu6nlztw24v24p27vk6l9nwsyerzawkk456cuauzarf3ksr6s8kuuyy', 'channel-26'], #AURA-v4
  ['wasm.nois1j3des9cjg0adpvkauck6c9muyrw6sxa7keaf82h2taxdjf69z8csw32v0e', 'channel-43'] #AURA-v5
[[chains]]
### CHAIN_2 - AURA###
id = 'euphoria-2'
rpc_addr = 'http://127.0.0.1:56657'
grpc_addr = 'http://127.0.0.1:9390'
websocket_addr = 'ws://127.0.0.1:56657/websocket'
rpc_timeout = '10s'
account_prefix = 'aura'
key_name = 'wallet'
#address_type = { derivation = 'ethermint', proto_type = { pk_type = '/ethermint.crypto.v1.ethsecp256k1.PubKey' } }
store_prefix = 'ibc'
max_gas = 15000000
gas_price = { price = 0.0025, denom = 'ueaura' }
gas_multiplier = 1.2
max_msg_num = 15
max_tx_size = 180000
clock_drift = '5s'
trusting_period = '31hours'
trust_threshold = { numerator = '1', denominator = '3' }
memo_prefix = 'lesnik_utsa#4480 (UTSA Relayer)'
[chains.packet_filter]
policy = 'allow'
list = [
#  ['wasm.aura1a472r2dggwwhf7hm8l8wk2fkafywve7pvufc9e2tkmmmh2z4xqwqpphpkg', 'channel-16'], #NOIS-v3
#  ['wasm.aura1qrf8f9kyh4zzckz2zy52z5gppwweumvrlxqrgd4xr3ydf3sx4dlqt8lnt8', 'channel-15'], #NOIS-v3
#  ['wasm.aura19z2hv8l87qwg8nnq6v76efjm2rm78rkdghq4rkxfgqrzv3usw8lq26rmwt', 'channel-18'], #NOIS-v4
  ['wasm.aura1dz64l7pgcm45p3hctydqj7c6gn9czy0mqmst9dh2e0s25q66xumqe3atts', 'channel-24'] #NOIS-v5
]

Проверяем правильность конфигурации

hermes config validate
# Success: "configuration is valid"

hermes health-check
2023-02-01T15:05:25.654244Z  INFO ThreadId(01) using default configuration from '/root/.hermes/config.toml'
2023-02-01T15:05:25.654493Z  INFO ThreadId(01) [nois-testnet-003] performing health check...
2023-02-01T15:05:25.662572Z  INFO ThreadId(01) chain is healthy chain=nois-testnet-003
2023-02-01T15:05:25.662592Z  INFO ThreadId(01) [euphoria-2] performing health check...
2023-02-01T15:05:25.668090Z  INFO ThreadId(01) chain is healthy chain=euphoria-2
SUCCESS performed health check for all chains in the config

Добавляем кошельки в Hermes. За подробной информацией обращаемся сюда

# создаем файлы с мнемноникой
sudo tee $HOME/.hermes/nois-testnet-003.mnemonic > /dev/null <<EOF
${MNEMONIC}
EOF
sudo tee $HOME/.hermes/euphoria-2.mnemonic > /dev/null <<EOF
${MNEMONIC}
EOF

# восстанавливаем кошельки
hermes keys add --chain nois-testnet-003 --mnemonic-file $HOME/.hermes/nois-testnet-003.mnemonic
hermes keys add --chain euphoria-2 --mnemonic-file $HOME/.hermes/euphoria-2.mnemonic

# посмотреть кошельки
hermes keys list --chain nois-testnet-003
hermes keys list --chain euphoria-2

# посмотреть баланс
hermes keys balance --chain nois-testnet-003
hermes keys balance --chain euphoria-2

Создаем 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
При успешных транзакциях видим следующие логи

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

Проверить открытые каналы

hermes query channels --show-counterparty --chain euphoria-2
hermes query channels --show-counterparty --chain nois-testnet-003

Смотрим логи

journalctl -u hermesd -f -o cat

Удалить ретранслятор

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

TS-RELAYER

При установке через Ts-relayer можно использовать отдельный сервер и пока команда Nois предлагает нам использовать их docker образы для запуска. В данном случае от нас требуется seed фраза от Вашего кошелька с балансом на счету

euphoria-2 => nois relay

export MNEMONIC='<YOUR_MNEMONICS_HERE>'

docker run -d --name ts-relayer-v5 \
           -e "MNEMONIC=$MNEMONIC" \
           noislabs/nois-relayer:euphoria-2-aura1dz64l7pgcm45p3hctydqj7c6gn9czy0mqmst9dh2e0s25q66xumqe3atts \
           ibc-relayer start \
           --src-connection=connection-22 \
           --dest-connection=connection-34 \
           --poll 3
Пример работы Ts-Relayer

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

# посмотреть логи
docker logs ts-relayer-v4 -f
docker restart ts-relayer-v4

# удалить ноду
docker stop ts-relayer-v4
docker rm ts-relayer-v4
Поддержим природу вместе: 0xa7476EC14cD663C742d527113638C77a1631Cc89 cosmos1m2mm7kzvw6m3464h94ryqg8xvr6tyeyyecppnq