简介
Tendermint 是分布式一致性软件。即使有 1/3 的机器叛变了, 也能保证其余机器上的数据一致。容忍机器以任意方式失败的能力, 包括变得恶意, 被称为拜占庭容错 (BFT)。该理论被提出来数十年了,由于 bitcoin 和 ethereum” 区块链技术” 的成功,才变得流行起来。区块链用点对点和加密认证技术组成了一个现代化 BFT 实例。Tendermint 包含了两个主要的组件:区块链共识引擎和通用应用层接口。共识引擎叫 Tendermint Core,确保每一台机器上的交易列表相同。应用层接口名字是 ABCI,提供能为任何语言处理交易的接口。与其他区块链的解决方案(内置的状态机预先打包块)不同,如 ethereum 的基于世界状态树的键值对存储、bitcoin 的脚本语言处理。开发人员可以在任何开发环境下用任何语言通过实现 ABCI 应用层来复制 Tendermint 状态机。
共识算法
Tendermint 是一个易于理解的,大部分模块采用异步通信的,拜占庭容错共识协议。该协议可用一个简单的状态机表示,如下图:
image
协议参加者称为验证节点;他们轮流打包出块并集体对该块打包。在每一个高度上只允许一个块 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。
通用的应用框架如下图:
image优点
-
应用层和区块链层相分离。
-
支持更丰富,更灵活的客户端 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 链接:查询应用状态。
imagemempool 和 Consensus Logic 作为客户端,和应用(ABCI 服务器端)间维护一个 open ABCI,上图展示了链接请求和响应类型
网友评论