简介
BFT拜占庭容错不是指一种算法,而是解决拜占庭将军问题的一类算法。分布式一致性算法选择最简单的BFT拜占庭容错,作为一致性算法入门一定能事半功倍。在分布式(一)中我们了解了一些基本理论,我们知道在有分区存在的情况下不能能出现完美的可用性和数据一致性,我们在项目中必须要最大限度做到分布式一致性,同时又要保证系统性能,所以必须了解分布式一致性算法。
拜占庭将军问题
拜占庭将军问题(The Byzantine Generals Problem)提供了对分布式共识问题的一种情景化描述,由Leslie Lamport等人在1982年首次发表。
拜占庭将军问题描述的场景:
拜占庭帝国n只军队驻扎在敌城外,敌人虽然不如拜占庭军队,但是可用抵抗n/2的拜占庭军队同时进攻,少于等于n/2军队进攻一定会失败。基于一些限制条件,拜占庭的n只军队不能汇集一点进攻,必须分散开来。每支军队都有各自的将军和指挥,并且每支军队之间都不能直接通信,只能使用信使间接通信。
在观察敌情之后,他们必须制定一个共同的进攻或撤退计划,只有当半数以上的将军共同发起进攻时才能取得胜利。其中有一些将军或指挥是叛徒,他们虽然不能截获或修改其他人的消息,但是他们可用使用假情报(如有利进攻时发撤退等),试图阻止忠诚的将军达成一致的行动计划。
拜占庭将军问题中并不去考虑通信兵是否会被截获或无法传达信息等问题,即消息传递的信道绝无问。Lamport已经证明了在消息可能丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的。所以,在研究拜占庭将军问题的时候,我们已经假定了信道是没有问题的,并在这个前提下,去做一致性和容错性相关研究。如果需要考虑信道是有问题的,这涉及到了另一个相关问题:两军问题。
我们将拜占庭将军问题简化成了,所有忠诚的将军都能够让别的将军接收到自己的真实意图,并最终一致行动;而形式化的要求就是,“一致性”与“正确性”。
一致性:每个忠诚的将军必须收到相同的命令值vi(vi是第i个将军的命令)
正确性:如果第i个将军是忠诚的,那么他发送的命令和每个忠诚将军收到的vi相同。
Lamport 对拜占庭将军的问题的研究表明,当 n > 3m 时,即叛徒的个数 m 小于将军总数的 n 的 1/3 时,通过口头同步通信(假设通信是可靠的),可以构造同时满足“一致性”和“正确性”的解决方法,即将军们可以达成一致的命令。
两将军问题
拜占庭问题前,就已经存在两将军问题(Two Generals Paradox):两个将军要通过信使来达成进攻还是撤退的约定,但信使可能迷路或被敌军阻拦(消息丢失或伪造),如何达成一致?
根据FLP不可能原理,两将军问题无通用解。
与分布式对应关系
在分布式系统领域, 拜占庭将军问题中的角色与计算机世界的对应关系如下:
将军, 对应计算机节点;
忠诚的将军, 对应运行良好的计算机节点;
叛变的将军, 被非法控制的计算机节点;
信使被杀, 通信故障使得消息丢失;
信使被间谍替换, 通信被攻击, 攻击者篡改或伪造信息。
如上文所述,拜占庭将军问题提供了对分布式共识问题的一种情景化描述,是分布式系统领域最复杂的模型。此外, 它也为我们理解和分类现有的众多分布式一致性协议和算法提供了框架。现有的分布式一致性协议和算法主要可分为两类:
一类是故障容错算法(Crash Fault Tolerance, CFT), 即非拜占庭容错算法,解决的是分布式系统中存在故障,但不存在恶意攻击的场景下的共识问题。也就是说,在该场景下可能存在消息丢失,消息重复,但不存在消息被篡改或伪造的场景。一般用于局域网场景下的分布式系统,如分布式数据库。属于此类的常见算法有Paxos算法、Raft算法,、ZAB协议等。
一类是拜占庭容错算法,拜占庭将军问题之所以难解,在于任何时候系统中都可能存在多个提案(作恶成本很低),并且要完成最终的一致性确认过程十分困难,容易受到干扰。但是一旦确认,即最终确认,概率上是100%。简单的说就是解决分布式系统中既存在故障,又存在恶意攻击场景下的共识问题,一般用于互联网场景下的分布式系统,如在数字货币的区块链技术中。属于此类的常见算法有PBFT算法、PoW算法。
BFT 算法
拜占庭将军问题提出后,有很多的算法被提出用于解决这个问题。这类算法统称拜占庭容错算法(BFT: Byzantine Fault Tolerance)。BFT从上世纪80年代开始被研究,目前已经是一个被研究得比较透彻的理论,具体实现都已经有现成的算法。
拜占庭将军问题是对现实世界的模型化,由于硬件错误、网络拥塞或中断以及遭到恶意***等原因,计算机和网络可能出现不可预料的行为。拜占庭容错技术被设计用来处理现实存在的异常行为,并满足所要解决的问题的规范要求。
区块链网络环境符合拜占庭将军问题模型,有运行正常的服务器(忠诚的拜占庭将军),有故障的服务器,还有破坏者的服务器(叛变的拜占庭将军)。共识算法的核心是在正常的节点间形成对网络状态的共识。
通常,发生故障的节点被称为拜占庭节点,而正常的节点为非拜占庭节点。
拜占庭容错系统是一个拥有n台节点的系统,整个系统对于每一个请求,满足以下条件:
A、所有非拜占庭节点使用相同的输入信息,产生同样的结果;
B、如果输入的信息正确,那么所有非拜占庭节点必须接收这个信息,并计算相应的结果。
拜占庭系统普遍采用的假设条件包括:
A、拜占庭节点的行为可以是任意的,拜占庭节点之间可以共谋;
B、节点之间的错误是不相关的;
C、节点之间通过异步网络连接,网络中的消息可能丢失、乱序并延时到达,但大部分协议假设消息在有限的时间里能传达到目的地;
D、服务器之间传递的信息,第三方可以嗅探到,但是不能篡改、伪造信息的内容和验证信息的完整性。
原始的拜占庭容错系统由于需要展示其理论上的可行性而缺乏实用性。另外,还需要额外的时钟同步机制支持,算法的复杂度也是随节点增加而指数级增加。