【区块链】Tendermint ——介绍及实战分析

本文转载至PPIO_Storage公众号。

【区块链】Tendermint ——介绍及实战分析

【区块链】Tendermint ——介绍及实战分析

我们将从理论解析和实战操作两个层面为大家介绍 Tendermint,可不要小瞧了这短短两行的目录,接下来的内容可是干货满满,精彩不断。

【区块链】Tendermint ——介绍及实战分析

提到区块链,大家想必已然不陌生了,不过更多人想到的可能会是众所周知的 Bitcoin 和 Ethereum。的确,两者分别是区块链技术的起源和发展的代表,也是大家广泛传播和深入研究的对象。但是随着 Bitcoin 的不断推进,比特币工作量证明共识机制在速度和扩展性上的不足也逐步展现出来。

Cosmos 的开发团队 Tendermint 其实早在2014年就意识到了其不足,并持续专注于寻求不依赖挖矿等高电力消耗的共识机制,提供快速的交易处理能力,它们的目标是为全世界所有的区块链提供速度、安全和可扩展性。目前,Tendermint 是跨链技术的核心。

【区块链】Tendermint ——介绍及实战分析

【区块链】Tendermint ——介绍及实战分析

Tendrmint 协议与比特币系统有很多相似之处,因为他们都是通过区块来记录信息,但在解决“拜占庭将军”的问题 (共识机制) 上又各采取了不同的解决方案。比特币的协议优化了去中心化的审核机制,而 Tendermint,则是在多节点的广域网(如拥有百万节点的高节点数)中优化了分布式应用及数据处理方面的拜占庭容错。上面两张图生动形象地介绍了 Tendermint 的软件开发层和应用部署网络结构。

【区块链】Tendermint ——介绍及实战分析

那相比于老牌的区块链技术,Tendermint 到底拥有哪些开发优势呢?

目前大部分的区块链实现都是采用一种“网络-共识算法-应用”的框架,实现成单一的程序,但是这就很容易出现两个问题:

  1. 代码复用困难,代码库的分支管理变得复杂。

  2. 限制了应用开发的语言。

针对这两个问题,Tendermint 设计了自己的一套框架,其设计原则是易使用,易理解,高性能,适用于各种分布式应用。它的创新之处在于,将区块链应用(状态)与底层共识进行了分离,将共识引擎和 P2P 网络层封装组成 Tendermint Core。同时提供 ABCI 接口与应用层进行交互,应用逻辑可以用任何语言编写,应用做的事情实际上就是状态机控制。不仅如此,Tendermint 还提供了许多实用的开发库,如密码库,默克尔树,iavl 状态树等。基于这种架构,应用的开发者可以方便地实现自己的区块链。

【区块链】Tendermint ——介绍及实战分析

接下来,我们将从共识算法,状态机复制及 ABCI 接口三个方面深入挖掘 Tendermint 的细节。

【区块链】Tendermint ——介绍及实战分析

下图为 Tendermint 出块节点选择机制及其优缺点。

【区块链】Tendermint ——介绍及实战分析

参与 Tendermint 共识过程的角色主要有两个:

· Validator(验证者):网络中的节点,可参与共识过程中的投票,不同的验证者在投票过程可能具备不同的投票权重(vote power)。

· Proposer(提议人):Tendermint 使用一种确定的非阻塞轮询选择算法从 Validators 中选出 Proposer,该算法根据 Validators 的投票权重所占比例来选择Proposer,投票权重越大的 Validator 被选为 Proposer 的频率越高。

Tendermint 区块链是通过基于 round(回合)的机制来确定下一个区块。每个 round 由三个过程组成:propose(提议),prevote(预投票)和 precommit(预提交)。

【区块链】Tendermint ——介绍及实战分析

这样的机制优点在于 Proposer 的选择方式是与 Stake 相关的,所以应用层可以实现自己的共识(DPOS),将应用层 Validator 的权重传递给 Tendermint,Tendermint 就会按照应用层需要的方式选择 Proposer。当然,没有一样技术是完美的,Tendermint 也有其出块机制上的缺点,那就是 Round-robin 策略过于简单,容易被坏人预测到下一个 Validator 是谁,于是可以提前布局,对 Validator 发起 DDoS 攻击或别的攻击。Tendermint 对此给出的解决方法是,把 Validator 节点,全部放在 Sentry Node 后面,对外不暴露 IP 地址。

【区块链】Tendermint ——介绍及实战分析

Tendermint 是一个易于理解的 BFT 共识协议。此协议遵循一个简单的状态机:验证者轮流对交易的区块提议并对提议的区块进行投票。区块被提交到链上,且每个区块就是一个区块高度。但区块也有可能提交失败,这种情况下协议将选择下一个验证者在相同高度上提议一个新的区块块,并重新开始投票。

如上图所示,想要成功提交一个区块,必须经过两阶段的投票,称为预投票(pre-vote)和预提交(pre-commit)。当超过 2/3 的验证者在同一轮提议中对同一个区块进行了 pre-commit 投票,那么这个区块才会被提交。

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

假设少于 1/3 的验证人是拜占庭节点,Tendermint 能够保证验证人永远不会在同一高度重复提交区块而造成冲突。为了做到这一点,Tendermint 引入了锁定机制,一旦验证者对一个区块进行了预投票,那么该验证者就会被锁定在这个区块。然后出现以下两种情况:

  1. 该验证人必须在预提交的区块进行预投票。

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

【区块链】Tendermint ——介绍及实战分析

这么做的优点在于 Tendermint 共识机制拥有无法比拟的共识最终确定性:一旦共识达成就是真实的, 而不像比特币或以太坊的共识是一种概率性质的确定性,并且有可能在将来某个时刻失效。因此在 Tendermint 中不会出现区块链分叉的情况。其缺点是 Tendermint 共识是拜占庭容错的,最多容忍不超过1/3的恶意节点,而比特币最多可以容忍50%的恶意节点。

【区块链】Tendermint ——介绍及实战分析

上图展示了 Tendermint 的状态机复制过程,其安全性在于 BFT 算法保证了在同一高度只有一个确定的区块。

【区块链】Tendermint ——介绍及实战分析

【区块链】Tendermint ——介绍及实战分析

【区块链】Tendermint ——介绍及实战分析

【区块链】Tendermint ——介绍及实战分析

Tendermint Core 通过一个满足 ABCI 标准的 socket 协议与应用程序进行交互。

ABCI 包含3 种消息类型:DeliverTx 消息,CheckTx 消息和 Commit 消息。Tendermint Core 将消息发送给应用,应用根据消息进行相应的回复。

DeliverTx 消息是应用的主要工作流程。链上的每笔交易都通过这个消息进行传送。应用基于当前状态、应用协议和交易的加密证书,验证接收到 DeliverTx 消息的每笔交易。然后,验证后的交易会更新应用状态。

CheckTx 消息类似于 DeliverTx,但它仅用于验证交易。Tendermint Core 的内存池首先使用 CheckTx 检验交易的有效性,并且只将有效交易广播给其他节点。

Commit 消息用于通知应用程序计算当前应用状态的加密保证,该加密保证会被放入下一个区块头部。

一个应用可能与多个 ABCI socket 连接。Tendermint Core 给应用程序创建了三个 ABCI 连接:一个用于内存池广播时的交易验证,一个用于区块提议时的共识引擎,还有一个用于查询应用状态。

【区块链】Tendermint ——介绍及实战分析

下面将进入我们的实战操作环节,屏幕前的你赶紧打开电脑跟着接下来 PPT 中的指示使用 Tendermint 开发一个属于自己的公链吧!

【区块链】Tendermint ——介绍及实战分析

【区块链】Tendermint ——介绍及实战分析

【区块链】Tendermint ——介绍及实战分析

【区块链】Tendermint ——介绍及实战分析

【区块链】Tendermint ——介绍及实战分析

【区块链】Tendermint ——介绍及实战分析

【区块链】Tendermint ——介绍及实战分析

【区块链】Tendermint ——介绍及实战分析

看到这里

【区块链】Tendermint ——介绍及实战分析【区块链】Tendermint ——介绍及实战分析 夏洛的克 发布了13 篇原创文章 · 获赞 6 · 访问量 788 私信 关注
上一篇:tendermint state分析


下一篇:Is TCP PACING enabled by default on linux?