什么是拜占庭将军问题
拜占庭将军问题(Byzantine Generals Problem)是由莱斯利·兰波特提出的分布式对等网络通信容错问题
想象一下,如果你是一支拜占庭军队的君主,并且准备攻击一座敌方城池,在城市周围有几支其他将军领导的军队。如果大家一起进攻,那么一定可以大获全胜;如果不合作分散进攻,那么就会导致失败;
这个时候作为君主的你决定在傍晚进攻,在那个时期,没有电话来联系所有的将军让大家一起傍晚发起进攻,所以你只能通过传令兵来传递信息。
那么问题来了,
- 如果传令兵在路途中被杀害怎么办(信息丢失)?
- 又或者传令兵被抓住,把信息换成假信息怎么办(信息有误)?
- 更甚者如果底下有的将军叛变了,你发布的是进攻命令,但是叛变将军就是不出兵怎么办?
这样一来各支军队的一致协同就遭到了破坏
所以,你该怎么确保所有的军队会达成共识,并且同时出击?这个就是拜占庭将军问题。
拜占庭将军问题有很多解决方法,下面介绍一种业界流行的方法:实用拜占庭容错算法(PBFT)
此方法并非最终方法,不过是非常有名的一个解决拜占庭问题的算法,我们可以先明白这个算法的原理,然后触类旁通的去学习其他拜占庭问题算法。
实用拜占庭容错算法(PBFT)
核心就是,对于收到命令的将军,都要主动给其他将军再发一遍相同的命令,其本质就是利用通信次数获取信用。
实用拜占庭容错算法过程,总共五个阶段
为了方便大家理解,我画了一些过程图方便大家理解,我们假设有四个将军一起进攻城池,其中将军2是叛徒,会把进攻命令传成撤退命令
1.你告诉将军0,发起进攻(请求阶段)
2.将军0收到进攻指令之后,把进攻指令传给将军1,2,3(兄弟们皇上让我们进攻)(预准备阶段 pre-prepare)
3.将军1,2,3 收到消息之后,分别向其他将军传递信息(准备阶段 prepare)
4.各个将军收到其他将军消息之后,会比对所有的信息,少数服从多数,做出最后的决定(提交阶段 commit)
5.各个将军执行命令成功之后,会告诉皇帝,我执行进攻了(reply阶段)
最终在三位将军的攻击下,我们打下了这座城池,将军们都感慨你的英明决策,可以让有叛徒的情况下,让大多数将军正确执行命令,攻下城池。
我们再来复习一下实用拜占庭容错算法的核心:对于收到命令的将军,都要主动给其他将军再发一遍相同的命令,其本质就是利用通信次数获取信用。
相信大家会对PBFT算法有更好的理解
以上就是拜占庭将军最火的解决方法 --- 实用拜占庭容错算法(PBFT)的粗糙讲解过程,不知道大家理解了没有,如果有疑问可以在评论区和我进行交流。
其他文章预告
- 《区块链系列(一)- 比特币的前世今生》
- 《区块链系列(二)- 拜占庭将军问题》
- 《区块链系列(三)- 区块链到底是什么》10月21日发布
- 《区块链系列(四)- 彻底读懂何为双花》10月23日发布
- 《区块链系列(五)- 你必须了解一点区块链挖矿技术》10月25日发布
- ......