首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Tendermint-Cosmos SDK源代码分析

最近对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即可。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180605G11G3F00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券