IBC
- What
- 区块链间通信协议 (IBC) 是一种端到端的、面向连接的、有状态的协议,用于在以未知和动态拓扑排列的异构区块链之间进行可靠、有序和经过身份验证的通信。
- 原理
- Step 1: 链B不断的接收链 A 的头部,链B 同理,相当于各自运行一个轻节点
- 第 2 步:绑定 当 IBC 转账开始时,TokenA 被锁定(绑定)在链 A 上。
- 第 3 步:证明中继然后,将 10 个 TokenA 绑定的证明从链 A 中继到链 B。
- 第 4 步:验证 证明在链 B 上针对链 A 的标头进行验证,如果有效,则在链 B 上创建 10 个 TokenA 凭证。
- 链 A 锁定代币 a,并将这个锁定证明(凭证)传递给链 B。一旦这个动作完成并验证,链 B 将在自己的链上投射一个替代的代币 a'(可以理解为一种等价的票证) .替代通证 a' 可以被链 B 销毁后,链 B 完成销毁后,链 A 将解锁原本锁定的通证 a。因此,我们可以跨链转移代币的价值,实现跨链资产转移,但不能转移代币本身。
- 总结来说,IBC的整个过程可以描述如下
- 握手建立连接
- 转账代币(目前我们只支持代币转账,nft转账即将推出)
- 通过中继器中继数据包
- 更多详细资料
-
OKC 与IBC 的交互
OKC 早期是由 cosmos-sdk(v0.39) 构建而成,最终选择移植ibc-go v2.0.2 版本的功能以支持IBC, 现今OKC不仅支持evm体系也同时支持cosmos体系.
OKC与其他cosmos系列的区块链基本类似,但也有不同, OKC 不支持 grpc-server 功能,因此对于rust版的中继器hermes
是不支持的
前置准备
第一步: 初始化relayer的相关配置
先初始化relayer配置
配置chains 和paths
OKC的配置为如下:
{
"type": "cosmos",
"value": {
"key": "testkey",
"chain-id": "exchain-65",
"rpc-addr": "https://exchaintesttmrpc.okex.org:443",
"grpc-addr": "",
"account-prefix": "ex",
"keyring-backend": "test",
"gas-adjustment": 1.5,
"gas-prices": "10000000000000wei",
"debug": true,
"timeout": "10s",
"output-format": "json",
"sign-mode": "direct"
}
}
注意点:
如果是本地私链压测,则要记得替换rpc地址为你自己本地的rpc地址
然后添加本地测试链的配置,如ibc-0 测试链
{
"type": "cosmos",
"value": {
"key": "testkey",
"chain-id": "ibc-0",
"rpc-addr": "http://localhost:6657",
"grpc-addr": "",
"account-prefix": "cosmos",
"keyring-backend": "test",
"gas-adjustment": 1.5,
"gas-prices": "0.025stake",
"debug": true,
"timeout": "10s",
"output-format": "json",
"sign-mode": "direct"
}
}
将两个链添加到rly配置中
rly chains add --file exchain-65.json exchain-65
rly chains add --file ibc0.json ibc-0
此时查询会输出2条链的信息
rly chains list
当添加完链的信息之后,可以添加path的信息,path是两条链的一个通信的名称,配置格式如下,以okc65-ibc0 为例(名字可以任意)
oec65_ibc0.json
{
"dst": {
"chain-id": "ibc-0",
"port-id": "transfer",
"order": "unordered",
"version": "ics20-1"
},
"src": {
"chain-id": "exchain-65",
"port-id": "transfer",
"order": "unordered",
"version": "ics20-1"
},
"strategy": {
"type": "naive"
}
}
然后将该path 添加到relayer配置中
rly paths add exchain-65 ibc-0 oec65_ibc0 --file ./oec65_ibc0.json
查询当前所有path
rly paths list
当添加完path之后,最后一步需要通过助记词绑定key, 该key的作用在于, 中继需要gas ,所以需要为其提供一个账户
rly keys restore ibc-0 testkey "your mnemonic"
rly keys restore exchain-65 testkey "your mnemonic"
testkey 代表的是链配置的json文件中的key
第二部: 握手建立连接
rly tx link oec65_ibc0 --src-port transfer --dst-port transfer --order unordered --version ics20-1 -d
当建立完毕之后,大概会有类似如下日志输出: Channel created {"src_chain_id": "exchain-65", "src_channel_id": "channel-0", "src_port_id": "transfer", "dst_chain_id": "ibc-0", "dst_channel_id": "channel-0", "dst_port_id": "transfer"}
启动中继器,自动中继相关数据
rly start path oec65_ibd0
第三步: 转账token
在此之前可以先查询对应的余额
rly q bal ibc-0 testkey
开始转账: 从exchain-65 测试网 给 对方链转账 0.0004 okt (注意: 1okt=10^18 wei
)
rly tx transfer exchain-65 ibc-0 400000000000000wei $(rly keys show ibc-0 testkey) channel-0 --path oec65_ibc0
转完之后再查询一下可以发现 余额会预期的进行减少
第四步: token转回
当relayer 中继完对应的数据之后,对方链上账户余额会出现对应的ibc 币种,此时可以将这个币转回去, 但是因为okc 同时也支持evm体系,所以当10币 转过来的时候,会自动的部署erc20合约,因此无法直接通过relayer的命令转回去, 此时的解决方案
是通过okc浏览器转回去(但okc浏览器团队依旧处于开发状态,因此暂时无法通过此方式转回token)
第二种方式则是以部署合约的方式,通过metamask方式转回