拜占庭共识算法有一个前提:
安全节点数 R(eliable) 大于不安全节点数 E(vil)。而且理想情况下R方希望投票结果是统一的。
- 如果E方放弃投票,不能让结果受到影响,所以 总票数
P < R
时,也可以有结果 - 最不理想的情况下 R/2的人赞同,R/2的反对,这时候E节点就可以操纵结果了,所以
P > R/2 + E
所以结合两个不等式P > R/2 +E
P < R
得出R > R/2 + E
这就可推测出R + R/2 > R + E
(3/2) R > ALL(总节点数)
辣么 R > ALL(2/3)
所以当安全节点数 R(eliable) 大于总节点的(2/3)时,投出来的票才是可靠的
然后,祭出拜占庭投票的流程,以及算法模拟流程
其中D为发送请求端,R0 R1 R2 R3为服务端:
- Request:D发起投票请求,挑一个服务发送即可,这里选择R0
- Pre-Prepare:率先收到的R0节点广播到 R1 R2 R3,进入Prepare阶段
- Prepare:R0 R1 R2 R3 互相广播,告知其他节点已收到投票请求,并进入了Prepare阶段
- Commit:处在Prepare阶段的节点收到 2/3节点的返回后表示都在Prepare阶段,则广播自己进入Commit阶段
- Reply:在Commit阶段的节点收到其他2/3节点都进入Commit阶段了,则对C进行反馈,宣布自己的投票结果
最后本来想自己写个实现的,但是Java实现太重量级了,贴个别人用Go语言实现的吧
https://github.com/bigpicturelabs/consensusPBFT
喜欢请留个赞,随便转载:
https://www.jianshu.com/p/38b25920b247