共识模块主要由几个组件组成,世代epoch、提案消息缓存服务msgcache、共识消息处理引擎engine、共识消息验证器verifier、提案消息存储服务forest、投票处理器voter、共识活性服务pacemaker、wal存储wal、节点间共识信息同步服务compensator、各模块相互配合实现maxbft流水线共识算法。
epoch:共识运行过程中由一个个epoch组成,每个epoch包含一组共识节点、在预定的视图范围内由这些共识节点生成提案、投票共识信息、驱动共识运行;每个epoch的最后一个提案初始化下一个epoch的信息,当前epoch最后一个提案被提交上链后触发世代切换
msgcache:检查网路中接收的提案消息是否缺失祖先提案,缓存缺失祖先提案的消息、并触发请求获取缺失的提案
engine:处理世代内接收到的共识消息
verifier:实现了共识消息的提案、投票验证规则
forest:缓存验证过的提案信息、并维护共识的各种QC状态genericQC、lockedQC、finalQC
voter:缓存验证过的投票信息、实现提案的投票规则
pacemaker:共识活性服务,使用接收到的QC、提案、超时信息,推进节点的共识状态
wal:在共识过程中存储验证过的共识消息
compensator: 共识内部的同步服务,发送、处理获取缺失提案的请求
hotstuff-投票处理
6.5.2. pacemaker 状态推进机制
pacemaker 提供了共识算法的活性,当某次共识view共识未达成一致、或共识消息处理完成后,使用相应的结果推进pacemaker维护的节点共识状态、并设置相应的超时器;因此共识的状态由两种信息推动:
共识信息:提案、投票组成的QC信息;当视图V+1的follower接受视图V的提案后,使用提案信息驱动pacemaker进入V+1的共识状态,当视图V+1的Leader接受视图V的提案后,设置超时器、进入投票收集阶段,使用投票聚合的QC信息驱动pacemaker进入V+1的共识状态
超时信息:超时器有等待提案、等待投票两种类型,当节点进入一个新视图后,设置接受提案类型的超时器,当节点作为视图proposal.View+1的Leader时,接受提案proposal后进入投票超时阶段;无论何种超时时间被触发都将驱动pacemaker进入下一个新视图
超时时间在[MaxBFTRoundTimeoutMill, MaxBFTMaxTimeoutMill] 范围内波动,通过最新提交的提案视图finalView与当前设置超时的视图currView确定当前超时类型的时间;算法为:timeOut = currView - finaView <= 4? MaxBFTRoundTimeoutMill : MaxBFTRoundTimeoutMill + MaxBFTRoundTimeoutIntervalMill * (currView - finalView - 4)
公示中常量为4的原因:一个区块的提交需要满足three-chain规则(即当前区块后接三个子孙块v+1, v+2, v+3),又因实现中设置超时器时满足three-chain的提案还未被提交(即finalView还未更新),因此正常无超时情况下currView - finalView 最大的间隔应为4
6.5.3. epoch 切换机制
epoch机制为maxbft共识算法提供了增删共识节点的功能,每个epoch创建时基于当前链配置合约chainconfig的共识节点状态初始化该epoch参与共识的节点信息,当前epoch的最后一个提案创建下一个epoch的状态,当最后一个提案被提交后触发epoch切换,同时丢弃当前epoch在该提案后的所有生成的子孙块,由于epoch切换属于耗时的重量型操作,基于性能与功能的trade-off,因此每个epoch预分配一定数量的运行视图,仅在当前epoch的视图运行结束时,才基于最新的链配置生成下一个epoch的信息;epoch运行期间配置交易导致链配置变更不会立即反应在共识的epoch配置中。
6.5.4. 配置参数
MaxBFTRoundTimeoutMill:共识状态初始超时时间;示例:”5000”
MaxBFTRoundTimeoutIntervalMill:每次超时后下一轮共识增加的delta时间;示例:”2000”
MaxBFTMaxTimeoutMill:超时时间上限;示例:”15000”
MaxBftViewNumsPerEpoch:每个世代的运行的视图数量;示例:”50”
6.6. DPoS
DPoS(Delegated Proof of Stake)委托权益证明共识算法,类似于公司董事会制度,在DPoS共识制度下,会选出一定数量的节点,来负责生成、验证区块。节点的选举根据节点质押的权益来进行,被选出来的节点代表其他所有的节点进行小范围共识出块。正常生产区块的节点可以获得额外的权益激励,但如果节点不履行生产区块的职责,或者作恶,会被剔除出去,并且依据事先设定的惩罚规则进行惩罚(如扣除质押的部分权益)。
DPoS共识是由DPoS委托质押算法、TBFT拜占庭共识算法组合实现的;DPoS委托质押算法负责节点的权益质押、验证人集合的选举、激励、惩罚这些操作,TBFT共识算法负责对Proposer生成的区块进行验证,保证大多数验证者节点对区块达成一致;
chainmaker【v1.2.0+版本】的DPoS共识实现是基于证书体系构建的,所以新节点准备参与共识过程时,除了DPoS共识自身所需的权益质押,还需要使用证书体系的管理机制(即:系统配置合约的操作),将新节点添加到网络中。
DPoS共识中,设置指定数量区块的区块构成一个世代,每个世代包含一批从候选人中依据质押的权益选举出来的验证者,作为世代的验证者集合,每个验证者轮流作为Proposer进行出块,其它不出块的验证者对Proposer生成的区块进行TBFT共识,保证大多数验证者对该区块达成一致,每个世代的最后一个区块选举下一个世代的验证者集合,并将选举结果写入区块以便其它验证者节点进行校验。因此在区块链上存在三种节点:普通节点、候选人节点、验证人节点;普通节点通过质押一定数量的权益资产,成为候选人节点,每个世代的最后一个区块,依据候选人质押的权益,选举一批节点作为下一个世代的验证者集合。
candidates
Note
【chainmaker v1.2.0】的DPoS共识仅支持levelDB存储引擎
【chainmaker v1.2.0】未实现区块激励、作恶惩罚,仅支持共识节点的增删、质押/解质押功能