Logo
Published on

Cosmos IBC Relayer?

Authors

Introduction

Inter-Blockchain Communication (IBC)는 Cosmos 네트워크에서 블록체인 간 통신을 가능하게 하는 중요한 프로토콜입니다. IBC relayer는 이러한 통신을 중계하는 역할을 합니다. 이번 포스팅에서는 IBC relayer의 개념을 이해하고, Hermes를 사용하여 Relayer Node를 설정하는 방법에 대해 알아보겠습니다.

What is IBC

Inter-Blockchain Communication (IBC) 프로토콜은 서로 다른 블록체인 간에 안전하게 데이터를 전송할 수 있게 해주는 표준화된 방법입니다. IBC는 두 블록체인 간의 메시지를 중계하여 다양한 자산과 데이터가 블록체인 간에 이동할 수 있도록 합니다. 이 프로토콜은 주로 Cosmos 생태계에서 사용되지만, 다른 블록체인 네트워크에서도 채택될 수 있습니다.

IBC Communication

IBC는 다음과 같은 구성 요소로 이루어져 있습니다.

  1. Client: 서로 다른 블록체인 간의 상태를 추적합니다. 클라이언트는 다른 블록체인의 상태를 검증하고 인증합니다.
  2. Connection: 두 블록체인 간의 통신 경로를 설정합니다. 연결은 신뢰할 수 있는 경로를 통해 메시지를 교환할 수 있도록 합니다.
  3. Channel: 특정 응용 프로그램 간의 통신을 처리합니다. 채널은 각기 다른 블록체인의 응용 프로그램이 데이터를 주고받을 수 있게 합니다.
  4. Packet: 전송되는 데이터 단위입니다. 패킷은 특정 채널을 통해 전송되며, 각 패킷은 송신 블록체인에서 수신 블록체인으로 안전하게 전달됩니다.

IBC 통신 과정

  1. Client 생성: 송신 블록체인과 수신 블록체인은 서로의 상태를 추적할 수 있도록 클라이언트를 생성합니다.
  2. Connection 설정: 클라이언트를 통해 두 블록체인 간의 연결을 설정합니다.
  3. Channel 생성: 연결이 설정된 후, 각 응용 프로그램 간의 데이터 전송을 위해 채널을 생성합니다.
  4. Packet 전송: 송신 블록체인에서 패킷을 생성하고 채널을 통해 전송합니다.
  5. Packet 수신 및 처리: 수신 블록체인은 패킷을 수신하고 이를 처리하여 데이터를 응용 프로그램에 전달합니다.

What is IBC Relayer?

IBC Relayer는 IBC 프로토콜의 핵심 구성 요소 중 하나로, 두 블록체인 간의 통신을 중계하는 역할을 합니다. 이를 통해 각기 다른 블록체인 간에 자산과 데이터를 자유롭게 이동할 수 있으며 블록체인 간의 상호운용성을 높여줍니다. Relayer는 다음과 같은 작업을 수행합니다.

  1. 메시지 관찰 및 중계: relayer는 블록체인 간에 전송된 메시지를 관찰하고, 이를 상대 블록체인으로 전달합니다.
  2. 데이터 검증: relayer는 메시지가 올바른지 검증하고, 이를 통해 데이터의 무결성을 유지합니다.
  3. 연결 설정: 새로운 IBC 연결을 설정하고, 이를 유지관리합니다.

자세한 내용은 Relaying With IBC에서 확인 가능합니다.


Go Relayer & Hermes

Go Relayer

Go Relayer는 IBC Relayer 소프트웨어 중 하나로, Go 언어로 작성되었습니다. Cosmos SDK와의 높은 호환성을 자랑하며, 다양한 기능을 제공합니다.

주요 특징

  1. 성능 최적화: Go의 성능을 활용하여 빠른 중계 속도를 제공합니다.
  2. 커뮤니티 지원: 널리 사용되는 소프트웨어로 커뮤니티의 지원이 풍부합니다.
  3. 확장성: 다양한 블록체인 네트워크와 쉽게 통합할 수 있습니다.

Hermes

Hermes는 IBC Relayer 소프트웨어 중 하나로, Rust 언어로 작성되었으며 빠르고 효율적인 메시지 전달을 목표로 합니다. Hermes는 다양한 Cosmos SDK 기반 블록체인 간의 IBC 통신을 지원합니다.

주요 특징

  1. 안정성: Rust로 작성되어 메모리 안전성과 성능이 뛰어납니다.
  2. 사용 편의성: 설정 파일을 통해 쉽게 구성할 수 있습니다.
  3. 자동화: IBC 패킷의 자동 중계를 지원합니다.

Execute Hermes

Pre-requisites

Hermes를 설치하려면 Rust 환경이 필요합니다. Rust가 설치되어 있지 않다면 Rust 설치 페이지를 참고하여 설치합니다.

Hermes Install

github 레포지토리를 클론 후 설치를 진행합니다.

git clone https://github.com/informalsystems/ibc-rs.git
git checkout v1.8.0

cd hermes
cargo build --release --bin hermes

Config

~/.hermes/config.toml 위치의 config.toml파일을 수정합니다. 다음은 예시 설정 파일입니다.

# ~/.hermes/config.toml

[global]
log_level = 'debug'

[mode]

[mode.clients]
enabled = true
refresh = true
misbehaviour = true

[mode.connections]
enabled = true

[mode.channels]
enabled = true

[mode.packets]
enabled = true
clear_interval = 100
clear_on_start = true
tx_confirmation = false
auto_register_counterparty_payee = false

[rest]
enabled = false
host = '127.0.0.1'
port = 3000

[telemetry]
enabled = false
host = '127.0.0.1'
port = 3001

[telemetry.buckets]

[tracing_server]
enabled = false
port = 5555

# Cosmos
[[chains]]
id = 'local-cosmos'
rpc_addr = 'http://172.17.0.2:26657'
grpc_addr = 'http://172.17.0.2:9090'
event_source = { mode = 'push', url = 'ws://172.17.0.2:26657/websocket', batch_delay = '500ms' }
rpc_timeout = '10s'
trusted_node = false
account_prefix = 'cosmos'
key_name = 'relayer'
store_prefix = 'ibc'
default_gas = 200000
max_gas = 4000000
gas_price = { price = 0.01, denom = 'uatom' }
gas_multiplier = 1.2
max_msg_num = 30
max_tx_size = 2097152
clock_drift = '5s'
max_block_time = '30s'
trusting_period = '200s'
trust_threshold = '2/3'
address_type = { derivation = 'cosmos' }


# Osmosis
[[chains]]
id = 'local-osmosis'
rpc_addr = 'http://172.17.0.3:26657'
grpc_addr = 'http://172.17.0.3:9090'
event_source = { mode = 'push', url = 'ws://172.17.0.3:26657/websocket', batch_delay = '500ms' }
rpc_timeout = '10s'
trusted_node = false
account_prefix = 'osmo'
key_name = 'relayer'
store_prefix = 'ibc'
default_gas = 200000
max_gas = 4000000
gas_price = { price = 0.01, denom = 'uosmo' }
gas_multiplier = 1.2
max_msg_num = 30
max_tx_size = 2097152
clock_drift = '5s'
max_block_time = '30s'
trusting_period = '200s'
trust_threshold = '2/3'
address_type = { derivation = 'cosmos' }

각 항목에 대한 정보는 Hermes github에서 확인 가능합니다.

Keys

key를 등록합니다. 해당 키는 각 IBC 연결을 할 체인의 Node를 생성할 때 받은 Mnemonic을 사용하여 다음 명령어로 생성합니다.

hermes keys add --chain <CHAIN_ID> --key-file <PRIVATE_KEY_FILE>

자세한 내용은 Hermes 공식문서 - Keys에서 확인 가능합니다

Health Check

다음 명령어를 이용하여 헬스체크가 가능합니다.

hermes --config /data/config.toml health-check

Create Clients

다음 명령어를 이용하여 각 네트워크에 각각 client를 생성합니다.

hermes create client [OPTIONS] --host-chain <HOST_CHAIN_ID> --reference-chain <REFERENCE_CHAIN_ID>

# Example
hermes create client --host-chain local-cosmos --reference-chain local-osmosis
hermes create client --host-chain local-osmosis --reference-chain local-cosmos

자세한 내용은 Hermes 공식문서 - Client에서 확인 가능합니다.

Create Connections

다음 명령어를 이용하여 각 네트워크에 각각 Connection을 생성합니다.

hermes create connection [OPTIONS] --a-chain <A_CHAIN_ID> --a-client <A_CLIENT_ID> --b-client <B_CLIENT_ID>

# Example
hermes create connection --a-chain local-cosmos --a-client 07-tendermint-1 --b-client 07-tendermint-1
hermes create connection --a-chain local-osmosis --a-client 07-tendermint-1 --b-client 07-tendermint-1

자세한 내용은 Hermes 공식문서 - Connection에서 확인 가능합니다.

Create Channels

다음 명령어를 이용하여 Channel을 생성합니다.

hermes create channel [OPTIONS] --a-chain <A_CHAIN_ID> --a-connection <A_CONNECTION_ID> --a-port <A_PORT_ID> --b-port <B_PORT_ID>

# Example
hermes create channel --order unordered --a-chain ibc-0 --b-chain ibc-1 --a-port  transfer --b-port transfer

자세한 내용은 Hermes 공식문서 - Channel에서 확인 가능합니다.

Create all at once

위의 Client, Connection, Channel을 다음 명령어로 한번에 만들 수 있습니다.

hermes create channel [OPTIONS] --a-chain <A_CHAIN_ID> --b-chain <B_CHAIN_ID> --a-port <A_PORT_ID> --b-port <B_PORT_ID> --new-client-connection

# Example
hermes --config /data/config.toml create channel --a-chain local-cosmos --b-chain local-osmosis --a-port transfer --b-port transfer --new-client-connection

Execute

다음 명령어를 이용하여 실행합니다.

hermes start

Test

이제 A체인에서 B체인으로 transfer Channel이 연결되었기 때문에 다음 트랜잭션을 보낼 수 있습니다.

# local-cosmos -> local-osmosis

gaiad tx ibc-transfer transfer transfer channel-0 osmo12v5vg9xn9hhpul4sp8g6k0rqyytncn8k5q0kzv 1000uatom --from relayer --fees 200uatom

이후 체인에 다음처럼 쿼리요청을 보내어 확인합니다.

osmosisd q bank balances osmo12v5vg9xn9hhpul4sp8g6k0rqyytncn8k5q0kzv

IBC Transfer가 정상적으로 실행되었다면 다음 응답을 받을 수 있습니다.

balances:
- amount: "1000"
  denom: ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2
- amount: "94999899500"
  denom: uosmo
pagination:
  next_key: null
  total: "0"

Reference