- Published on
Cosmos IBC Relayer?
- Authors
- Name
- 이민기
- Github
- @mingi3442
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는 다음과 같은 구성 요소로 이루어져 있습니다.
- Client: 서로 다른 블록체인 간의 상태를 추적합니다. 클라이언트는 다른 블록체인의 상태를 검증하고 인증합니다.
- Connection: 두 블록체인 간의 통신 경로를 설정합니다. 연결은 신뢰할 수 있는 경로를 통해 메시지를 교환할 수 있도록 합니다.
- Channel: 특정 응용 프로그램 간의 통신을 처리합니다. 채널은 각기 다른 블록체인의 응용 프로그램이 데이터를 주고받을 수 있게 합니다.
- Packet: 전송되는 데이터 단위입니다. 패킷은 특정 채널을 통해 전송되며, 각 패킷은 송신 블록체인에서 수신 블록체인으로 안전하게 전달됩니다.
IBC 통신 과정
- Client 생성: 송신 블록체인과 수신 블록체인은 서로의 상태를 추적할 수 있도록 클라이언트를 생성합니다.
- Connection 설정: 클라이언트를 통해 두 블록체인 간의 연결을 설정합니다.
- Channel 생성: 연결이 설정된 후, 각 응용 프로그램 간의 데이터 전송을 위해 채널을 생성합니다.
- Packet 전송: 송신 블록체인에서 패킷을 생성하고 채널을 통해 전송합니다.
- Packet 수신 및 처리: 수신 블록체인은 패킷을 수신하고 이를 처리하여 데이터를 응용 프로그램에 전달합니다.
What is IBC Relayer?
IBC Relayer는 IBC 프로토콜의 핵심 구성 요소 중 하나로, 두 블록체인 간의 통신을 중계하는 역할을 합니다. 이를 통해 각기 다른 블록체인 간에 자산과 데이터를 자유롭게 이동할 수 있으며 블록체인 간의 상호운용성을 높여줍니다. Relayer는 다음과 같은 작업을 수행합니다.
- 메시지 관찰 및 중계: relayer는 블록체인 간에 전송된 메시지를 관찰하고, 이를 상대 블록체인으로 전달합니다.
- 데이터 검증: relayer는 메시지가 올바른지 검증하고, 이를 통해 데이터의 무결성을 유지합니다.
- 연결 설정: 새로운 IBC 연결을 설정하고, 이를 유지관리합니다.
자세한 내용은 Relaying With IBC에서 확인 가능합니다.
Go Relayer & Hermes
Go Relayer
Go Relayer는 IBC Relayer 소프트웨어 중 하나로, Go 언어로 작성되었습니다. Cosmos SDK와의 높은 호환성을 자랑하며, 다양한 기능을 제공합니다.
주요 특징
- 성능 최적화: Go의 성능을 활용하여 빠른 중계 속도를 제공합니다.
- 커뮤니티 지원: 널리 사용되는 소프트웨어로 커뮤니티의 지원이 풍부합니다.
- 확장성: 다양한 블록체인 네트워크와 쉽게 통합할 수 있습니다.
Hermes
Hermes는 IBC Relayer 소프트웨어 중 하나로, Rust 언어로 작성되었으며 빠르고 효율적인 메시지 전달을 목표로 합니다. Hermes는 다양한 Cosmos SDK 기반 블록체인 간의 IBC 통신을 지원합니다.
주요 특징
- 안정성: Rust로 작성되어 메모리 안전성과 성능이 뛰어납니다.
- 사용 편의성: 설정 파일을 통해 쉽게 구성할 수 있습니다.
- 자동화: 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"