浅析Tendermint
Tendermint是一项可用在许多机器上,并能安全一致复制应用程序的软件。在安全性上,即使多达1/3的机器发生任何故障,Tendermint仍然有效。在一致性上,每个无故障的机器都能看到相同的交易记录。安全一致的复制是分布式系统中的基本问题;它在货币、选举、基础设施建设的许多应用的容错性方面发挥着关键作用。
容忍机器以任意方式失效(包括变为恶意)的能力被称为拜占庭容错(BFT)。BFT理论已有几十年历史,但软件实现在最近才开始流行,这主要归功于比特币和以太坊等区块链技术的成功。区块链技术只是在更现代化的环境中对BFT进行重组,重点是点对点网络和加密认证。该名称来源于交易在区块中以批的形式进行处理,其中每个块包含着前一个块的加密哈希,从而形成链。实际上,区块链数据结构优化了BFT设计。
Tendermint包含两项主要技术组件:区块链共识引擎和通用应用程序接口。共识引擎,被称为TendermintCore,确保以相同的顺序在每台机器上记录相同的交易。应用程序接口,被称作ApplicationBlockChainInterface(ABCI),可以使用任何编程语言处理交易。不同于区块链和其它共识方案,它们预先打包了内置状态机(如花哨的键值存储或奇怪的脚本语言),开发人员可以使用Tendermint进行BFT复制任何编程语言编写的应用程序。
Tendermint使用简单,便于理解,性能性高,适用于各种分布式应用程序。
Tendermint大致类似于两类软件。第一类包括分布式键值存储,如Zookeeper,etcd和consul,它们使用非BFT共识。第二类被称为“区块链技术”,包括比特币、以太坊等加密货币和可替代的分布式账本,比如Hyperledger’sBurrow。
Zookeeper,etcd,consul
Zookeeper、etcd和consul都是键值存储在经典的非bft共识算法之上的实现。Zookeeper使用一种名为ZookeeperAtomicBroadcast的Paxos版本,而etcd和consul使用Raft共识算法,这种算法更新颖,更简单。一个典型的集群包含3-5台机器,并且可以容忍多达1/2台机器的崩溃故障,但一个拜占庭故障就可能破坏系统。
每个都提供了一个功能性键值存储的实现,虽然略有不同,但都集中在为分布式系统提供基本服务,例如动态配置,服务发现,锁定,领导者选举等。
Tendermint本质上是类似的软件,但有两个主要区别:
第一是拜占庭容错,意味着它只能容忍高达1/3的故障,但任意行为,黑客攻击和恶意攻击都包含在内。它没有指定特定的应用程序,如花哨的键值存储。相反,它专注于任意状态机复制,因此开发人员可以构建适合他们的应用程序逻辑,从键值存储、加密货币到电子投票平台等。
比特币,以太坊等
Tendermint出现在比特币,以太坊等加密货币中,其目标是提供比比特币的工作量证明更有效和更安全的共识算法。在早期,Tendermint内置了一种简单的货币,并且为了达成共识,用户必须将货币单位“绑定”到保证金中,如果他们作恶就可以撤销,让Tendermint成为权益证明算法。
从那时起,Tendermint已经发展成为可以管理任意应用程序状态的通用区块链共识引擎。这意味着它可以用作其他区块链软件共识引擎的即插即用替代品。因此,在使用当前的以太坊代码库,无论是在Rust,Go还是Haskell中,能使用Tendermint共识将其作为ABCI应用程序运行。实际上,我们是用以太坊做的。我们计划对比特币,ZCash和其他各种确定性应用程序也这样做。
搭建在Tendermint上的加密货币应用程序的另一个例子是Cosmos网络。
Fabric采用与Tendermint类似的方法,但更关注是如何管理,并且要求所有应用程序在很多docker容器潜在运行,称之为“chaincode”模块。
Burrow是以太坊虚拟机和以太坊交易机制的实现,具有名称注册,权限许可,本地合同,选择性区块链API的功能。它使用Tendermint作为其共识引擎,并提供特定的应用程序状态。
区块链应用接口(ApplicationBlockChainInterface,ABCI)允许应用的拜占庭容错复制,任意编程语言都可编写。
产生动机
到目前为止,所有区块链“堆栈”(如比特币)都采用了单片设计。也就是说,每个区块链堆栈都是一个处理分布账本的各类问题的程序,包括P2P连接,交易的“mempool”广播,最近块的共识,账户余额,图灵完成合同,用户级权限等。
在计算机科学中,使用单片架构是典型的错误操作,会使重用代码组件变得困难。如果真的这么去做,会导致代码库分支的维护变得十分复杂。特别是在代码设计并非模块化时,会产生难以维护的“意大利面条式代码”。
单片设计的另一个问题是它限制了区块链堆栈的语言(反之亦然)。在以太坊中,它支持图灵完备的字节码虚拟机,它限制你必须使用可以编译为该类型字节码的语言。目前,它所支持的语言是Serpent和Solidity。
相比之下,我们的方法是从特定区块链应用的应用状态细节中,将共识引擎和P2P层分离。我们通过将应用程序的细节抽象为接口来实现,这种实现叫做socket协议。
所以,我们就有了一个接口,应用区块链接口(ABCI)和它的主要实现,即TendermintSocketProtocol(TSP,或Teaspoon)。
TendermintCore(“共识引擎”)通过满足ABCI的socket协议与应用进行交流。
拿大家熟知的比特币举例。比特币是一种加密货币区块链,其中每个节点都维护一个完全经过审计的未使用交易输出(UTXO)数据库。如果想在ABCI上创建一个类似比特币的系统,TendermintCore将会负责以下内容:
在节点间共享区块和交易
建立交易(区块链)的标准/不变的顺序
应用将会负责:
维护UTXO数据库
验证交易的加密签名
阻止花费尚未存在的交易
允许客户端查询UTXO数据库
Tendermint能够在应用过程和共识过程之间,提供一个非常简单的API(即ABCI)来分解区块链设计。
ABCI包含了3个主要消息类型,从核心传递到应用程序。应用会回复相应的响应信息。
消息说明:ABCI消息类型。
DeliverTx消息是应用的主要部分。链中的每笔交易都通过这个消息进行传送。应用程序需要根据当前状态,应用程序协议和交易的加密证书,去验证交易和传送消息。通过验证的交易需要更新应用状态,比如,将值绑定到键值存储库中,或者通过更新UTXO数据库。
CheckTx消息类似于DeliverTx,但它仅用于验证交易。TendermintCore的内存池首先通过CheckTx检查交易的有效性,并把交易传输给其它节点。例如,应用程序可以检查交易中的递增序列号,并且如果序列号是旧的,则在CheckTx上返回错误。或者,他们可能会使用基于功能的系统,该系统需要对每笔交易重新更新。
Commit消息用于计算当前应用程序状态的加密承诺,将其置于下一个区块中。这里有一些方便的属性。现在,更新该状态的不一致将显示为区块链分叉,它会捕获一大堆编程错误。这也简化了安全轻量级客户端的开发,因为可以通过检查块哈希来验证Merkle-hash证明,并且块哈希由quorum签名。
一个应用可能有多个ABCIsocket连接。TendermintCore给应用创建了三个ABCI连接:一个用于内存池广播时的交易验证,一个用于运行提交区块时的共识引擎,还有一个用于查询应用状态。
很明显,应用设计人员需要非常仔细地设计他们的消息处理程序,去创建一个有用的区块链,这个架构提供了一个范例。下图说明了通过ABCI的消息流。
确定性说明
区块链交易处理的逻辑必须是确定性的。如果应用逻辑不确定,就无法在TendermintCore复制节点间达成共识。
在以太坊上的Solidity是用于区块链应用一个很好的语言选择,除了一些其他因素,它还是一个完全确定性的编程语言。但是,通过使用现有的一些流行语言,比如Java,C++,Python和Go也是可以创建确定性应用的。对于通过避免非确定性来源创建确定性程序,游戏程序员和区块链开发者都已经很熟悉了,比如:
随机数生成器(没有确定性的种子)
线程上的竞争条件(或完全避免线程)
系统时钟
未初始化的内存(在像C或者C++这样的不安全语言)
浮点数算法
随机的语言特性(比如Go语言的map迭代)
虽然程序员非常小心避免非确定性,但也可以为每种语言创建一个特殊的语法检查器或静态分析器来检查其确定性。将来,我们可能会与合作伙伴一起创建此类工具。
共识概述
Tendermint是一种易于理解,大多是异步的BFT共识协议。该协议遵循一个简单的状态机,如下所示:
该协议的参与者称为验证者;他们轮流提出交易块并对其进行投票。每个高度会有一个块在链上提交。块可能无法提交,在这种情况下协议转至到下一轮,并且新的验证器将建议该高度的块。成功提交一个区块需要两个阶段的投票;我们称他们为预投票和预提交。在同一轮中,当超过2/3的验证器为同一区块预提交时,就能提交成功。
验证器可能由于多种原因而无法提交块;当前提案者可能处于脱机状态,或者网速很慢。Tendermint允许他们确定应该跳过验证器。在投票进入下一轮之前,验证者会等待一小段时间从提案者那里收到完整的提案区块。这种对超时的依赖使得Tendermint成为一种弱同步协议,而不是异步协议。但是,协议的其余部分是异步的,验证器只有在听取了超过三分之二的验证器征集的意见后才会取得进展。Tendermint的一个简化元素是,它使用相同的机制来提交区块,就像跳到下一轮一样。
假设不到三分之一的验证者是拜占庭式的,Tendermint保证安全性永远不会被侵犯,也就是说,验证器永远不会在同一高度提交冲突的块。为此,它引入了一些锁定规则,这些规则调整流程图中可以遵循的路径。一旦验证器预先提交了一个块,它就被锁定在该块上。
权益
在许多系统中,并非所有验证器在共识协议中都具有相同的“权重”。因此,我们对三分之一或三分之二的验证器并不那么感兴趣。在总投票权的那些比例中,这些比例可能不是在各个验证器之间均匀分布的。
由于Tendermint可以复制任意的应用程序,所以可以定义一种货币,并以该货币为投票权定名。当投票权以本国货币计价时,该系统通常被称为股权证明。根据应用程序中的逻辑,验证器可以强制将他们的货币绑定到一个安全的存款中,如果他们被发现在共识协议中作恶,则可以销毁。这为协议的安全性增加了经济因素,允许人们量化违反假设的成本,即不到三分之一的投票权是拜占庭式的。
Cosmos网络被设计使用这种股权证明机制,用于作为ABCI应用程序实现。
(这是我的一次翻译尝试,原文链接
https://github.com/tendermint/tendermint/blob/master/docs/introduction/introduction.md)
主题测试文章,只做测试使用。发布者:最新稳定辅助网,转转请注明出处:https://www.744broad.com/13593.html