许多权益证明(Proof-of-Stake, PoS)项目涌现出来。以太坊 Casper,卡尔达诺(Cardano)的 Ouroboros,等等。对权益证明协议日益高涨的兴趣可能源于无限扩展区块链的愿望,再加上认定“工作量证明(Proof-of-Work, PoW)很 ‘浪费’ ”的错误观念。(到这里看关于工作量证明的更细致的讨论)(译者注:中译本见文末超链接《剖析工作量证明》)
但是,关于权益证明协议,有件事还没有得到足够多的强调,就是它在处理完最恶劣的情况之后缺乏恢复能力 [作者注1]。举个例子:导致网络中的大部分节点甚至所有节点掉线或是相互隔绝的极端情况。又或是偷盗/买卖私钥的风险。
有人可能会认为,这些情况是很罕见的或是不可能出现的,但是,a)这些情况也许并不像你认为的那么罕见以及 b)即便是发生的概率只有 0.1% 也意味着在长期中它 将会 发生——也就是 Nassim Taleb 所说的黑天鹅事件。
简单点来说,这些事件几乎不可能发生,但当它们发生的时候,结果通常是灾难性的。我们人类常常低估影响巨大的长尾事件。例如,我们会有一种幻觉,觉得明天肯定是安全的,因为我们在过去 10 年或是 100 年间一直是安全的。
在设计协议的时候,仔细考虑长尾事件是非常重要的,尤其是该协议有潜力成为全球经济的支柱时,数以百万计的用户和业务都会依赖它。
我们必须用对待核反应堆软件的态度来对待比特币软件。在工程的意义上,这一级别的软件是所谓的关键系统(Critical System)。有三种类型的关键系统:安全关键型、任务关键型以及业务关键型。比特币符合三种特征(丢钱可以是很要命的)。所以压根不能允许犯错。
有经验的工程师在晚上也不会熟睡,即便系统具备了当前比特币安全性的程度,离完美也还远着呢。他们知道我们离灾难永远只有一步之遥,不管论文写得多可靠、系统看来已经平稳运转了多久。
过去已经出现了好几个令人瞩目的工程错误,清楚地证明了这种隐藏的危险。下面是一些例子:
1)协和飞机坠毁(2003)
协和号飞机(1976 ~ 2003)史上仅有的两种超音速客机之一。协和飞机失事是由于起飞时候爆炸的轮胎撞击油箱、造成连锁反应而发生的。而协和号还一度被认为是“世界上最安全的飞机”之一。
2)挑战者号失事(1986)
NASA(美国国家航空航天局)一开始估计失败几率只有十万分之一。Richard Feynman 领导研究发现32 度下 O 型环无法扩展。真正的几率非常接近于百分之一。误差达到了一千倍!
3)福岛核电站事故(2011)
日本是在防震技术和地震安全方面是最好的国家之一了。
然而,福岛核电站事故还是在你可以称之为灾难的完美组合中发生了:日本有史以来最剧烈的 9 级大地震,再加上千年一遇的浪高15米的海啸。
在组建关键系统时,考虑最糟糕的情形是绝对必要的;如果这些系统是世界范围内的,这样的考虑会变得更加重要。
然后,我们来解释一下工作量证明和权益证明是如何处理网络隔离以及没有预料到的断联的 [作者注2]。
直截了当地说,这些情况并不像人们想的那么罕见:在……期间,……成功地劫持了 BGP 网络协议以阻止人们发推特。……
你也可以想象战争的情形——互相敌对的也许会想要端掉敌人的通讯基础设施,这很有可能是第一个目标,因为不管是谁,有更好的通讯便占了上风。
那么,工作量证明系统或是权益证明在这种情况下有多强韧呢?我们来讨论一些例子。
场景 1:一段时期,整个网络都被强制下线,然后重启。
因为不同地区也许不会同时重启并重新联系上其他人,很有可能最终结果就是从网络被黑之前的最后一个共同区块开始,几个地区形成他们自己独立的链,因此分裂成了多条链。
跨链通信重建的时候,各独立链上的节点将联系上其他人。
在工作量证明中,节点会自动地自我组织并最终被吸引到单一的一条链上,就是累积了最多工作量证明(也是最安全的)的那条链。这个过程当然会很痛苦,因为一些链会被抛弃。但最终它会起作用,人们的行为也是确定的。
在权益证明协议中,节点不知道哪条链是更“对”的链。不像工作量证明,权益证明没有客观的尺度来评判两条链中哪条更“真实”。人们的行为是不确定的;如果不引入一些武断的规则,不可能实现自动化;但这些规则又会增加受攻击的面。分裂可能会一直存在下去,因为一些权益证明协议不允许进行太深的回滚。
权益证明协议的设计者在“惩罚”恶意参与者上已经走得太远。他们没有考虑过所有节点都诚实地行动、但链却分裂了的可能性!
场景 2:部分网络与主网隔离开来。
可以证明,这种情况的结果跟我们在场景 1 中看到的情形相似。各分区将继续运转,就好像一切都运转良好那样——除了“活动的”保证金节点的数量在每一个孤立的分区中都变得更少。各分区重新联系上主网时,困惑就随之而来。节点不知道哪条链是正确的链。
场景 1 与场景 2 的一个主要的区别在于,场景 2 发生的几率会更高。流量重定向总比完全关闭流量容易——我们已经看过这种事发生了。这种类型的分区可以小到一个小镇。可以想象这种事情每几年就会发生一次,甚至比这还频繁。
场景 3:在另一些最坏的情景中,比如私钥被盗,权益证明协议也会更糟糕。
财富分布常常服从幂分布(Power Laws,或说少数支配定律),没有理由认为加密货币会是例外。“1% 的加密货币持有者”,屈指可数的几个人,可能掌控着全部货币供给的很大一部分,甚至绝大多数。
这些最富有的 PoS 权益所有者的私钥可能会因为机巧的社会工程学攻击(绑架、拷打、勒索,等等)而被偷走。通过偷盗私钥而不是在公开市场上租借或是购买货币,攻击者避免了货币价格的上升。奇怪的是,在考虑这种攻击途径的时候,权益证明协议的设计者常常假设在公开市场上购买货币是唯一一种掌控大多数控制权的方式,因此错误地断定攻击权益证明货币的成本仅仅由其市场价格决定。偷盗私钥可以干脆地躲开“防御”并显著地降低攻击成本。
(此类攻击的一个变种是从以前的大额权益所有者处购买旧密钥,这些人可能不再对加密货币感兴趣了。)
在工作量证明中,这等同于控制绝大多数的算力。
一个控制绝大多数算力的人在工作量证明系统里能做什么呢?他可以尝试双花(Double-spend)或是重写历史。但要双花的话,他得消耗掉一大笔钱。获得绝大多数的控制力仅仅是第一步。即便在这种场景下,就像它听起来那么糟糕的时候,协议还是会像预期中那样起作用,只有一条链可以被认为是有效的(即便 SPV(Simplified Payment Verification,简化交易验证)节点会觉得困惑——这也是我们一般鼓励运行全节点的原因)。重写历史要消耗的金额会跟天文数字一样大,所以丢失用户余额的风险不高。用户可以选择等待灾难过去然后采取行动改变工作量证明算法。
总而言之,这是非常让人讨厌的情况。但我们可以看到获得绝大多数的算力在工作量证明中不会让攻击者获得无限的权力。你必须控制绝大多数算力并且花钱去发动攻击。我们可以认为这是一种 双层保护机制。当攻击发生的时候,人们的行为还是确定的,以及,不会对哪条链是有效的感到困惑。此种在敌意环境下的恢复能力没有得到足够多的重视。
相反,获得权益证明系统中的绝大多数权益会给你不受限制的权力。不像在工作量证明系统中,你可以双花而无需消耗任何额外的金钱。你也可以 a)重写历史,如果协议没有检查点(Checkpoint) 或是 b)导致无从调解的链分裂,如果协议有检查点的话(比如 Casper)。改变权益证明算法不会有什么帮助,因为实际上没有转换的成本,不像投资在硬件中那样。
总结一下,进入安全领域,工作量证明会带来两种利益:
权益证明没有办法提供这两种东西。权益证明的支持者也许会生成检查点可以缓解问题 #2,但实际上检查点只会将问题从一个地方转移到另一个地方。检查点是一个中心化的方案,会打开另一个潘多拉盒子 [作者注3]。
结论是,具备正确的思维对比特币和区块链协议发展来说是非常重要的。它们理应是能够适配最高级别工程的关键系统。
权益证明建立在有缺陷的并且是幼稚的假设上,它们在最糟糕的情形下会迅速崩溃。权益证明是往错误的方向迈出的一步:它会降低而不是提高防御的质量。
权益证明与错误的工程思维》),我讨论了为何在最坏的情况下,PoS 不如 PoW 恢复能力强。
在本文中,我将扩展讨论上文提过的场景 3:私钥攻击。
私钥攻击可以分为两类:旧 私钥攻击 & 现有 私钥攻击。
为了解决这一问题,新版本的 PoS 开始使用动态验证者集或者检查点(Checkpoint)。背后的思想是要收回曾经的”权益持有者“参与未来验证过程的权利。
然而,即使使用了上述方法,我们也无法完全在 PoS 协议中消除这个问题。以下两类节点仍旧十分脆弱:
a)刚刚加入网络的新节点
b)长期不活跃的节点
由于这些节点要么无任何区块历史,要么由于长期下线缺失了许多区块历史,他们(上述节点)很难检测到一些“权益持有者”在自己不在线的期间已经出售了其所持有的代币。
某些 PoS 的支持者可能会很快指出,PoW 的新节点中也会出现类似的问题,因此这个问题是可以接受的。
不过该论断非常具有误导性。虽然 PoW 系统中的新用户的确需要信任 某人,才能下载正确版本的软件并跟上其他节点的节奏。该信任并不延伸到信任某人来选择哪条链是合法的。
第二,也是更重要的一点,只要 PoW 节点软件下载完成,对于节点操作者来说,脱机任意时间都是比较安全的。在引导步骤完成后,PoW 可以达到高度“无需许可性(Permission-less)”:节点可以随时加入或者离开。除了在发生硬分叉的时候,需要节点操作者重复引导步骤(这也是为什么我们需要谨慎地进行硬分叉,并在可能的情况下尽量避免)。
而对于 PoS 的操作者来说,即使有了正确版本的节点软件,仍需定期向可信任的第三方沟通,以确定自己还在合法链上。对与主网失联或是被骗上错误的链的担忧会持续存在,说不定比你的可信任第三方的存在还要持久。这将大大降低协议的安全性。
所有 PoS 协议都会遭遇这一根本问题。
第二类私钥攻击的对象是现有私钥。这意味着即使加入动态验证者集或是检查点都无法预防该攻击。(事实上,由于自动检查点把未决的链分裂永久化,反而会加剧该问题。)
以下简述该类攻击是如何发生的:一名获得了持有至少 1/3 代币供应量的私钥的攻击者[4] 能够轻易地在相同高度创建出两条具有相当合法性的链,对于网络中的其他参与者来说,两条链中的任一条都不会看起来更“正确”(这实际上就是一次链分裂)。这对于大多数 PoS 协议来说都是破坏性的,因为在 PoS 下如果无法达到大于 2/3 的参与者是诚实参与者,协议就会停止运作。那么我们将无法“确认”任何区块,这条基于 PoS 的链就会停止生长并最终死去。
(上述保证持续运作的性质被称为“活跃性(liveness)”。)
让我们具体来看几个PoS实现:
Tendermint 认同上述缺点,并承认在协议卡住的情况下,用户需要通过链下手段达成共识:
“验证者子集应该通过外部方法协作,以签署”重组提案(reorg-proposal)“来选择出一条链。
我们还是应该赞扬他们的诚实,不过我完全无法同意该”解决方案“能真正解决问题。增加人类用户的手动干涉意味着该协议更难扩展,也意味着更容易被贿赂。这离我们在设计重要的基础设施级别的软件时想要的强健程度差了十万八千里。正如我上一篇文章里说的,从根本上说,这是心态问题。
Casper 在攻击方控制超过 1/3 权益时也会卡死。
Casper 引入了一个很成问题的概念——“不活跃漏洞(inactivity leak)”,节点只要离线就会受到惩罚,无论你是否故意恶意离线。这是一个非常 保守的规则 因为:a)这给了攻击者另一个攻击面,即攻击者可以发起 DDoS 攻击诚实验证者使其离线,进而使其亏损;b)这将使节点有潜在的理由(担心亏损)不抵押保证金(即 stake)。由于抵押保证金的参与度对 PoS 来说 极度 重要,该概念总体上会对整个网络的安全性造成负面影响。(下文会详述)
在 DFINITY 项目中,每个区块需要“认证(notorized)”两次才能最终“确认”。持有超过 1/3 权益的攻击者也有能力不让区块成功“认证”,以冻结该协议。
关于 DFINITY,还有一些重点我要提一下。
DFINITY 建立了一个模仿 PoW 链中的“区块重量”特征的机制(由此解决链分裂问题),但没有 PoW 背后的能源支持。该机制通过一个叫“random beacon”的东西在每一轮中随机部署一个验证者“排行榜”,每个区块的“重量”等于创建该区块的验证者的排名。简单来说,DFINITY 对于”重量“的思考仅仅基于随机性(并且所有参与者对相同的随机性达成共识)。
先不考虑这个“random beacon”是否真的能安全地实现,并以去中心化的形式实现,直观上说,这并不是个好点子。
一个数字化区块并没有真正的重量,所有的区块都是由一堆 0 和 1 组成的。如果生产区块没有成本,那么造假或者重新生产也就不会有成本。使得 PoW 区块具有真正的重量的,是区块哈希与挖矿消耗的能量之间的直接且可证明的联系。(更多关于该话题的内容,请看我关于 PoW 的文章)(编者注:中译本见文末《剖析工作量证明》)
而 DFINITY 的区块重量则是主观的,因此可能被操控。当出现以下两种情况时,该“被相信”的重量会变得毫无意义:a)当节点无法就随机性达成共识,或者 b)当随机数源停止运作(例如:区块”认证“错误会导致 random beacon 停止运作)
总的来说,DFINITY 的安全性可能实际上比 Tendermint 和 Casper 要差。虽然“准入小组”是个好主意,但它只是全部活跃验证者的一个子集(k < N)。由于该子集是随机选取的,恶意节点很容易在某些子集中占多数(也许在其他子集里只占少数)。能够控制 1/3 验证者子集的攻击者可能在一个子集中有超过 1/3 的参与度。随后攻击者可以进一步进行身份“研磨(grinding)”,直到占有他想要的份额来提高攻击成功的概率。(他不需要控制所有的准入小组,只需要控制 部分 即可。)
在上述的分析中,我们假设的最坏情况是攻击者控制了 货币总供给量 的 1/3 或以上,这在事实上很难,但并非不可能。不过在现实中,攻击者需要控制的“权益”并不需要这么高,因为攻击者只需控制“活跃权益(active stake)”的 1/3 或以上即可。
所有的权益持有者都参与到权益抵押与验证过程中的可能性是非常低的。我们先来假设参与度为 50%,那么攻击者只需控制 1/6(而非 1/3)的代币总供给就能够制造冲突区块或检查点了。假设参与度为 25%,那么攻击者只需控制 1/12。这有着很大的警示作用,正如之前提到的,财富通常服从幂定律分布,几个最富有的权益持有者轻易就能控制代币总供给量的1/12。
权益抵押的低参与度很可能是 PoS 协议需要面对的最大威胁。
让我们来回想一下,比特币成为一个突破性创新的背后到底有什么秘密?以下是三个关键因素:
第一和第二点都是 PoW 挖矿的方面,而第三点则嵌入了比特币的共识协议代码中。
第一点属于计算机科学与密码学的领域,第三点则属于经济学与博弈论的领域。
而唯独第二点,却很难说到底属于哪门学科。理解第二点并理解其重要性所需的思维模型可以说是多个学科的综合,如考古学、进化心理学、经济学甚至物理学。[5]
很可能是因为我们对第二点尚未充分研究,许多人忽视且大大低估了其重要性。 PoS 协议的设计者就经常犯这个错,在他们的设计中只考虑第一和第三点。
在 DFINITY 对随机性的执念中我们能看到这一点。DFINITY 的设计者认为随机性就是解决所有问题的关键。
而以太坊的 Casper 协议则是对激励机制有着执念,在这条路上走得越来越远,还创造了个毫无意义的术语——“加密经济学”。以太坊的设计者们以为只要巧妙地设计激励机制就能解决所有问题。
有句老话说:“如果你只有一个锤子,那么所有东西看起来都是钉子。”这句话还挺适合 PoS 协议设计领域的。
事实是,这个“无法伪造的奢侈消耗”很可能就是支撑起比特币最最最重要的组成部分。没有此种无法伪造的奢侈,比特币就既没有任何新东西,也不具备任何颠覆性。
总的来说,私钥攻击对 PoS 协议来说是个严肃的问题。在 PoW 中失去对大多数哈希率的控制不是什么好事,但这并不意味整个系统会完全崩塌。但在 PoS 中失去对“权益”的控制将使整个系统完全暴露且毫无防御能力。
作者注 1:一些早期对权益证明的分析:Andrew Poelstra, “论权益与共识”
作者注 2:网络隔离是一个重要的研究领域。看看 Ethan Heilman 在这个领域的工作
作者注 3:检查点可以用一种去中心化的方式来实现,但它们会导致一些问题,要求完全的中心化解决方案,所以实际上检查点就是中心化的。
注 4:这个1/3的比例取自已经有成熟研究的传统拜占庭容错系统,而PoS本身就是其中的一部分。传统拜占庭容错系统在大于等于1/3的节点是恶意节点时会失效。而"拜占庭容错"的概念则来自拜占庭将军问题,由 Lamport、Pease 与 Shostak 在1982年提出。
注5:请阅读 Nick Szabo 关于货币起源的论文,以便更好地理解第二点的重要性。
链接:
https://medium.com/@hugonguyen/proof-of-stake-the-wrong-engineering-mindset-15e641ab65a2
https://medium.com/@hugonguyen/proof-of-stake-the-wrong-engineering-mindset-15e641ab65a2