图示
流程描述
Validators:所有参与共识的节点
Proposer:出块节点
以高度n,round 0共识为例
1 所有的Validators在New Height(高度n,round 0)处等待开始,timeout或者tx到来的时候进入Propose阶段
2 Propose阶段
Proposer打包区块,并广播给其他Validators,然后进入Prevote阶段
其他Validators等待接收区块,收到区块后进入Prevote阶段,或者一定时间内没收到区块也进入Prevote阶段
3 Prevote阶段
这个阶段不区分Proposer了,所有Validators处理都一样
如果有有效区块则针对blockID(block的hash)投票,如果没有有效区块则针对nil投票即可
然后一直等待接收其他Validators的Prevote投票
a:如果收到了针对同一blockID或者nil的+2/3的投票,进入Precommit阶段
b:如果收到了+2/3节点的投票但是大家未达成一致,起一个timeout,如果在timeout内未收到针对同一blockID或者nil的+2/3的投票,也进入Precommit阶段
4 Precommit阶段
a:如果Prevote阶段有+2/3对同一blockID或者nil的投票,那么针对这个blockID或者nil投Precommit的vote
b:如果Prevote阶段没有+2/3对同一个blockID或者nil的投票,那么针对nil投Precommit的vote
然后一直等待接收其他Validators的Precommit投票
a:如果收到了针对同一blockID的+2/3的投票,进入commit阶段
b:如果收到了+2/3节点的投票但是大家未达成一致,起一个timeout,如果在timeout内未收到针对同一blockID的+2/3的投票,那么重新对高度n进行共识,round会加1,proposer也会进行更换,谨防高度n round 0的Proposer是拜占庭节点
5 Commit阶段
保存共识的block,调用abci让app更新世界状态。
然后启动对高度n+1的共识