分布式网络中的信任问题

更新于 2026年10月10日 版权声明
分布式网络中的信任问题

区块链是项新技术,解答的却是个老问题—“拜占庭将军问题”,其实就是分布式结构如何达成共识的问题。

拜占庭将军问题(Byzantine failures)不是个真问题,它是由莱斯利·兰伯特[11]提出的点对点通信中的假设。

问题是这样的:拜占庭帝国想要进攻一个强大的敌国,为此派出了9支军队去包围这个敌国。敌国的实力虽然无法与拜占庭帝国相比,但也非等闲之辈,它足以抵御4支拜占庭军队的同时进攻,也就是说拜占庭帝国至少有5支军队同时进攻才能取得胜利,而且这5支军队不能集中在一起单点突破,必须在分开包围对手的情况下同时攻击。在少于5支军队进攻的情况下都毫无胜算,甚至有全军覆没之风险。这9支军队分散在敌国的周围,依靠通信兵传递信息并约定是否进攻以及具体的进攻时间。

那么,问题来了,他们如何确定收到的信息都是对方真实意图的表达,又如何保证9位将军中间没有叛徒?

如果通信兵出问题,约定肯定出问题;如果将军叛变,也会造成严重后果。

比如,9位将军中有4位决定进攻,4位决定撤退。如果最后一位将军已经叛变,那么他可以给决定进攻的4位将军发“进攻”信号,给决定“撤退”的4位将军发“撤退”信号,但他自己却按兵不动。

结果显而易见,最终只会有4支决定进攻,又收到错误信号认为“叛变将军”也会进攻的部队发起进攻,由于部队少于5支,必然失败。(https://www.daowen.com)

在计算机领域,这是个典型的分布式系统问题,其中通信兵属于通信一致性问题,叛变将军属于恶意节点问题,那么如何规避风险的发生生呢?这正是莱斯利·兰伯特所关注的。

莱斯利·兰伯特认为要解决“拜占庭将军问题”必须满足两个条件:一是一致性,即所有的将军必须得到相同的指令(无论这个指令是否代表了其他将军的真实意图,如果叛变则会作假);二是如果命令是真实的,那么所有忠诚的将军都会执行这一命令。

实用拜占庭容错协议(Practical Byzantine Fault Tolerance,PBFT)解决了这一问题,它是卡斯特罗和利斯科夫在1999年提出来的,它不但解决了效率问题,还将算法的复杂度降低到了多项式级,使得这个问题可解。这个协议的核心思想是:对于每一个收到命令的将军,他都要去询问其他人,他们收到的命令是什么。实用拜占庭容错PBFT是首个解决拜占庭将军问题的方案,当前已被 Hyperledger Fabric 采用。在兼顾效率与效果的情况下,实用拜占庭容错协议表现不错,但从根本上解决这一问题的还是中本聪的区块链方案。

中本聪的思路是加入发送信息的成本,使得每个时间点只可能有一个“最大工作量”将军发送信息,其他将军收到信息后必须签名盖章,确认各自的身份,为了保证签名不被篡改,他使用了非对称加密技术。可见,中本聪用这种方法解决了和拜占庭容错同样的问题,即由谁来发起信息,如何实现信息统一及信息同步问题,本质上也是共识问题。

当有新的“记账”需求时,区块链对外广播,通过某种共识机制(比特币采用的是工作量证明,其实也可以采用其他的共识机制)寻找记账人,最终由记账节点广播全网、形成区块,区块加盖时间戳,形成之后不可篡改,区块链就是通过这样的方式最终实现的分布式网络中点点对传输的信任问题。

图示

图4.5 比特币中区块链的工作流程

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)