HOME
走进Cosmos之Cosmos SDK

《走进Cosmos之入门》中我们已经知道了Cosmos的设计初衷是为了进行跨链的资产转移,也可以看到Cosmos的跨链场景中Zone是参与到Cosmos网络中的应用链,而Zone允许不同类型的区块链加入进来。

在Cosmos的设计中,能够接入进来的Zone是需要满足Cosmos SDK条件的,所以Cosmos SDK可以说是Cosmos生态体系中的重要部分。

什么是Cosmos SDK

Cosmos SDK可以说是一个架构,是为了让开发者能够很容易的创建自定义的区块链。通过Cosmos SDK开源的模块,大家可以根据自己区块链所想要有的功能,选取需要的模块构建出自己需要的区块链。

同时,除了Cosmos已经开源出来的模块,任何一个人都可以根据自己所想要的需求为Cosmos SDK创建一个模块。这样就解决了对于想要使用Cosmos区块链框架但是又有自己定制化开发想法的问题。

那么为什么Cosmos需要设计Cosmos SDK来构建特定区块链生态呢?

事实上,今天区块链的大趋势是像以太坊这样的带有智能合约虚拟机的区块链发展的,通常来说对于某个特定功能,开发者首先想到的是通过区块链上的智能合约来构建这个功能。

在实际场景中,智能合约确实为单用途应用程序带来了便利开发的灵活性,可一旦所要求的功能逻辑变得复杂,智能合约就有了很大的局限性,这也是Cosmos SDK推出的初衷。

Cosmos SDK所提供的特定区块链架构是和智能合约区块链的架构完全不同的开发设计模式。通过特定区块链架构,开发人员可以使用一条特定区块链来服务一项特定的功能,从而避免了一条区块链上业务功能的复杂化,同时也提供给开发人员更好的定制化接口,在性能和管理上提供了很好的保障。

Cosmos SDK的特点

Cosmos SDK作为现阶段比较成熟的特定应用链框架,拥有以下一些特点:

1.   SDK中的默认的共识是Tendermint Core。Tendermint是现在市面上比较成熟的BFT共识,该共识算法也被业界很多区块链所采用。

2.   Cosmos SDK属于开源项目,这也就意味着SDK的生态会随着社区的发展更加的完善和成熟。

3.   Cosmos SDK基于OCAP系统,通过OCAP,可以防止蓬勃发展的Cosmos SDK开源社区中产生包含错误或者恶意的模块对其余模块的攻击。

4.   Cosmos SDK已经有了自己的小范围生态系统,包括Cosmos Hub,Iris,Binance Chain,Terra等,产品的不断加入为生态后续的发展提供了基础。

Cosmos SDK应用程序架构

众所周知,区块链应用的核心是具有最终确定性的复制状态机。而Cosmos SDK所提供的灵活性的模块化设计,能够让开发者自由的定义应用程序的状态,交易类型以及状态变化函数。

在Cosmos SDK中,开发者只需要定义好状态机,那么默认的Tendermint模块就会帮助开发者完成状态机在网络层面的工作。

在共识算法中,Tendermint算法由一组称为验证人节点的节点集合来进行共识,验证人负责向区块链添加交易区块,当共识通过以后,则认为该区块是有效的。验证人节点集合是可以通过状态机中开发者所编写的规则来更改的。对于Tendermint共识的具体解读,将会在之后的文章中深入展开。

所以Cosmos SDK应用程序的主要部分是一个区块链的服务程序,网络中的每个节点都会运行该服务,当共识通过,那么每个节点在查询状态得到的结果都是相同的。

上面我们知道了Cosmos SDK区块链状态机的一致性是由Tendermint共识算法来保证的,那么在Cosmos SDK中共识层和应用层又是如何通信的呢?Cosmos SDK使用了一个名为ABCI的接口将交易从网络层传递给了应用层,而该接口也是应用层开发者所必须要实现的。

事实上,在共识层面,Tendermint对交易的处理仅仅只是字节层面,它并不会对交易的具体内容进行解析,而只是做确定性排序,具体对交易内容的处理则是应用程序所需要做的工作。共识层通过ABCI将交易的字节传给应用程序,并通过接口的返回码来获取消息的成功与否。

Cosmos SDK交易流程设计

从第三部分我们可以看出,Cosmos SDK是一个方便开发者开发基于Tendermint的安全可靠状态机的一套框架,并且从第三部分我们也可以看出基于Tendermint的核心就是ABCI接口的实现。同时,为了存储数据以及处理交易,Cosmos SDK还附带了multistore以及router来实现设计。

下面简单介绍一下Cosmos SDK构建的应用程序是如何处理交易的:

   1.   首先应用层会解码从Tendermint共识引擎接受到的交易;

   2.   从1中得到的交易中提取消息并进行基本的合理性检查;

   3.   将每条消息通过router模块路由到相对应的模块进行处理;

   4.   由对应的模块处理完以后提交状态变更。

这就是Cosmos SDK应用层处理交易的整个流程。为了简单的展现该流程的运作,Cosmos SDK用baseapp来实现了一个简单的ABCI的模板。bassapp的目的是在存储和可扩展状态机的之间提供安全接口,同时尽可能少的定义该状态机。这样的话开发者就可以基于baseapp来完成自己所需要的定制化开发。

对于区块链上的存储,Cosmos SDK提供了multistore作为状态持久化的模块。multistore使开发者能够声明任意数量的KVStore。而其中这些KVStore只接受字节数组作为value值输入,因此Cosmos还提供了go-amino来对各种类型进行编码。

在Cosmos的设计中模块化是Cosmos一直强调的概念。区块链应用通过把一组可以互操作的模块组合起来进行构建,从而组成自己想要的特定区块链应用。由于这种模块化的设计,每个模块都可以定义自己的状态子集,并且每个模块都可以包含自己的对消息或者交易处理的引擎,同时SDK会将每个消息根据类型路由到其各自归属的模块。

从上图可以看出,每个模块都可以看作一个小型的状态机,开发者可以自定义该状态机的子集,以及修改状态的message 的自定义类型。通常来说,每个模块在multistore声明它自己的KVStore来持久化保存它定义的状态子集。这就是每个应用链的全节点是如何处理接收的有效块中交易的。

SDK模块在SDK的x/目录下定义。一些核心模块包括:

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

2. x/bank: 用于实现token和token转账.

3. x/staking + x/slashing: 用于构建POS区块链.

除了x/中已有的模块,任何人都可以在他们的应用程序中使用自己定义的模块。

总结

从上面的介绍我们可以看出,Cosmos SDK提供了一个可以快速搭建特定区块链的框架,通过这个框架,开发者能够快速便捷的开发自己想要的有特定功能的区块链。

我们也可以看出Cosmos通过Cosmos SDK能够更好的扩充自己的跨链生态,能让更多的通过Cosmos SDK开发的区块链加入到Cosmos Hub的生态中来。

作者简介

夏立伟

来自数据网格实验室BitXHub团队

主要负责区块链账本互操作技术相关研究工作