我们到底需要什么样的共识算法?

转载
1900 天前
11974

文章来源:橙皮书

“我们之所以需要区块链,是因为对于中心化系统最大的担忧不是作恶代价的大小,而恰恰是作恶成本无法估计、无法量化。

作恶的回报并不限于系统内,还可以在系统外。即便是最透明的上市公司,我们也无法获知股东的所有收益来源,因此,也就无法量化他们能够通过作恶在系统外获得多少利益。

无论是POS还是POW,当区块链中「大节点」过于集中的时候,我们将面临和中心化系统一样的问题——我们无法量化系统的安全性,于是,只好把安全性寄托于对于节点的信任,而不是可量化的作恶成本上。”

这是任博士关于 POW vs POS 的第三篇,这也将是本系列的最后一篇文章。


本文作者:Maxdeath,任之劼博士,唯链区块链高级研究员,主要研究方向包括区块链共识算法、扩容、应用,曾在国际学术会议上发表多篇区块链论文。

“由于POW和POS(或者其他的什么算法)在不同属性上各有千秋,所以它们各自适用于不同的场景,于是他们会在现实中并存,不同的区块链可以用不同的算法。”

这似乎是现在更流行的看法,也是个更模棱两可和左右逢源的看法。

但这并不是我的看法。

我的看法其实已经在上两篇文章里表达的很明确了,我认为——

在安全性面前,其他的特性都是末节。

同样的,我认为安全性上逊色的算法,就是差一些的算法。

于是,我们又回到了上次我们想要讨论、但还没有讨论的问题——

我们究竟需要什么样的共识算法。

其实,以上的论点放在2-3年前可能关注度会更高。在很多人看来,就算我写扩容、分片或者链下技术,都已经是属于前两年的、过时了的东西了。更何况是“POW”、“安全性”这种似乎从n年前公链项目爆炸的年代就在讨论、结果到了大部分公链都死了也没有结果,于是到现在双方都决定各退一步说:“两者互有优劣适用场景不同”的话题。

那么,我为什么还要写这个问题呢?为什么不去写一些更热门的话题,例如Defi,例如链上治理,例如Staking Economy,例如价值捕获,例如生态建设等等……

因为在我看来,这个问题并不过时,而且,从未如此重要过。

因为以上的所有问题,在我看来都是安全问题。

因为区块链本身,解决的就是安全问题。

   

“安全”是指这个系统能够可靠地按照我们的设想,做它该做的事

那么,什么是共识算法的安全性?

一方面,在之前的两篇中我们已经介绍了——“所有人都认为的安全”,并不是真正的安全性。同时,“在现实中没有被攻破”,也并不是安全性的保证。

那么,理论上的安全呢?有了论文,有了数学证明,总该够安全了吧。

其实也不尽然。

从理论上,我们可以从分布式系统的方法证明共识算法是拜占庭容错的,或者,可以从密码学的角度证明其中所有采用密码学的机制都是安全的,我们还可以用Bitcoin backbone protocol里的模型证明某个算法适用于区块链共识,因为它拥有和比特币一样的特性,然而所有这些关于安全性的证明都是基于某些理论上的模型或者假设,并不代表它们在现实之中就一定是安全的。

例如,BFT里关于超过2/3诚实节点的假设,对于不同的算法,这个假设的成立与否是不一定的——如果你要求诚实节点安装某个客户端,这个客户端每十分钟验证1MB的交易,那么多数节点可能可以是诚实的;但如果这个算法要求诚实节点每秒钟验证1M的交易,那么很多带宽和计算能力达不到要求的节点显然是无法完成的,于是,在BFT的模型里,这些节点就会变成“不诚实”的。而这个时候,如果说每个节点能够收到相应的激励的话,他们又会变得诚实起来。于是,一个证明是拜占庭容错的算法,未必在现实中是安全的,而一个能容错1/3的算法,在现实中,也未必一定比容错1/5要更安全。

另一个例子就是,不考虑自私挖矿的话,比特币从理论上来讲是“安全的”,因为我们的假设是“恶意节点无法控制超过50%的算力”。但是我们之前已经说了,这个假设本身并不实际,首先获得50%算力的难度很低,其次在实际之中一些POW项目50%以上的算力就控制在一个或几个节点手中。

换句话说,实际上,即便在学术界,目前也没有一个确切的定义,或者说一个公认的,非常贴合实际的模型来描述现实中对于区块链系统“安全”的标准,于是,我们也无从证明,到底什么才是“安全”的共识算法。

一个能够证明的,安全的共识算法,只是说明了它在某些假设下和某些模型中的安全性。虽然这总比没有证明好,但是,在我们还在寻找一个能够更好地描述区块链的模型时,说这种算法就是我们在寻找的“安全”的共识算法,区块链系统用了他们就可以高枕无忧了,还为时过早。

那么,什么才是“安全”的区块链共识算法呢?

这里我说的安全并不是传统信息安全里面讲的安全性。

这里,“安全”是指这个系统能够可靠地按照我们的设想,做它该做的事。

这件事,在我看来,凌驾于其他一切属性之上,是区块链共识算法的首要责任。

因为,区块链的首要责任,也是安全。

这又是一个相当“非主流”的观点——我猜很多人会说:“区块链的首要责任不是去中心化吗?”

当然,我承认,去中心化很重要,去中心化是区块链最大的特点,是区块链与中心化系统最大的不同,如果没有了“去中心化”,那么区块链也就不能称之为区块链了。

但是,别忘了比特币诞生于整个密码朋克小组的初衷,我们需要去中心的原因,不还是因为我们不相信中心化系统的安全性和可靠性,也就是说,虽然一个中心,例如银行,例如政府,告诉我它会做一些事,告诉我们“这是数字货币,这里面的钱记在我的系统里是安全的,请放心”,但是,我们其实并不完全相信它会遵守我们的约定,而可靠地做这件事吗?

所有区块链领域的从业者,都应该记住一件事——

我们需要区块链,但其他人并不在乎,他们需要的是一个更好的系统——无论它是中心化的,还是去中心化的。

所以,我们需要去中心化,但它的目的是,我们需要通过提供一个去中心化的区块链,使得我们能够更好地量化它的安全性,而不需要依赖于对于某个中心的信任,最终,得到一个比中心化系统更安全的系统。

因此,如果天平的两边是去中心化和安全性——那么无论如何我都会选择安全;如果天平的两边是一个“更去中心化、但不那么安全的系统”和一个“不那么去中心化、但更安全的系统”,那么我无论如何都会选择后者。

但是,在目前的阶段,我们确实需要去探索性地尝试那些“不那么安全、但是更去中心化”的方法,但是请一定谨记,如果我们都往这个方向走,并且不回头地走得太远,那么最终被抛弃掉的,将不是一个系统而已,而是整个区块链技术。

因此,在我看来,安全是第一位的。

换言之,我们可以不在乎一个区块链是不是能够“有效地”做它该做的事,是不是能够“快速地”做它该做的事,是不是能够“足够去中心化地”做它该做的事,甚至,我们可以不在乎它是不是能够“节能地”做它该做的事,我们更不在乎它做事的方法是不是足够简洁,足够优雅,足够吸引所有人参加生态建设,或者是不是能够自行启动,自行进化,自我治理,自发形成一个健康的生态……

因为除了“可靠”这一点,其他的我们早就在中心化系统里实现过了。

没错,我们也许的确只知道如何在中心化的场景下实现以上的这些,而不知道如何在去中心化的情况下实现这些,而这点的确是目前学术界和工业界研究的重点,也是目前媒体和这个圈子聚光灯下的焦点。

然而,如果没有安全性,这一切都成了无源之水,无本之木。

因为我们无法回答的问题是——

即便我们能够做出一个去中心化的系统,即便我们找出了以上一切的去中心化实现方法,但是,如果实现这些所有功能的系统不可靠,安全性无法量化,甚至说,最终安全性还是主要取决于对于某个中心、某个创始人、某家公司、某些矿工的信任,那么我们究竟是为什么要放弃已然成熟的中心化方案,来使用区块链系统?

换句话说,我们之所以推崇区块链,投入这个领域之中,不就是因为我们认为一个中心化系统不够“可靠”,因此,我们希望用“算法”来代替“信任”,用“机器”来取代“人”吗?

更何况,正如我以上所说——其实,一切我们正在讨论的,归根结底仍旧是安全问题。因为无论是链下技术,链上治理,激励机制,生态建设,经济模型……所有的这些,只要在链上实现,就都会回归到区块链共识算法的安全问题——

如果共识算法不安全,凭什么相信节点会执行链上治理投票决定的决策?

如果共识算法不安全,凭什么认为节点会诚实地对于激励进行分配?

如果共识算法不安全,凭什么认为它天然就成了所谓价值互联网的基础设施?

如果共识算法不安全,凭什么可以将区块链当做一个可信第三方使用,在上面构建侧链、支链,运行Dapp,并且搭建一整个生态?

这也是我之所以认为这篇东西并不过时,而且,恰恰需要在此时出现的原因——

最近以来,关于共识算法问题的降温和公链的退潮,让资本和舆论都开始追逐新的话题和项目。于此同时,也带了了这种盲目乐观地将共识算法当做一个成熟的基础设施的幻觉,而完全忽略了一个事实——

我们最常用的,也是最司空见惯的被认为是绝对安全的POW,实际上远比我们认为的要不安全得多。以及,我们其实一直在讨论的POW vs. POS的问题,始终都没有一个结果。所有人都在憧憬区块链的未来,设想着怎么围绕区块链搭建生态,怎么利用区块链重塑经济,怎么通过区块链改变世界的时候,只有很少的人和很少的声音在关注究竟这个区块链究竟能不能用,安不安全。

因此,我们始终需要这种回归本质的讨论和研究——我们,究竟需要怎样的共识算法。以及,一个真正安全的区块链,应该是什么样的。

   

我们需要一个衡量区块链安全的标准

这个问题,其实从前面一段的分析中我已经表达了我的看法——一个区块链的共识算法的第一标准,是能够可靠地实现它设计的功能。我们必须知道,当我们用算法来代替“信任”的部分,得出的共识一定是可靠的,而且,它的可靠程度是可以量化的。否则,整个区块链就毫无意义,因为它能做到的一切中心化系统也能做到,甚至做得更快更好,然而,我们并不能确定它比中心化系统更可靠。

这种可量化的安全,仅满足于“我们觉得是安全的”的层面是不够的,停留在“从来没有发生过”的层面也是不够的,甚至,停留在“我们可以从理论上证明”的层面,在早些年的探索时期也许还勉强够用,放在巨量资本已经开始在上面搭建生态的现在,也显得捉襟见肘了。我们需要一种量化的分析方法和模型,来计算一个共识算法的安全性,更理想的状况是,我们能够根据共识算法的应用场景需求,来具体量化每一个属性的安全性。

比如,一个安全的哈希函数,我们可以计算出需要多少计算能力才能“破解”它(找到一个冲突),于是,我们可以根据相应硬件的价格和时间,量化出哈希函数的攻击成本。同理,我们也可以算出椭圆曲线加密的攻击成本。实际上,在信息安全的领域里,这样的分析从理论到实践上,都是十分常见的。

现在,我认为,是时候将这样的模型扩展至区块链的领域了,尽管我们需要克服许多困难——

最核心的问题就是,我们要怎么定义安全,以及怎么定义攻击,而这点对于区块链而言并非易事。

以比特币为例,如果我们以密码学的标准来评估比特币的话,它的安全性是漏洞百出的——比如,对于哈希函数,我们认为只要有比穷举更好的方案,这个哈希函数就是不安全的。但是,对于比特币,且不说最著名的“自私挖矿”的问题,单从比特币链上存在的空块来看,很显然矿工有比“诚实”地挖出区块更有利的方法。有人可能会说——这并不影响安全性,但其实这影响到了比特币的活性,就如同“粉尘攻击”,也是影响活性的攻击。

而这也是目前对于区块链共识算法安全性的证明的局限所在——想要证明算法的绝对安全,我们就只能在假设的实际性上作出牺牲——例如,我们需要假设50%以上的算力是诚实的,或者2/3以上的节点是诚实的,而无法顾及这种假设背后的现实性,比如,是否有足够的激励让这些节点诚实地去执行算法中的每一个步骤,或者,在应用的场景下,我们是否能做出这样的假设。这种做法的弊端在之前的POW算法容易被51%攻击的分析中已经很明显了——我们当然可以对于所有的资源都做出“大多数人都诚实的假设”,但是,如果这个假设在现实中并不成立,那么采用这个假设证明了安全性也毫无意义。

另一方面,共识算法的安全性是与它的应用场景相分离的。对于一个共识算法是否安全,我们要么通过BFT证明“它可以达到拜占庭容错”,能够对于所有数据达成一致和活性,要么通过Bitcoin Backbone Protocol的模型证明我们可以得到一个增长的,一致的账本。也就是说,前者,我们将区块链视为一个拜占庭容错的分布式数据库,后者,我们将区块链视为某种类似比特币的分布式账本。然而,在此之上区块链的应用却已经远超分布式数据库和账本的范畴了。例如,对于分布式账本,一致性的重要性高于活性(所以可能很多人会认为空块不算是对于比特币安全性的破坏)。

因此,比特币的POW算法并不保证交易的活性,而仅仅保证能够被上链的交易的活性,同时用交易费的模型鼓励矿工尽可能地将交易添加上链,即保证“交易费给得足够多”的交易的活性。然而,当将这种共识算法用于其他对于交易活性要求高的应用时就可能会出现严重的问题——例如FOMO3D实际上就是受到了针对于以太坊交易活性的攻击,而尽管比特币以及以太坊的模型不保证交易活性这件事对于业内人士都不是秘密,但是不可否认的是,既然以太坊或者其他的区块链具有这样的应用,在共识算法安全性分析的时候把这种情况排除在外,本身也说明了这个模型并不完备。

因此,我们需要一个更实际,从应用出发,面向目标和场景的对于区块链安全性的评价标准,并且:

1、相比于每一个机制的可证明的安全性,我们更关注这个系统是不是能够达成它应有的功能。

2、相比于在一些条件限定下的绝对安全性,我们更关注在现实语境下的相对安全性。这点和我们之前的分析是一致的,也就是说,我们更关心——想要破坏这个系统,使得它没法做它该做的事情的代价有多大。

3、然后,对于“应有的功能”相对应的特性,我们应该根据实际情况来分析他们的重要性——例如,对于货币,一致性、活性、抗审查、匿名的需求取决于什么样的场景。如果黑市是需求,那么匿名可能需要摆在活性之上,但如果把交易和支付作为场景的话,我们应该参照一个支付平台的要求去考虑他们之间的权重。

以上的定义并不严谨,但是毕竟这只是一个提议,我们不是在写论文。

从这个角度来讲,其实对于数字货币的共识算法而言,我们并不用去考虑51%攻击,长链攻击,无利益攻击这些方式和相应的条件,也不用去关心在怎样的假设下通过什么样的算法可以防止他们的出现。

我们该关心的的问题是——

1、我们需要付出多大的代价才能破坏一致性,进行一次双重支付攻击:于是,我们可以判断这个系统可以承载多少价值,而一笔交易的数额超过多少的时候,我们就需要考虑双重支付这种可能,并且相应地提高确认时间,或者,仔细审视各个节点的动态。

2、我们需要付出多大的代价才能破坏活性,每延迟一次出块或者一分钟达成共识:于是,我们可以知道需要即时确认的交易中,我们有可能会遭到多大的损失。然后,对于FOMO3D这样的“游戏”,我们会知道当一个币卖到多少钱的时候,就已经可能不安全了。

3、我们还需要知道需要付出多大的代价才能破坏抗审查:于是,我们可以知道,比特币其实并不是一个完全自由的货币,当代价足够高的时候,我们是可以消灭掉某个地址的活性的。

4、然后,对于匿名货币,我们需要知道多大的代价,可以破坏匿名性,于是可以追踪到一笔钱的来历,或者是标记一个地址的身份。

以上,是对于“货币”这个功能而言的——这是我们的起点。

而之后,最理想的状态是,我们应该对于区块链所能实现的所有功能,判断它们所需的性质,然后,量化它们的安全性。

那么,在这里,去中心化的位置在哪里呢?

对于去中心化的要求,已经融入安全性的标准之中了——毕竟,去中心化是手段而不是目的:一个过于去中心化的系统,将面临着和中心化系统同样的风险,即作恶的成本不可控。

而同时,一个过于中心化的系统中,共识算法也将失去意义。

因此,在安全性标准中,我们必须也将它的去中心化程度纳入考量。

1、我们需要衡量实际参与共识节点的大节点的数量。

2、我们需要知道这些节点的信息,来评估他们在链外获益或者合谋的可能性。

3、同时,我们还需要确定,这些节点确实有能力维护这个系统的安全。

正如之前所说,一个理想的,安全的区块链系统,是由足够多数量的,身份已知的大节点来维护的。

于是,我们需要知道:

1、他们是否有足够的动力来维护这个系统——他们是否有足够的收益。

2、这个系统的结构是否稳定——他们是否也能够决定系统的发展方向。换言之,我们怎么保证未来整个系统还是有足够的大节点来维护,而不是共识节点会由于系统未来的发展方向与期待不符而逐渐退出或者分叉,重新导致中心化。因此,我们需要评估的决策机制是否能够代表共识节点的权益。

3、同时,我们还需要保证,所有在系统中有利益的群体,都应该能够参与共识。

于是,我们需要激励机制,链上治理等等其他的机制——

一切,归根结底都是安全问题。

   

写在最后

这是我关于POW和POS讨论的最后一篇,这三篇的内容和长度都远远超出我的预期,可能是进入这个领域以来看到听到的东西太多,积攒了很多东西不吐不快的缘故。

之前,我写过专业的在区块链领域的顶会上发表的学术论文,也一直致力于在知乎上写一些客观的和中立的科普性文章,我一直致力于避免的,就是在这个本来就混乱的行业中引入新的混乱——因此,我一直只写一些已经成为这个领域基础的论文和技术,但不愿意写太多新的、未经证实或者检验的结论,尽管有些结论我认为是正确的。甚至于,即便我的文章已经被接受甚至发表,我也不太愿意在我的专栏里介绍它们。

然而这一个系列和之前我写过的所有文章都不同,这一篇里更多的是个人的观点和判断,其中,我可能提出了不少“政治不正确”的,“大家不喜闻乐见”的,“在业内尚有争议”的,或者“所有人都知道但是没有人愿意说”的观点,因此,自从文章发表以来也或多或少引起了一些争论——而这些都是我原来一直想要避免的。

之所以做出这样的改变,其实关键的原因还是我在文中说的那点——资本和市场追逐新噱头的脚步是不会停下等技术发展的,于是,当这个领域所有的人似乎都已经开始盲目乐观地考虑长期发展的时候,我们需要反思一下——我们做的这些东西,真的“够安全”吗?

(完)

本文开头部分有所删减,完整版请见:

https://bbs.vechainworld.io/topic/283/%E6%88%91%E4%BB%AC%E9%9C%80%E8%A6%81%E4%BB%80%E4%B9%88%E6%A0%B7%E7%9A%84%E5%85%B1%E8%AF%86%E7%AE%97%E6%B3%95