区块链时代的拜占庭容错:Tendermint(二)

原文题目:《Tendermint: Byzantine Fault Tolerance in the Age of Blockchains》git

原文做者:Ethan Buchman算法

翻译:饶云坤数据库

校对:傅晓波promise

本文为节选缓存

如下为正文:安全

 

本章阐述Tendermint共识算法和用于原子广播( atomic broadcast)的相关区块链。拜占庭容错共识问题将被详细讨论,而且Tendermint共识的一个正式说明将以π-calculus的形式给出。Tendermint区块链已经被非正式地证实为知足原子广播。未来咱们将以进程演进的方式来描述完整的区块链协议,并证实相关特性。网络

 

Tendermint综述

Tendermint是区块链范式中的一个安全的状态机复制算法。其算法形态为BFT-ABC,而且附加责任制,便于验证拜占庭节点的不诚实行为。数据结构

Tendermint算法给每一个区块赋予一个增量索引或者高度(height),在某一高度中只存在一个有效的区块,区块链从高度为0的创世纪块开始,由一个验证者集合投票产生下一个区块,其中每个验证者由各自的公钥标识。每个验证者须要维护一份完整的复制状态的拷贝。在投票产生某一高度的区块的过程当中,在正式提交(commit)某一高度的区块以前,至少须要通过一轮(round)投票(vote)来达成共识。每一轮都会经过round robin的方法产生一个提议者(proposer),该提议者在当轮以广播的形式提出一个提议(proposal),提议通过验证者的集体投票,来决定是否最终提交该区块或者进入下一轮。在提议的区块真正被提交(commit)以前,验证者们须要进行两轮投票(pre-vote & pre-commit), 经过一个简单的锁机制用来阻止少于总数1/3的拜占庭节点攻击。因为Tendermint网络的不一样时性(asynchrony),当拜占庭节点超过总数的1/3,网络存在瘫痪的可能性。app

注意到,tendermint的多轮投票机制的核心是共识算法。每个区块包含一些元数据(metadata),称做区块头(header)。区块头里包含本区块的高度,提议时间,本区块全部交易的梅克尔根哈希值。异步

 

共识

共识算法能够大体分为如下几部分:

•  提议(Proposals):在每一轮(round)中,新区块的提议者必须是有效的,而且告诉(gossiped)其余验证者。若是在必定时间内没有收到当轮提议(proposal),当前提议者将被后面的提议者接替。

•  投票(Votes):两阶段的投票基于优化的拜占庭容错。它们分别被称做预投票(pre-vote)和预提交(pre-commit)。对于同一个区块同一轮若是存在超过2/3的预提交(pre-commit)则对应产生一个提交(commit)。 
•   锁(Locks):在拜占庭节点数少于节点总数的1/3的状况下,Tendermint中的锁机制能够确保没有两个验证者在同一高度提交(commit)了两个不一样的区块。锁机制确保了在当前高度验证者的下一轮预投票或者预提交依赖于这一轮的预投票或者预提交。

为了应对单个拜占庭故障节点,Tendermint网络至少须要包括4个验证者。每一个验证者拥有一对非对称密钥,其中私钥用来进行数字签名,公钥用来标识本身的身份ID。验证者们从公共的初始状态开始,初始状态包含了一份验证者列表。全部的提议和投票都须要各自的私钥签名,便于其余验证者进行公钥验证。

验证人在发起提议(proposal)步骤以后,当且仅当收到其它验证人超过三分之二(+2/3)的投票后才会进一步推动流程。虚线箭头表示进入下一个区块高度共识流程的原子广播。

共识开始于第0轮,第一个提议者(proposer)是区块链头里验证者列表里的第一个验证者。每一轮最终要么完成了一个提交(commit),要么直接进入当前高度的下一轮,每一轮都会产生一个新的提议者。

与其余选举(leader election )算法不一样,Tendermint每一轮都会产生一个新的提议者(proposer),验证者投票决定是否进入下一轮,这与接受提议的流程相似。

每轮的开始对同步有弱的依赖性。每一轮开始期间,存在一个用来计时的本地同步时钟,若是验证者在TimeoutPropose时间内没有收到提议,验证者将参与投票来决定是否跳过当前提交者。TimeoutPropose会随着轮数的增长而增长。

每轮收到提议之后,进入彻底异步模式。以后验证者的每个网络决定须要获得2/3验证者以上的赞成。这样下降了对同步时钟的依赖或者网络的延迟。可是这也意味着若是得不到1/3以上验证者的响应,整个网络将瘫痪。

简言之,每轮,开始提议弱同步,以后投票彻底异步。

为了加强Tendermint共识网络的安全性,引入了少许的锁定规则(locking rules)来迫使验证者自证其投票的合法性。尽管咱们不须要实时广播他们的合法证实,可是咱们确实指望验证者们保存相关数据。这样当网络被拜占庭故障节点瘫痪时,其能够存留为相关证据。这个问责机制确保在网络故障(例如PBFT)的时候Tendermint具备一个更健壮的担保(guarantees)。

验证者使用一组不一样的消息(messages)来管理区块链,应用程序状态,p2p网络和共识。其中,核心的共识算法包含两类消息:

ProposalMsg: 对应某一高度及某一轮数的区块的提议(proposal),该提议已经由提议者签名 

VoteMsg: 对某一提议的签名投票

 

1、提议 

每轮开始于一个提议(proposal),提议者从内存池(Mempool)选取一批交易进而构成了一个区块,该区块随后被嵌套在ProposalMsg中,最后提议者广播(broadcast)ProposalMsg。若是这个提议者是拜占庭节点,他可能向不一样的验证者广播不一样的ProposalMsg。

提议者经过一个简单而且相对固定的的roubd robin轮流坐庄,因此每一轮只有一个有效且被全部验证者公认的提议者。若是验证者收到了以前更低轮次的提议或者提议来自于非法的提议者,该提议将被拒绝。

提议者的轮流坐庄对于拜占庭容错是必要的。好比,对于raft算法,若是选举出来的leader是拜占庭,而且leader与其余节点网络链接状态良好,该leader能够彻底控制整个网络,网络节点的安全和正常运转将无从获得保障。Tendermint经过投票和锁的机制(voting and locking mechanisms )确保了系统的安全性。若是一个提议者在限定时间内没有处理任何交易,排在其后的提议者将会接替他。更有趣的是验证者能经过治理模块投票来移出或者替换拜占庭验证者。

 

2、投票 

一旦验证者从网络中收到了一份完整的提议(proposal ),他对该提议进行预投票(pre-vote)签名,而且广播到网络中。若是验证者在ProposalTimeout时间内没有接收到一个有效的提议,其对该提议的预投票为空(nil)。

在存在拜占庭节点的异步环境中,单阶投票,即每一个验证者对每一个提议只投一次,不能足以确保整个系统的安全。本质上,由于验证者可能作出一些不诚实的行为,而且消息的到达时间没有任何保障,一个不诚实的验证者能够与其余验证者进行协做来提交(commit)一个区块,然而其余没有看到这个提交区块的验证者进入了新的一轮,并提交(commit)了一个不一样的区块。

一个单阶的投票容许验证者互相沟通他们知道的关于该提议的信息。可是为了容忍拜占庭故障,他们也须要互相告诉对方他们本身了解到的其余验证者声称了解到的关于该提交的信息。换句话说,二阶段提交确保了足够的验证者见证了第一阶段的结果。

对于某个区块的非空预投票是为网络提交(commit)区块已作好准备的投票。空预投票是为网络直接进入下一轮的投票。在理想的一轮中,超过2/3的验证者为该提议进行了预投票。在任意一轮中,区块具备的超过2/3的预投票被称做一个波尔卡(polka)。超过2/3的空预投票成为空波尔卡(nil-polka)。

当一个验证者收到了一个波尔卡(polka),他接受到了一个信号,即网络准备提交该区块,做为一个验证者签名而且广播预提交(pre-commit)的背书。有时,因为网络的不一样时性,验证者可能没有收到对应的波尔卡或者波尔卡根本就不存在。在这种状况下,验证者没有对应的波尔卡为这个预提交背书,此时预提交为空。也就是说,在没有收到波尔卡背书的状况下,签名一个预提交被看做是一个恶意行为。

预提交(pre-commit)是关于提交(commit)一个块的投票。空预提交则投票进入到下一轮。若是验证者收到2/3以上验证者的预提交,则其在本地提交该块,计算结果状态,并移动到下一高度的第0轮。若是验证者接收到超过2/3的空预提交,则投票进入下一轮。

 

3、锁 

多轮投票的安全问题是棘手的,必须避免同一高度不一样轮数分别提交两个不一样区块的情形。在Tendermint中,这个问题能够经过锁机制(locking mechanism)获得解决。锁机制的大体定位在波尔卡附近。本质上,预提交必须有一个波尔卡为其背书,验证者被锁定在其最近预提交(pre-commit)的区块上。

锁定规则:

· 预投票锁(Prevote-the-Lock):验证者只能预投票(pre-vote)他们被锁定的区块。这样就阻止验证者在上一轮中预提交(pre-commit)一个区块,以后又预投票了下一轮的另外一个区块。

· 波尔卡解锁(Unlock-on-Polka ):验证者只有在看到更高一轮(相对于其当前被锁定区块的轮数)的波尔卡以后才能释放该锁。这样就容许验证者解锁,若是他们预提交了某个区块,可是这个区块网络的剩余节点不想提交,这样就保护了整个网络的运转,而且这样作并无损害网络安全性。

简单来讲,验证者能够被看做锁在任意高度-1轮的nil-block上,因此波尔卡解锁意味着验证者不能预提交一个新高度的区块直到他们看见一个波尔卡。

这些规则能够以例子的形式被更直观的理解。考虑4个验证者,A,B,C,D,假设有一个第R轮关于blockX的提议。如今假设blockX已经有一个波尔卡,可是A看不见它,预提交(pre-commit)为空,然而其余人对blockX进行了预提交。进一步假设只有D看见了全部的预提交,然而其余人并无看见D的预提交(他们只看见他们的预提交和A的空预提交)。D如今将要提交(commit)这个区块,然而其余人进入到R+1轮。因为任何验证者均可能是新的提议者,若是他们提议并投票了一个新的区块blockY,他们可能提交这个区块。但是D已经提交了bockX,所以损害了系统的安全性。注意,这里并无任何拜占庭行为,仅仅是不一样时性。

(为了便于读者理解,译者补充此表格,下同)

锁定解决了这个问题经过强迫验证者粘附在他们预提交(pre-commit)的区块上,由于其余的验证者可能居于这个预提交进行了提交(如上例中的D)。本质上,在任何一个节点一旦存在超过2/3预提交(pre-commit),整个网络被锁定在这个区块上,也就是说在下一轮中没法产生一个不一样块的波尔卡。这是预投票锁的直接动机。

固然这里必须有相应的解锁方式。假设在某一轮中,A和B预提交(pre-commit)了blockX,与此同时C和D的预提交为空。所以全部的验证者进入到下一轮,预提议(pre-vote)blockY。假设A是拜占庭,为blockY也进行了预投票(不考虑其被锁在blockX上),致使了一个波尔卡。假设B并无看见这个波尔卡,预提交为空,此时A下线,C,D预提交bolckY。他们进入到下一轮,可是B仍然被锁定在blockX上,C和D被锁定在blockY上。这时由于A下线了,他们将永远得不到一个波尔卡。所以即便在拜占庭节点少于1/3的状况下,这里网络的正常运转仍然受到了影响。

解锁的条件是1个波尔卡。一旦B看见了blockY的波尔卡(用来为C和D的关于blockY的预提交背书),他应当可以解锁并预提交(pre-commit)blockY。这是波尔卡解锁的动机,其容许验证者在看见更高轮数波尔卡的时候解锁而且提交对应的新区块。

 

区块链

Tendermint对交易按批或块进行处理。区块之间经过加密哈哈希算法链成一个完整的区块链。区块链包括通过排序的交易日志和验证者提交的相关证据。

 

1、为何是区块? 

共识算法一次提交若干个交易(transactions)。正如在第二章提到的那样。从分批原子广播(batched atomic broadcast)的角度来看待这个问题,对应两个主要的优化,其给了咱们更多的吞吐量和容错能力:

·  带宽优化:由于每一次提交(commit)须要验证者之间的两轮通信,以块为单位交易的批处理,平摊了提交的成本在该区块中的全部交易上。

·  完整性优化:区块的哈希链造成了一个不可篡改的数据结构,跟git仓库很像,具有历史任意点的子状态认证检查的能力。

区块也引发了另一个效应,看上去更微妙,可是可能更重要。他们增长了单个交易的最小延迟到区块的最小延迟,对于Tendermint来讲在数百毫秒到数秒量级。传统的序列化数据库系统提供了提交延迟在毫秒到数百毫秒量级。他们的低延迟是由于这些数据库不是拜占庭容错的,只须要一轮通信而不是两轮和来自于1/2而不是2/3节点的响应。然而,与其余具备快速提交时间(commit times)的选举算法不一样,Tendermint提供了一个更常规的脉冲(pulse ),在节点故障和网络不一样时方面对整个网络的状态具备更好的响应度。

脉冲在通信自治系统一致性方面的角色如今并不明朗,可是由此引起的延迟在金融市场中是具备前景的。

 

2、区块的结构 

区块的目的是打包一批交易,而且连接到前面一个块。连接包含两种形式:前面一个区块的哈希和前面区块的预提交的集合,其也被称做LastCommit。所以一个区块由三部分构成:区块头,交易列表和Lastcommit。

 

安全性

这里咱们简要的证实一下Tendermint知足原子广播。原子广播被定义为知足如下条件:

· 有效性(validity) - 若是一个正确的进程广播m,它最终成功传达了m

· 一致性(agreement) - 若是一个正确的进程成功传达了m,全部最终全部的进程成功传达m

· 完整性(integrity) - m只传递一次,而且是以广播的形式被发送者发送出去

· 总的顺序(total order) - 若是正确的进程p和q分别传递出m和m',p传达m在m'以前,那么q传达m在m'以前

注意到, 若是把m看做一个区块,Tendermint并不知足有效性,由于并不能保证提议的区块最会会被提交,由于验证者可能进入到新的一轮,并提交一个不一样的区块。

若是咱们把m看做某一区块里的一批交易,那么咱们可以知足有效性经过验证者从新提议同一批交易直至交易最终被提交。

为了知足完整性的第一部分,咱们必须引入额外的规则来禁止一个合法的验证者提议或者预提交一个区块,其中这个区块包含的这批交易已经被提交过。幸运的是,交易能够被梅克尔根索引,在提议和预提交之前能够进行相关的查找来滤除已经提交的交易。

或者咱们能够把m当成一个交易(transaction),经过引入内存池的持久属性,能够知足有效性,即,交易能够驻留在内存池中直到它被提交。然而为了知足完整性的第一部分,咱们必须依赖应用程序状态(application state)来制定一些针对交易的规则,这样一个给定的交易只能进行一次。例如,能够经过基于帐户的序列号,正如在以太坊中的那样。或者保存一份未使用资源的列表,每个资源只能被使用一次,正如在比特币中使用的那样。由于有多种方法,Tendermint自己并不保证消息只传达一次,可是容许应用开发者来指定相关特性。完整性的第二部分显而易见,由于只有正确的提议者提议的区块中的交易才能被提交。

为了证实Tendermint知足“总的顺序”,咱们引入了一个新的特性,状态机安全性(state machine safety),而且能够证实知足状态机安全性的协议一定知足“一致性”和“总的顺序”。所谓的状态机安全是指若是一个正确的验证者在高度H提交了一个区块,没有其余的验证者在同一高度提交一个不一样的区块。考虑到全部的消息最终被接收,这个马上暗示了一致性,由于若是一个正确的验证者在高度H提交了一个区块B,包含了交易m,全部其余的正确的验证者不能提交其余的区块,所以最终提交了区块B,传达了消息m。

如今,咱们须要证实状态机安全知足“总的顺序”,而且Tendermint知足状态机安全。为了证实前者,考虑两个消息m和m'分别由验证者p和q发出。状态机安全确保p发出消息m在高度Hm当且仅当q发出消息m在高度Hm,而且p发出消息m'在高度Hm'当且仅当q发出消息m'在高度Hm'。不失通常性,由于高度是严格递增的,假设Hm<Hm'。那么咱们有p发出消息m在m'以前当且仅当q发出消息m在m'以前,这偏偏就是“总的顺序"的定义。

最后,为了证实当拜占庭节点少于1/3的时候,Tendermint知足状态机安全,咱们采用反证法。假设Tendermint并不知足状态机安全,容许在某一高度提交多个区块。那么咱们能够证实至少须要1/3的拜占庭节点,与假设矛盾。

考虑一个有效的验证者在高度H和轮数R提交了一个区块B。提交一个区块意味着验证者在第R轮收到了关于区块B的超过2/3的预提交。假设另外一个区块C在高度H提交。咱们有两个选项:要么在第R轮提交要么在S轮提交(S>R)。

若是区块C在第R轮提交,那么超过2/3的验证者必须为该区块预提交,那么意味着至少1/3的验证者在第R轮同时对区块B和C进行了预提交,那么显然这些同时节点是拜占庭节点。假设区块C在S轮提交。由于超过2/3对B区块进行了预提交,他们在S轮也将被锁定在区块B上,所以他们必须对B进行预投票。为了对区块C进行预提交,他们必须接收到关于区块C的波尔卡,所以须要关于区块C的超过2/3的预投票。然而,超过2/3的验证者已经被锁定在区块B上。节点为了收到区块C的波尔卡至少须要网络中1/3的验证者违背锁机制,这部分节点显然是拜占庭节点。所以,为了违背状态机安全,至少须要1/3的拜占庭验证者。即若网络中的拜占庭节点少于总数的1/3,Tendermint知足状态机安全性。

综上,Tendermint知足原子广播。

在将来的工做中,咱们会提供关于Tendermint的安全性的更正式的证实。

 

责任制

一个具备问责制的拜占庭容错算法可以在存在安全隐患时标识全部的拜占庭验证者。传统的拜占庭容错算法并没与这个特性,对应地也没有任何相应的保证。固然,问责制仅能适用在拜占庭节点在1/3到2/3的状况。若是超过2/3的节点是拜占庭,他们可以彻底占据协议,此时没法保证一个合法的验证者能够收到任何拜占庭节点违法的证据。

进一步,问责制是在异步网络环境下最终性的尽力而为,在这样的网络环境中着安全问题,关键消息(critical messages)的延迟使得在探测到安全问题之后才可能发现拜占庭验证者。事实上,若是正确的进程(correct processes)能够接受拜占庭行为的相关证据(evidence),可是在他们可以通信以前不可逆地失败了(fail irreversibly),可能使得问责制永久失效( Permanently compromised),尽管实际上这种情形能够经过高级备份策略来克服。

经过枚举安全问题的各类隐患,拜占庭验证者是能够识别的,这样协议是具备问责制的。与其它竞选相关的协议相比,Tendermint的简洁给予了其更简单的分析方法。

在Tendermint存在两类安全隐患,每一种都是可问责的。第一种,拜占庭提议者在单轮中产生两个冲突的提议,而且拜占庭验证者同时对这两个提议进行投票(vote)。第二种,一些验证者在单轮已经提交(commit)以后,拜占庭验证者违反锁机制(locking rules),导致其余验证者在随后的轮数提交一个不一样的区块。注意到,若拜占庭验证者少于2/3,只经过违反解锁机制的方法是没法引起安全性问题的,同时超过1/3的节点必须违背波尔卡锁机制,由于每个提交(commot)须要有一个波尔卡为其背书。

在存在提议或者投票冲突的状况下,同时接受冲突的提议或者投票,能够根据这些提议或投票的签名来辨别这些拜占庭节点。

在违反锁定机制(locking rules)的状况下,伴随着相应的安全性问题,有效的验证者必须广播在当前高度看到的全部投票,这样证据能够被收集起来。少于2/3的正确验证者在全部致使两个区块被同时提交的投票中集体隐匿。此时在这些投票中,若是没有1/3或者更多的验证者签名冲突的投票,那么存在1/3或者更多的验证者违反了锁定机制。

若是预投票( pre-vote )或者预提交( pre-commit)影响了一个提交,它必定会被一个合法的验证者看见。所以,经过搜集全部的投票,经过匹配每个预投票和最近的预提交,能够探测到违反锁机制的行为(violations of Prevotethe-Lock )。

相似的,经过匹配预提交(pre-commit )和为其背书的波卡尔卡(polka),能够探测到违反解锁机制的行为(violations of Unlock-on-Polka )。注意到这就意味着若是拜占庭验证者能够在看见波尔卡以前预提交(pre-commit),而且若是相应的波尔卡最终发生的话,拜占庭验证者将逃脱责任制。然而,若是每个预提交有波尔卡背书的话,这些安全隐患就不存在。

目前的设计提供了问责制,伴随着后危机广播协议(post-crisis broadcast protocol),可是其可以用来提升实时的问责制。也就是说,一旦提交被改变,相应的预提交,为预提交背书的预投都会发生改变,这样一直回退到创世纪块。经过上面的方式,若是发生安全问题,没有背书的投票能够当即被探测到。

 

故障和可用性

做为一个拜占庭共识容错算法,Tendermint能够容忍拜占庭故障节点到(但不包括)节点总数的1/3。这就意味着节点可能会崩溃,发送不一样和冲突的消息到不一样的节点,拒绝中继消息或者表现异常,安全或者运转存在问题。

协议中有两个地方咱们能够经过使用本地时钟的超时特性,为不一样时性作一些优化:在接收到2/3或者更多预投票(pre-votes)以后(不针对单个区块或者nil)和在收到2/3或更多预提交(pre-commit)之后(不针对单个区块或者nil)。在每一中情形中,咱们能够睡眠一段时间用来给延迟的投票一个被接受的机会,所以减小在新的一轮没有提交区块的可能性。时钟不须要在验证者之间同步,由于验证者在观测到2/3或更多的投票时会重置各自的时间。

若是1/3或者更多的验证者崩溃,网络瘫痪,由于任何共识进展须要2/3以上验证者的投票。网络仍然能够读取数据,可是没有新的区块的提交。只要验证者从新上线,他们可以从以前的投票状态开始。共识状态机应该配置一个预写式日志(write-ahead log),这样从新上线的的验证者能够快速回退到以前机器崩溃时的位置,确保没有违反规则。

若是1/3或者更多的验证者是拜占庭,他们可以以多种方式损害系统的安全性。例如,在同一轮提交两个块,而且投票提交这两个区块或者经过经过违反锁定机制在同一高度不一样轮提交两个不一样的区块。在每一种情形中,有清晰的证据显示哪些验证者是拜占庭节点。在第一个例子中,他们在同一轮签名两个不一样的提议,违反规则。在第二个例子中,他们锁定在r-1轮在第r轮提交了一个不一样的区块,违反了锁定机制。

当使用经济和治理组件来激励和管理共识,这些额外的责任制保证是具备决定性的。

 

结论

Tendermint自己是弱同步,拜占庭容错,状态机复制协议,拥有优化的拜占庭容错和额外的责任制来保证当超过拜占庭容错假设上限时的情形。协议采用round robin的提议者产生方法,用一样的机制跳过一个提议者。多轮投票之间的安全性经过锁机制获得了保障。

 

本章是关于协议的表述,存在许多有待进一步讨论的重要细节,例如块之间有效的通信(efficient gossiping of blocks),缓存交易,验证者集合的改变和应用逻辑的接口。这些重要的话题将在随后的章节获得进一步的解释。

相关文章
相关标签/搜索