拜占庭将军问题#
如果你第一次看到这个名字,可能会觉得这是一个历史人物遇到的一个打仗的问题。但其实完全不是,而是一个计算机学家提出来为了解决分布式网络的问题。
拜占庭将军问题 (Byzantine Generals Problem),是由莱斯利・兰波特在其同名论文中提出的分布式对等网络通信容错问题。
简单介绍一下问题提出者:
莱斯利・兰波特 (Leslie Lamport),美国计算机科学家。也是排版系统 LaTeX 的开发者。2013 年,获得图灵奖。
开开脑洞#
在探寻拜占庭将军问题这个复杂问题前,我想先给一个小问题来开开脑洞(适应下思维方式)。
有两个守门童 A 和 B,有两扇门 a 和 b,我们的目标是找到 a 和 b 中正确的门,已知:
- 我们可以各询问 A 和 B 一个问题
- A 和 B 一个人说真话,一个人说假话
请问,如何问才能找到正确的门?
可以思考一下,还挺有意思的,其实只用问一个问题就可以得到答案。
答案:询问 A:你认为 B 会说哪个门是正确的门?(正确答案就是 A 回答的另一扇门)
达成共识#
这个拜占庭将军问题举的例子比较复杂,希望能用一个简单的例子来让你理解:
一群好朋友(将军)想要讨论明天早上十点是否一起去公园,但是现在无法群聊,只能一对一的私聊,可以确定的是朋友内有想捣乱或破坏大家的关系(故意乱说),如何达成大家统一行动的目标(一起去或不去)?
比如,一共 9 个人,大家采用多数服从少数的原则,当四人同意去,四人不同意去,坏蛋跟同意的四人说同意去,跟不同意的四人说不同意去,双方都以为自己胜利,会导致出现目标失败。
上述的故事映射到计算机系统里,将军便成了计算机,而私聊就是通信系统。虽然上述的问题涉及了电子化的决策支持与信息安全,却没办法单纯的用密码学与数字签名来解决。因为电路错误仍可能影响整个加密过程,这不是密码学与数字签名算法在解决的问题。因此计算机就有可能将错误的结果提交去,亦可能导致错误的决策。
而在区块链中,若出现了无法达成共识会出现分叉、宕机等问题。当一条链共识出现问题,将会对这条链造成信任危机也是致命打击,所以在区块链中共识算法是生态发展的底层基础。
口头协议#
其实共识算法在不断进步,也有非常聪明的人在不断提出新颖的解题思路。在本问题被提出的论文中,莱斯利・兰波特已经提出了两种解法,今天就分享口头协议这个解法。
以下内容并不是原版解法,是根据个人理解的表达,若有错误希望理解
定义:
- 分为两类,好人(希望统一),坏人(希望不统一)
- 提出提案的人自动作为领头(将军)
目标:
- 若领头是好人,保证所有好人都执行领头的提议
- 保证所有好人保持一致执行
失败案例#
继续按上面的去公园为基础,这次是 a、b、c 3 人商讨是否明天去公园,其中一人坏人。
b 提出去公园的想法,作为领队。
(下方有图解)
可能 1#
b 领队不是坏人,c 是坏人
a 收到 b 去公园的想法,但是不知道 b 是否是好人,所以问 c:b 提议是去还是不去,c 反馈不去,所以 a 收到 1 个去,1 个不去。a 知道 b 和 c 中有一个坏人,但不知道是谁。
所以无法达成共识:失败
可能 2#
b 领队是坏人,a c 都是好人
a 收到 b 去提议,c 收到 b 不去的提议,此时 a 和 c 交换信息,都得到 1 个去,1 个不去。
所以无法达成共识
成功案例#
这次是 a、b、c、d 4 人商讨是否明天去公园,其中一人坏人。
可能 1:#
领队 c 是好人,提出明天不去公园,d 是坏人。
a 收到不去公园的意见后,询问 b、d 领队的意见是什么,得到的是不去(b)和去(d)。
a 得到的是(不去、不去、去),选择多数不去就行,b 同理结论是不去。
最后 a、b、c 都不去,达成目标 2,并且符合领队的命令,达成目标 1.
可能 2:#
领队 c 是坏人,对 a、b 说去,对 d 说不去。
a 收到去的提议后,询问 b、d 领队的意见是什么,得到的是去(b)和不去(d)。
a 得到的是(去、去、不去),选择多数去就行,b 同理结论是去。
d 收到不去的提议后,询问 a、b 领队的意见是什么,得到的是去(a)和去(b)。
d 得到的是(不去、去、去),选择多数去就行。
最后 a、b、d 都统一去了,达成目标 2,由于领队是坏人,无需考虑目标 1。
其实,当时莱斯利・兰波特提出口头协议时就给出了结论,若有 n 人参与,m 人是坏人,那么只有当 n > 3m 时才能达成共识。也就是说当有 2 人坏人时,需要一共 7 人才能达成共识,具体的推演过程可以看李永乐老师的视频,很有意思。
当然区块链中比特币和以太坊都采用的 PoW(工作量证明)也非常出色的解决了共识问题,并且经过十几年的稳定运行也证明了这种方法的可行性。但是 PoW 也有非常多被人诟病的问题,有机会再详细研究一下 PoW 的底层逻辑。