前言:区块链技术作为交易各方信任机制建设的完美数学解决方案,之所以能解决信任机制的问题,是因为它起源于分布式系统中重要的算法问题:拜占庭将军问题。今天我们就来分析下区块链技术翻过的大山——拜占庭将军问题。
 
拜占庭将军问题
 
拜占庭帝国国土辽阔,当攻打敌人的时候,每个军队都分隔很远,将军之间只能靠信使传消息。
 
在战争的时候,拜占庭军队内所有将军必须达成一致的共识,决定是否去攻打敌人的阵营。但是,军队可能有叛徒和敌军间谍,左右将军们的决定,扰乱军队的秩序,使达成的共识并不代表大多数人的意见。这时,在已知有间谍的情况下,其余忠诚的将军在不受叛徒的影响下如何达成一致的协议,就是拜占庭将军问题。
 
将军之间的联络通过信使,在这个问题中信使不会被截获(信道可靠,不可靠的情况见文末的“两军问题”)。拜占庭将军们需要设计出一种算法,能够满足下列条件:
 
一个司令向他的n-1个副官发送命令,使得:
 
A. 所有忠诚的副官都遵守相同的命令
 
B. 如果司令是忠诚的,那么每个忠诚的副官必须遵守他发出的命令。
 
P.S:条件A和B被称为交互一致性条件。可以看到,当发令将军是忠诚的时候,A可以由B导出。但值得注意的是,发令将军不一定是忠诚的。
 
内核
 
当我们去掉故事的伪装后,我们发现问题的内核是:如何在一个不基于信任的分布式网络中就信息达成共识?例子中的将军换成计算机网络中的节点,把信使换成节点之间的通信,把进攻与否换成需要达成共识的信息,你就可以理解问题所描述的困境了。达成共识的能力对于一个支付系统来说重要性不言而喻,这正是区块链技术需要解决的问题。
 
拜占庭将军问题需要解决一致性和正确性的算法问题。一致性指的是将军们行动一致(统一进攻或撤退),正确性指的是每个将军(司令和副官)都可以正确表达自己的想法,并使别人判断真伪。
 
关于提出者
 

 

 
上面照片中头发胡须白成一片的就是拜占庭将军问题的提出者,计算机科学史上的传奇人物莱斯利·兰伯特(Leslie Lamport)。作为研究分布式系统的先锋人物,微软研究院首席研究员,他为提升计算机系统的可靠性以及稳定性做出了杰出贡献,因此他获得了2013年图灵奖——计算机界的诺贝尔奖。
 
他在1978年发表的论文《分布式系统内的时间、时钟事件顺序(Time, Clocks, and the Ordering of Events in a Distributed System)》成为计算机科学史上被引用最多的文献。可以说,只要你在使用建立在分布式系统上的互联网,你就该感谢这位伟大的科学家!
   
兰伯特曾说,是故事让问题变得受欢迎,因此他在提出观点和问题时常用故事背景吸引眼球。拜占庭将军的故事就是兰伯特在研究分布式系统容错性的时候编出的一个故事。
 
1972年,兰伯特加入斯坦福国际研究院(SRI)。SRI有一个项目,旨在为NASA建立容错型航电计算机系统。考虑到系统的工作性质,故障是不允许发生的。这段经历孕育了两篇旨在解决拜占庭故障(故障节点不但会丢失信息,还会给出错误信息)的论文,由兰伯特和SRI同事Marshall Pease 及Robert Shostak合作完成。
   
有趣的是,兰伯特在伯克利的一间咖啡馆,在一张餐巾纸上写出了第一种数字签名算法,作为解决拜占庭将军问题的方法。只可惜那张餐巾纸已经消逝在时间的流沙中。
 
问题的可解性

(1)叛徒数大于或等于1/3,拜占庭问题不可解
 
如果有三位将军,一位副官是叛徒。当司令发出进攻命令时,副官2可能告诉副官1,他收到的是“撤退”的命令。这时副官1收到一个“进攻”,一个“撤退”,而无所适从。
 
如果司令是叛徒。他告诉副官1“进攻”,告诉副官2“撤退”。当副官2告诉副官1,他收到“撤退”命令时,副官1由于收到了司令“进攻”的命令,而无法与副官2保持一致。
 
正由于上述原因,在三模冗余系统中,如果一机有拜占庭故障,即叛徒数等于1/3,拜占庭问题不可解。三模冗余只能容故障-冻结(fail-frost)那类的故障,就是元件故障后冻结在某一个状态不动。对付这类故障,用三模冗余比较有效。
 
(2)用口头信息,如果叛徒数少于1/3,拜占庭问题可解
 
这里说“少于1/3”表明,要对付一个叛徒,至少要用四模冗余。在四模中有一个叛徒,叛徒数是少于1/3的。所谓口头信息,是指满足三个条件:
 
①被发送的消息都能够被正确的投递
②接收者知道是谁发的
③沉默(不发信息)可以被检测
 
简而言之,信道绝对可信,且消息来源可知。但口头协议并不会告知消息的上一个来源是谁。
我们可以给出一个多项式复杂性的算法来解这一问题。算法的中心思想很简单,就是司令把命令发给每一副官,各副官又将收到的司令的命令转告给其他副官,递归下去,最后用多数表决。
如果司令是忠诚的,他送一个命令v给所有副官。若副官3是叛徒,当他转告给副官2时命令可能变成x。但副官2收到{v, v, x},多数表决以后仍为v,忠诚的副官可达成一致。
 
如果司令是叛徒,他发给副官们的命令可能互不相同,为x, y, z。当副官们互相转告司令发来的信息时,他们会发现,他们收到的都是{x,y,z},因而也取得了一致。
 
(3)用书写信息,如果至少有2/3的将军是忠诚的,拜占庭问题可解
 
所谓书写信息,是指带签名的信息,即可认证的信息。它是在口头信息的基础上,增加两个条件:
 
①忠诚司令的签名不能伪造,内容修改可被检测。
②任何人都可以识别司令的签名,叛徒可以伪造叛徒司令的签名。
 
一种已经给出的算法是,接收者收到信息后,签上自己的名字后再发给别人。由于书写信息的保密性,可以证明,用书写信息,如果至少有2/3的将军是忠诚的,拜占庭问题可解。
 
如果司令是叛徒,他送“进攻”命令给副官1,并带有他的签名0,送“撤退”命令给副官2,也带签名0。副官们转送时也带了签名。于是副官1收到{“进攻”:0,“撤退”:0,2},说明司令发给自己的命令是“进攻”,而发给副官2的命令是“撤退”,司令对我们发出了不同的命令。对副官2也同样。
 
区块链的解决方案
 
区块链的基本结构也是用数字签名的形式解决拜占庭将军问题。
 
但是,问题在于(还是以将军为例)
 
1.可能每一封都写着不同的进攻时间。
 
2.除此以外,部分将军会故意背叛发起人,他们将重新广播超过一条的信息链。这个系统迅速
变质成不可信的信息和攻击时间相互矛盾的纠结体。
 
因此,区块链采用了PoW(工作量证明)的方法来确认,提交一个所有人都必须经过大量尝试计算才能得出,却十分容易证明正确的计算结果。例如,只有一个前13个字符是0的哈希值结果可以被系统接受成为“工作量证明”,这就需要全网花费一定时间算出大量的无效值。这就是减慢信息传递速率,但使得整个系统可用的“工作量证明”。
 
人们把一段时间内的信息,包括数据、代码打包成一个区块,盖上时间戳,与上一个区块衔接在一起,每下一个区块的页首都包含了上一个区块的索引(哈希值),然后再在页中写入新的信息,从而形成新的区块,首尾相连,最终形成了区块链。
 
此外,PoS(权益证明机制)和广义的零知识证明技术( generalized zero knowledge proof technology)等发展中的技术在保护区块链不可篡改的安全性上也有很大的前景。
 
意义
 
可信计算中必须考虑人为的故障,特别是人为恶意的攻击。这是保证计算安全性的基本出发点,在今天的网络环境下有非常重要的现实意义。拜占庭将军问题不过是保持并行计算中数据一致性问题的一个抽象表达。一种抽象表达往往能把本质问题从繁琐的工程实现中提取出来,对于基础研究极其重要。
 
解拜占庭将军问题的算法给我们提供数据一致性的思路和算法。而在该算法中就有各位将军的同步问题。这些问题都为计算可信性的提高以启发。要解决拜占庭将军问题需要四模冗余,硬件开销是很大的。从中还可以看出,签名和认证对保证数据安全有节省硬件的效果。
 
现在银行的异地备份受制于硬件并不都是四模冗余,然而在区块链中这并不是问题,作为分布式账簿,区块链在这方面有着先天的优势。互联网成功实现了信息去中心化,区块链则将借此实现信用去中心化。

原文链接:http://www.gongxiangcj.com/show-22-1081-1.html