编者按:本文来自 以太坊爱好者(ID:ethfans),Odaily星球日报经授权转载。
注:本文档已于 2015 年 3 月进行了大量修改。旧版本可以在 https://download.wpsoftware.net/bitcoin/old-pos.pdf找到。
2009 年,中本聪创造了比特币 [Nak09]。比特币是一种互联网货币系统,可以实现点对点的数字代币转账。为确保所有人就代币所有权达成共识,中本聪采用了一种可由所有网络参与者复制并验证的公共账本。为了避免单点故障,该账本采用一种动态成员多方签名(dynamic membership multiparty signature,DMMS)[BCD+14] 机制来证实(authenticated),即,在每次 “心跳” 时对整个账本历史执行一次高成本计算(但是验证成本很低)。
不同于传统的数字签名,DMMS 中没有 “可伪造性” 的概念(there is no notion of “forgeability” for a DMMS)。每个 DMMS 的创建成本都很高(在比特币中,需要消耗高昂的电力成本),并且,这种行为可以得到账本上增发的新货币作为奖励。由于这些新代币必须得到其他人的认可才有用,参与者会受到激励来共同扩展“真正的账本”,而非自行创建账本 1。(译者注:此处的 “认可” 一词原文为 “recognize”,也就是说它的原意可能并没有那么多 “社会共识” 的暗示,其本身可以有严格的技术含义:如果你没有收到一个区块,你就不会认可由这个区块发行的货币。)
由于比特币的 DMMS 在计算和热力学 [Poe14a] 方面成本非常高,人们已经提出了其它更为经济环保的方案。最常被提议的方案是 PoS(权益证明),它是一种低成本的分布式共识机制。正如 Andrew Poelstra [Poe14b] 在 2014 年所言,PoS 是不可行的,但还是涌现出各种形式的 PoS 方案。与此同时,各种论坛上经常有人声称 Poelstra 的论点是 “虚假” 或 “错误” 的,尽管他们从来没有提出任何有说服力的反例或错误。此外,也有人给出了中肯的意见,认为 Poelstra 的这篇论文写得晦涩枯燥。由此可见,这篇论文还有许多不足之处。虽然 Poelstra 没有发现他的前作有任何不准确之处,但是他准备借此机会进一步地正式阐述他的论点。
相比 Poelstra 撰写论文时,人们对比特币共识的科学认识已经有了巨大进步 [MLJ14, BMC+15] 。
本文旨在更新 Poelstra 的论文,阐明比特币所解决的问题,PoS 背后的设计原理,以及 PoS 之类的机制无法在比特币的信任模型中产生分布式共识的原因。
注 1: 为了确保所有参与者都可以看到 “真正的账本”,我们需要一个同步网络:所有(有效)数据都能在一定的时间长度 λ 内到达所有参与者,而且网络心跳时间比 λ 长得多。如果没有同步网络,分布式共识的难度会大得多。(经常被人引用的一个结论是,使用确定性算法是不可能实现分布式共识的 [FLP85];但使用概率算法就可以很容易避免这一问题,因此在共识系统的设计难度上没有很多讨论。本文档的旧版本错误地引用了这一结论,以为这一点使得所有分布式共识机制在异步网络中都不可能达成共识,感谢 Dominic Williams 指出了这一点。)
在讨论比特币对于分布式共识问题的解决方案之前,我们首先要理解这个问题的本质。分布式共识(比特币系统所使用的术语)是一种彼此之间缺乏信任的参与方之间达成的共识(即,全局一致 global agreement)。这些参与方都是匿名的,而且在系统建立时并不一定存在。正如 Poelstra 在其论文中所解释的那样:
就密码学货币而言,仅在交易的时间顺序上达成分布式共识就足够了,即,就 “第一个转移特定资金的交易达成共识”。这样可以确保整个网络都认可新的资金所有者。
之所以需要达成这种共识,是为了防止 重复花费 问题(double-spending)。在所有去中心化数字货币机制中,都有可能出现付款方将同一笔资金发送给两个不同的人的情况,而且这两笔交易看起来都是有效的。因此,收款方需要能够确保没有发生冲突,或者在有冲突的情况下,网络会认可其交易为正确版本。就交易顺序达成分布式共识可以实现这一目的:在发生冲突的情况下,每个人都认可第一笔交易是有效的,其余交易是无效的。
(数字货币的其它问题,如权限和防伪,相对来说比较容易,可以通过传统密码学解决。)
重点是,我们应该意识到,尽管分布式共识是个难题,但是普通共识更加容易,经过了更深入的研究,而且使用受信任且可识别的签名方可以将效率提高数万亿倍。因此,(即使是在有限条件下)引入了受信任方的密码学货币都应该考虑的一点是,其新型信任模型是不是能帮助降低达成共识的难度。对更高效的、具备受信任方的共识机制感兴趣的读者可以研究一下。
比特币的账本是公开可用的,比特币网络中的所有参与者都可以验证账本上每笔交易的有效性。然而,由于账本在根本上属于历史记录,密码学无法辨别真伪,必须要有人来证明账本,而且其他人必须相信这个人不会签署错误的历史。
最早的数字现金系统都由单个非匿名者签署所有交易 [Cha83]。然而,这样不仅为系统引入了单点故障风险,而且可以让签署方(以及任何可以通过权力或武力来胁迫该签署方的人)审查交易或发起重复花费。虽然我们可以采用盲签名(具体参见 [Cha83])来防止审查制度,但是无法防范单点故障和重复花费问题。多方签名或许有可以解决后面两个问题,但是所有签名方难以同时遭到胁迫与所有签名方必须得到所有参与者的信任这两个要求是相互冲突的。非匿名性也意味着,特定攻击者总能持续攻击系统。
比特币的解决方案是完全去掉固定且可识别的签名者。比特币的账本由一组被称为矿工的签名者验证,他们不向其它参与者公开自己的身份,或许还可以零成本进入或退出系统。矿工通过叫做 “挖矿” 的过程来生成签名。在挖矿过程中,他们会共同为连续的、由交易数据组成的区块生成 工作量证明 [Bac02]。
在本节中,我们将解释挖矿是如何运作以及如何提供验证的。
密码学数字签名机制的运作原理如下。签名方生成 “签名” 和 “验证” 密钥对(s,v),并将 v 连同其姓名一起发布在某个公共渠道上。该签名方可以根据给定消息 m 生成签名 σ,任何人都可以验证 σ 的有效性。也就是说,将 v,m 和 σ 输入验证算法,如果签名是有效的,总是会输出 1。
为了安全起见,传统数字签名必须具备抗伪造性,即,任何计算能力有限的攻击者伪造签名的概率都微乎其微。具体而言,“伪造” 指的是(攻击者)能在下列游戏中胜出:
就 DMMS 而言,所有参与方都是平等的;无法通过让 “敌手” 仅拥有不完全知识(incomplete knowledge)来获得安全性。因此,我们使用以下三部分定义了 DMMS。这些部分都不同于传统签名的密钥生成算法:
使用代价函数 c 来追踪算法的执行并输出 “代价(cost)” t ∈ ,其中 是某个 “代价域”。该函数必须是线性的,因为连续运行两个算法的成本是它们各自成本的总和。
注 3:该模型是完全不现实的,因为真正的随机函数,from, say, 512 bits to 256 bits,平均需要 2512·256 位来表示,已经超过了目前已知的表达极限。
如果只是这个问题,那么要求每笔交易之间间隔几秒钟即可(如果相互冲突的交易之间间隔太短,这两个交易都会被拒绝;但是等到每笔交易完成几秒钟后,所有参与方就能确保不会发生这种情况)。但是,实际情况会更加糟糕,原因有两点:
“网络延迟” 在恶意环境中无法得到限制。攻击者或能使用拒绝服务攻击(denial-of-service measures)来任意降低系统速度,并通过其它方式对网络进行物理分区。
用相对论来说,这意味着无论将等待时间设为多久,都无法确保参与者不会与网络中的其他参与者类空分离(spacelike separated)。
新加入网络或最近离线的用户需要访问历史数据。但是,没有办法可以事后验证交易发生的顺序,因此在出现交易冲突的情况下,用户无法保证他们收到的交易是先发生的。
是否一定要使用 DMMS 才能打造分布式的共识机制呢?到目前为止这还是一个开放问题。笔者的猜测是 “不是”。更具体一点来说,简单改变比特币协议,用 “优惠券” 来奖励那些以更低难度挖出未来区块的矿工 [BDC+14, 章节 6.1] 不太可能破坏共识机制,但这种模式显然不符合我们上述的 DMMS 定义。
有了比特币的共识机制作为基础,我们来分析一下当前最流行的替代方案,权益证明(Proof of Stake)。PoS 的描述见 [Poe14b]:
有了现代密码学之后,“ ‘信息’ 本身即是物理上真实且具有价值的东西” 这一观念便摆脱了哲学系的教室,进入到真实的商业世界。我们都非常熟悉安全的通信所支撑的经济活动:谈判意见、合同、交易、买单和命令,都能发到互联网公网上而无需担心伪造和拦截。我们也都清楚,如果秘密数据遗失或被盗会带来什么样的经济后果。到了 2009 年 1 月,密码学货币诞生 [Nak09],有价信息的概念就变得更加具体。你可以在公开的通信媒介中持有和交换一种同质化(fungible)的价值储存物,仅仅只需使用密码学方法(无需物理的安全设施)来防止欺诈和盗窃。人们不仅可以说 “这把加密密钥值 1 万美元,因为假使它暴露,我们就会损失这么多金钱”,还可以说 “这把密钥值 1 万美元,但里面的价值是可以分拆的,你可以拆出 20 美元发给别人,自己留着剩余的部分”。有这些背景知识,权益证明其实很好理解。一个权益证明就是一个对所有权的密码学证明。在密码学货币中,权益证明不仅能够证明一笔货币的所有权,还可以证明这笔钱满足一些特征(比如,这笔钱是被锁定的、无法花用的,直到某些条件被满足才会解锁)。具体来说,证明资金锁定在一种稀缺且实验性的密码学货币上,可以视作证明了其人对该项目的成功有浓厚的兴趣。用户可以用提供锁定的权益来证明自己对项目的持续存在(及可持续发展)有兴趣。
也就是说,权益证明是这样一种观念:我们可以使用密码学证明,而不是像朗道尔极限(Landauer limit)这样的物理学理论,来证明某些计算是非常昂贵的。
使用 “纯粹的权益证明” 来生成对一种密码学货币的历史的共识,这种思路其实是预设了:有可能创造出一种近似 DMMS 的签名方案 7,其代价函数度量的是该种币本身的数量。这在原理上听起来很简单,我们再次引用 [Poe14b]:
在一个足够有表现力(sufficiently expressive)的账本上,货币的持有者可以锁定他们的货币一段时间,以租借在密码学上可验证的 “权益(stake)”。需要推进共识历史时,每一个权益持有者都为延伸的内容(区块)签名,而不是为这些内容附加工作量证明。出于实践上的方便,一般来说,每次出块都会随机选出权益持有者中的一小部分,来负责出块;而且,要让区块获得合法性(validity),也只需要这个小团队中的大多数同意就行。这些被选中的权益持有者可以获得奖励,而且一段时间后,只要他们愿意,就能解锁自己的权益。这里的观念是,与其让控制历史的经济代价高不可攀,权益持有者们有激励对每一个区块达成一致,因为(a)他们都是随机挑选出来的,不太可能相互勾结;(b)即使他们可能相互勾结,也不想搞崩整个系统(例如,签署相互冲突的历史就会导致这个结果);(c)他们资本有限,无法造成巨大的破坏。因为上述理由,下一个被随机选出的权益持有者团体可能只会选择在一个他们认为可靠的历史上出块。
注 7:权益证明方案并不总被尝试设计成无过程性的(progress-free,亦即无论你此前做了什么,都不会影响你下一次尝试的成功率),所以并不都能成为正确的或者安全的 DMMS。但是,其根本宗旨仍然是 “让制造历史非常昂贵,并奖励那些参与正确历史的人”,所以我们继续以成本这个视角来观察。
该文已经稍微把事情复杂化了:在真实的权益证明系统中,往往只需要一个签名者认可,而不需要绝大部分的认可。
这里的问题是,要想恰到好处地定义出一种能够度量(以某种货币的形式)锁定权益数量的代价函数,先得有这种货币的共识历史。如果只能达到 “存在某段历史,其中这些币都是锁定在一起的” 的程度,则虽然最终的 DMMS 可能定义得很清楚,但其代价函数不再是度量稀缺的东西,而本文 3.5 节的结论也就都不成立了。
当然,稀缺可以通过惩罚那些签署多个历史的权益持有者来塑造。举个例子,如果系统使用 Schnorr 或者 ECDSA 签名方案,且权益持有者在签名时仅能选择一个特定的 nonce,则他们要签署多个历史时,就必然会用到同样的 (key, nonce) 对来签发两条消息,而这会使得他人能用几何求解出他们的私钥。但是,这样的设计还是不能阻止权益持有者们 “研磨(grinding)” 区块(不断尝试不同的区块),仅发布那个能使他们在下一个区块继续担任出块者的区块 8,这样不断重复就能完全掌控整个区块链。这就是 “权益研磨” 攻击的一个例子。下文我们可以看到,权益研磨只是一个更普遍问题的一个特例而已。
总的来说,一次性签名方案可以防止权益持有者发布相互冲突的历史(前提是攻击者对自己会丢的币估价更高,而不能从自己导致的混乱中得到更多),但一次性签名无法防止权益持有者偷偷地制造相互冲突的历史。
注 8: 注意,随机数必须由区块链本身来决定,因为它就是大家要共识的唯一对象。所以 PoS 矿工可以用权益研磨来扭曲系统。使用多个区块或者久远的区块来决定随机数并不能解决这个问题,无论哪一种方案,都有某一方能够操纵它。
终极来看,问题在于,为提出一条权益签名而锁定的币,仅存在于这些币所属的区块链上(coins bonded against a stake signature only exist within the blockchain to which those coins belong)。这就意味着,只要某些团体能以低廉的成本创建区块链,这样的团体就会创建多条区块链,然后选择较为偏向他们利益的那一条。
如果每个人都能便宜地创建历史,那系统就会崩溃。锁定权益的用意正在于,让 “便宜创建历史” 的权限仅对那些愿意长期持有这种货币的人开放,而且可以假设,对这些人来说,这个系统意义重大,以至于不可能去攻击它。但是,因为没有全局时间(对那些新加入网络的人,也没有全局历史),那就根本没有办法把 “最近” 才开始持币的人与 “一直” 持币的人区分开来。对一个权益证明系统来说,在历史中的任何一个时间点,都有一组签名密钥可以转让货币、锁定和解锁权益、签名区块。可以假设,在真实世界里的某一刻,系统创建出一个新区块的时候,在这一刻,一些密钥对应着所有权。但是,真实世界的时间会继续流转,而这个区块会变成静态之物,所有与它相关的签名密钥也会一起变成静态的。
我再说一遍:在真实的时间里,区块链会变得越来越长,权益会解锁,币会被用来交换别的产品和服务,而那些密钥,即使误用会导致持有者损失价值,也会变得毫无意义。但对于一个不可更改的区块链来说,区块的密钥的含义(meaning)永远不能发生改变。
因为在一个权益证明系统中,部分密钥就决定了未来,这就导致了一个问题。无论什么人,只要能获得这些密钥(可能是自己把币清仓了的用户,或是跟她买到了私钥或者捡到了她的私钥的人;用户不善于长期保存私钥,尤其是那些他们觉得自己再也用不上的私钥!),就有能力分叉这个网络,或者创造出另一个历史;新用户并不能分辨出哪个是真的、哪个是伪造的。
要点在于,即使权益持有者要锁定(具有高昂市场价值的)一大笔资金,而且一旦不遵守协议就会损失所有资金,这种威慑力在用户解锁自己的权益之后也会消失,而解锁或早或晚总会到来(无论是从系统外部看还是从系统内部看),而且在当下(这个区块)也必然无法确定权益会在什么时候(哪个区块)解锁。所以,免费的历史,或者说 “零成本的模拟”,是没法通过锁定由系统内部定义的价值来防范的。
如果你要求权益持有者必须长时间绑定权益,而且使用久远以前(以区块计)的区块产生选择签名者的随机性,那就可以让上述的攻击者必须重写很长一段时间的历史。常常有人说,这样就能 “防止短程攻击”。
很清楚的是,这还是没有解决零成本模拟问题;毕竟,只要创建历史本身很容易,那无论创建多长的历史分支都很容易。不过,支持者们常常说,有一个诚实签名者创建的历史,这条链积攒的区块数量也正对应着现实世界里的较长时间,而对这段历史的任何修改都会与参与者们所铭记的这段历史相冲突。因此,大家可以检测到并意识到这是一场攻击,然后拒绝掉它。
如果软件能正确实现这里的规则,那确实是没什么问题的了,但它改变了比特币这类系统所用的信任模型。那些新加入网络的参与者会遭遇多种历史,而且也不再能够仅凭自己就辨认出哪个是真的;他们需要询问网络中已有的参与者(可能是他们的朋友,家人,声誉卓著的大企业、公开的网站,等等)哪个历史才是真的。这就不是一种分布式共识机制了!这是另一类共识机制,虽然能在始终在线的对等节点间去中心化地形成,但新加入网络的用户和长期离线的,就必须信任某些人了。这种模型对于法律上的压力、对 “被信任” 实体的攻击和网络攻击,自然都是非常脆弱的。
再次引用 [Poe14b]:
另外,这种可以控制未来签名者人选(甚至控制整个权益持有者集合,可通过控制进入区块的交易实现)的能力会带来严重的后果。甚至不必由处心积虑的攻击者来动手,任何时候有权出块的签名者都有激励将大家导向一个他本人会有更多权益(也因此能获得更多奖励)的历史,使系统趋向中心化。他们可以通过扭曲未来区块对签名者的选择来实现,或者更隐蔽地,可以审查那些最终会扩大权益持有者群体的交易。
本文描述了 DMMS 机制如何能产生一种分布式的共识机制。虽然 DMMS 连带着一些经济上的要求,足以形成共识,但它可能不是必需的。开放问题包括减少这些经济上的假设(或者证明这些要求是不可消除的),以及确定哪些条件是分布式共识的必要条件。
我们还分析了 DMMS 的一种替代品,权益证明。我们证明了,仅靠系统内的资源,权益证明是无法形成分布式共识的,因为它要依靠自己尝试形成的历史来执行惩罚。
声明:本内容为作者独立观点,不代表 CoinVoice 立场,且不构成投资建议,请谨慎对待,如需报道或加入交流群,请联系微信:VOICE-V。
简介:建立最好的以太坊中文技术社区,持续推广和普及以太坊的技术,帮助以太坊释放区块链和智能合约的潜力,并为开发者提供更好的平台和机会
评论0条