映月读书网 > 区块链:技术驱动金融 > 2.2 分布式共识 >

2.2 分布式共识

在前一节,我们笼统地讨论了去中心化和中心化。现在我们从一个更为技术性的层面看一下比特币的去中心化。接下来,我们会遇到一个被称作“共识”(consensus)的重要概念,特别地,还有“分布式共识”(distributed consensus)。建立一个分布式的电子现金系统的关键技术问题,就在于要达成分布式共识。直观地说,你可以想象我们的目标就是要将第1章提到的财奴币去中心化。

分布式共识有各种应用,计算机界对其也研究了多年,传统具有启发式的应用就是提高分布式系统的可靠性。设想你在管理一个社交网络公司的后端平台,比如微信,像这样庞大的系统通常有几千台甚至几万台服务器,这些服务器组成了一个巨大的分布式数据库,数据库中记录了这个系统里发生的各种活动,而每条信息都会被记录在后端的若干个节点上,对于整个系统的状态,这些节点必须要做到同步。

分布式共识协议的意义远远超出了传统意义的范畴。一旦具备了这样的体系,我们就可以建立一个庞大的分布式键值(key-value)存储库,该类存储库可以将任意数据如身高、名字等对应一个相应的开启键,基于此,许多应用得以实现。例如,我们可以建立一个分布式域名系统,将人脑易于理解的域名与IP地址进行配对,我们也可以建立一个公钥目录,这个目录可以把公钥与电邮地址(或者其他真实世界中的身份证明)对应起来。

以上讨论在直觉上说明了分布式共识的大概含义。对于分布式共识,我们还是要给出一个技术定义,以此我们可以判别一个协定是否符合分布式共识的要求。

分布式共识协议 在一个有n个节点的系统中,每一个节点都有一个输入值,其中一些节点具有故障,甚至是恶意的。一个分布式共识协议有以下两个属性:

● 输入值的中止须经所有诚实节点来确定。

● 这个输入值必须由诚实节点来生成。

那么以上概念在比特币里又是什么含义呢?想要理解分布式共识在比特币中的用途,我们需要记住比特币是个点对点的系统。当爱丽丝向鲍勃付款的时候,她其实是在向构成比特币网络上的所有节点广播其交易行为,见图2.1。

图2.1 广播交易

注:为了向鲍勃付款,爱丽丝需要向整个比特币点对点网络进行广播。

顺便提一下,你可能注意到,当爱丽丝向整个比特币点对点系统广播时,鲍勃的计算机并不一定在图2.1的网络中。当然鲍勃也有可能在这个网络上运行着一个节点,如果鲍勃想在爱丽丝转币给他时及时被系统通知,运行一个节点当然是个好主意,但其实这并不重要,鲍勃是否运行节点并不影响他收到爱丽丝转给他的比特币。

在比特币网络里,节点到底要达成什么样的共识呢?网络里有各种各样的用户在向网络广播交易,节点必须对哪些交易可以进行广播和交易发生的次序达成共识,以此系统将形成一个唯一的全球交易总账。回想我们在第1章1.5节中曾提到的财奴币将交易打包成块,对信息进行优化处理。类似地,在比特币体系里,我们也将每个区块进行共识处理。

在任何时点,所有在点对点网络上的节点都有包含一系列区块的总账本,每个区块中都包含了已经被所有节点达成共识的交易清单。除此之外,每个节点还有一堆没有被打包进入区块的交易,就是那些网络节点已经被通知、交易已经发生,但还没有被写进区块的交易。网络节点对于这些交易还没有达成共识,所以每个节点都有一个略有差异、尚待确认的交易池。在实际中,点对点网络是不完美的,所以有些节点听到了交易,而有些节点却没有听到。

那么,所有的节点是如何对一个区块达成共识的呢?一个方法是,在一个时间段里,比如说每隔十分钟,每个节点都提议,自己的未被认可的交易成为已经达成共识的区块链后面的下一个区块,然后那些节点会执行一些共识协议,每个节点把自己提议的区块作为输入。但不可避免地,有些节点可能是恶意的,存心要把不当交易放进区块里,其他节点则是诚实的。如果共识协议能够顺利完成,一个正当有效的区块会被选作输出值。尽管有些被选出的区块是由一个节点提交,但只要这个区块是正当有效的,输出就是正当有效的。这时候可能有人会指出,这个被选出的区块可能未包含所有的正当有效的交易,但这并没有关系,如果有些正当有效的交易没被放进区块,它们可以等待下一次机会。

前面所谈到的这个办法与比特币系统有些相似之处了,但实质还是不完全一样。以上做法有几个技术上的问题:第一,达成共识一般是个难题,因为有些节点会死机或是根本就是恶意节点;第二,就比特币而言,点对点网络是不完美的,并非所有对应的节点是两两相连的,互联网链接的不良可能会造成网络问题,要执行一个所有节点都参与的共识协议好像并不现实;第三,由于交易信息是分布在整个互联网上,信息传递会有严重延迟。

延迟与全球时间

比特币协议达成共识时必须直面两大障碍:其一是不完美网络,例如信息延迟和节点死机,其二是某些故意搞破坏的节点。

严重网络延迟导致的一个后果是,节点之间没有一个统一的全球时间概念。意思是,并非所有节点都能根据每个交易的时间戳来达成交易时间共识,因此,共识协议不能执行以下指令:“在第一步里发了第一个消息的节点必须在第二步里执行X。”这一做法根本无法执行,因为所有的节点对于谁在第一步中发出第一个信息有不同的看法。

不可能性结论

在全球时间上的不统一,给共识协议算法带来了很多限制。事实上,由于这些限制,许多关于分布式共识的文献都对是否能达成共识持悲观态度,有许多达成共识具备不可能性的结论已经被证实。一个经典案例就是“拜占庭将军问题”(Byzantine Generals Problem),这个经典难题是这样阐述的:拜占庭是东罗马帝国的首都,它的军队分成多个师,每个师都由一个将军统领。这些将军通过信使进行交流,来达成一个共同作战方案,有些将军可能是叛徒,想故意破坏这个过程,这会造成那些忠诚的将军也无法达成一个统一的作战计划。解决这个难题的办法就是让那些忠诚的将军在这样的情况下达成统一作战方案,而避免那些叛徒对作战方案的误导。事实证明,如果叛徒数量超过1/3时,这个难题将无法克服,那些忠臣的计划终会被叛徒们破坏。

还有一个更为微妙的关于不可能性的结论,这就是著名的“Fischer-Lynch-Paterson不可能结果”[1],该名称以最初的作者而命名。该结果指出,在一定的条件下(包括节点行为具有确定性特征),甚至在只有一个缺陷的过程中,达成共识都是不可能的。

尽管有这些“不可能性结论”,还是有文献谈到了一些共识协议。比较著名的就是Paxos算法协议。Paxos算法做了一些妥协,一方面,Paxos算法能做到不产生不一致的结果;另一方面,Paxos算法所做的妥协是,在一定条件下(虽然是不常见的情形),该协议会死机卡住,从而无法继续运行。

打破传统上的假设

但好消息是,这些所谓的“不可能性结论”都是在一些特定的模式下才成立,这些结论是针对分布式数据库的研究,这些模型不能完全套用到比特币身上来,比特币本身就打破了很多原来分布式数据库所做的假设。这些结论其实从某一方面让我们更明白了那些特定模式,由此或许可以真正对分布式共识给出解决方案。

具有讽刺意义的是,就目前对共识的研究来说,比特币实际运行情况下远比理论上告诉我们的要好得多,这就是比特币让专家们跌破眼镜之处。我们看到分布式共识在比特币里运行良好,但我们还没有建立理论来充分解释为什么会这样,但无论如何,完善理论对将来的发展还是十分重要的,理论结果可以使我们预测,甚至预防未来可能的攻击和问题。我们一旦具备了较强的理论依据,来解释比特币分布式共识的良好运作机制,我们才能真正地对比特币的安全性和稳定性做出保证。

比特币到底打破了经典模型里的哪些假设呢?第一,比特币引进了奖励的理念,这对分布式共识协议来说是一个全新的理念,这也只有在比特币里才可能实现,因为比特币也是个货币,所以人们自然而然地会为了金钱奖励而变得诚实起来。所以,比特币并没有真正解决分布式共识问题,它只是在特定货币系统下解决了这个问题而已。

第二,比特币体系包含随机性这个概念。在后面两节里我们将会看到,比特币的共识算法很大程度上依赖于随机性。此外,它也不再纠结于规定共识的起点与终点。相反,共识是通过一段较长的时间而达成的,在实际系统中,达成共识大约需要一个小时左右。但即使在一个小时以后,节点们也无法确定哪一个交易块应该进入总账本。但随着时间的流逝,我们对某一个块的认识与最终总体共识相吻合的概率将越来越大,观点出现分歧的概率按指数级下降。比特币在以上方面的不同,让它能够逾越传统理论关于分布式共识不可达成这一鸿沟。

[1] Fischer-Lynch-Paterson不可能结果,是Michael J. Fischer、Nancy A. Lynch和Michael S. Paterson在论文Impossibility of distributed consensus with one faulty process中证明的一个结论,称得上是分布式理论中最为深刻的结论,大致表述如下:“在一个多进程异步系统中,只要有一个进程不可靠,那么就不存在一个协议,此协议能保证有限时间内使所有进程达成一致。”——译者注