区块链专题(十一)Tendermint - 4 共识算法

论坛 期权论坛 期权     
浙商国际财经评论   2020-4-3 23:56   1499   0





来源:Unsplash

01
WAL


共识模块将每条消息写入WAL(预写日志)。它还通过File#Sync对由该节点签名的消息发出fsync syscall(以防止双重签名)。在后台,它使用autofile.Group功能,当文件太大(> 10MB)时,它将旋转文件。总大小上限为1GB。我们只需要最新的程序块和它之前的程序块,但是如果前一个程序块拖累了多个回合,则我们需要所有这些回合。


Replay


共识模块将重播崩溃前写入WAL的所有最后高度的消息(如果发生这种情况)。


专用验证器可能会尝试在重播期间签名消息,因为它在某种程度上是自动运行的,并且不知道重播过程。


例如,如果我们一直在WAL中进行预提交,在那之后发生了崩溃现象,这时候则在重播投标消息后,私有验证程序将尝试签署预投票,但是这将失败。这是可以接受的,因为稍后我们会在WAL中看到该选区。然后它将进行预提交,这次提交将产生作用,因为私有验证器包含LastSignBytes,然后我们将从WAL重新进行预提交。




02
拜占庭共识算法


1、条款


1)网络由可选连接的节点组成。直接连接到特定节点的节点称为对等点。

2)决定下一个区块(在某个高度H处)的共识过程由一个或多个回合组成。
3)NewHeight,Propose,Prevote,Precommit和Commit代表回合的状态机状态。(aka RoundStep或只是“step”)。
4)节点处于给定的高度,回合和步骤时,或者位于(H,R,S)处,或者简称为(H,R),此处省略步骤参数。
5)进行预投票或预提交某内容意味着广播某项的预投票或首次预提交投票。
6)(H,R)处的投票是在其符号字节中包含H和R的字节签名的投票。
7)+2/3是“大于2/3”的缩写。
8)1/3 +是“1/3或更多”的缩写。
9)一组特定块或(H,R)中的的一组+2/3预投票被称为“锁更改证明”或短期PoLC。


2、状态机概述



在区块链的每个高度,都运行基于回合的协议以确定下一个区块。每个回合包括三个步骤(建议,预投票和预提交),以及两个特殊步骤:提交和新高度。


最佳方案的步骤顺序为:






“建议->投票->预提交”这个顺序称为回合。可能需要超过一轮才能在给定的高度提交给块。下面是示例,显示了为什么可能需要更多回合:


1)指定的提议者不在线。

2)指定的提议者提议的阻止无效。
3)指定的提议者提议的块未及时传播。
4)提议的块是有效的,但是对于足够的验证者节点,在到达“预提交”步骤之前,没有及时收到提议的块的+2/3投票。即使要进行下一步也需要+2/3的投票,但至少有一个验证者可能对投了赞成票或对其他东西投了恶意票。
5)提议的块是有效的,并且对于足够的节点,接收到了+2/3的预投票,但是对于足够的验证器节点,没有接收到针对提议的块的+2/3的预提交。


其中一些问题可以通过进入下一轮与提议者进行解决。而其他问题则通过在每个连续回合中增加一定的回合超时参数来解决。



3、状态机图






03
Background Gossip


节点可能没有对应的验证者私钥,但通过将相关的元数据、提议、数据块和投票投给对等节点,它在共识过程中仍然发挥着积极作用。具有活动验证者的私钥并参与投票的节点称为验证者节点。所有节点(不仅是验证者节点)都具有关联状态(当前高度,倒圆角和阶段),并努力取得联系。



在两个节点之间存在一个Connection,并且在此连接之上,多路复用的是相当节流的信息通道。在这些渠道中,某些渠道实施了gossip协议,以使对等节点快速了解最新的共识状态。例如,


1)节点gossip PartSet当前回合的提议者的提议区块的一部分。LibSwift启发式算法用于在gossip网络中快速广播数据块。

2)节点gossip预投票/预提交投票。在NODE_B之前的节点NODE_A可以发送NODE_B预投票或预提交NODE_B的当前(或将来)回合,以使其向前发展。
3)如果提出了建议,则节点gossip会投票支持建议的PoLC(锁证明)。
4)节点gossip到滞后于区块链高度的节点,并针对较旧的区块进行区块提交。
5)节点机会性地gossip HasVote消息,以提示对等节点它已经拥有的投票。
6)节点向所有相邻对等方广播其当前状态。




1、提案



提案由指定提案者在每个回合中签名并发布。通过确定性和非阻塞性的循环选择算法选择提议者,该算法根据投票权比例选择提议者。


(H,R)处的提议由一个块和一个可选的最新PoLC-Round 转到Prevote(H,R)
在收到投标书后,所有投票都在PoLC-Round上进行。->转到Prevote(H,R)
退出条件。


2)Prevote Step (height:H,round:R)
进入Prevote后,每个验证人都会广播其Prevote投票。
首先,如果因为LastLockRound的缘故使得验证器已锁定在某个块上,但现在在回合PoLC-Round上具有针对Poc-Round的PoLC,其中LastLockRound 转到Precommit(H,R)
退出条件


3)Precommit Step (height:H,round:R)
进入“预提交”后,每个验证者都会广播其“预提交”投票。
如果验证者针对特定块B在(H,R)处具有PoLC,则它将(重新)锁定(或更改为锁定)并预先提交B并设置LastLockRound = R.
否则,如果验证者在(H,R)处具有的PoLC,它将解锁并预提交。
否则,它将保持锁不变并预提交。
进行的预提交表示“本轮我没有看到PoLC,但是我确实获得了+2/3的投票并稍等了一下”。
预提交步骤结束:
在+2/3之后,预提交。->转到Propose(H,R + 1)
超时后收到任何+2/3预提交后进行预提交。->转到Propose(H,R + 1)
退出条件


4)Common exit conditions
在+2/3之后,对特定块进行预提交。->转到Commit(H)
在任何+2/3后,在(H,R + x)收到选票。->转到Prevote(H,R + x)
在(H,R + x)处收到任何+2/3预提交之后。->转到Precommit(H,R + x)


5)Commit Step (height:H)
设置CommitTime = now()
等待直到收到阻止。 ->转到NewHeight(H + 1)


6)NewHeight Step (height:H)
将Precommits移动到LastCommit并增加高度。
设置StartTime = CommitTime + timeoutCommit
等到StartTime接收散乱的提交的时候。->转到Propose(H,0)


本文编译自Tendermint Spec, 来源:tendermint.com。










长按二维码关注我们


注:本文所使用的图片及音乐属于相关权利人所有,因客观原因,部分素材未能及时联系到相关权利人,如存在使用不当的情况,请相关权利人随时联系我们协商授权事宜。
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:173
帖子:4
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP