当前位置:   article > 正文

区块链 --- Cosmos和Tendermint

tendermint


 

1、跨链技术背景

   市面上大部分链上应用(加密货币或者智能合约)都无法跨越当前链的边界,不能与其他链协同合作实现价值的流通从而限制了区块链的发挥空间。跨链技术是打开链与链之间互通的钥匙,能很好地解决价值孤岛的问题,建立价值网络的桥梁。

 

2、主流跨链技术

  1. 公证人机制(Notary schemes)

  2. 侧链/中继(Side chains/relays)

  3. 哈希锁定(Hash-locking)

  4. 分布式私钥控制(Distributed private key control)

而Cosmos是中继技术中的一个典型案例。

 

3、Cosmos是什么

  Cosmos是Tendermint团队推出的一个支持跨链交互的异构网络,它最终的目标是创建一个区块链互联网,允许大量自主且易开发的区块链互相扩展和交互。基于Tendermint开发,采用的Tendermint共识算法,是一个类似实用拜占庭容错共识引擎,具有高性能、一致性、具备拜占庭容错等特点。

 

4、Tenermint 是什么

  1. Tendermint是一个能够在不同机器上,安全一致复制应用的软件,其中安全性和一致性也是分布式账本的关键概念。
  2. Tendermint具备拜占庭容错能力,是一种拜占庭容错共识算法。
  3. Tendermint主要有两部分组成:
  • Tendermint Core:区块链共识引擎,负责节点之间数据传输以及拜占庭共识。
  • ABCI:区块链应用程序接口,也是一个协议,支持任何语言的交易处理实现。

 

5、Tenermint的设计原则

5.1 普通的区块链架构

img

  • 网络层(Networking):负责交易和数据传输和同步。
  • 共识算法(Consensus):负责不同的验证节点处理完交易后,保证状态的一致,也就是将交易打包到区块中。
  • 应用程序(Application):交易的真正执行者。

这种架构的问题

  1. 代码复用困难,代码库的分支管理变得复杂。
  2. 限制了应用开发的语言。

 

5.2 Tenermint架构

为了规避这些问题,Tenermint自己设计了一套框架,将区块链应用(状态)与底层共识进行了分离,将共识引擎和P2P网络层封装组成Tendermint Core。同时提供ABCI接口与应用层进行交互,应用逻辑可以用任何语言编写,应用做的事情实际上就是状态机控制。基于这种架构,应用的开发者可以方便地实现自己的区块链。

img

  如上图,Tendermint的框架总体来讲分为ABCI Application以及Tendermint Core两部分,两者通过ABCI连接。

 

5.3 Tendermint核心模块
5.3.1 ABCI Application

开发者定制开发的区块链应用,开发语言不受限制,可以使用任何语言进行开发,但是必须实现为一个ABCI Server,即需要满足以下几点:

  1. 是一个Socket Server,需支持TSP或GRPC两种方式之一。
  2. 能够处理ABCI Message。所有的ABCI消息类型都是通过protobuf来定义的。
  3. 实现区块链应用接口(ABCI)。ABCI是Tendermint中定义的一套Application与Tendermint Core之间交互的协议。

 

5.3.2 ABCI接口分类

ABCI接口可以分为三类:信息查询、交易校验以及共识相关处理。而Tendermint Core作为ABCI Client在启动时,会与ABCI Server建立三个连接,分别用于这三类接口消息的处理。

  • DeliverTx 消息是应用的主要部分。链中的每笔交易都通过这个消息进行传送。应用需要基于当前状态,应用协议,和交易的加密证书上,去验证接收到 DeliverTx 消息的每笔交易,。一个经过验证的交易然后需要去更新应用状态 – 比如通过将绑定一个值到键值存储,或者通过更新 UTXO 数据库。
  • CheckTx 消息类似于 DeliverTx,但是它仅用于验证交易。Tendermint Core 的内存池首先通过 CheckTx 检验一笔交易的有效性,并且只将有效交易中继到其他节点。比如,一个应用可能会检查在交易中不断增长的序列号,如果序列号过时,CheckTx 就会返回一个错误。又或者,他们可能使用一个基于容量的系统,该系统需要对每笔交易重新更新容量。
  • Commit 消息用于计算当前应用状态的一个加密保证(cryptographic commitment),这个加密保证会被放到下一个区块头。这有一些比较方便的属性。现在,更新状态时的不一致性会被认为是区块链的分支,分支会捕获所有的编程错误。这同样也简化了保障轻节点客户端安全的开发,因为 Merkel-hash 证明可以通过在区块哈希上的检查得到验证,区块链哈希由一个 quorum 签署。

 

5.3.3 Tendermint Core

Tendermint共识引擎,包含区块链需要大部分功能实现,主要有:

  • 共识算法:拜占庭POS算法。
  • P2P:采用gossip算法,默认端口是46656。
  • RPC:区块链对外接口,默认端口是46657。支持三种访问方式:URI over HTTP、JSONRPC over HTTP、JSONRPC over websockets。
  • 其它:交易缓存池、消息队列等。

 

5.3.3.1 共识算法

Tendermint是一个易于理解的BFT共识协议。协议遵循一个简单的状态机,如下:

img

协议中有两个角色:

  • 验证人:协议中的角色或者节点,不同的验证者在投票过程中具备不同的权力(vote power)。
  • 提议人:由验证人轮流产生。

  验证人轮流对交易的区块提议并对提议的区块投票。区块被提交到链上,且每个区块就是一个区块高度。但区块也有可能提交失败,这种情况下协议将选择下一个验证人在相同高度上提议一个新块,重新开始投票。

  从图中可以看到,成功提交一个区块,必须经过两阶段的投票,称为pre-vote和pre-commit。当超过 2/3 的验证人在同一轮提议中对同一个块进行了pre-commit投票,那么这个区块才会被提交。

  由于离线或者网络延迟等原因,可能造成提议人提议区块失败。这种情况在Tendermint中也是允许的,因为验证人会在进入下一轮提议之前等待一定时间,用于接收提议人提议的区块。

  假设少于三分之一的验证人是拜占庭节点,Tendermint能够保证验证人永远不会在同一高度重复提交区块而造成冲突。为了做到这一点,Tendermint 引入了锁定机制,一旦验证人预投票了一个区块,那么该验证人就会被锁定在这个区块。然后:

  1. 该验证人必须在预提交的区块进行预投票。
  2. 当前一轮预提议和预投票没成功提交区块时,该验证人就会被解锁,然后进行对新块的下一轮预提交。

  可以看到,Tendermint共识算法和PBFT时非常相似的,可以说是PBFT的变种,那我们来比较一下:

相同点:

  1. 同属BFT体系。
  2. 抗1/3拜占庭节点攻击。
  3. 三阶段提交,第一阶段广播交易(区块),后两阶段广播签名(确认)。
  4. 两者都需要达到法定人数才能提交块。

不同点:

  1. Tendermint与PBFT的区别主要是在超过1/3节点为拜占庭节点的情况下。当拜占庭节点数量在验证者数量的1/3和2/3之间时,PBFT算法无法提供保证,使得攻击者可以将任意结果返回给客户端。而Tendermint共识模型认为必须超过2/3数量的precommit确认才能提交块。举个例子,如果1/2的验证者是拜占庭节点,Tendermint中这些拜占庭节点能够阻止区块的提交,但他们自己也无法提交恶意块。而在PBFT中拜占庭节点却是可以提交块给客户端。
  2. 另一个不同点在于拜占庭节点概念不同,PBFT指的是节点数,而Tendermint代表的是节点的权益数,也就是投票权力。
  3. 最后一点,PBFT需要预设一组固定的验证人,而Tendermint是通过要求超过2/3法定人数的验证人员批准会员变更,从而支持验证人的动态变化。

 

5.3.3.2 P2P网络

   Tendermint的P2P网络协议借鉴了比特币的对等发现协议,更准确地说,Tendermint是采用了BTCD的P2P地址簿(Address Book)机制。当连接建立后,新节点将自身的Address信息(包含IP、Port、ID等)发送给相邻节点,相邻节点接收到信息后加入到自己的地址薄,再将此条Address信息,转播给它的相邻节点。

   此外为了保证节点之间数据传输的安全性,Tendermint采用了基于Station-to-Station协议的认证加密方案,此协议是一种密钥协商方案,基于经典的DH算法,并提供相互密钥和实体认证。

6、Cosmos架构

   Cosmos网络由许多独立的并行区块链组成,网络中第一个区块链是Cosmos Hub,其他的并行链称为Zone,通过跨链协议(IBC)与Hub进行跨链操作。

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

img

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

  1. baseapp:定义了一个基本ABCI应用的模版,与Tendermint通信。开发者也可以根据自己的需求重写。
  2. 应用程序:包括gaia、basecoin、democoin。其中gaia就是hub主程序,basecoin以及democoin是提供的两个示例应用。
  3. plugins:cosmos-sdk的基本单元,每个plugin都是baseapp的功能扩展,包含各自的消息和交易处理逻辑。目前SDK已经集成了一些重要的plugin:
  • staking:POS相关的实现,包括:绑定,解绑,通货膨胀,费用等操作。

  • ibc:跨链协议IBC的实现,也是Cosmos支持跨链的主要插件。

  • governance:治理相关的实现,如提议、投票等。

  • auth:定义了一个标准的多资产账户结构(BaseAccount),开发者可以直接嵌入自己的账户体系中。

  • bank:定义资产的转移。

    基于cosmos-sdk框架,利用其插件功能,可以非常快速的开发出属于自己应用的区块链,同时也可以很方便的加入Cosmos生态网络,支持不同链之间的互操作

 

7、区块链间通信协议(IBC)

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

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

  • IBCBlockCommitTx:发送方所在区块链的最新的区块信息。

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

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

  1. 保存对方链验证者集合以及Merkle证明的算法,这样接收链才能确保消息的正确性和来源的可靠性。
  2. 为对方链创建两个可靠队列,一个队列存放发往对方链的消息(outgoing),一个队列存放来自对方链的消息(incoming)。

以chain1中用户User A转100mycoin 给test-hub用户User B为例,工作流程:

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

参考链接:
https://blog.miuyun.work/archives/12822920
https://zhuanlan.zhihu.com/p/42693285
https://zhuanlan.zhihu.com/p/38252058

 
如有不对,烦请指出,感谢~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/687197
推荐阅读
  

闽ICP备14008679号