【深度知识】COSMOS架构及核心模块分析

1. 摘要

Cosmos项目有个宏伟的目标,就是在DPOS+BFT的共识引擎的基础上,能够实现区块链开发简便,互通互联。本文介绍以下内容:
(1)Cosmos架构
(2)Cosmos Hub
(3)Cosmos SDK
(4)IBC协议
(5)PegZone


先推荐一个下周(6.23)在上海举行的跨链技术交流活动。


图片发自简书App

2.Cosmos架构

Cosmos是Tendermint团队推出的一个支持跨链交互的异构网络,它最终的目标是创建一个区块链互联网,允许大量自主且易开发的区块链互相扩展和交互。基于Tendermint开发,采用的Tendermint共识算法,是一个类似实用拜占庭容错共识引擎,具有高性能、一致性、具备拜占庭容错等特点。Tendermint共识算法参考《【深度知识】Tendermint共识算法原理和框架流程》
Cosmos网络由许多独立的并行区块链组成,网络中第一个区块链是Cosmos Hub,其他的并行链称为Zone,通过跨链协议(IBC)与Hub进行跨链操作。

Cosmos官方网站:https://cosmos.network

图所示是Cosmos 网络的详细架构图,Cosmos为方便平行链开发提供了基本服务CosmosSDK包括:共识、网络以及IBC协议等,这样基于Cosmos SDK开发的子链之间都能够方便地互相交互。此外对于非Cosmos SDK 开发的区块链需要使用Peg Zone进行桥接,如图中的Ethereum。

3.Cosmos Hub

Cosmos上的第一个Hub叫做Cosmos Hub。Cosmos Hub是一种多资产权益证明加密货币网络,它通过简单的管理机制来实现网络的改动与更新。此外,Cosmos Hub还可以通过连接其他Zone来实现扩展。 Cosmos网络的Hub及各个Zone可以通过区块链间通信(IBC)协议进行沟通,这种协议就是针对区块链的虚拟用户数据报协议(UDP)或者传输控制协议(TCP)。代币可以安全快速地从一个Zone传递到另一个Zone,两者之间无需体现汇兑流动性。Zome内部所有代币的转移都会通过Cosmos Hub,它会记录每个Zone所持有的代币总量。这个中心会将每个Zone与其他故障Zone隔离开。因为每个人都将新Zone连接到Cosmos Hub,所以个Zone今后也可以兼容新的区块链技术。

4. Cosmos SDK

从Github上可以看出Cosmos主要的代码是cosmos-sdk,它包含Cosmos Hub的程序代码,同时也是一个区块链开发框架,为其他区块链开发者提供一些通用的功能模块,比如:共识,P2P网络,IBC,账户,治理,认证等。

不难看出cosmos-sdk其实就是一个ABCI应用。主要有:

  • baseapp:定义了一个基本ABCI应用的模版,与Tendermint通信。开发者也可以根据自己的需求重写。
  • 应用程序:包括gaia、basecoin、democoin。其中gaia就是hub主程序,basecoin以及democoin是提供的两个示例应用。
  • plugins:cosmos-sdk的基本单元,每个plugin都是baseapp的功能扩展,包含各自的消息和交易处理逻辑。目前SDK已经集成了一些重要的plugin:
    -staking:POS相关的实现,包括:绑定,解绑,通货膨胀,费用等操作。
    -ibc:跨链协议IBC的实现,也是Cosmos支持跨链的主要插件。
    -governance:治理相关的实现,如提议、投票等。
    -auth:定义了一个标准的多资产账户结构(BaseAccount),开发者可以直接嵌入自己的账户体系中。
    -bank:定义资产的转移。

4.1)源代码结构

整个SDK源代码目录如下图所示:

image

4.2)基本数据结构

a)Actor & Context

Actor以及Context定义在context.go代码中。

image

Actor定义了某个链上某个App的一个账户(地址)。

image

Context定义一些基本信息的函数集合:权限查询,Nonce/ChainID/BlockHeight查询等等。

b)Tx

Tx定义在txinner_wrapper.go文件中。Tx会贯穿整个SDK的处理,是整个SDK最重要的数据结构。

image

Tx是个数据结构,其中的TxInner是接口:Wrap以及ValidateBasic。也就是说一个Tx必须要实现TxInner接口。

c)Handler

Handler接口定义在handler.go文件中。

image

Handler定义module执行的接口:CheckTx(查看Tx),DeliverTx(区块中交易处理),InitState以及InitValidator(初始化状态和Validator),Name是执行模块的名称。有关module的具体解释,请看Stack和Module的介绍。

4.3)Stack

Stack的相关代码在stack目录中。Stack有关的数据类型如下图:

image

Stack有两部分组成:builder(middleware)以及Dispatcher。Dispatcher和middleware的区别是:middleware提供Next函数,可以访问下一个“middleware”,Dispatcher是一组Dispatchable构成。

Stack上的所有Middleware被wrap成一个sdk.Handler。

image

4.4)Client客户端

Client的逻辑在client的目录中。介绍一下Client端将sdk.Tx封装的逻辑(实现在client/txs/wrapper.go)。

image

Wrapps.Wrap函数将当前传入的sdk.Tx进行wrap,形成类似洋葱样的封装。

image

4.5)Server服务器端

与客户端相对应的是服务器端,服务器端主要是接收sdk.Tx,检查后调用Tendermint的RPC提交或者查询信息。逻辑实现在client/rest目录下。以txs.go为例,解释一下服务器的实现原理:

image

服务器端利用mux.Router机制,注册响应函数(如上图中的PostTx)。

4.6)ABCI App程序

ABCI App程序的逻辑实现在app以及server目录。App程序的逻辑相对简单,主要是实现ABCI的接口,调用Stack,具体的操作由Stack的一个个的middleware处理。

一个交易的大致处理流程如下图:

image

4.7)example示例

Cosmos SDK提供了示例代码,在examples目录下。感兴趣的小伙伴,可以查看basecoin的实现。

4.8)module实现

在Cosmos SDK中实现了一些通用module,在modules目录下:fee,coin,ibc, nonce, auth等等。fee module的逻辑相对简单,可以看出一个模块大致需要实现的逻辑:

image

实现一个module,要实现三个接口:commands/wrap.go(client端的封装),handler.go(Stack中的middleware的接口,也就是sdk.handler接口),以及tx.go(此模块的交易定义以及TxInner的实现)。

image

因此基于cosmos-sdk框架,利用其插件功能,可以非常快速的开发出属于自己应用的区块链,同时也可以很方便的加入Cosmos生态网络,支持不同链之间的互操作,在插件的设计上和EOS也有异曲同工之妙。

那么如何使用这些插件功能呢?可以参考cosmos-sdk提供的示例应用,以basecoin为例,只需要几步:

  1. 创建自己的ABCI应用,可以嵌入baseapp,也可以重载baseapp。
  2. 定义自己的账户体系,可以嵌入BaseAccount。
  3. 选择所需要的插件,注册到消息路由。

5. IBC协议

Cosmos的区块链间通信协议(IBC)将不同区块链连接起来,达到价值转移的目的。

IBC协议是针对Cosmos网络设计的,依赖其及时最终性的特点,用于Hub与Zone之间消息传递。IBC协议中设计了两个消息:

  • IBCBlockCommitTx:发送方所在区块链的最新的区块信息。
  • IBCPacketTx:跨链交易本身的信息,及其在发送方链中被打包的区块信息。

但有了消息的传递,接收链如何校验信任消息呢?

在IBC协议设计里,两个链建立连接之前需要进行彼此注册,有两个作用:

1、保存对方链验证者集合以及Merkle证明的算法,这样接收链才能确保消息的正确性和来源的可靠性。

2、为对方链创建两个可靠队列,一个队列存放所以对方链的消息(outgoing),一个队列存放来自对方链的消息(incoming)。

我们以chain1中用户User A转100mycoin 给test-hub用户User B为例看看IBC整个的工作流程如下(基于目前IBC实现代码):

整个工作流程可以分为三个阶段:

  1. User A向chain1提交跨链交易,chain1执行该交易,并将交易存入outgoing队列。
  2. relayer从chain1中对应test-hub的outgoing消息队列取出跨链交易,提交到test-hub。
  3. test-hub执行交易,放入incoming消息队列。

大家可以看到,整个流程比较简单,而且涉及的消息只有IBCPacket。目前Cosmos跨链实现并没有全部完成,只是完成了一个简单的交易处理流程。

6. PegZone

基于cosmos-sdk开发的区块链能够轻松满足实时最终性,然而现存的Bitcoin和Ethereum这类使用POW共识的区块链并不具备此特点,只能属于概率最终性,无法防止区块链的回滚。对于这类链,团队采用PegZone方案来解决。

PegZone本身其实是一条代理链,实时跟踪原始链的状态,通过设定一个安全阀值,等待原始链区块增长数达到安全阀值时就认为原始链的状态达到了伪实时最终性(回滚概率小),这点和轻客户端钱包验证是相同的原理,例如比特币安全阀值通常设置为6,以太坊安全阀值可以设置为20或者100。而PegZone本身具备实时最终性,就可以通过IBC与Hub相连,从而实现跨链。

接下来还是用例子来说明下,以Ethereum为例来看,有兴趣的朋友可参考Github上的cosmos/Peggy项目。示意图如下:

上图我们可以看出PegZone可以分为5个部分:

  1. Smart Contract:资产托管的角色,保管以太坊中的代币和Cosmos中的代币。主要提供了lock、unlock、mint、burn四个方法。
  2. Witness:是一个以太坊全节点,监听以太坊合约的event,并等待100个区块产生后,封装WitnessTx提交到PegZone中来证明在以太坊内状态更改。
  3. PegZone:PegZone是基于Tendermint的区块链,负责维护用户的账户信息,允许用户之间资产的转移,并提供交易查询。
  4. Signer:使用secp256k1对交易进行签名,以便签名能够高效的被智能合约验证,对应于智能合约的校验者公钥集合。
  5. **Relayer: **中继器负责交易转发。将所有Signer签名后的SignTx转发到smart contract中。

7. 参考

(1)深度解析Tendermint,快速融入Cosmos生态
https://zhuanlan.zhihu.com/p/38252058
(2)跨越当前链的边界,Cosmos技术深扒
https://zhuanlan.zhihu.com/p/42693285
(3)软硬核:彻底读懂 Cosmos 如何一键发链与万链互联
https://www.8btc.com/article/373565
(4)查看支持COSMOS跨链的项目
https://cosmos.network/ecosystem
(5)Cosmos项目以及SDK介绍
https://zhuanlan.zhihu.com/p/43898294
(6)Cosmos互联链通信技术规范(上)
https://juejin.im/post/5a98f6496fb9a028da7bf9d4
(7)Cosmos网络开发进展
https://cosmos.network/roadmap

Cosmos

其他

推荐阅读更多精彩内容