拜占庭共识算法

1112615-18404389912f3674.png

拜占庭共识算法有一个前提:
安全节点数 R(eliable) 大于不安全节点数 E(vil)。而且理想情况下R方希望投票结果是统一的。

  1. 如果E方放弃投票,不能让结果受到影响,所以 总票数P < R 时,也可以有结果
  2. 最不理想的情况下 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)时,投出来的票才是可靠的

然后,祭出拜占庭投票的流程,以及算法模拟流程

1112615-e6ae9dfe99ec70df.png
节点投票流程

其中D为发送请求端,R0 R1 R2 R3为服务端:

  1. Request:D发起投票请求,挑一个服务发送即可,这里选择R0
  2. Pre-Prepare:率先收到的R0节点广播到 R1 R2 R3,进入Prepare阶段
  3. Prepare:R0 R1 R2 R3 互相广播,告知其他节点已收到投票请求,并进入了Prepare阶段
  4. Commit:处在Prepare阶段的节点收到 2/3节点的返回后表示都在Prepare阶段,则广播自己进入Commit阶段
  5. Reply:在Commit阶段的节点收到其他2/3节点都进入Commit阶段了,则对C进行反馈,宣布自己的投票结果

最后本来想自己写个实现的,但是Java实现太重量级了,贴个别人用Go语言实现的吧

https://github.com/bigpicturelabs/consensusPBFT

1112615-a586c697ca4cca34.jpg
Go的拜占庭实现

喜欢请留个赞,随便转载:
https://www.jianshu.com/p/38b25920b247

猜你喜欢

转载自blog.csdn.net/weixin_33852020/article/details/87328046