Cosmos SDK 介绍(下)

引言

区块链是人类的巅峰科技成果组合而成的全新架构,对于生产关系的变革有巨大的潜力。数与科技团队致力于在实践中探索更加开放的加密经济基础设施,我们将逐步拆解主流区块链的底层技术细节,并且尝试将碎片化的区块链知识整理成树状知识图谱分享给社区,也欢迎有兴趣的朋友一起加入。

Cosmos是一套成熟且高可用区块链开发框架,拥有模块化设计、基于Golang开发、支持跨链协议等特点,是目前比较主流的区块链开发框架。通过Cosmos SDK,开发者可以快速构建出属于自己的区块链,高效地进行一系列个性化开发。

本文为Cosmos文档翻译系列第二篇,点击查看《Cosmos SDK 介绍(上)》

 

 

区块链架构

 

状态机

区块链的核心是复制确定状态机(replicated deterministic state machine)。

状态机是计算机科学领域的一个概念,即一台机器可以具有多个状态,但在任意给定时刻只具有一个确定的状态。我们用state描述系统当前状态,transactions触发状态转换。

给定一个状态S和Transaction T,状态机会返回新的状态S'。

Cosmos SDK 介绍(下)_第1张图片

 

在实际中,Transaction集会被打包进区块中,以让处理过程更加高效。给定一个状态S和一个包含Transaction集 B的区块,状态机就会返回新的状态S'。

Cosmos SDK 介绍(下)_第2张图片

 

在区块链的上下文环境中,状态机是确定的。这意味着节点从给定状态开始,重放相同的Transaction序列,总能得到相同的最终状态。

Cosmos SDK为开发者提供了最大程度的灵活性去定义应用程序的状态,Transaction类型和状态转换功能。接下来的章节中会更详细地介绍使用SDK构建状态机的过程。在此之前,先让我们看看如何使用Tendermint复制状态机。

 

2 Tendermint

得益于Cosmos SDK,开发者只需要定义好状态机,Tendermint就会处理好状态复制的工作。

Cosmos SDK 介绍(下)_第3张图片

Tendermint 是一个与应用程序无关的引擎,负责处理区块链的网络层和共识层。这意味着Tendermint负责对Transaction字节进行传播和排序。Tendermint Core 通过同名的拜占庭容错算法来达成Transaction顺序的共识。

Tendermint共识算法与一组被称为Validator的特殊节点共同运作。Validator负责向区块链中添加包含Transaction的区块。在任何给定的区块中,都有一组Validator集合V。算法会从集合V中选出一个Validator作为下一个区块的Proposer。如果一个区块被集合V中超过三分之二的Validator签署了Prevote和Precommit,且区块中所有Transaction都是有效的,则认为该区块有效。Validator集合可以按照状态机中写定的规则更改。

 

ABCI

Tendermint通过被称为ABCI的接口向应用程序传递Transactions,该接口必须由应用程序实现。

Cosmos SDK 介绍(下)_第4张图片

需要注意的是,Tendermint仅处理Transaction字节,它并不知道这些字节的含义。Tendermint所做的只是对Transaction字节进行确定性地排序。Tendermint通过ABCI向应用程序传递字节,并期望返回状态码以获知包含在Transactions中的Messages是否成功处理。

以下是ABCI最重要的Messages:

CheckTx:当Tendermint Core接收到一个Transaction时,它会传递给应用程序以检查是否满足一些基本要求。CheckTx 用于保护全节点的内存池免受垃圾Transactions攻击。AnteHandler这一特殊处理程序用于执行一系列验证步骤,例如检查手续费是否足够以及验证签名。如果检查通过,该Transaction会被添加进内存池,并广播给其他共识节点。请注意,此时Transactions尚未被CheckTx处理(即未进行状态修改),因为它们还没有被包含在区块中。

DeliverTx:当Tendermint Core收到一个有效区块时,区块中的每一个Transaction都会通过DeliverTxt传递给应用程序以进行处理。状态转换会在这个阶段中发生。AnteHandler会与Transaction中每个Message的实际处理程序一起再次执行。

BeginBlock/EndBlock:无论区块中是否包含Transaction,Messages都会在每个区块的开头和结尾处执行。触发自动执行的逻辑是很有用的。但需要谨慎使用,因为计算量庞大的循环会严重降低区块链的性能,而无限循环甚至会导致区块链宕机。

获知更多关于ABCI的详细内容可以访问 Tendermint docs.

基于Tendermint构建的任何程序都需要实现ABCI接口,以便和底层的本地Tendermint引擎通信。幸运的是,您不需要实现ABCI接口,Cosmos SDK 以 baseapp 的形式提供了样板实现。

 

Cosmos SDK的主要组件

Cosmos SDK 是一个框架,可以促进基于Tendermint的安全状态机的开发。SDK的核心是一个基于Golang的ABCI样板实现。它带有一个用于存储数据的多存储区,和一个用于处理Transaction的路由器。

下面的简化视图展示了当通过DeliverTx从Tendermint 转移Transactions时,基于Cosmos SDK构建的应用程序如何处理这些Transactions。

  • 解码从Tendermint共识引擎中接收到的Transactions(Tendermint只能处理 []bytes 类型的数据)

  • 从Transactions中提取Messages并进行基本的健全性检查。

  • 将每个Message路由到对应的模块中,以进行相应处理。

  • 提交状态更改。

 

BaseAPP

Baseapp 是 Cosmos SDK 应用程序的样本实现,它拥有能够处理和底层共识引擎的连接的ABCI实现。通常,Cosmos SDK 应用程序通过嵌入app.go来实现拓展。查看示例请参考SDK应用教程:

Cosmos SDK 介绍(下)_第5张图片

 

baseapp 的目标是在存储和可拓展状态机之间提供安全的接口,同时尽可能少地定义状态机(对ABCI保持不变)。

更多关于baseapp的信息,请点击这里。

 

Multistore

Cosmos SDK 为状态持久化提供了Multistore。Multistore允许开发者声明任意数量的KVStores。这些KVStores只接受[]byte类型的值,因此任何自定义的结构都需要在存储之前使用codec进行编码。

Multistore抽象用于区分不同模块的状态,每个都由其自己的模块管理。更多关于multistore的信息请点击这里。

 

3 Modules

Cosmos SDK的强大之处在于其模块化开发的理念。SDK应用程序是通过组合一系列可互操作的模块而构建的。每个模块定义了状态子集,并包含其Messages与Transactions的处理器,同时SDK负责将每个Message路由到对应的模块中。

以下的简化视图展示了应用链中的每个全节点如何处理有效区块中的Transaction。

Cosmos SDK 介绍(下)_第6张图片

每个模块都可以看成是一个小的状态机。开发者需要定义由模块处理的状态子集,同时自定义改变状态的Message类型(注意:Messages是通过baseapp从Transactions中提取的)。通常,每个模块会在多存储区中声明自己的KV存储器,以存储自定义的状态子集。大部分开发者在构建自己的模块时,需要访问其它第三方模块。由于Cosmos SDK是一个开放的框架,其中的一些模块可能是恶意的,这意味着需要一套安全原则去考虑模块间的交互。这些原则都基于对象能力。事实上,这也意味着,并不是要让每个模块都保留其他模块的访问控制列表,而是每个模块都实现了被称为keepers的特殊对象,它们可以被传递给其他模块,以授予一组预定义的功能。

SDK模块被定义在SDK的 x/ 文件夹中,一些核心的模块包括:

  • x/auth:用于管理账户和签名

  • x/bank:用于启动 tokens 和 token 转账。

  • x/staking + s/slashing:用于构建POS区块链

除了x/文件夹中已经存在的任何人都可以使用的模块,SDK还允许您构建自己自定义的模块,您可以在教程中查看示例。

 

 

关于我们:

杭州数与科技于2017年在中国杭州成立,由来自EOSIO、COSMOS等开源社区的核心开发者组成。我们致力于在实践中探索主流区块链底层技术,建设开放的信任经济基础设施、消除信任建立成本。

 

Cosmos SDK 介绍(下)_第7张图片

你可能感兴趣的:(Cosmos SDK 介绍(下))