Cosmos项目以及SDK介绍

Cosmos项目以及SDK介绍

Cosmos项目是个有着宏伟目标的区块链项目。在DPOS+BFT的共识引擎的基础上,Cosmos提出了更大的区块链未来和蓝图:区块链开发简便,互通互联。Cosmos设计了区块链的基础设施和生态,区块链开发者只需要调用Cosmos-SDK,开发Plugin,处理特有业务。Cosmos项目已经不只是提供DPOS+BFT共识机制的引擎这么简单。它在打造区块链的基础设施和开发生态。在Cosmos的基础上,设计开发区块链就是在Cosmos上写个应用程序。Cosmos的框架协助实现了一些区块链相关的基本功能:

1)区块链的数据存储以及共识机制(DPOS+BFT)

2)各个应用(区块链)之间的token的互换(IBC)

3)现有区块链的接入(Peg Zone)

在Cosmos框架的基础上开发一条区块链,开发人员唯一要做的事情,就是编写符合ABCI接口的应用程序(解释区块数据,业务处理)。

Cosmos官方网站:cosmos.network

1)Cosmos生态框架

Cosmos的整体框架如下图:



Tendermint Core是所有Cosmos生态中区块链的核心(上图中的淡绿色部分),提供了DPOS+BFT的共识机制。Cosmos Hub提供了不同区块链的之间的交互和价值转移。各个区块链应用之间通过IBC接口进行通信。

2)Cosmos SDK

在Tendermint以及ABCI的基础上,为了进一步方便用户进行区块链开发,Cosmos提供了Cosmos SDK,把区块链中的一些通用模块标准化,用户只需要在SDK的基础上实现Plugin模块,处理一些链特有的业务。



3)Cosmos网络开发进展

Cosmos的开发如火如荼的进行中,各个子项目的代码更新非常密集。从这个网站可以看到各个模块的成熟程度:cosmos.network/roadmap



从上图可以看出,Cosmos项目由四个子项目组成:

a)Cosmos Hub - Cosmos生态中的区块链的互转互换模块

b)Cosmos SDK - ABCI应用程序的SDK

c)Tendermint Core - 共识机制引擎以及网络交互

d)Cosmos Voyager - 客户端终端,提供钱包以及投票等功能

4)Cosmos SDK的框架

Cosmos SDK是Cosmos项目中的一个子项目,主要是抽象出Stack(Middleware),将区块链的应用的功能拆分成一个个module,进一步方便区块链开发人员开发新链。在Cosmos SDK的基础上,实现区块链只需要关注区块链特有的业务逻辑,将其实现成module即可。Cosmos SDK区块链的功能做了细致的划分:客户端,服务器端,以及APP。



客户端提供用户操作的接口:转账,查询等等。服务器端和客户端对应提供服务端的实现(REST接口),客户端和服务器端通过websocket通讯。APP是区块链业务逻辑实现。这些功能模块在“Stack”模块之上。“Stack”由Cosmos-sdk的一个个module组成。区块链相关的一个个小功能,实现成一个个的module,这些中间件串在一起,称为“Stack”。APP将区块链状态记录在State上。

4.1)源代码结构

整个SDK源代码目录如下图所示:



4.2)基本数据结构

a)Actor & Context

Actor以及Context定义在context.go代码中。



Actor定义了某个链上某个App的一个账户(地址)。



Context定义一些基本信息的函数集合:权限查询,Nonce/ChainID/BlockHeight查询等等。

b)Tx

Tx定义在txinner_wrapper.go文件中。Tx会贯穿整个SDK的处理,是整个SDK最重要的数据结构。



Tx是个数据结构,其中的TxInner是接口:Wrap以及ValidateBasic。也就是说一个Tx必须要实现TxInner接口。

c)Handler

Handler接口定义在handler.go文件中。



Handler定义module执行的接口:CheckTx(查看Tx),DeliverTx(区块中交易处理),InitState以及InitValidator(初始化状态和Validator),Name是执行模块的名称。有关module的具体解释,请看Stack和Module的介绍。

4.3)Stack

Stack的相关代码在stack目录中。Stack有关的数据类型如下图:



Stack有两部分组成:builder(middleware)以及Dispatcher。Dispatcher和middleware的区别是:middleware提供Next函数,可以访问下一个“middleware”,Dispatcher是一组Dispatchable构成。

Stack上的所有Middleware被wrap成一个sdk.Handler。



4.4)Client客户端

Client的逻辑在client的目录中。介绍一下Client端将sdk.Tx封装的逻辑(实现在client/txs/wrapper.go)。



Wrapps.Wrap函数将当前传入的sdk.Tx进行wrap,形成类似洋葱样的封装。



4.5)Server服务器端

与客户端相对应的是服务器端,服务器端主要是接收sdk.Tx,检查后调用Tendermint的RPC提交或者查询信息。逻辑实现在client/rest目录下。以txs.go为例,解释一下服务器的实现原理:



服务器端利用mux.Router机制,注册响应函数(如上图中的PostTx)。

4.6)ABCI App程序

ABCI App程序的逻辑实现在app以及server目录。App程序的逻辑相对简单,主要是实现ABCI的接口,调用Stack,具体的操作由Stack的一个个的middleware处理。

一个交易的大致处理流程如下图:



4.7)example示例

Cosmos SDK提供了示例代码,在examples目录下。感兴趣的小伙伴,可以查看basecoin的实现。

4.8)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的实现)。



【完】

喜欢技术的小伙伴,欢迎关注公众号:星想法。


weixin.qq.com/r/qS16Yvf (二维码自动识别)

发布于 2018-09-06 14:58