cosmos
July 19, 2022

IBC relay на примере Juno(uni-3) <> Sei(atlantic-1)

Существует несколько реализаций cosmos релееров, ibc-go (реализация на go), hermes (rust) и ts-relayer (typescript). Функционал у всех примерно одинаковый, так что выбор является вопросом личных предпочтений.

В данной статье я буду рассматривать установку и настройку ts-relayer на примере тестовых сетей Juno - Sei. Ts-relayer выбран как требующий, по моему мнению, наименьшего количества телодвижений.

Релеер необязательно должен устанавливаться на сервер с нодой, более того, вам даже необязательно иметь собственную, достаточно знать RPC адреса конечных точек. Не буду сильно вдаваться в технические подробности, всем заинтересованным смотреть оф. гайд

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

Пререквизиты

  • nodejs старше 14-го, возьмем LTS версию 16.16 как наиболее стабильную на данный момент:
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs
  • проверяем
node -v
v16.16.0

Установка релеера

npm i -g @confio/relayer

После установки доступны исполняемые файлы ibc-setup и ibc-relayer.

Инициализируем конфигурацию

ibc-setup init

Результатом выполнения команды будет загрузка файла .ibc-setup/registry.yaml содержащего дефолтные настройки нескольких чейнов. В терминале видим такую картину (это писать не надо )):

Pulled default registry.yaml from remote.
Exited early. Registry file downloaded to /root/.ibc-setup/registry.yaml.
Please edit that file and add any chains you wish.
Then complete the initialization by running ibc-setup init --src <chain-1> --dest <chain-2>.

Ориентируясь на сети которые там уже есть, не составит большого труда добавить свою. Также для 'чистоты эксперимента' можно удалить все лишние сети и оставить только нужные. Сеть Juno (uni-3) уже добавлена по дефолту, и изменений не требует. От нас требуется добавить конфиг сети Sei.

nano .ibc-setup/registry.yaml

дописываем в конце конфиг sei:

  sei:
    chain_id: atlantic-1
    prefix: sei
    gas_price: 0usei
    hd_path: m/44'/118'/0'/0/0
    ics20_port: 'transfer'
    rpc:
     - http://<node_ip>:<port>

Об адресах и портах

Как показала практика, часто возникает неразбериха относительно адресов и портов rpc. Попробую прояснить на примере сетей из конфига uni - sei

Поскольку мануал предназначен для участников тестнета Sei, наиболее вероятных вариантов всего два:

Вариант один. Tx-relayer ставится на сервер вместе с Sei.

[juno] < -— > [tx-relayer + sei]

В этом случае значения следующие

  • uni rpc: оставляем как есть
  • <node_ip>: http://127.0.0.1
  • <port> смотрим командой ss -tulpn | grep LISTEN, процесс seid, или командой echo $(grep -A 3 "\[rpc\]" ~/.sei/config/config.toml | egrep -o ":[0-9]+")
  • таким образом в конфиге должно быть прописано sei rpc:http://127.0.0.1:12657

Вариант два. Tx-relayer ставится отдельно между uni и sei

[juno] < --- > [tx-relayer] < --- > [sei]

В этом случае значения следующие

  • uni rpc: оставляем как есть
  • <node_ip>: получаем командой curl ifconfig.me (команда выполняется на сервере с нодой)
  • <port> смотрим командой ss -tulpn | grep LISTEN (команда выполняется на сервере с нодой), или командой echo $(grep -A 3 "\[rpc\]" ~/.sei/config/config.toml | egrep -o ":[0-9]+")
  • таким образом в конфиге должно быть прописано sei rpc:http://158.101.209.61:12657 (ip будет тот что получили выше)
  • плюс еще один момент, в конфиге .sei/config/config.toml, параметр laddr должен быть установлен в 0.0.0.0 Это необходимо для доступа к ноде снаружи. Проверяем либо руками, либо командами:
cd ~
PORTR=$(grep -A 3 "\[rpc\]" ~/.sei/config/config.toml | egrep -o ":[0-9]+")
sed -i.bak -e "s%^laddr = \"tcp://127.0.0.1$PORTR\"%laddr = \"tcp://0.0.0.0$PORTR\"%" ~/.sei/config/config.toml

systemctl restart seid.service
  • в итоге должно получиться следующее

Итоговый конфиг выглядит следующим образом:

version: 1
  chains:
  uni:
    chain_id: uni-3
    prefix: juno
    gas_price: 0.025ujunox
    hd_path: m/44'/118'/0'/0/0
    ics20_port: 'transfer'
    # request in juno faucet channel https://discord.gg/TfsuB6yd
    # faucet: https://faucet.uni.juno.deuslabs.fi
    rpc:
      - https://rpc.uni.juno.deuslabs.fi:443
  sei:
    chain_id: atlantic-1
    prefix: sei
    gas_price: 0usei
    hd_path: m/44'/118'/0'/0/0
    ics20_port: 'transfer'
    rpc:
     - http://158.101.209.61:12657

Завершаем инициализацию

ibc-setup init --src uni --dest sei

Результатом выполнения команды будет:

  1. генерация файла .ibc-setup/app.yaml с указанием сетей src, dest и сгенерированной мнемоникой
  2. по указанной мнемонике создаются адреса в сетях src, dest которые будут использоваться для подписания транзакций.

В итоге в терминале мы видим примерно следующее (опять же, писать это никуда не надо)

# ibc-setup init --src uni --dest sei
Saved configuration to /root/.ibc-setup/app.yaml
Source address: juno1vqr9uwn3tdr6hvqz695d6e3e6zeqfnjacg23ew
Destination address: sei1vqr9uwn3tdr6hvqz695d6e3e6zeqfnjarkcucn

Если в конфиге registry.yaml указано значение faucet то будет пополнен баланс адресов в соответствующих сетях. В противном случае необходимо пополнить его вручную. Баланс необходим для оплаты комиссий за транзакции. Во всяком случае так написано в доках.

Внимание! Без пополнения баланса созданных выше аккаунтов, они не будут активированы и, соответсвенно, релей не запустится!

Для сети uni-3 можно использовать кран https://faucet.roguenet.io,

Sei пополняем из своего кармана, либо используем кран https://www.allthatnode.com/faucet/sei.dsrv#

Создаем ics20 канал

ibc-setup ics20 -v

На выходе имеем следующее:

  1. создается новое соединение между src и dest
  2. в конфиг записываются connection ids
  3. создается новый канал

Вся процедура займет какое-то время, поэтому сидим, ждем и не нерничаем )

По завершении операции , если все идет как надо, наблюдаем следующую картину:

Created channel:
uni-3: transfer/channel-81 (connection-68)
atlantic-1: transfer/channel-103 (connection-91)

Записываем значения каналов, они понадобятся для выполнения транзакций.

Запускаем релей

tmux new -s relay
ibc-relayer start -v --poll 15
Похоже все идет как надо )

Собственно это все, релей работает, остается проверить. Сделать это можно либо через Keplr для простоты, либо для любителей хардкора в терминале.

  • Отправляем с Sei на Juno. Формат команды следующий:
seid tx ibc-transfer transfer \
[src-port] \
[src-channel] \
[receiver] \
[amount] \
[flags]

[src-port] - transfer

[src-channel] - канал источника, в нашем случае канал sei = channel-103

[receiver] - адрес получателя в формате juno..

[amount] - количество usei

[flags] - дополнительные флаги, указываем следующее --node <адрес_ноды если нода не локальная> --chain-id <id_сети_отправления>

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

seid tx ibc-transfer transfer \
transfer \
channel-103 \
juno14l9y3dreaqethw5hshlfmsgepv8yrrwcvnh0xw \
10usei \
--from sei1alaflqpaqdpr8487wau2d6ynezexhk8vlyc0rv \
--node http://158.101.209.61:12657 \
--chain-id atlantic-1 \
--packet-timeout-height 0-0

Результат:

...
txhash: 85CB26FDA57C0A5C6FC2CABD346833BADE40303EE51FE288901AF5346F4F7557

Чекаем хэш:

Обращаем внимание на то что несмотря что мы создавали канал --src uni --dest sei работает он в обоих направлениях.

На этом все, вопросы и дополнения пишите в чат или в комменты. Возможно что-то упустил. Всем космонавтам удачных полетов 🚀


TL/DR для тех кому лень много читать:

curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs
npm i -g @confio/relayer
ibc-setup init

nano .ibc-setup/relayer.yaml

version: 1
chains:
  uni:
    chain_id: uni-3
    prefix: juno
    gas_price: 0.025ujunox
    hd_path: m/44'/118'/0'/0/0
    ics20_port: 'transfer'
    # request in juno faucet channel https://discord.gg/TfsuB6yd
    # faucet: https://faucet.uni.juno.deuslabs.fi
    rpc:
      - https://rpc.uni.juno.deuslabs.fi:443
  sei:
    chain_id: atlantic-1
    prefix: sei
    gas_price: 0usei
    hd_path: m/44'/118'/0'/0/0
    ics20_port: 'transfer'
    rpc:
     - http://158.101.209.61:12657
ibc-setup init --src uni --dest sei
ibc-setup ics20 -v
tmux new -s relay
ibc-relayer start -v --poll 15