本文旨在深入分析 Cosmos SDK 中已经实现的 IBC 源码,对其已经实现或部分实现的语义并结合 ICS 文档 Cosmos IBC 链间通信协议剖析 ,剖析其背后的跨链设计思想,真正了解 Cosmos,了解跨链。
在十一月初,Cosmos 在 Chain Reaction 会议中进行了一段代码演示,演示了如何使两条亮通过 IBC 建立链接,并完成资产跨链交易。这是首次发布的较为完整的跨链流程的演示。虽然 IBC 还并未完全实现仍处在开发阶段,关于应用层以及激励等语义还未实现,但我们可以在演示版本的 SDK 中看到 ICS 文档中提及的关键标准的部分实现,由此可以窥见 IBC 由 ICS 标准的设定到落地的实施细节。相关代码及 hands-on 请参考 IBC Hands-on / IBC 快速上手 。
本文会从几个核心 ICS 子协议出发,通过标准解读加源码分析的方式,对 IBC 进行分析。
文中所示代码取自 cosmos-sdk@v0.34.4 发行版本。
以 cosmos-sdk 构建的项目代码有自己的项目结构和约定。例如,应用逻辑相关的模块的代码会放到./x/ 目录下。不论是应用模块还是 SDK 内置的诸如 auth 、bank、gov等核心功能模块,还是正在开发的 ibc 模块,他们本质上都是可插拔的模块,不论是 cosmos-sdk 源码还是 gaia 亦或是其他基于 cosmos-sdk 所构建的包含应用链的代码,这一套约定都是通用的。
所以对于 cosmos-sdk 来说,其本身是ibc 协议的实现,所以我们要找的ibc 模块的实现的入口是./x/ibc 。
在跳进代码细节之前,了解如何阅读和编写基于 cosmos-sdk 构建的代码是很有必要的。 Cosmos SDK 快速建链
在 cosmos-sdk 的 ibc-alpha 特性分支上,已经完成的 IBC 代码目录如下:

其中,
./client路径下存储的是命令行客户端命令集(REST 暂未实现)./keeper定义对状态机底层数据库的操作的封装./types中定义了错误类型及路由关键字等属性handler.go是对从数据包中解析出来的特定类型的消息到处理程序的路由列表module.go是整个 ibc 模块的入口,其是 cosmos-sdk 定义的 module 的实现,实现AppModule和AppModuleBasic 接口及相关方法,使得 ibc 模块可以作为可插拔模块接入到由 cosmos-sdk 构建的区块链应用中