HotStuff公式算法
HotStuff是基于View的的共识协议,View表示一个共识单元,共识过程是由一个接一个的View组成。在一个View中,存在一个确定leader来主导共识协议,并经过三阶段投票达成共识,然后切换到下一个View继续进行共识。假如遇到异常状况,某个View超时未能达成共识,也是切换到下一个View继续进行共识。............
1 引言
HotStuff是基于View的的共识协议,View表示一个共识单元,共识过程是由一个接一个的View组成。在一个View中,存在一个确定leader来主导共识协议,并经过三阶段投票达成共识,然后切换到下一个View继续进行共识。假如遇到异常状况,某个View超时未能达成共识,也是切换到下一个View继续进行共识。
- View: 表示一个共识单元,共识过程是由一个接一个的View组成的,每个View中都有一个ViewNumber表示,每个ViewNumber对应一个Leader
- QC(quorum certificate): 表示一个被(n−f)个节点签名确认的数据包及viewNumber。比如,对某个区块的(n−f)个投票集合。
- prepareQC: 对于某个prepare消息,Leader收集齐(n−f)个节点签名所生成的证据(聚合签名或者是消息集合),可以视为第一轮投票达成的证据
- lockedQC: 对于某个precommit消息,Leader收集齐(n−f)个节点签名所生成的证据(聚合签名或者是消息集合),可以视为第二轮投票达成的证据。
2 HotStuff 算法思路
共识过程从新的leader节点收集非leader节点中的新视图消息开始。当leader已经从足够的非leader节点中收集了请求时,leader节点将开始一个新的视图并提出自己的状态转换请求,然后向其他节点发送一条prepare消息。接收到prepare消息后,系统中的其他节点将按照以下三个阶段验证其合法性并确认该消息:
- Pre-Commit阶段:当leader节点收到当前提案的准备票时,它将其合并为准备仲裁证书,然后以预提交消息的形式将其广播给所有节点,这表明有足够的节点确认了状态转换请求。
- Commit阶段:leader节点收到Pre-Commit投票后,将它们组合成precommitQC,并以commit消息的形式向所有节点广播;接收到该消息的副本可以锁定当前状态转换请求,以便即使在视图更改期间也可以达成共识决策。
- Decide阶段:领导者收到提交投票后,将它们合并为commitQC。一旦leader节点已经组建了一个commitQC,它发出了一个决定消息到所有其他副本。收到确定消息后,副本将在已提交分支中执行状态转换并启动下一个视图。

2.1 Prepare阶段
每个View开始时,新的Leader收集由(n−f)个副本节点发送的NEW-VIEW消息,每个NEW-VIEW消息中包含了发送节点上高度最高的prepareQC(如果没有则设为空)。
- prepareQC可以看做是对于某个区块(n−f)个节点的投票集合,共识共识过程中第一轮投票达成的证据
Leader从收到的NewView消息中,选取高度最高的preparedQC作为highQC。因为highQC是viewNumber最大的,所以不会有比它更高的区块得到确认,该区块所在的分支是安全的。
Leader节点会在highQC所在的安全分支来创建一个新的区块,并广播proposal,proposal中包含了新的区块和highQC,其中highQC作为proposal的安全性验证。
其他节点(replica)一旦收到当前View对应Leader的Proposal消息,Replica会根据会 safeNode-predicate规则 检查Proposal是否合法。如果Proposal合法,Replica会向Leader发送一个Prepare-vote(根据自己私钥份额对Proposal的签名)。
Replica对于Proposal的验证遵循如下的规则:
- Proposal消息中的区块是从本机lockQC的区块扩展产生(即m.block是lockQC.block的子孙区块)
- 为了保证liveness, 除了上一条之外,当Proposal.highQC高于本地lockQC中的view_number时也会接收该proposal。
2.2 Precommit阶段
Leader发出proposal消息以后,等待(n−f)个节点对于该proposal的签名,集齐签名后会将这些签名组合成一个新的签名,以生成prepare-QC保存在本地,然后将其放入PRECOMMIT消息中广播给Replica节点。
- prepare-QC可以表明有(n−f)个节点对相应的proposal进行了签名确认。
2.3 Commit阶段
commit阶段与precommit阶段类似,也是Leader先收集(n-f)个precommit-vote,然后将其组合为precommit-QC,并将其放在COMMIT消息中广播。
当Leader收到当前Proposal的(n-f)个precommit-vote时,会将这些投票组合成precommit-QC,然后将其放入COMMIT消息中广播。
当Replica收到COMMIT消息时,会对其签名commit-vote,然后回复给leader。更为重要的是,在此时,replica锁定在precommitQC上,将本地的lockQC更新成收到的precommitQC.
Replica收到了commit消息,验证成功后,表示第二轮投票达成。此时Replica回复给Leader,并且保存precommitQC到lockedQC。
2.4 Decide阶段
当Leader收到了(n-f)个commit-vote投票,将他们组合成commitQC,广播DECIDE消息。
Replica收到DECIDE消息中的commitQC后,认为当前proposal是一个确定的消息,然后执行已经确定的分支上的交易。View-Number加1,开始新的阶段。
3 共识流水线
可以看出,HotStuff的三个确认阶段具有相同的结构:其他节点对消息进行投票,leader节点将这些投票组合起来并广播到其他节点。这些阶段可以统一表示并流水线化。因此,可以将不同的proposal的不同的阶段重合,然后服用每一轮的广播来完成这些重叠的proposal的阶段的变换。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)