浅谈拜占庭将军问题

浅谈拜占庭将军问题

了解过比特币和区块链的人,多少都听说过拜占庭将军问题,今天要分享的就是拜占庭共识的问题。

拜占庭将军问题是什么

拜占庭将军问题是一个共识问题,首先由Leslie Lamport与另外两人在1982年提出,被称为The Byzantine Generals Problem或者Byzantine Failure。核心描述是军中可能有叛徒,却要保证进攻一致,由此引申到计算领域,发展成了一种容错理论。随着比特币的出现和兴起,这个著名问题又重入大众视野。

拜占庭将军问题场景

拜占庭是东罗马帝国的首都,这是一个国土辽阔的帝国,其用于防御的军队彼此都分离的很远,各个军队彼此之间靠信差传消息。战争发生时,他们无法聚在一起来商讨进攻与否,只能彼此之间通过信使来传递彼此的决定。

困扰这些将军的问题是,他们不确定他们中是否有叛徒,叛徒可能擅自变更进攻决定。在这种状态下,拜占庭将军们能否找到一种分布式的协议来让他们能够远程协商,从而就进攻问题达成一致?这就是著名的拜占庭将军问题。

浅谈拜占庭将军问题

背景:拜占庭派10支军队去围攻一个强大的敌人,至少6支军队同时进攻才可以取胜,否则不进攻。

难题:其中一些将军是叛徒,会发布假消息或者相反的进攻意图。

目的:所有将军远程协商最终达成一致。

拜占庭解决方案:

1、每个将军给其他所有将军发送指令。

2、每个将军根据自己收到的指令来决定最终的策略。

缺点:每个将军都要向其他将军发送指令,如果人数很多的话,达成一致的时间比较长。

成立前提

前提1、通信没问题,每个将军发出的信息中间没有阻断,都顺利传达。

前提2、n≧3m+1,n代表将军总数,m代表叛徒的数量。即如果叛徒有1人的话,总数最少3×1+1=4人,叛徒有3人的话,总数最少为3×3+1=10人。

如下图所示,进攻命令为1,按兵不动命令为0,下面列举其中的一种情况。

浅谈拜占庭将军问题

可以看出来,忠将A发出的指令的都是1,收到的指令是1、1、0,最后指令为1,即进攻

叛将B发出的都是0,收到的指令是1、1、1,正常来说应该做出1的指令,但叛将捣乱,最后指令为0,即B选择不出兵

忠将C发出的都是1,收到的是1、1、0,最后指令为1,即进攻

忠将D发出的都是1,收到的是1、1、0,最后指令为1,即进攻

浅谈拜占庭将军问题

最终A、C、D达成共识进攻并取得胜利。

上面的事例中,叛将B发出的都是0指令,感兴趣的老铁可以试着自己推演一下,当叛将B发出其他的指令时,例如:1、1、0或者1、0、0亦或是1、1、1后结果是什么样的,也可以多加几个将军进行一下推演,经过推演你可以发现,共识总是可以达成的,要么进攻保证成功,要么统一不进攻,通过推演你也可以更深刻的理解拜占庭将军的共识问题。

当然,为了说的明白一点上面只用了4个节点,实际情况下节点要多的多,复制程度也高很多,但是,只要满足上面的情况,最后还是都能达成共识的。

需要注意的一点是,拜占庭问题最后取得的共识有可能是进攻,也有可能是不进攻,最终目的不是为了胜利,而是为了统一行动,不让忠将因为错误信息而牺牲。


分享到:


相關文章: