IBC relay на примере Juno(uni-3) <> Sei(atlantic-1)
Существует несколько реализаций cosmos релееров, ibc-go (реализация на go), hermes (rust) и ts-relayer (typescript). Функционал у всех примерно одинаковый, так что выбор является вопросом личных предпочтений.
В данной статье я буду рассматривать установку и настройку ts-relayer на примере тестовых сетей Juno - Sei. Ts-relayer выбран как требующий, по моему мнению, наименьшего количества телодвижений.
Релеер необязательно должен устанавливаться на сервер с нодой, более того, вам даже необязательно иметь собственную, достаточно знать RPC адреса конечных точек. Не буду сильно вдаваться в технические подробности, всем заинтересованным смотреть оф. гайд
Я вышел за рамки обычного копипаст-гайда, и постарался описать процесс для более глубокого понимания происходящего. В случае когда это окажется лишним, смотрим копипаст в конце.
Пререквизиты
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.
дописываем в конце конфиг 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
Результатом выполнения команды будет:
- генерация файла
.ibc-setup/app.yamlс указанием сетейsrc,destи сгенерированной мнемоникой - по указанной мнемонике создаются адреса в сетях
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
- создается новое соединение между
src иdest - в конфиг записываются connection ids
- создается новый канал
Вся процедура займет какое-то время, поэтому сидим, ждем и не нерничаем )
По завершении операции , если все идет как надо, наблюдаем следующую картину:
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 для простоты, либо для любителей хардкора в терминале.
seid tx ibc-transfer transfer \ [src-port] \ [src-channel] \ [receiver] \ [amount] \ [flags]
[src-channel] - канал источника, в нашем случае канал sei = channel-103
[receiver] - адрес получателя в формате juno..
[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
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:12657ibc-setup init --src uni --dest sei
ibc-setup ics20 -v
tmux new -s relay ibc-relayer start -v --poll 15