标题：The Byzantine Generals Problem
个人简介
英文为了利于对“拜占庭将军”问题原意的理解把英文解释奉上：
Byzantine General Problem ——The problem of reaching a consensus among distributed units if some of them give misleading answers. The original problem concerns generals plotting a coup. Some generals lie about whether they will support a particular plan and what other generals told them. What percentage of liars can a decision making algorithm tolerate and still correctly determine a consensus?中文拜占庭帝国就是5～15世纪的东罗马帝国，拜占庭即现在土耳其的伊斯坦布尔。我们可以想象，拜占庭军队有许多分支，驻扎在敌人城外，每一分支由各自的将军指挥。将军们只能靠通讯员进行通讯。在观察了敌人以后，忠诚的将军们必须制订一个统一的行动计划。然而，这些将军中有叛徒，他们不希望忠诚的将军们能达成一致，因而影响统一行动计划的制订与传播。问题是：将军们必须有一个算法，使所有忠诚的将军们能够达成一致，而且少数几个叛徒不能使忠诚的将军们做出错误的计划。
解决拜占庭将军问题的保证
解决拜占庭将军问题的算法必须保证：所有忠诚的将军基于相同的计划做出决策忠诚的将军按算法的要求行动，而叛徒则按他们自己的意志行动。算法要保证不管叛徒怎么做，条件A都能得到保证。忠诚的将军们不但要能达成一致，而且要同意一个合理的计划。这就要求条件B。
少数叛徒不能使忠诚的将军做出错误的计划这一条是很难做到的，因为“错误的计划”很难形式地加以定义。
我们考虑将军们怎么达成一致。设有n个将军，v(i)表示第i个将军送出的信息。每个将军用相同的方法把v(1),…,v(n)按某一种逻辑方式组合起来，形成一个行动计划。要满足条件A，将军们就必须用同样的方法来组合这些信息。而条件B要求使用的方法是健壮的。考虑最简单的情况，如果决定只有进攻和撤退两种可能，v(t)就是将军认为选择那一种行动最好，而最后的决定则基于多数表决。少数叛徒只有在忠诚的将军们几乎随机地（每一种选择的概率都是1/2）做出决策时才能影响决策，但既然每一种选择的概率都是1/2，那就不管怎么决策都不能说是坏的。
如果把第i个将军的信息v(i)送给其他将军。由于条件A要求每一个忠诚的将军得到v(1),…,v(n)相同的值，而叛徒将军可以给不同的将军送不同的值。为了使条件A得到满足，下面两条必须成立：
1．每一个忠诚的将军得到v(1),…,v(n)相同的值。
这就意味着忠诚的将军并不一定使用第i个将军送来的信息作为v(i)。因为第i个将军可能是叛徒。但这又可能使忠诚的将军送来的信息也被修改，因为忠诚的将军并不知道第i个将军是忠诚的，还是叛徒。如果要满足条件B，这是不能允许的。例如，我们不能因为少数叛徒说“撤退”，忠诚的将军说“进攻”，而做出“撤退”的决定。因此，要求
2．对每一个 i，如果第i个将军是忠诚的，其他忠诚的将军必须以他送出的值作为v(i).
我们可以重写条件1如下。
1’。 对每一个 i，不论第i个将军是忠诚的，或是叛徒，任何两个忠诚的将军使用相同的值v(i).
条件1’和2都只牵涉到第i个将军怎么送一个值v(i)给其他的将军。因此，我们可以用司令送命令给副官的方式叙述如下：
拜占庭将军问题：一个司令要送一个命令给他的n-1个副官，使得
IC1。所有忠诚的副官遵守同一个命令。
IC2。假如司令是忠诚的，则每一个忠诚的副官遵守他送出的该命令。
条件IC1和IC2称为交互一致性条件。注意，如果司令是忠诚的，IC1可以从IC2推出来。但是，司令并不一定是忠诚的。
这个问题比过去的容错更困难。因为过去的容错都是针对那样一些软硬件故障，其故障效果是固定的。而拜占庭故障却假定故障机是鲜活的，它可以做坏事。
拜占庭将军问题的可解性
拜占庭将军问题的可解性
叛徒数大于或等于1/3叛徒数大于或等于1/3，拜占庭问题不可解
如果有三位将军，一位副官是叛徒，如图1所示。当司令发进攻命令时，副官2可能告诉副官1，他收到的是“撤退”的命令。这时副官1收到一个“进攻”的命令，一个“撤退”的命令，而无所适从。
如果司令是叛徒，如图2所示。他告诉副官1“进攻”，告诉副官2“撤退”。当副官2告诉副官1，他收到“撤退”命令时，副官1由于收到了司令“进攻”的命令，而无法与副官2保持一致。
正由于上述原因，在三模冗余系统中，如果允许一机有拜占庭故障，即叛徒数等于1/3，因而，拜占庭问题不可解。也就是说，三模冗余对付不了拜占庭故障。三模冗余只能容故障-冻结(fail-frost)那类的故障,就是说，元件故障后，它就冻结在某一个状态不动了。对付这类故障，用三模冗余比较有效。用口头信息，叛徒数少于1/3用口头信息，如果叛徒数少于1/3，拜占庭问题可解
注意，这里说“少于1/3”表明，要对付一个叛徒，至少要用四模冗余。在四模中有一个叛徒，叛徒数是少于1/3的。所谓口头信息，是指它满足三个条件：① 传送正确，② 接收者知道是谁发的。③ 沉默（不发信息）可以被检测。拜占庭问题可解是指：所有忠诚的副官遵循同一命令。若司令是忠诚的，则所有忠诚副官遵循其命令。我们可以给出一个多项式复杂性的算法来解这一问题。算法的中心思想很简单，就是司令把命令发给每一副官，各副官又将收到的司令的命令转告给其他副官，递归下去，最后用多数表决。如图3所示。如果司令是忠诚的，他送一个命令v给所有副官。若副官3是叛徒，当他转告给副官2时命令可能变成x。但副官2收到{v, v, x}，多数表决以后仍为v，忠诚的副官可达成一致。如果司令是叛徒，如图4所示。他发给副官们的命令可能互不相同，为x, y, z。当副官们互相转告司令发来的信息时，他们会发现，他们收到的都是{x,y,z}，因而也取得了一致。用书写信息，至少2/3的将军是忠诚的用书写信息，如果至少有2/3的将军是忠诚的，拜占庭问题可解
所谓书写信息，是指带签名的信息，即可认证的信息。它是在口头信息的基础上，增加两个条件：① 忠诚司令的签名不能伪造，内容修改可被检测。② 任何人都可以识别司令的签名，叛徒可以伪造叛徒司令的签名。一种已经给出的算法是接收者收到信息后，签上自己的名字后再发给别人。由于书写信息的保密性，可以证明，用书写信息，如果至少有2/3的将军是忠诚的，拜占庭问题可解。
如果司令是叛徒，他送“进攻”命令给副官1，并带有他的签名0，送“撤退”命令给副官2，也带签名0。副官们转送时也带了签名。于是副官1收到{“进攻”：0，“撤退”：0,2}，说明司令发给自己的命令是“进攻”，而发给副官2的命令是“撤退”，司令对我们发出了不同的命令。对副官2也同样。
形式描述
考虑网络N，包含n个处理器，或叫游戏者，记为1,2,…,n，设n≥4。每一个处理器是一个交互的、概率的多项式时间图灵机。设网络N是完全的以私人通道连接，即每对处理器皆可互相通信而不能被其他处理器读取。该网络是同步的，即有统一的时钟。在d和d+1个脉冲间送出的信息将在d+1个脉冲时收到。
游戏者i称为是好的，如果它遵循协议，即正确执行其程序，在适当的时间在适当的地点写入返回的值。i称为是坏的，如果它破坏了该协议。如果坏的游戏者被敌手选用和控制，则更一般的故障行为可能发生。敌手是一个算法，在一个网络中发作，腐化一定比例的游戏者。
定义：设A是一个概率算法，r为常数。A称为是一个r-敌手，如果A可以在任何n游戏者的、运行任何协议P的网络上发作，并且满足：
(1) A可以读取非私人通道上的任何通信链路。
(2) A可腐化任何t个游戏者。当A腐化i时，A可以读取i的所有数据，并夺取i输出的执行写控制。
(3) 动态性：A可以在P的任何步骤上腐化游戏者。
(4) 急促性：A读第d周期内通过非私人通道传送的信息。第d周期私人通道信息在第d周期送给坏游戏者。基于这些信息，A在第d周期腐化其他的游戏者（少于t个）。而且在第d周期把d周期信息送给新被腐化者。这一过程继续到腐化t个游戏者。在第d+1个脉冲之前，A不需要选择在第d周期由坏游戏者送给好游戏者的信息。
(5) A可以即时完成无限步的计算
有文章给出了拜占庭一致性算法，不要求亲信伙伴和预处理。给定私人通信链路，可望在常数时间内达成一致，如果同步网络故障机；异步网络，故障机。如果不能保证私人通信，可以用密码得到在容错和敌手有限计算能力的运行时间两方面最优的算法。在这种情况下，对异步网络也能容n/3个故障。
可信计算中的拜占庭将军问题
可信计算中必须考虑人为的故障，特别是人为恶意的攻击。这是保证计算安全性的基本出发点，在今天的网络环境下有非常重要的现实意义。拜占庭将军问题不过是保持并行计算中数据一致性问题的一个抽象表达。一种抽象表达往往能把本质问题从繁琐的工程实现中提取出来，对于基础研究极其重要。工程师们常常被繁琐的工程任务所左右，在保证安全的要求下要考虑的问题非常多，而忽略了提纲挈领的功夫。
在可信计算领域，过去考虑的故障-冻结模式，假定部件故障以后就“死”去了，不再工作了。现在我们必须考虑故障-活动模式，即部件故障以后，它可能仍然活动，甚至进行系统所有者所不希望它做的事情。这正是电子对抗中要着力研究的问题。
并行计算中有两个基本问题：一个是控制的同步性；一个是数据的一致性。不论是并行的处理器，还是并行的线程，总需要保持某种程度上的同步，以期达到各个计算部件之间的协同与合作。尽管这种同步可以是紧耦合，也可以是松散的耦合。另一方面，各计算部件之间的数据一致性也至关重要。例如银行系统在为用户存取款服务时，人名的查找必须和存取款数量相对应，否则就错了。而这两件事可能由不同的计算部件或不同的时刻完成。而这种一致性常常能被故障，特别是恶意攻击所破坏。敌人的攻击也常常是利用这一点。拜占庭将军问题只把数据简化为二值的0和1。当然，多版本的一致性不单是“进攻”和“撤退”这样简单的信息，但原理是一样的。
为了保持多版本的一致性，系统需要一定的时间。在这段时间内，系统还没来得及达成一致，系统可能有可攻击的脆弱之处。这段时间表现为故障潜伏期，即敌人的攻击不一定马上生效，系统在某一时机来到时就可能做出错误的响应。
解拜占庭将军问题的算法给我们提供数据一致性的思路和算法。而在该算法中就有各位将军的同步问题。这些问题都为计算可信性的提高以启发。要解决拜占庭将军问题需要四模冗余，硬件开销是很大的。所以，现在银行的异地备份并不都是四模冗余。这就看你的系统要求有多高的安全性，相对于那些投资，孰轻孰重。
从拜占庭将军问题解法可以看出，签名和认证对保证数据安全有节省硬件的效果。这些技术将在后文详细介绍。