拜占庭将军问题:
所有节点如何才能达成共识形成统一的决策
所有将军如何才能达成共识去攻打城堡/撤退
9个将军带领9支军队,打一场攻城战役。假设每个将军都能独立根据眼前战况做出两种判断:进攻或撤退,要求(或者最终目的是)如何让这9个将军的命令是一致的(一致性,即共识)?要么一起进攻,要么一起撤退(每个将军之间也是互不信任的,也有消灭对方的动机)
最简单的策略即:投票(上图中的红色箭头和绿色箭头为每个将军做出的判断),超过半数支持某个决定,那么所有9个将军一定执行这个决定。如上图,4个将军决定进攻,5个将军决定撤退,那么所有将军都会下令:撤退!
这种策略需要每个将军把自己的判断通过一种途径(途中灰色箭头)传递到所有其他将军处。相对的,每个将军只有在收到了所有投票结果后,才会下令。如上面的例子,所有将军得到投票:4进攻5撤退,才下令撤退。
这个投票策略的最大问题:假设出现了叛徒,如上图所示,会出现两种情况:
【1】对自己位置的战场情况进行错误广播(比如他这个地方优势很大,但是投票给撤退)
【2】可以选择靠给不同的将军送去不同的消息破坏整体决定的一致性(导致左边四个将军选择撤退,右边四个将军选择进攻)
【拜占庭将军问题一般性结论】如果叛徒的数量大于或等于三分之一 ,那么拜占庭问题不可解。这个三分之一也被称为拜占庭容错,三模冗余是完全无法容错的(也就是说无解,不可能保持一致性)。
在区块链之前,有两种解决方案:投票或节点共识/口头协议(又称为拜占庭容错算法)和书面协议
通常来说,大多数分布式系统使用的是书面协议确保一致性,中心机构背书。其中有实用拜占庭容错算法(PBFT)最为有名。
PBFT的核心思想是:对于每一个收到命令的将军,都要去询问其他人,他们收到的命令是什么。也就是说利用不断的信息交换让可行的节点确认哪一个记录选择是正确的,即发现其中的背叛者
采用PBFT方法,本质上就是利用通信次数换取信用。每个命令的执行都需要节点间两两交互去核验消息,通信代价是非常高的。通常采用PBFT算法,节点间的通信复杂度是节点数的平方级的
拜占庭问题的核心就是一致性问题,区块链利用共识算法解决了一致性问题。
先假设信道一定是可靠的,传令兵死亡之类的事情我们不考虑,毕竟在一个非常复杂的网络中,还可以通过多条的方式连接任意两个节点,可靠性还是值得相信。主要破坏一致性的还是心怀不轨的间谍,或者总结为:如何防止间谍对整体决策(进攻还是撤退)进行破坏?
模拟区块链模型:
每个将军本地都存储一份记录:记录所有将军的决定,比如“1:1”代表1号将军决定进
然后构造以下协议内容:
在拜占庭时期,因为没有网络,构造上述这样的系统,是完全不可能的。而现在网络链路速度,效率越来越高,让区块链解决一致性问题得以解决。
互联网技术的存在,让传输过程中,基本没有延迟(或说延迟很小可以基本忽略),解决了通讯延迟的问题
区块链使用链型数据结构 + 算力互相制约使得作假的成本随着时间的加长呈指数上升,解决了一致性问题。当然非对称秘钥部分的密码学,解决了身份确认问题