区块链拜占庭攻击,区块链拜占庭机制

  

  拜占庭一般问题的背景拜占庭一般问题是对现实世界的建模,如硬件故障、网络拥塞或断线等意外行为,都属于拜占庭一般问题。   

  

  土耳其拜占庭的伊斯坦布尔是东罗马帝国的首都。由于东罗马帝国疆域辽阔,各军之间距离遥远,将军与将军只能通过信使传递消息。当发生战争时,所有的指挥官和中尉必须达成共识。只有他们一致认为自己会赢,才会主动攻击敌人。但是,军队中可能有叛徒或内奸,这些人往往会扰乱军队的正确决策。   

  

  忠诚的将军们如何在不受内奸影响的情况下达成协议,是拜占庭将军们问题的根源。   

  

  对应视频链接:用《华山论剑》的方式讲解,头条面试问题:拜占庭将军问题。   

  

  实际上,拜占庭通用问题是分布式领域中最复杂的容错模型。一旦理解了,就很容易理解分布式系统的一致性。   

  

  第二,恢复拜占庭将军的问题。为了方便理解拜占庭将军的问题,我们以《华山论剑》为背景切入主题。   

  

  老教师金庸的《射雕英雄传》中,东有黄,西有欧阳锋,南有段志兴,北有洪七公,中有,合称五绝。   

  

  作为一个大宗师,欧阳锋是一个真正的反派。武功虽不及,但略胜黄、段志兴、洪七公。   

  

  南宋李宗年间,王重阳为统帅,率洪七公、段志兴、黄石爻围攻西毒欧阳锋。我们设定欧阳锋为反派,王重阳为主将,洪七公、段志兴为忠臣,冤枉黄为内奸,而内奸则扮演忠臣的角色,称为“大奸臣,忠臣”。主公和忠臣都不知道内奸的身份,都把内奸当成了忠臣。   

  

  历史背景   

  

  要想杀死西毒欧阳锋,王重阳必须统一忠臣的作战计划。因为这是一个临时团队,王重阳并不知道这三个忠臣‘沾花惹草’,而且,其中一个是内奸。内奸与欧阳锋秘密通信,向忠臣发送误导性作战信息,怎么办?信差被小偷拦截了怎么办?这些都会导致自己的作战计划被打乱。这样一来,有的忠臣会进攻,有的忠臣会撤退,使他们无法集中优势兵力打歼灭战。而是让欧阳锋得逞,欧阳锋趁机进攻,将他们一一击溃。   

  

  这个故事是拜占庭将军们问题的简化表达。王重阳面临着一个典型的共识问题,即在信息误导的情况下,如何采用合适的沟通机制,使众多将领达成共识,制定出一致的作战方案。因为单打独斗不是欧阳锋的对手,只能群起而攻之。   

  

  2.1忠臣选择退。洪七公、段志兴、黄接到进攻或撤退的命令后,按照少数服从多数的原则进行表决,不得弃权。大家一起决定进攻还是撤退。一旦达成协议,所有的将军都会既往不咎,勇往直前。   

  

  洪七公想都没想就选择了进攻,通过传令兵告诉段志兴和黄进攻。   

  

  然而,段志兴却在想“在外忙前,必先安”。要想打败贼人,必须先找出内奸,决定试着下令撤退,看内奸如何选择,并通过信使告诉洪七公和黄撤退。   

  

  黄虽然是内奸,但他不想这么早暴露身份,所以假扮成的样子。接到进攻和撤退信号后,他决定进攻,并通过传令兵告诉洪七公和段志兴进攻。   

  

  一个忠臣选择了撤退   

  

  计票时,攻击票:撤回票=2:1,按照少数服从多数的组织原则进行投票。由于段志兴是忠臣,本轮投票虽然找不到内奸,但是战胜敌人还是很重要的,所以撤退命令改为进攻。所以最后三位将军的投票结果都是攻击,是一致的战斗。最终打败了欧阳锋。这一轮没查出内奸是谁,还是留下了很大的隐患。好在胜利还是属于正义的一方。   

  

  2.2内奸作弊,一进一出。黄看了最后一个方案,发现自己的身份并没有暴露,而且大师还是很相信自己的。但是,作为一个内奸,他最终还是要完成自己的使命,所以他想用欺骗的手段消灭自己的一个忠臣。   

  

  洪七公嫉恶如仇,仍然选择了进攻,通过使者告诉段志兴和黄进攻。   

  

  制定最后一个作战方案的时候,段志兴没有找到内奸,他依然没有放弃。他不得不“与外媾和”,决定撤退,并通过信使告诉洪七公和黄撤退。   

  

  黄决定欺骗。既然洪七公选择了攻击,我就跟洪七公说,我也会通过信使攻击。既然段志兴选择了退,我就跟段志兴说我也退。这会让段志兴退缩,同时,他也会选择退缩。让洪七公独自面对欧阳锋。   

  

  洪七公收到的攻守比为2: 1,相信至少有一支同盟军。结果他独自面对欧阳锋。结果洪七公败给欧阳锋,最后忠臣洪七公被KO。这个结局是邪恶对正义的胜利。   

  

  鼹鼠作弊器,一进一出。   

  

  第三,签约解决拜占庭将军问题。我们找到了两个忠臣和一个内奸的组合场景,内奸很容易成功。那么有没有计划让鼹鼠不   

能两面三刀呢。

  

早在春秋战国时期,各个诸侯国通过虎符作为调兵的信物,虎符的背面刻有铭文,分为两半,右半存于朝廷,左半发给统兵的将帅或者地方长官,并且从来都是专符专用,一地一符,绝不存在一个兵符能调动两支军队的场景,调兵谴将时需要两半勘合验真后,才能生效。

  

但是使用虎符调兵也存在一定的风险,比如虎符被盗,后果将不堪设想。每个诸侯国为了防止虎符被盗,造成兵变的悲剧发生。就发明了圣旨,圣旨就相当于数字签名,必须手持圣旨和虎符才能调动军队。那么,计算机算法中的数字签名都有哪些特点,保证了分布式系统的一致性呢?

  

① 签名是无法伪造的,对签名后的内容,进行任何更改都会被发现。

  

② 任何人都能验证数字签名的真伪。

  

3.1 忠臣先发起作战协作信息比如现在忠臣洪七公作为主将,率先发起联合作战协商,向两个副将传递消息。将签名后的消息发送给段智兴和黄药师。

  

段智兴和黄药师在收到签名的消息后,都会验证消息的真伪。

  

而黄药师在上一轮得逞之后,又动了歪脑筋,修改了消息内容,将进攻的命令改成了撤退,并且伪造了数字签名,然后将消息发送给了段智兴。声称主将洪七公发出的是撤退命令。

  

段智兴足智多谋,验证了洪七公和黄药师发来的签名之后,发现黄药师是内奸。因此,他决定和洪七公一起发起进攻,于是告知洪七公,我会发起进攻。

  

这时不管内奸黄药师选择进攻还是撤退,都不会影响战胜欧阳锋的大局。因为进攻和撤退的比例至少是2:1。

  

经过本轮操作,不但揪出内奸,而且正义战胜了邪恶。

  

数字签名解决拜占庭将军问题一

  

3.2 内奸率先发起协作信息如果此时主将是内奸黄药师,副将是洪七公和段智兴,由内奸发起联合作战协商。

  

黄药师向洪七公发送的消息是进攻,向段智兴发送的消息是撤退。

  

洪七公和段智兴在各自的阵营中,验证数字签名都是正常的。

  

因此,洪七公会向段智兴发送他和黄药师都是选择进攻的命令;而段智兴会向洪七公发送他和黄药师,都是选择撤退的命令。

  

这个时候,有意思的地方就来了,他们发现黄药师发给两个人的命令不一致,就断定黄药师是内奸。

  

这个解决办法,是兰伯特在论文中提到的签名消息型,拜占庭将军问题之解。通过签名机制来约束内奸的叛变行为,任何内奸的叛变行为都会被发现,最后忠诚的将军们总能达成一致的作战计划。

  

数字签名解决拜占庭将军问题二

  

可以从另外一个角度理解:n 位将军,能容忍 (n - 2) 位内奸(因为只有一位忠将没有意义,因为此时不需要达成共识了)。关于这个公式,只需要记住就好了,推导过程可以参考论文。

  

四 总结我们通过华山论剑的角色,讲解了分布式中的共识场景。那他们和分布式系统是怎样的映射关系呢?

  

每个将军都对应一个计算机节点。忠诚的将军对应正常运行的计算机节点。叛变的将军对应出现故障,并会发送误导信息的计算机节点。签名被修改表示通讯被恶意攻击、伪造信息或劫持通讯。不要小瞧拜占庭将军问题,它是分布式场景中最复杂的故障场景。比如在区块链技术中,就用到了这些知识点。

  

给大家留一个思考题,除了用“签名的方式解决拜占庭将军问题,还有没有其他方式能解决拜占庭将军问题?”

相关文章