[PBFT]Practical Byzantine Fault Tolerance[二]<View-Change>视图更换理解
一、视图更换的必要性
视图更换是系统由于Primary出故障而能够保证可用性(liveness)的手段,可用性指操作能够在有效时间内完成。
checkpoint, stable checkpoint
the states produced by the excution of these requests : checkpoint
a checkpoint with a proof : stable checkpoint
proof指节点达成2f+1的共识,达成全网共识的checkpoint就是stable checkpoint。
checkpoint是对于单个节点来说的,其设置是周期性的,比如说节点每当消息序号n是100的倍数设置一次,每个节点设置checkpoint相互独立,chekpiont消息带有请求的序列号,水位线机制确保了最低chekpoint和最高checkpoint的间隔。节点在确立检查点的时候会多播<CHECKPOINT,n,d,i>消息给其他节点;stable checkpoint是对于全网节点来说的,达到全网共识的checkpoint就是stable checkpoint。
checkpoint的作用:减少内存占用。
二、视图更换的流程
backup在收到有效请求但并未执行的时候就会进行等待,这期间会开始计时(starts a timer),计时在等待时启动,非等待状态会停止。
-
节点检查到timer超期会停止接受消息并多播一个视图更换消息<VIEW-CHANGE,v+1,n,C,P,i>给所有的replica。n代表i当前所知道的最新稳定检查点s(stable checkpoint)的消息序号,C是2f+1个能够证明s正确的有效的检查点消息<CHECKPOINT,n,d,i>集合,集合P由Pm构成,m是所有大于n的消息的序列号,集合Pm是由在i中达成prepared状态的消息的集合,Pm的内容包括关于m的pre-prepare消息和2f个prepare消息。
-
当下一个视图确定的primary p收到2f+1个视图更换消息后,就会多播一个<NEW-VIEW,v+1,V,O>的消息给所有的节点,V是p收到和发出的有效的
消息的集合,O是pre-prepare状态的消息的集合。
O的确定,p根据收到的消息可以得知min_s和max_s。min_s是p收到的所有 消息中最新的稳定检查点的消息序号n,max_s指的是 消息中已知是prepare状态的最大消息序号(由集合P得到)。确定min_s和max_s之后,p就为这些消息创建pre-prepare消息。 -
p将所有的O中的消息写入自己的日志,其他节点在对O验证之后就接受
消息。到这里就完成了视图的更换,之后的流程与三阶段消息就一样了。
其他优化
1. 为了节省网络带宽和CPU占用,通过client指定一个replica存储计算结果,其它replica存储计算结果的摘要,如果验证后发现结果不正确,再重新提交请求,要求所有节点都提交完整信息。
2. 当不发生视图更换的时候,节点到达prepare状态之后,会执行节点的请求并发送临时结果给client,当client收到2f+1个相同的临时性结果时就可以接受。这一步利用了从prepare到commit之间的等待时间。
参考文献
https://www.jianshu.com/p/fb5edf031afd
https://www.cnblogs.com/gexin/p/10242161.html
https://lessisbetter.site/2020/03/22/why-pbft-needs-viewchange/
https://zhuanlan.zhihu.com/p/35847127