共识算法-拜占庭将军问题

title: 共识算法-拜占庭将军问题
tags: 区块链,共识算法
背景 共识算法-拜占庭将军问题
文章图片

由于拜占庭帝国国土辽阔,所以驻守军队之间分隔的很远。每个军队的实力都差不多,将军们平时只能依靠信使相互传递消息。当拜占庭和强大的敌国发生战争时,任意单独的军队都无法战胜敌人,但是超过一半以上的军队联合起来同时进攻就可能赢得战争。但是将军中可能存在叛徒,给其它将军传递错误的信息,干扰其他将军的行动。比如说现在有ABC三个将军,其中B是叛徒,当A向B、C发出提议,某日早晨6点开始进攻,B收到消息,向A回复同意该协议,并向C提议某日下午4点开始进攻,此时C收到了两份不一样的提议,这就使C产生了迷惑。
因此,将军们必须有一个预定的方法协议,使所有忠诚的将军能够达成一致,而且少数几个叛徒不能使忠诚的将军做出错误的计划。

注意:拜占庭将军问题中并不去考虑通信兵是否会被截获或无法传达信息等问题。
拜占庭将军问题 “拜占庭将军问题”也被称为“拜占庭容错”。
【共识算法-拜占庭将军问题】在分布式系统中,特别是在区块链网络环境中,也和拜占庭将军的环境类似,有好的节点(类似忠诚的拜占庭将军),有坏节点,还有恶意节点(类似叛变的拜占庭将军)。通常,这些发生故障节点被称为拜占庭节点,而正常的节点即为非拜占庭节点。
拜占庭假设是对现实世界的模型化,由于硬件错误、网络拥塞或断开以及遭到恶意攻击,计算机和网络可能出现不可预料的行为。
共识算法的核心是在正常的节点间形成共识。
解决拜占庭问题的核心就是:
忠诚的将军遵守的命令和自己发出的命令相同。Lamport(莱斯利·兰伯特)对拜占庭将军间题的研究表明,当n>3m时,即叛徒的个数m小于将军总数n的1/3时,通过同步通信(假设通信是可靠的),将军们可以达成一致的命令。
但如果通信是可认证、防篡改伪造的(如采用PKI认证,消息签名等),则在任意多的叛徒(至少得有两个忠诚将军)的情况下都可以找到解决方案。
而在异步通信情况下,情况就没有这么乐观。异步我们可以简单的理解为有时间差,这就存在了一个问题,可能战争结束了忠诚的将军才收到提议。 Fischer- Lynch- Paterson定理证明了,只要有一个叛徒存在,拜占庭将军问题就无解。
解决方案 在经典的情形下,我们可以找到两种办法,口头协议书面协议
口头协议 口头信息即使将军们派人用口信传达消息,必须满足以下条件:
  • 每个被发送的消息都能够被正确投递
  • 信息接受者知道消息是谁发的
  • 能够知道缺少的消息
口头协议实现很简单,假设我们有10个将军,其中任意一个将军1派信使发送消息,其他2-10的将军收到1的消息,将军直接相互转告,一轮下来每个将军都有10个信息(加上自己发的消息),如果有叛徒,那么消息就可能不一致,那么怎么决策呢,如果超过一半以上的将军决定进攻,那么就进攻,简而言之就是少数服从多数。
但是这个也有明显缺点,不知道上一个消息的来源是谁,即不知道谁是叛徒。
书面协议
书面协议则是提议发起者使用信件发送消息,将军们如果同意执行协议,会在书信上盖章(签名)。这个就需要满足:
  • 盖章无法伪造,一但篡改可被发现。
  • 任何将军都可以相互之间验证盖章的可靠性
相比于口头协议,书面协议解决了溯源问题, 但是仍然面临着一些问题:
  1. 信息传输慢
  2. 无法避免盖章(签名)被伪造
  3. 书信保存,无法保证人手一份。
区块链方案
在区块链系统中,存在着多种这样的筛选方案,比如PBFT(Practical Byzantine Fault Tolerance,实用拜占庭容错算法)、PoW(Proof of Work,工作量证明)、PoS(Proof of Stake,权益证明)、DPoS(Delegate Proof of Stake,委托权益证明)、Ripple(瑞波)等,各种不同的算法,其实就是不同的游戏玩法。

    推荐阅读