IBC Relayers

Работа ретранслятора на Namada

В этом документе описывается работа ретранслятора для протокола межблокчейн-коммуникаций (IBC) с Namada. В этой документации рассматривается возможность создания соединений по протоколу IBC, а также настройка локальных экземпляров Namada для целей тестирования.

В этом документе описаны основные шаги по использованию IBC с Namada:

Описанное ниже предназначено для тех, кто хочет организовать ретрансляцию IBC-сообщений между двумя цепочками Namada. Разумеется, это можно сделать между любыми двумя IBC-совместимыми цепочками (например, цепочкой Cosmos). В этом случае для осуществления передачи пакетов необходимо, чтобы узел работал как на цепочке назначения, так и на цепочке источника. Ниже мы рассмотрим, во-первых, как включить такое соединение между двумя уже существующими цепочками с помощью Hermes, а во-вторых, как настроить два локальных экземпляра Namada или объединить два уже существующих экземпляра Namada для этой цели.

Настройка Hermes

Hermes - это ретранслятор IBC, предназначенный для передачи IBC-пакетов между цепочками (инстансами). В Namada используется форк Hermes, поддерживающий инстансы Namada. Перед началом ретрансляции пакетов пользователю необходимо выполнить следующие действия по настройке и запуску Hermes.

  1. Создать файл конфигурации Hermes

  2. Создать IBC-клиент/соединение/канал между инстансами

  3. Запустить Hermes

Создать файл конфигурации Hermes

Одним из важнейших элементов головоломки является создание файла config.toml, описывающего, какие будут установлены соединения, за которые будет отвечать ретранслятор.

export HERMES_CONFIG="<choose path for hermes config>/config.toml"
touch $HERMES_CONFIG

Если путь к файлу не указан, то по умолчанию считается ~/.hermes/config.toml.

Пример конфигурационного файла приведен ниже. По сути, в конфигурационном файле для Namada вы меняете только идентификаторы цепочек, адреса RPC и имена ключей. Если у вас нет узлов, настройте их вручную или с помощью наших скриптов.

[global]
log_level = 'info'
 
[mode]
 
[mode.clients]
enabled = true
refresh = true
misbehaviour = true
 
[mode.connections]
enabled = false
 
[mode.channels]
enabled = false
 
[mode.packets]
enabled = true
clear_interval = 10
clear_on_start = false
tx_confirmation = true
 
[telemetry]
enabled = false
host = '127.0.0.1'
port = 3001
 
[[chains]]
id = 'namada-test.0a4c6786dbda39f786'  # set your chain ID
type = 'namada'
rpc_addr = 'http://127.0.0.1:27657'  # set the IP and the port of the chain
grpc_addr = 'http://127.0.0.1:9090'  # not used for now
event_source = { mode = 'push', url = 'ws://127.0.0.1:27657/websocket', batch_delay = '500ms' }  # set the IP and the port of the chain
account_prefix = ''  # not used
key_name = 'relayer'  # The key is an account name you made
store_prefix = 'ibc'
gas_price = { price = 0.001, denom = 'nam' }  # not used for now
 
[[chains]]
id = 'namada-test.647287156defa8728c'
type = 'namada'
rpc_addr = 'http://127.0.0.1:28657'
grpc_addr = 'http://127.0.0.1:9090'
event_source = { mode = 'push', url = 'ws://127.0.0.1:28657/websocket', batch_delay = '500ms' }
account_prefix = ''
key_name = 'relayer'
store_prefix = 'ibc'
gas_price = { price = 0.001, denom = 'nam' }

Путь к файлу конфигурации, который сохраняется в переменной $HERMES_CONFIG, пригодится в дальнейшем.

Интерпретация toml

Каждая конфигурация цепочки задается в объекте [[chains]]. Это те кусочки головоломки, которые вы хотите сохранить:

chains.id - имя цепочки

chains.rpc_address - порт, через который осуществляется связь с каналом, и который будет являться аргументом для ledger_address в Namada при взаимодействии (это станет ясно позже).

Обязательно измените IP-адрес на IP-адрес вашей локальной машины, на которой запущен этот узел!

chains.key_name задает ключ подписывающего, который подписывает транзакцию от ретранслятора. Ключ должен быть сгенерирован перед запуском ретранслятора.

event_source задает URL веб-сокета цепочки. Для корректной работы Hermes он должен совпадать с адресом rpc_address.

Создание IBC-клиента/соединения/канала между экземплярами

В Hermes CLI имеются команды для их создания. Перед созданием узел каждого экземпляра должен быть запущен по указанным rpc-адресам. Если у вас нет узлов, установите их вручную или с помощью наших скриптов.

Экспорт переменных окружения

Пользователю, осуществляющему ретрансляцию, необходимо сохранить некоторые переменные окружения. К ним относятся:

export CHAIN_A_ID="<replace-with-chain-a-id>"
export CHAIN_B_ID="<replace-with-chain-b-id>"
export HERMES_CONFIG="<replace-with-hermes-config-path>"

Установка Hermes

Перед проведением любых операций с IBC необходимо загрузить бинарный файл форка Hermes компании Heliax или собрать его из исходных файлов.

Из бинарных файлов

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

Например.

export TAG="v1.6.0-namada-beta3"
export ARCH="x86_64-unknown-linux-gnu" # or "aarch64-apple-darwin"
curl -Lo /tmp/hermes.tar.gz https://github.com/heliaxdev/hermes/releases/download/${TAG}/hermes-${TAG}-${ARCH}.tar.gz
tar -xvzf /tmp/hermes.tar.gz -C /usr/local/bin

В некоторых системах каталог /usr/local/bin является защищенным. В этом случае может потребоваться выполнить приведенную выше команду с правами sudo. Т.е.

sudo tar -xvzf /tmp/hermes.tar.gz -C /usr/local/bin

Это справедливо и для команды cp ./target/release/hermes /usr/local/bin/, приведенной ниже (см. комментарий).

Из источника

export TAG="v1.6.0-namada-beta3"
 
git clone https://github.com/heliaxdev/hermes.git
git checkout $TAG
cd hermes
cargo build --release --bin hermes
export HERMES=$(pwd) # if needed

Проверьте двоичный код:

./target/release/hermes --version #or sudo cp ./target/release/hermes /usr/local/bin/

Теперь рекомендуется добавить hermes в $PATH, чтобы он вызывался без каких-либо префиксов. Для пользователей ubuntu это можно сделать следующим образом

cp ./target/release/hermes /usr/local/bin/

Настройка ретранслятора

Создайте каталог namada_wallet и цепочку каталогов для хранения каждого кошелька ретранслятора wallet.toml

Для работы ретранслятора необходимо иметь каталог кошелька для хранения ключей ретранслятора. Это можно сделать, выполнив команду:

# in the Hermes folder
mkdir namada_wallet
mkdir -p ~/.hermes/namada_wallet/$CHAIN_A_ID
mkdir -p ~/.hermes/namada_wallet/$CHAIN_B_ID

This step is only needed for namada chains. For cosmos based chains, it is advised to add the key directly to hermes.

./hermes --config $HERMES_CONFIG keys add --chain "<name-of-chain>" --key-file "<path-to-key>" --overwrite

Создание учетной записи ретранслятора

В каждой цепочке должна существовать учетная запись ретранслятора. На цепочке namada это можно сделать, выполнив команду:

namadaw key gen --alias relayer

В результате будет сгенерирован ключ для учетной записи ретранслятора. Ключ будет храниться в файле wallet.toml, который находится в базовом каталоге узла, в папке chain-id. Например, если chain-id - namada-test.0a4c6786dbda39f786, то wallet.toml будет находиться в каталоге $HOME/.local/share/namada/namada-test.0a4c6786dbda39f786/wallet.toml (на машине ubuntu, где base-dir не был настроен должным образом).

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

cp $HOME/.local/share/namada/$CHAIN_A_ID/wallet.toml ~/.hermes/namada_wallet/$CHAIN_A_ID/wallet.toml
# Make sure this is done for both wallets on each chain!

Теперь можно приступить к настройке клиента.

Создание канала IBC

Команда "создать канал" (см. ниже) создает не только канал IBC, но и необходимое клиентское соединение IBC.

hermes --config $HERMES_CONFIG \
  create channel \
  --a-chain $CHAIN_A_ID \
  --b-chain $CHAIN_B_ID \
  --a-port transfer \
  --b-port transfer \
  --new-client-connection --yes

Обратите внимание, что указанные выше CHAIN_ID будут зависеть от вашей собственной установки, поэтому проверьте это сами!

После завершения создания можно увидеть идентификаторы каналов. Например, в следующем тексте показано, что в цепи A namada-test.0a4c6786dbda39f786 создан канал с идентификатором 7, а в цепи B namada-test.647287156defa8728c создан канал с идентификатором 12. Идентификаторы каналов понадобятся для передачи данных по IBC. Это означает, что для передачи данных из цепочки A в цепочку B необходимо указать в качестве идентификатора канала канал-7 (префикс channel- всегда обязателен), а для передачи данных из цепочки B в цепочку A - канал-12.

SUCCESS Channel {
    ordering: Unordered,
    a_side: ChannelSide {
        chain: BaseChainHandle {
            chain_id: ChainId {
                id: "namada-test.0a4c6786dbda39f786",
                version: 0,
            },
            runtime_sender: Sender { .. },
        },
        client_id: ClientId(
            "07-tendermint-0",
        ),
        connection_id: ConnectionId(
            "connection-3",
        ),
        port_id: PortId(
            "transfer",
        ),
        channel_id: Some(
            ChannelId(
                "channel-7",
            ),
        ),
        version: None,
    },
    b_side: ChannelSide {
        chain: BaseChainHandle {
            chain_id: ChainId {
                id: "namada-test.647287156defa8728c",
                version: 0,
            },
            runtime_sender: Sender { .. },
        },
        client_id: ClientId(
            "07-tendermint-1",
        ),
        connection_id: ConnectionId(
            "connection-2",
        ),
        port_id: PortId(
            "transfer",
        ),
        channel_id: Some(
            ChannelId(
                "channel-12",
            ),
        ),
        version: None,
    },
    connection_delay: 0ns,
}

Запуск ретранслятора

После запуска Hermes осуществляет мониторинг экземпляров через узлы и ретранслирует пакеты в соответствии с отслеживаемыми событиями.

hermes --config $HERMES_CONFIG start

Более подробную информацию о Hermes можно найти в официальном документе.

После синхронизации вы можете создать канал и запустить Hermes, как описано выше.

# create a channel
hermes --config $HERMES_CONFIG \
  create channel \
  --a-chain $CHAIN_A_ID \
  --b-chain $CHAIN_B_ID \
  --a-port transfer \
  --b-port transfer \
  --new-client-connection --yes

Перевод активов через IBC

Появилась возможность перевода активов между двумя цепочками.

Настройка локальных экземпляров Namada с помощью скрипта hermes

Скрипт setup-namada создаст два экземпляра с одним узлом валидатора, скопирует необходимые файлы для Hermes и создаст счет для Hermes на каждом ledger. Кроме того, в каталоге hermes будет создан файл конфигурации Hermes config_for_namada.toml.

Для начала необходимо экспортировать некоторые переменные окружения:

export NAMADA_DIR="<path-to-namada-source-directory>"export TAG="v1.6.0-namada-beta3"
git clone https://github.com/heliaxdev/hermes.gitgit checkout $TAG # The branch is the same as our Hermescd hermes./scripts/setup-namada $NAMADA_DIR $CHAIN_ID_A $CHAIN_ID_B

В этом случае пользователю не нужно ждать синхронизации. Если на счету ретранслятора на каждом экземпляре имеется достаточный баланс, пользователь может создать канал и сразу же запустить Hermes, как было описано выше. Идентификаторы цепочек инстансов пользователь находит в конфигурационном файле config_for_namada.toml. Можно выполнить команду grep "id" ${HERMES_CONFIG}.

# create a channel
hermes --config $HERMES_CONFIG \
  create channel \
  --a-chain $CHAIN_A_ID \
  --b-chain $CHAIN_B_ID \
  --a-port transfer \
  --b-port transfer \
  --new-client-connection --yes
 
# Run Hermes
hermes --config $HERMES_CONFIG start

Файлы данных и конфигурации каждого узла находятся в папке hermes/data/namada-*/.namada.

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

killall namadan

Last updated