Cosmos SDK 技术介绍


原文链接:https://medium.com/cypher-core/a-technical-introduction-to-cosmos-sdk-f3a08c85a2b5

原文作者:Jay | Cypher Core

架构设计概述

Cosmos SDK是一个类似于npm的框架,可让开发人员在Tendermint之上轻松构建复杂、安全且与应用无关的状态机。 使用Cosmos SDK构建的应用实质上是基于BPoS(绑定权益证明)的多资产、可互操作的公链。

下图显示通过ABCI(或具体来讲是DeliverTx),用Cosmos SDK构建的应用从Tendermint重播时,是如何处理交易的:

Cosmos SDK:

npm: https://www.npmjs.com/

Tendermint: https://tendermint.com/

应用解读

Cosmos SDK应用通常包含以下主要组件:

一、全节点客户端

全节点客户端是由Cosmos网络中的参与者构建和运行的二进制应用(或守护程序),用于实例化其自己的状态机并连接到其他全节点。 全节点完整验证区块链的交易和区块。
640

二、核心应用

Cosmos SDK应用的核心主要包括 类型定义构造函数

类型定义

在app.go中定义的自定义应用的类型定义仅是包含以下内容的结构:

  • 对baseapp的引用:对baseapp的引用定义了为您的应用嵌入baseapp的自定义应用类型。 换句话说,对baseapp的引用允许自定义应用继承大多数baseapp的核心逻辑,例如ABCI方法和路由逻辑。

baseapp:

  • 存储密钥列表:Cosmos SDK中的每个模块都使用多重存储来保留其状态的一部分。 访问此类存储需要在应用的类型定义中声明的密钥列表。

多重存储:

  • 每个模块的Keeper列表:keeper是每个模块中的抽象部分,用于处理模块与商店的交互,指定对其他模块的Keeper的引用以及实现模块的其他核心功能。为了使跨模块交互能够正常工作,Cosmos SDK中的所有模块都需要在应用的类型定义中声明其keeper,并作为与其他模块的接口导出,以便在授权时可以在其他模块中调用和访问模块的keeper方法。

keeper:

  • 对编解码器的引用:默认为go-amino,Cosmos SDK应用中的编解码器可以用其他合适的编码框架代替,只要它们将数据坚持存储在字节切片中,并且是确定性的即可。

go-amino:

  • 参考模块管理器:不言自明。 对包含应用模块列表(也称为模块管理器)的对象的引用。

应用类型定义示例:

构造函数

顾名思义,构造函数会创建一个应用实例,并在其中声明应用的类型定义。 具体来说,构造函数在被调用时执行以下操作:

  1. 使用对编解码器、baseapp以及存储密钥列表的引用来初始化新的应用实例
  2. 按照类型定义中的正确顺序初始化每个模块的keeper(比如,如果模块Ken的keeper需要引用模块Jay,则需要在模块Ken之前实例化模块Jay的keeper)
  3. 初始化应用的模块管理器——这是一个对象,其中:
  • 传入对每个模块的引用(假定此处初始化的模块打算在以后进行修改)。
  • 路由(到模块的处理程序)和查询路由(到模块的查询器)已初始化。
  • 每个模块的不变量(即在每个区块尾评估的变量)都会被记录。 每个不变量的值必须等于其相应模块中指定的预定义值。
  • 设置每个模块的关键功能(例如InitGenesis,BeginBlocker,EndBlocker)之间的执行顺序。
  • 设置了应用其余参数。
  • 商店已安装。
  • 应用实例已返回。

应用构造器示例:

三、模块

Cosmos SDK中已经内置了一致性应用所需的许多关键模块,因此开发人员可以通过将自定义模块与现有模块集成来轻松构建复杂的状态机。 目前,SDK支持以下模块:

在本节的其余部分中,我们将简要探讨模块的两个最基本的部分——接口和消息类型。

接口

根据定义,Cosmos SDK模块实现两个接口:AppModuleBasic和AppModule。 AppModule通常包含模块的模块间依赖方法,而非依赖方法(例如,编解码器)则进入AppModuleBasic。

模块接口示例:

消息类型

实现消息接口的每个模块都需要定义自己的自定义消息类型。 此类消息类型也应视为“要包括在交易中的消息”。 在收到通过DeliverTx从Tendermint中继的交易区块之后,应用需要执行4个步骤的过程,然后提交状态更改:

  1. 从字节切片或[] bytes编码每个事务
  2. 执行健全性检查(例如费用、签名)并提取交易中包含的消息
  3. 将消息路由到适当的模块的处理程序
  4. 处理消息

四、应用介面

每个Cosmos SDK应用都实现一个命令行界面(CLI),该命令行界面用于与全节点客户端进行交互。 现成的CLI支持以下通用命令:
640-1
CLI

CLI示例:

五、依赖关系和Makefile

Cosmos SDK使开发人员可以自由选择喜欢的项管理器和项目构建方法。Go 模块通常用于前者,Makefile用于后者。

备注

无论您是否刚接触区块链,一开始学习新的代码库都可能有些艰巨。这是我的尝试,目的是使希望在Cosmos SDK上构建的开发人员对框架有所了解,并希望有助于减轻他们的代码上手期。如果您准备动手构建自己的应用专有链,请查看此处的教程:https://github.com/cosmos/sdk-tutorials

最后但并非最不重要的一点,谢谢您的阅读!

资源

[1] GitHub. (2019). cosmos/cosmos-sdk. [online] Available at: https://github.com/cosmos/cosmos-sdk/tree/master/docs [Accessed 11 Nov. 2019].