拜占庭将军问题本质其实描述的是拥有可靠信道的分布式系统中的共识问题,那么为什么要叫拜占庭将军问题呢
在描述分布式系统的共识问题时,其主创们(Leslie Lamport, Robert Shostak, Marshall Pease)也纠结了很久,因为他们发现在并发领域,哲学家吃饭问题(The Philosopher’s Eating Problem)比读者-写者问题(Reader-Writer Problem)获得了更多的关注,但是显然读者-写者问题的用处是更大的。于是他们得出了一个结论,给研究性问题起一个故事性的名字能够获得更多的关注。
而在此之前,曾用中国将军问题(Chinese Generals Problem,也叫作两军问题)描述过不安全链路(消息就是或篡改)上的通信和协调问题,不考虑背叛者存在。他们认为分布式共识问题与中国将军问题是一脉相承的,于是也想起一个与将军相关的名字,但是又不希望这个名字会引起任何国家或地区的不适,于是选择了拜占庭将军问题(The Byzantine Generals Problem)。
拜占庭将军问题描述了一个军事战略问题:拜占庭帝国想要攻打某个城市,于是派出N个将军分别带领N个军队去完成这件事,这个问题同时满足一下条件:
目前有一个普遍的认知,当背叛者大于或等于三分之一时,这个问题是无解的。同样的,如果通信兵存在被杀或者背叛的情况,这个问题同样无解,即在信道存疑(丢失或篡改)的情况下,共识问题不可能达成。
显然,这个问题是一个非常复杂的问题。幸运的是,在计算机领域,可靠信道传输问题已经有了很多成熟的解决方案,至少可以保证信息一定能到达。也就是说通信兵被杀的情况可以不做考虑。
另外,通信兵作为背叛者的情况也可以不做考虑。通信兵如果背叛,会故意传输错误的信息,对应到计算机领域,就是信息在传输过程中被恶意篡改。这种情况一般是有外部黑客恶意攻击系统,在现有的技术框架下,有很多解决这一问题的办法,最基本的思想就是篡改信息的成本远大于篡改成功后的收益,自然就能大大减少这种情况的发生。策略虽各有不同,但本质都是提升篡改信息的难度,如加密等,同时降低篡改成功后的收益,这种就看具体情况了,这里不详细展开。
事实上,如果通信兵背叛,对于其他将军而言,这个通信兵的将军就相当于背叛了,但是如果在排除这个将军以后,其他将军依然能做出一致性决策,那么这个将军最终也会做出正确的决策。只是这样的话将军和通信兵合为一体,只要有一个背叛者,这个共同体就需要算作背叛者,最后如果总的背叛者数目依然不超过N/3,那么也能达到胜利的目的
拜占庭将军问题,可以描述为在拥有可靠信道的分布式系统中的共识问题,即N个将军怎样在存在背叛者的情况下保证最终达成一致决策,实现军事胜利。这个时候我们可以这样描述这个问题:
PBFT是对BFT算法的优化,是目前为止流传最广的共识算法,将BFT的时间复杂度从指数级降到了多项式级。该算法的核心方法用一句话就可以描述:接收到某个将军的消息后,会遍历询问其他将军收到什么样的消息。
举个栗子:有A,B,C,D四个将军,其中可能存在背叛者,但是不超过4/3个,也就是最多只有一个背叛者。假设A作为消息发起者发送消息分别给B,C,D。这时候分两种情况:
我们可以就这两种情况分别考虑:
第一种情况,BCD最终会收到的消息分别是[1(from A),2(from C),3(from D)],[1(from B),2(from A),3(from D)],[1(from B),2(from C),3(from A)],如此一来,三个将军都会知道A是背叛者,只需再同步一轮即可实现一致决策
第二种情况,我们假设B是背叛者,那么BCD最终会收到的消息分别是[1(from A),1(from C),1(from D)],[1(from A),2(from B),1(from D)],[1(from A),3(from B),1(from C)]。这个时候C和D不知道背叛者是谁,可能是A给了B错误消息,也可能是B故意篡改了消息,但是他们能够知道1点钟攻击是正确的时间,因为A和B之间只会有一个背叛者,忠诚者一定会做出正确决策
看起来方法似乎很简单,但是当背叛者出现两个或以上时,这个问题就会变得复杂,这也就是为什么一定要有1/3规则,除了保证最终一定能够达到一致以外,当N很大时,这也是将军们做决策的依据之一。
我们可以进一步简化问题,第二种情况,C和D之所以无法判断谁是背叛者,归更到底是他们没法确定A传给B的消息到底是什么,或者说将军们传递消息的方式是通过一种非常容易模拟和篡改的方式。之前我们说过,如果篡改的代价过大,就能最大可能减少篡改的发生。假设BCD在询问彼此收到的消息是什么时直接把A发送出来的消息原件发出来,那么这个问题是不是就简单了很多呢,简单的击鼓传花就能达到消息一致。但是同时这又引入新的问题:
万幸这些问题在计算机领域都是可以解决的,区块链技术就是这样做的。但是在真的应用时,还存在一个问题,就是A是谁,是怎么选出来的,如果每个人都可以成为A,那么通信量显然会爆炸,在区块链中,采用了类似PoW共识算法来提高成为A的代价,算作一个竞争机制。
拜占庭将军问题解决的仅仅是可靠信道上的分布式共识问题,但是也正因为场景单一,这个算法才能更加纯粹,才能用很简单的语言描述清楚这个算法。在用算法解决实际问题时,在初始状态下是否也需要提取出来这样纯粹的场景:比如因为信道不可信导致的问题复杂度在场景中被彻底排除。