区块链系列(二)- 拜占庭将军问题

2,785 阅读3分钟

什么是拜占庭将军问题

拜占庭将军问题(Byzantine Generals Problem)是由莱斯利·兰波特提出的分布式对等网络通信容错问题

image.png

想象一下,如果你是一支拜占庭军队的君主,并且准备攻击一座敌方城池,在城市周围有几支其他将军领导的军队。如果大家一起进攻,那么一定可以大获全胜;如果不合作分散进攻,那么就会导致失败;

这个时候作为君主的你决定在傍晚进攻,在那个时期,没有电话来联系所有的将军让大家一起傍晚发起进攻,所以你只能通过传令兵来传递信息。

那么问题来了,

  • 如果传令兵在路途中被杀害怎么办(信息丢失)?
  • 又或者传令兵被抓住,把信息换成假信息怎么办(信息有误)?
  • 更甚者如果底下有的将军叛变了,你发布的是进攻命令,但是叛变将军就是不出兵怎么办?

这样一来各支军队的一致协同就遭到了破坏

所以,你该怎么确保所有的军队会达成共识,并且同时出击?这个就是拜占庭将军问题。


拜占庭将军问题有很多解决方法,下面介绍一种业界流行的方法:实用拜占庭容错算法(PBFT)

此方法并非最终方法,不过是非常有名的一个解决拜占庭问题的算法,我们可以先明白这个算法的原理,然后触类旁通的去学习其他拜占庭问题算法。


实用拜占庭容错算法(PBFT)

核心就是,对于收到命令的将军,都要主动给其他将军再发一遍相同的命令,其本质就是利用通信次数获取信用。

实用拜占庭容错算法过程,总共五个阶段 image.png

为了方便大家理解,我画了一些过程图方便大家理解,我们假设有四个将军一起进攻城池,其中将军2是叛徒,会把进攻命令传成撤退命令

1.你告诉将军0,发起进攻(请求阶段)

image.png image.png

2.将军0收到进攻指令之后,把进攻指令传给将军1,2,3(兄弟们皇上让我们进攻)(预准备阶段 pre-prepare)

image.png image.png

3.将军1,2,3 收到消息之后,分别向其他将军传递信息(准备阶段 prepare)

image.png

image.png


4.各个将军收到其他将军消息之后,会比对所有的信息,少数服从多数,做出最后的决定(提交阶段 commit)

image.png image.png

5.各个将军执行命令成功之后,会告诉皇帝,我执行进攻了(reply阶段)

image.png image.png

最终在三位将军的攻击下,我们打下了这座城池,将军们都感慨你的英明决策,可以让有叛徒的情况下,让大多数将军正确执行命令,攻下城池。

我们再来复习一下实用拜占庭容错算法的核心:对于收到命令的将军,都要主动给其他将军再发一遍相同的命令,其本质就是利用通信次数获取信用。

相信大家会对PBFT算法有更好的理解


以上就是拜占庭将军最火的解决方法 --- 实用拜占庭容错算法(PBFT)的粗糙讲解过程,不知道大家理解了没有,如果有疑问可以在评论区和我进行交流。


其他文章预告