Cosmos SDK技术介绍

作者:Jay|Cypher Core  时间:2019-12-18  分类:阿童木(Cosmos)新闻  

  

  原文链接:

  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重播时,是如何处理交易的:

  SDK设计概述

  Cosmos SDK: 

  https://github.com/cosmos/cosmos-sdk

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

  Tendermint: https://tendermint.com/

  应用解读

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

  应用解读

  一、全节点客户端

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

   节点客户端

  二、核心应用

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

  类型定义

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

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

  baseapp: 

  https://cosmos.network/docs/intro/sdk-design.html#baseapp

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

  多重存储:

  https://cosmos.network/docs/intro/sdk-design.html#multistore

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

  keeper:

  https://cosmos.network/docs/spec/auth/04_keepers.html#keepers

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

  go-amino: 

  https://github.com/tendermint/go-amino

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

  应用类型定义示例:

  https://github.com/cosmos/gaia/blob/master/app/app.go#L73-L107

  构造函数

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

  使用对编解码器、baseapp以及存储密钥列表的引用来初始化新的应用实例

  按照类型定义中的正确顺序初始化每个模块的keeper(比如,如果模块Ken的keeper需要引用模块Jay,则需要在模块Ken之前实例化模块Jay的keeper)

  初始化应用的模块管理器——这是一个对象,其中:

  传入对每个模块的引用(假定此处初始化的模块打算在以后进行修改)。

  路由(到模块的处理程序)和查询路由(到模块的查询器)已初始化。

  每个模块的不变量(即在每个区块尾评估的变量)都会被记录。 每个不变量的值必须等于其相应模块中指定的预定义值。

  设置每个模块的关键功能(例如InitGenesis,BeginBlocker,EndBlocker)之间的执行顺序。

  设置了应用其余参数。

  商店已安装。

  应用实例已返回。

  应用构造器示例:

  https://github.com/cosmos/gaia/blob/master/app/app.go#L110-L222

  三、模块

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

  模块-第一部分

  模块-第二部分

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

  接口

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

  模块接口示例:

  https://github.com/cosmos/cosmos-sdk/blob/master/x/bank/module.go

  消息类型

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

  从字节切片或[] bytes编码每个事务

  执行健全性检查(例如费用、签名)并提取交易中包含的消息

  将消息路由到适当的模块的处理程序

  处理消息

  四、应用介面

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

  CLI

  CLI示例:

  https://github.com/cosmos/sdk-tutorials/blob/master/nameservice/cmd/nscli/main.go

  五、依赖关系和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].

  

版权信息
作者:Jay|Cypher Core
来源:Cosmos互联链

关于我们

联系我们

作者进驻

公众号

Copyright © 2013 比特巴 www.btb8.com
只为您提供客观公正有用的比特币 区块链 加密数字货币新闻、技术教程、行情分析、行业人物资讯
手机版