看懂“拜占庭容错”,也就看懂了区块链的核心技术

上一篇我们简单提到了拜占庭将军问题:拜占庭的n个将军围攻一个敌人,n个将军包围着这个敌人,所以他们是在不同的地方。忠诚的将军希望通过某种协议达成某个命令的一致(比如约定某个时间一起进攻)。但其中一些背叛的将军会通过发送错误的消息阻挠忠诚的将军达成命令上的一致。如果同时发起进攻的将军数量少于m个,那么不足以歼灭敌人反而容易被敌人全部歼灭。怎样做才能保证有多于m个将军在同一时间一起发起进攻?

“拜占庭将军问题”模型中,对于将军们(节点)有两个默认的假设: 

  • 所有忠诚的将军收到相同的命令后,执行这条命令得到的结果一定是相同的;
  • 如果命令是正确的,那么所有忠诚的将军必须执行这条命令。

假设1的含义是:所有节点对命令的解析和执行是一样的,这个命令必须是一个确定性的命令,不能存在随机性,也不能依赖节点自身的状态。(这个命令不能是心情好就攻击敌人,心情不好就原地休息。)

假设2的含义是:忠诚的将军需要判断接收到的命令是不是正确的。这个判断命令的方法是整个拜占庭容错技术的核心。

对于将军们的通信过程,在“拜占庭将军问题”中也是有默认假设的:点对点通信是没问题的。也就是说,在这里,我们假设A将军要给B将军一条命令X,那么派出去的传令兵一定会准确的把命令X传递给B将军。

有了上述假设,我们来看看将军们面临的核心问题是什么。

我们考虑4个将军的情况,同时假设4个将军中最多只有1个背叛者。当4个将军A、B、C、D把敌人包围了之后,必须协商一个统一的时间去发起进攻。这时,A将军派出了3个传令兵,分别告诉B、C、D将军,下午1点准时发起进攻。到了下午1点,A、C、D三个将军发起了进攻,歼灭了敌人,同时他们三个发现B是背叛的。虽然B背叛了,但是对最终任务没有影响。

 

但如果A是背叛的,会发生什么情况?A派出3个传令兵,分别告诉B、C、D将军在下午1点、2点、3点发起进攻。于是,到了下午1点,B将军去攻击敌人,由于寡不敌众,全军覆没;2点,C将军全军覆没;3点,D将军全军覆没。

因为对于忠诚的将军来说,他不知道谁是背叛者,所以,他不能完全相信接收到的命令,他必须对命令做出判断。在1999年,著名的PBFT算法出现了。这个算法说起来也不难理解,他的核心思想是:对于每一个收到命令的将军,都要去询问其他人,他们收到的命令是什么。

 

回到刚才的第二种情况(A是背叛者),A派出3个传令兵,分别告诉B、C、D将军在下午1点、2点、3点发起进攻。B将军派出传令兵去告诉C和D两位将军,B收到的命令是下午1点进攻。C也同样派出了传令兵分别告诉B和D两位将军,C收到的命令是下午2点进攻。D也同样告诉B和C两位将军,D收到的命令是下午3点进攻。于是,B得到了3条指令:A命令B下午1点进攻,A命令C下午2点进攻,A命令D下午3点进攻。B很容易判断出来,A是背叛者(因为B知道最多只有一个背叛者)。C和D也能做出同样的判断。因此这次进攻时间的协商是无效的。

 

采用了这种办法以后,另一种情况又会怎样?当B是背叛者,A将军派出了3个传令兵,分别告诉B、C、D将军,下午1点准时发起进攻。B告诉C说B收到的命令是下午2点,B告诉D说收到的命令是下午2点,C和D分别告诉另外2个将军,A告诉他们的命令是下午1点。

 

于是,C、D收到的消息都是两个1点,一个2点。对于C、D而言,不需要判断是A和B谁是背叛者——他们只需要执行收到多的那个命令就可以了。

如果A是忠诚的,那么B是背叛的,这种情况下对于A来说,他知道自己是忠诚的,他发出的命令,至少有2个将军会执行,所以下午1点,A、C、D三个将军一起去进攻,有3个将军一起发起攻击,敌人被歼灭了。如果B是忠诚的,那么B会收到两个1点一个2点,B也会执行收到多的命令,于是B、C、D三个将军一起去进攻,有3个将军一起发起攻击,敌人被歼灭了。不管怎样,按照这种方式执行,结果是没问题的。

 

采用PBFT方法,本质上就是利用通信次数换取信用。每个命令的执行都需要节点间两两交互去核验消息,通信代价是非常高的。通常采用PBFT算法,节点间的通信复杂度是节点数的平方级的。

注意,上面所讨论的所有情况里,还有一个假设:所有传递的消息都是口头消息。意思就是,A告诉B下午1点进攻,B可能告诉C说“A命令我下午2点进攻”。如果采用了书写的消息,那么情况是不一样的。A派传令兵给B一张纸,A将军用自己独特的笔迹写的“下午1点进攻”,然后要求B把这张纸传给C,B在纸上用自己独特的笔迹签名表示同意,然后B传给C,C也签名表示同意,然后D也同意,最后签过所有名的纸再给每个人看一眼,就可以让所有节点一致了。这种采用书面签名消息的情况,对算法要求简单得多。但是,采用书面消息的前提是:每个将军都知道其他将军的笔迹是什么样的,并且无法模仿其他将军的笔迹。 

在PBFT的基础上,又出现了很多变种算法,这些算法往往都带有一些额外的假设。例如:认为发起请求的客户端一定是忠诚的,由客户端去验证节点是否忠诚;认为绝大部分时候将军都是忠诚的,所以降低两两交互核验消息的次数;通过对节点进行分工,来提高整个系统的处理速度;等。这些变种算法由于增加了额外的假设,导致了整个系统的去中心化程度的降低(关于区块链系统去中心化程度的理解,可以参见本系列的第6篇文章)。

但是,对于不同类型的应用场景,有些假设是合理的,有些假设则是不合理的。例如,在类似比特币的代币转账系统中,不能认为客户端是忠诚的,因为客户端很可能会发起双花交易。因此,当企业希望使用区块链技术改进自己的业务或者开展新业务的时候,一定要选择适合自己业务的区块链技术和系统。

本文作者:敖萌

本文转自雷锋网禁止二次转载,原文链接

时间: 2025-01-27 22:50:12

看懂“拜占庭容错”,也就看懂了区块链的核心技术的相关文章

从IBM三大前沿科技看量子计算、认知计算和区块链

从IBM三大前沿科技看量子计2016年蔓延全球的安全威胁仍然是愈演愈烈,而这也同时催促着安全技术的进步与革新. 在诸如区块链.人工智能等前沿技术领域的研究,谷歌.亚马逊等IT巨头都已经通过在某个方向上的巨额投入,试图在这一领域独占鳌头.但是却有一家企业,不只同时在量子计算.区块链和认知计算这三项前沿领域积极布局,并已经将部分研究成果以服务的形式对外开放. 一.量子计算 量子计算一直给人"高不可攀"的感觉 ,其技术实现复杂,目前仍广泛处于实验阶段. 现在我们普遍接触到的计算机,只能依靠1

走近比特币:一个故事看懂“区块链”

本文讲的是走近比特币:一个故事看懂"区块链",区块链是比特币的底层技术和基础架构,本质上是一个去中心化的数据库.区块链是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一次比特币网络交易的信息,用于验证其信息的有效性(防伪)并生成下一个区块. 狭义来讲,区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一 种链式数据结构, 并以密码学方式保证的不可篡改和不可伪造的分布式账本. 以上定义摘自百度百科.很多菜鸟朋友看完这段解释依然满脸懵逼,到底什么是"区块链&q

JavaScript闭包 懂不懂由你反正我是懂了_javascript技巧

越来越觉得国内没有教书育人的氛围,为了弄懂JS的闭包,我使出了我英语四级吃奶的劲去google上搜寻着有关闭包的解释,当我看到stackoverflow上这一篇解答,我脑中就出现了一句话:就是这货没跑了! 不才译文见下,见笑了. Peter Mortensen问: 就像老Albert所说的,"如果你不能向一个六岁的孩子解释清楚,那么其实你自己根本就没弄懂."好吧,我试着向一个27岁的朋友就是JS闭包(JavaScript closure)却彻底失败了. 你们会怎么把它解释给一个充满好奇

第一篇博客 给自己看 杂乱无章的区块链笔记

刚刚开始接触区块链技术不久,刚刚一个月有余.也看了几本书,还没有形成系统的认识. 就杂乱无章的记录一些东西吧. 记得第一次接触区块链是在机械工业出版社书店(2016年9月),架子上摆了几本区块链的书,根本不知道什么是区块链也没听说过.随便拿了一本翻了翻,书的名字也忘记了,大概就是比较浅显的介绍了一些概念以及和bitcoin 的关系, 大概花了一个小时的时间浏览了一遍,算是扫盲了.现在开始买了一本书开始看也开始从网上看一些文章,进一步提高一下自己,没办法做技术的总要与时俱进吧以此来预防老年痴呆..

c++-关于C++的问题出了 好多错 看不懂错误 请求帮助,看晕了

问题描述 关于C++的问题出了 好多错 看不懂错误 请求帮助,看晕了 #include class Stu { char *name; double score; public : void Set(char *na,double s); void Show(); ~Stu(); friend int date(Stu &s1,Stu &s2,Stu &s3,Stu &s4,Stu &s5); }; Stu::Set (char *na,double s) { sc

从物联网发展历程看区块链挑战

2009年,中本聪发布了第一个比特币节点,五年后区块链俨然成为一个规模巨大的产业. 虽然看起来,基于区块链的新的商业时代距离我们似乎只有一步之遥,但在2016年,我们已经意识到区块链产业不会那么快获得成功. 早期的新技术热情通常不是什么新鲜事;但是通常的模式是:人们常常被宣称新技术解决了一系列的旧问题的说法所振奋,继而是疯狂的炒作.疯狂过后的褪色,接着是让位于怀疑,最终真正的有价值的应用才会出现. 在二十世纪九十年代末,每个人都认为互联网连接每个电子设备的想法似乎是必然的: 每一台自动售货机,咖

支付技术创新已经完成?看区块链如何变革金融支付

从电子支付时代的线上的美国银行的支付到移动互联网时代的手机端支付,再到加密支付,比如支付宝,以及微信的各项创新的出现,让我们似乎有这样一个错觉:关于支付领域所有的创新已经完成,看不出有任何改进的可能和余地.那是不是真的是这个样子呢?在钛媒体举行的分享活动上,曾担任美国朗讯贝尔实验室资深工程师.现任OK Inc. 副总裁兼首席研究员.著有<区块链:重塑经济与世界>的段新星对此作了讲述. 区块链是金融支付的下一个突破 90年代时比尔盖茨曾经做过了一次著名的预言,他说:"依我看64K的内存

“价值互联网”时代,带你读懂区块链

区块链乍看似乎是一个去中心化的分布式账本,但这只是基于比特币来说,实际上连狭义的区块链都算不上. 区块链从本质上来说是一串使用密码学相关联所产生的数据块,每一个数据块中包含了多次网络交易有效确认的信息. 链的组成:节点(每一个参与者)--节点与节点的交易历史(组成区块)--区块连接区块(形成链) 每个交易都应用了非对称密码学(比特币是哈希数值),每条区块链的形成都有一个共识机制. 用元界CTO陈浩的话来说就是:区块链更像是一门交叉学科,结合了P2P网络技术.非对称加密技术.宏观经济学.经济学博弈

区块链究竟是什么鬼?看完漫画秒懂!

区块链究竟是什么鬼?看完漫画秒懂! 来源 | OKLink区块链(ID:OKLink-DY) 编辑:黎跃春 黎跃春:江湖人称春哥.资深讲师.全栈工程师:区块链.高可用架构技术爱好者. 区块链技术是指一种全民参与记账的方式.所有的系统背后都有一个数据库,你可以把数据库看成是就是一个大账本.目前是各自记各自的账. 由于没有中心化的中介机构存在,让所有的东西都通过预先设定的程序自动运行,不仅能够大大降低成本,也能提高效率.而由于每个人都有相同的账本,能确保账本记录过程是公开透明的. 区块链技术是比特币