简介
Tendermint 是分布式一致性软件。即使有1/3的机器叛变了, 也能保证其余机器上的数据一致。容忍机器以任意方式失败的能力, 包括变得恶意, 被称为拜占庭容错(BFT)。该理论被提出来数十年了,由于bitcoin和ethereum”区块链技术”的成功,才变得流行起来。区块链用点对点和加密认证技术组成了一个现代化BFT实例。Tendermint包含了两个主要的组件:区块链共识引擎和通用应用层接口。共识引擎叫Tendermint Core,确保每一台机器上的交易列表相同。应用层接口名字是ABCI,提供能为任何语言处理交易的接口。与其他区块链的解决方案(内置的状态机预先打包块)不同,如ethereum的基于世界状态树的键值对存储、bitcoin的脚本语言处理。开发人员可以在任何开发环境下用任何语言通过实现ABCI应用层来复制Tendermint状态机。
共识算法
Tendermint 是一个易于理解的,大部分模块采用异步通信的,拜占庭容错共识协议。该协议可用一个简单的状态机表示,如下图:
协议参加者称为验证节点;他们轮流打包出块并集体对该块打包。在每一个高度上只允许一个块commit。在一个块无法在该轮被提交的情况下,协议会移动到下一轮,并且新的验证节点会propose一个该高度的块。需要两轮投票才能commit一个块;这两轮投票我们称为“pre-vote“ 和 “pre-commit“。在每一轮投票中需要超过2/3的验证节点对同一个块pre-commit才能最后的块commit。
验证者在每一轮中commit块时会失败,原因如:当前提议者可能离线,或者网络可能很慢。Tendermint允许跳过验证者,验证者等待一小段时间从proposer收到完整的proposer块,然后进入下一轮投票。这种对超时的依赖使得Tendermint成为弱同步协议,而不是异步协议。然而,协议的其余部分是异步的,验证者只有收到超过2/3的投票后才能取得进展。precommit和propose两轮投票机制是一样的。
假设有不到三分之一的验证节点是拜占庭节点,Tendermint保证不会违反安全性。也就是说,验证节点永远不会在相同的高度提交冲突的块,不会分叉。为此,它引入了一些“锁定“规则。一旦验证器预先插入一个块,它将被锁定在该块上,然后,
- 1.prevote的块必须是被锁定的。
- 2.precommit一个新块后,验证者才能解锁。
股权
并非所有系统中的验证者有相同的权重。因此,我们对1/3或2/3的验证者并不感兴趣,但在总投票权的比例中,这些比例可能不会在单个验证者中统一分配。由于Tendermint可以实现任意应用程序,因此可以定义货币,并以该货币计价投票权。当投票权以本币计价时,系统通常被称为PoS。验证者可以通过应用程序中的逻辑强制将其货币持有量“绑定”在可能被破坏的PoS中,如果它们在协商一致的协议中被发现存在不正当行为。这为协议的安全性增加了经济因素,允许人们量化违反不到三分之一的投票权是拜占庭的假设成本。基于Tendermint的应用架构
区块链应用不仅仅包括共识引擎和交易逻辑(如,智能合约,商业逻辑)。同时也包括(手机端, web端,桌面端)链接上的应用。在这些链接中安全很重要,DoSed攻击是通过攻破的1/3的验证节点去攻击其他2/3的验证节点。一种常见的攻击就是ABCI应用和tendermint core之间的通信。所以ABCI应用和tendemint core之间的通信安全性很重要。通信安全由强到弱 unix socket > local tcp socket > vpn > 外网tcp socket。
通用的应用框架如下图:
优点 - 应用层和区块链层相分离。
- 支持更丰富,更灵活的客户端API。
- 支持pub-sub模式,观察关键字段等。
注意点 - 直接调用ABCI接口非常危险(写数据接口调用时需要非常小心,除非来自验证节点的消息)
- 不能直接访问区块链的头和验证交易。
- 自己必须实现自己的API。
应用层开发
ABCI的目的在一台交易处理状态机和多台提供复制机制的计算机之间提供清晰的接口。前者称之为“应用逻辑“, 后者称之为“共识引擎“。应用程序逻辑验证事务,并可选地针对某些持久状态执行事务。共识引擎可确保在每台机器上以相同的顺序复制所有事务。我们将共识引擎中的每个机器称为“验证器”,并且每个验证器通过相同的应用程序逻辑运行相同的事务。特别是对区块链的共识引擎,其中交易在链式哈希块中提交。
ABCI的设计有几个不同的模块: - 消息协议
- 1.一对请求和响应消息。
- 2.共识提出请求,应用响应。
- 3.使用protobuf的定义。
- server/client
- 1.共识引擎作为client端运行。
- 2.应用程序作为server端运行。
- 3.两个实现:
- a.异步raw字节。
- b.grpc。
- 区块链协议
- 1.abci是面上链接的。
- 2.Terdermint Core 维护了三个链接:
- a.mempool链接:CheckTx
- b.consensus链接:交易列表执行后打包提交,消息队列对于每个块:BeginBlock, [DeliverTx, …], EndBlock, Commit。
- c.query链接:查询应用状态。
mempool和Consensus Logic作为客户端,和应用(ABCI 服务器端)间维护一个open ABCI,上图展示了链接请求和响应类型 。