最近对Cosmos项目比较感兴趣,看了看Cosmos SDK的源代码。本文从源代码的角度解释Cosmos SDK提供了哪些具体功能。
首先说明,Cosmos SDK更新代码比较频繁,有些项目是基于比较老的版本开发的,先从以下的版本介绍(一月份左右的版本)。以后我会介绍最新的代码动态。
1)Cosmos SDK的框架
Cosmos SDK区块链的功能做了细致的划分:客户端,服务器端,以及APP。
客户端提供用户操作的接口:转账,查询等等。服务器端和客户端对应提供服务端的实现(REST接口),客户端和服务器端通过websocket通讯。APP是区块链业务逻辑实现。这些功能模块在“Stack”模块之上。“Stack”由Cosmos-sdk的一个个module组成。区块链相关的一个个小功能,实现成一个个的module,这些中间件串在一起,称为“Stack”。APP将区块链状态记录在State上。
2)源代码结构
整个SDK源代码目录如下图所示:
3)基本数据结构
3a)Actor & Context
Actor以及Context定义在context.go代码中。
Actor定义了某个链上某个App的一个账户(地址)。
Context定义一些基本信息的函数集合:权限查询,Nonce/ChainID/BlockHeight查询等等。
3b)Tx
Tx定义在txinner_wrapper.go文件中。Tx会贯穿整个SDK的处理,是整个SDK最重要的数据结构。
Tx是个数据结构,其中的TxInner是接口:Wrap以及ValidateBasic。也就是说一个Tx必须要实现TxInner接口。
3c)Handler
Handler接口定义在handler.go文件中。
Handler定义module执行的接口:CheckTx(查看Tx),DeliverTx(区块中交易处理),InitState以及InitValidator(初始化状态和Validator),Name是执行模块的名称。有关module的具体解释,请看Stack和Module的介绍。
4)Stack
Stack的相关代码在stack目录中。Stack有关的数据类型如下图:
Stack有两部分组成:builder(middleware)以及Dispatcher。Dispatcher和middleware的区别是:middleware提供Next函数,可以访问下一个“middleware”,Dispatcher是一组Dispatchable构成。
Stack上的所有Middleware被wrap成一个sdk.Handler。
5)Client客户端
Client的逻辑在client的目录中。介绍一下Client端将sdk.Tx封装的逻辑(实现在client/txs/wrapper.go)。
Wrapps.Wrap函数将当前传入的sdk.Tx进行wrap,形成类似洋葱样的封装。
6)Server服务器端
与客户端相对应的是服务器端,服务器端主要是接收sdk.Tx,检查后调用Tendermint的RPC提交或者查询信息。逻辑实现在client/rest目录下。以txs.go为例,解释一下服务器的实现原理:
服务器端利用mux.Router机制,注册响应函数(如上图中的PostTx)。
7)ABCI App程序
ABCI App程序的逻辑实现在app以及server目录。App程序的逻辑相对简单,主要是实现ABCI的接口,调用Stack,具体的操作由Stack的一个个的middleware处理。
一个交易的大致处理流程如下图:
8)example示例
Cosmos SDK提供了示例代码,在examples目录下。感兴趣的小伙伴,可以查看basecoin的实现。
9)module实现
在Cosmos SDK中实现了一些通用module,在modules目录下:fee,coin,ibc, nonce, auth等等。fee module的逻辑相对简单,可以看出一个模块大致需要实现的逻辑:
实现一个module,要实现三个接口:commands/wrap.go(client端的封装),handler.go(Stack中的middleware的接口,也就是sdk.handler接口),以及tx.go(此模块的交易定义以及TxInner的实现)。
总结:Cosmos SDK是Cosmos项目中的一个子项目,主要是抽象出Stack(Middleware),将区块链的应用的功能拆分成一个个module,进一步方便区块链开发人员开发新链。在Cosmos SDK的基础上,实现区块链只需要关注区块链特有的业务逻辑,将其实现成module即可。
领取专属 10元无门槛券
私享最新 技术干货