一、拜占庭将军问题
1.概念、实质与条件
拜占庭将军问题的核心:军中可能有叛徒,军队保证进攻一致性的同时,又要避免军中叛徒的破坏。 在拜占庭将军问题中,将军们必须有一个预定的方法,使所有忠诚的将军能够达成一致,即使有几个叛徒传递了错误消息,也不会使忠诚的将军做出错误的计划。
拜占庭将军问题的实质是:要寻找一个方法,使将军们能在一个有叛徒的非信任环境中建立对战斗计划的共识。
拜占庭将军问题已经被证明的结论是:如果背叛的将军超过了将军总数的1/3,达成一致性目标是不可能的。
2.两军问题
白军驻扎中间,蓝军分设左右两边。蓝军只有合力进攻才能够打败白军,而且左右蓝军只能派遣通信兵穿过白军阵地才能与对方蓝军协商进攻时间。而蓝军通信兵经过敌人阵地可能被捕。换言之,两军问题中的信道是不可靠的,并且其中没有叛军之说,这是两军问题和拜占庭将军问题的根本不同。
两军问题的关键在于信道的不可靠。然而并不存在一个能使蓝军一定胜利的通信协议,所以两军问题在经典情景下是不可能有解的。
即使是三次握手也并不能够彻底解决两军问题,只有在现实成本可控的条件下,我们把TCP协议当做了两军问题的现实可解方法,即通过有限次数的双方回执来确认消息已经到达。
3.拜占庭将军问题的解决与意义
拜占庭将军问题考虑的主要问题子啊与通信的多方,存在有故意破坏者或叛徒的情况下,如何保持正确的一致性的问题。其复杂性可以用计算机容错学里的概念表述:
(1)拜占庭容错。是指有一个节点根本不按照程序和逻辑执行,对它的调用会返回随意或者混乱的结果。要解决这一问题需要有同步网络,并且故障节点必须小于1/3;通常只有某些特定领域才会考虑这种情况,并通过高冗余来消除故障。
(2)崩溃容错。比拜占庭容错多一个限制,即节点总是按照程序逻辑执行, 并且结果是正确的,但是不保证消息返回的时间。原因可能是网络中断、节点崩溃后重启或者异步网络中的高延迟等。
(3)遗漏容错。比崩溃容错多一个限制,即一定要“非健忘”。“非健忘”是指这个节点在崩溃之前能把状态完整地保存在持久存储器上,启动之后可以再次按照之前的状态继续执行和通信。
(4)崩溃停止容错。即一旦发生故障,这个节点就不会再和其他节点有任何交互。
区块链记账机制面临的问题与拜占庭将军问题很相似。区块链的各个节点都会互相传递交易信息,其中有一部分记账节点将交易信息收集起来,定期生成包含交易信息的账本。记账节点就是“将军”,会传递错误或者恶意消息的节点就是“叛徒”,节点之间的消息相当于“信使”。
各个节点通过消息传递来更新账本,因此需要提前约定一个统一的算法协议,并保证生成出来的账本满足下面3点要求:
(1)一致性,所有节点看到的账本是一样的;
(2)正确性,账本中不能包含错误的信息;
(3)不可篡改,账本一旦生成,就不能修改。
这个算法协议,在区块链中被称为共识机制,并且区块链能够很好地解决拜占庭将军问题。
二、共识算法
分布式共识协议具有以下两点属性:
(1)如果所有公正节点达成共识,共识过程终止。
(2)最后达成的公式必须是公正的。
由于私有链是封闭生态的存储网络,因此使用传统分布式一致性模型应该是最优的选择;基于联盟链的半封闭、半开放特性,使用DPoS是最优的选择;而对于公有链,PoW应该是最优的选择。