文章内容源自“长安链ChainMaker”官方微信公众号
作者为长安链核心开发工程师史金乾
编者语:
长安链ChainMaker(以下简称“ChainMaker”)目前实现了很多种共识算法,比如SOLO、RAFT、TBFT、HOTSTUFF等,TBFT共识算法是ChainMaker实际应用中常见的共识算法。TBFT共识算法是一种拜占庭容错算法,可以在拜占庭节点数小于总数1/3的情况下,保证系统的安全运行,本文主要对ChainMaker TBFT共识源代码进行解析。
TBFT基于Tendermint算法,与PBFT的最大区别在于:PBFT有一个固定的leader节点打包交易,当leader节点故障的时候会使用view-change子协议更换leader;而在TBFT中,leader是轮换的,每提交n个块(可以配置)leader会轮换成下一个节点。因此,TBFT比PBFT有更好的公平性。
ChainMaker TBFT共识流程
1.1 TBFT 节点之间的共识流程
1.2 TBFT 节点自己的共识阶段
TBFT共识网络启动后,共识节点本地的各个共识阶段如下:
2.1 TBFT源代码目录
2.2 TBFT共识流程代码解析
开始阶段
Start方法对应TBFT共识流程中的开始阶段,它是TBFT共识的启动函数,主要实现了:
NewHeight阶段
enterNewHeight方法对应TBFT共识流程中的NewHeight阶段,这是进入新区块高度的起始阶段。NewHeight阶段会设置新区块高度,重置Round为0,添加、移除验证者,然后进入NewRound阶段,开启一轮对新区块的验证、投票、提交。
NewRound阶段
enterNewRound方法对应TBFT共识流程中的NewRound阶段 ,进入新一轮Round,需要重新初始化相关的共识状态,将Proposal、VerifingProposal重置为空,设置NewRound阶段的意义:共识节点在投票阶段有可能会超时,超时未对新区块达成一致投票,那么就进入下一轮投票round+1,直到对新区块投票达成一致。
Proposal阶段
enterPropose方法对应TBFT共识流程中的Proposal阶段,Proposal超时后,会重新选举主节点,如果没有超时,主节点会通过msgbus发送消息给核心引擎,核心引擎负责打包区块,然后返给主节点,所有共识节点都会广播共识状态,告诉其他共识节点,自己进入了新的块高。
Prevote阶段
enterPrevote方法对应TBFT共识流程中的Prevote阶段,共识节点在Prevote阶段,首先会生成区块的prevote投票并签名,然后把投票放到internalMsgC通道中,最后广播给其他共识节点。
Precommit阶段
enterPrecommit方法对应TBFT共识流程中的Precommit阶段,共识节点在Precommit阶段,首先会验证prevote投票是否大于2/3,如果满足,会生成对区块的precommit投票并签名,然后将投票放到internalMsgC通道中,最后广播给其他共识节点。
Commit阶段
enterCommit方法对应TBFT共识流程中的Commit阶段,共识节点在Commit阶段,首先会验证precommit投票是否大于2/3,如果满足,共识节点把区块发给核心引擎,核心引擎负责把区块提交到账本中。
TBFT共识模块与核心引擎模块的交互
3.1 共识与核心引擎的交互流程
TBFT共识模块和核心引擎模块是通过Msgbus互相传递消息的,核心引擎模块为TBFT共识模块提供区块打包、区块验证、提交区块到账本的功能。
3.1.1 ProposaState,Proposal是主节点专有的共识阶段
3.1.2 Verify和VerifyResult是从节点专有的共识阶段
3.1.3 主节点和从节点都包含Commit和BlockInfo阶段
3.2 共识与核心引擎交互代码解析
OnMessage方法对应接受核心引擎发给Msgbus的消息,包括Proposal、VerifyResult、BlockInfo,然后Msgbus把消息放到各个相应channel中等待被处理。
handle方法处理OnMessage方法放到各个channel中的消息。
节点通过Msgbus,调用publishToMsgbus函数,向其他节点发送消息。
4.1 共识节点发送共识消息给其他共识节点
4.1.1 节点主动发送消息给其他节点。
4.1.1.1 进入Propose阶段,需要向其他节点同步自己进入到新的块高了。
4.1.1.2 如果收到自己的投票就直接触发,即节点自己主动把自己的投票信息添加到投票集合发送给其他节点。
4.1.2 节点被动发送共识消息
如果节点收到其他节点发送给自己的共识状态消息,会将消息响应相应的节点,证明自己收到了该消息。
4.1.3 节点发送共识消息的判断
以节点发送Prevote投票为例,如果收到节点的投票集合中不包括自己的投票,那么就发送自己的投票。
4.2 共识节点接受其他共识节点发送的共识消息
共识节点之间传输的共识消息主要有4种类型:propose,provote,precommit,state,然后分别进行处理。
关于长安链开源社区
“长安链ChainMaker”是国内首个自主可控区块链软硬件技术体系,由微芯研究院、清华、北航、腾讯和百度等机构共同研发,具有自主可控、灵活装配、性能领先、开源开放的突出特点。长安链面向大规模节点组网、高交易处理性能、强数据安全隐私等下一代区块链技术需求,融合区块链专用加速芯片硬件和可装配底层软件平台,为构建高性能、高可信、高安全的数字基础设施提供新的解决方案,为长安链生态联盟提供强有力的区块链技术支撑。取名“长安链”,喻意“长治久安、再创辉煌、链接世界”。
开发者可登录长安链开源社区网站
https://www.chainmaker.org.cn/下载源代码