如何学会爱上弱主观性
权益证明(PoS)一直是密码学货币领域最具争议性的话题。
尽管这个模式有许多不可否认的好处,包括高效、更大的安全保障和对硬件集中化的永久免疫,PoS 算法,往往比基于 PoW 的方案更复杂,关于 PoS 的可行性也一直有广泛的质疑,有人认为 “无利害关系“(Nothing at stake
)” 问题是根本无法解决的。
事实证明,这些问题是可以解决的,我们可以提供一个严密的论证,PoS 连同它的一切是可以成功的,只不过要付出一点微小的代价。这篇文章的目的是解释这个代价是什么,以及如何将其影响最小化。
经济组(Economic Set)和 “无利害关系”(Nothing at stake)
首先,请循其本。一般来说,共识算法的目的,是为了允许系统根据一些特定的状态转换规则来安全地更新状态;同时,执行这些状态转换的权利是分散在一个经济组当中的。
一个经济组是一组被可以被授予权利(can be given the right)的用户,他们可以共同地通过算法来执行状态转换;用于共识的经济组所需的重要特性是:它必须是安全地去中心化的(securely decentralized) —— 这意味着没有一个角色(或一个串谋的团体)可以控制这个群组的绝大多数,即使这个角色资金雄厚且有获利的可能。到目前为止,我们已经发现了三种安全且去中心化的经济组,每种经济组对应一类共识算法:
算力的持有者:标准的工作证明(PoW),或 TaPoW。请注意,它有两种变种:用专门的硬件来参与的和(理想情况下)通用的硬件来参与的。
权益持有者:PoS 的所有变种。
用户的社会网络:瑞波/恒星类型的共识。
值得注意的是,最近有一些人尝试开发基于传统拜占庭容错理论(traditional Byzantine fault tolerance)的共识算法;然而,所有这些方法都是基于 M-of-N 的安全模型,而适用 “拜占庭容错” 概念本还需面对的一个问题是,N 应从哪里取样。在大多数情况下,所用的经济组都是权益持有者,所以我们会把这种新的 BFT 范式作为 “PoS” 的严格子类别(clever subcategories)对待。
工作证明(PoW)具有很好的特性,使得为它设计有效的算法更加简单:参与经济组要求参与者消耗系统外部的资源。这意味着,在为区块链贡献工作量时,矿工必须在所有可能的链分支(forks)中选择一个(为之贡献工作量、延续它)(或者启动一个新分支),不同的选项是相互排斥的。双重投票(Double-voting),哪怕第二次的投票是在第一次投票的许多年后进行,也是无利可图的,因为它需要你将算力分散在不同的选票上;主导战略是让你的算力只放在你认为最可能会胜出的分叉上。
然而对 PoS 来说,情况就不同了。虽然加入经济组的门槛可能是高的(虽然我们会看到不总是这样),但是投票是免费的。这样的 “幼稚的 PoS” 算法,只是试图让每一个币都成为一个 “模拟矿机”,使币的主人每秒有一个特定的概率有权签名一个区块(出块),以此仿制工作证明,所以有一个致命的缺陷:如果有多个分叉,最佳的策略是给所有不同的分叉投票。这就是 “Nothing at stake” 的核心。
有一个概念可以告诉我们为什么在 PoS 环境下你没法让一个用户只给一个分叉投票:“利他主义主导型人格(altruism-prime)”。利他主义主导性人格是真利他主义和假利他主义的混合,(部分用户或者软件开发者可能具备的)前者是出于对他人和网络财富的直接关切、以及做出明显为恶的事情(例如双重投票)时的道德厌恶感;后者则是因为持有币的人也不希望看到他们的币价值归零。
但是,仅仅依靠利他主义主导型人格是靠不住的,因为由协议的完整性产生的币价值的提升是公共利益,会遭遇供给不足的问题(例如,如果有 1000 个权益持有者( stakeholders),他们的每一个行动都总有 1% 的概率变成促使一次攻击成功的 “关键” 因素,且这个攻击会导致币值归零,那么对任一权益持有者,都只需提供等价于他持币价值的 1% 就可以贿赂他)。假定持币量的分布等价于以太坊的创世区块,需要贿赂的量将等于总权益(总持币量)的 0.3% 到 8.6% 不等(或更少,如果攻击是非致命性的),这取决于你如何估计每个用户成为关键因素的概率。尽管如此,利他主义主导型人格仍然是算法设计者应该记住的一个重要概念,在有用的时候,它的优势会表现得很明显。
短程分叉和长程分叉
如果我们仅考虑短程分叉,即距离最新区块的距离小于一定数量(比如 3000 个区块)的分叉,那么实际上存在一个解决 “Nothing at stake” 问题的办法:安全押金。为了有资格获得区块投票的奖励,用户必须先存入一笔押金,如果该用户被发现给多个分叉投票,则他人可以在原来的链上发布一条对这些事务的证明,然后拿走该用户的奖励。因此,不断在一条链上投票就成为了主导策略。
另一套策略,被称为 “Slasher2.0″(这是相对于最早的基于押金的 PoS 算法 Slasher1.0 而言),仅仅惩罚给 错误 的分叉投票的选民,不是进行双重投票的选民。这使得分析变得相当简单,因为它不需要提前很多个区块先安排好投票者(来防止概率性的双重投票),虽然也是有成本的,因为一旦在同一高度的块上有 2 种选择,用户可能会选择哪个都不支持。如果我们想让用户签名(投票),在这种情况下,“对数评分规则” 的一个变种可以拿来使用(这里有更详细的研究)。为方便讨论,(这里直接认为)Slasher1.0 和 2.0 具有相同的性质。
为什么这种方法仅仅对短程分叉有效,原因很简单:用户最终有权收回押金,一旦取回押金,不再有任何理由不用这些币(权益)在长程分叉上投票。处理这个问题的一种途径是让押金永久化,但是这些方法都有各自的问题:除非一个币的价值不断增长,不断接纳新的签名者(投票人),否则最终会僵化成为一种永久的贵族统治。鉴于让密码学货币普及的其中一个因素就是,民众对贵族拥有永恒权力的不满,在数字世界里复制一个这种东西出来是不可能被大多数用户接受的。只有那些特定用途、注定要结束的区块链,在追求速死时,才应该使用贵族模型(比如你可以想象一种基于区块链、只跑一轮的游戏)。
解决这种问题的一类办法是将上述的罚没机制(用于对付短程分叉)和一个备份方案,事务自身即 PoS (transactions-as-proof-of-stake),结合起来。TaPos 统计各区块的交易费作为每一区块的得分(要求每一次交易都包括最近的一个块的哈希,以使交易不变得过于琐细),理论上,一个成功的攻击必须花费大量成本才能实现。然而,这种混合的方法有个根本的缺陷:如果我们假设攻击成功的概率近乎为零,则每个签名人都有一个激励,提供一项收费服务:为分叉链重新签署自己签署过的所有交易的(如此反而会使分叉势均力敌);因此,从博弈理论来看,攻击的成功概率为零并非稳定的均衡。
你觉得不可能每一个用户都会开一个自己的 node.js 网页应用来收受贿赂?没错,如果大家都有这样的动机,还有一个更为简单的做法:在黑市上出售老的、不再使用的私钥。即使没有黑市,PoS 系统的币也将永远处于这种威胁之下:那些在预售阶段买了币的部分大户最终会见面并互相串通,合伙搞个分叉来谋取私利。
因为所有的上述观点,我们可以得出结论:很不幸,这种发起任意长程的分叉的威胁是基本存在的;而且,所有的 non-degenerate 实现来说,PoS 算法想在 PoW 的安全模型下成功,都面临这样的致命威胁。
然而,我们可以通过对安全模型的轻微(但却是根本性的)变更,来绕过这个阻碍。
弱主观性(Weak Subjectivity)
虽然有许多方法来分类共识算法,接下来的部分我们将重点讨论如下内容。首先,我们将提供今天最常见的两种范式:
客观的:新加入网络的节点只需了解(1)协议的定义和(2)所有的块和其他已经公布的 “重要” 的消息,不需要其他信息,即可对最新状态达成与网络的其他成员相同的结论。
主观的:在这样的系统中,不同的节点总是会得到不同的结论,要加入网络则先要获得大量的社会信息(例如声望)。
使用社交网络作为共识集的系统(如瑞波)都必然是主观的;一个只知道协议和数据的新节点,能够被攻击者说服,从而认为攻击者的 100000 个节点是可信的;所以没有信誉就没有办法应对攻击。而另一方面,PoW 则是客观的:当前状态也将总是包含最高工作量预期的状态。
现在要给权益证明(PoS)添加第三种范式:
弱主观性:新加入网络的节点只需要知道(1)协议定义、(2)所有的区块和其他已经公布的“重要”消息和(3)距今 N 个区块以内的、已被公认为有效的状态;即可与网络中的其他参与者对最新状态达成一致,除非有一个攻击者永久拥有超过百分之 X 控制共识集的能力。
在这种模式下,我们可以清楚地看到 PoS 工作得非常好:我们只是禁止节点回滚(reverting)超过 N 个区块,并将 N 设为安全押金的时长( set N to be the security deposit length)。也就是说,如果 S 状态有效,且已成为至少 N 个有效状态的祖先,那么从此开始,不属于 S 的后代的 S' 就必然是无效的。长程攻击因此不再是个问题,因为我们只需说,根据协议的定义,长程分叉是无效的。这条规则显然是弱主观的,而且额外的好处是 X 会等于 100%(即,除非创造长于 N 个区块的分叉,没有攻击者可以造成永久性的分裂)。
另一个弱主观评分方法是 指数性主观评分,定义如下:
每个状态 S 都有一个 “得分” 和一个 “重力”
创世区块的得分为 0,重力为 1
score(block) = score(block.parent) + weight(block) * gravity(block.parent)
, 这里 weight(block) 通常是1, 当然也可以使用更高级的权重函数 (例如,对比特币来说,weight(block) = block.difficulty
也可以很好地工作)如果一个节点发现一个新的块 B' 且 B 是其父块,如果从 B 延伸出来的最长分叉的长度为 n,则
gravity(B') = gravity(B) * 0.99 ^ n
(注意,除了 0.99,这里也可以有别的取值)
本质上,我们这是在显式地惩罚后来出现的分叉。ESS 不像那些更幼稚的、依赖于主观性的方法,它基本上能避免永久性的网络分裂;如果第一节点和最后一个节点收到区块 B 的时间间隔是 k 个区块,分叉就不能长期持续,除非两条分叉的长度永远保持在彼此的约 K % 的范围内(unless the lengths of the two forks remain forever within roughly k
percent of each other)(如果是这样的话,那么分叉的不同重力值,将使网络的一半永远以某个分叉为更高得分的分叉,而另一边则永远支持另一条分叉)。因此,ESS 是弱主观的,X 大致对应于攻击者能创建的网络分裂的比例接近 50/50 的程度(例如,假如攻击者可以创建一个 70/30 的分裂,那么 x = 0.29)。
一般来说,“最多回退 N 个区块” 规则更优、复杂性更小,但如果用户愿意接受更高程度的主观性(即更小的 N)以换取更快得到非常高的安全性(即在 N 个区块后免疫 99% 的攻击),则 ESS 也许能被证明更有效。
推论
那么,由弱主观性共识驱动的世界看起来将是什么样子的?
首先,总是在线的节点不会遭遇问题;对他们来说,弱主观性的定义等价于客观性。
偶尔在线一次的节点,或至少每隔 N 个区块上线一次的节点,也不会遇到问题,因为他们能够不断地得到网络的更新状态。
但是,新加入网络的节点,以及很长一段时间才出现一次的节点,将不能依赖共识算法来保护他们。幸运的是,对他们来说,解决方法很简单:在他们第一次注册、或长时间下线后再次上线时,他们只需要从朋友、或一个区块浏览器、或者仅仅是他们的软件供应商那里得到最近的块的哈希,作为一个 “检查点” 导入他们的区块链客户端软件里,这样就能够安全地从那里更新他们的当前状态。
这个安全假设,“从一个朋友处” 获得区块哈希值的想法,对许多人来说似乎不太严谨;比特币开发者往往会指出的是,如果长程攻击的解决方案是某种替代性的决定机制 X,则区块链的安全最终取决于机制 X,所以在现实中这个算法并不比直接利用 X 更安全 —— 他们的暗示是,大部分 X ,也包括我们的社会共识驱动的方法,是不安全的。
然而,这种逻辑忽略了为什么会出现共识算法(why consensus algorithms exist in the first place)。共识是一个社会过程,而且人类非常擅长达成共识,完全不需要来自算法的任何帮助;也许最好的例子是石头币,在雅浦岛的一个部落里,他们以集体记忆来铭记石头币所有权的变更,几乎就是一种区块链(这些石头就像比特币一样,是一种没有内在价值的资产)。
为什么共识算法是必要的,很简单,因为人类没有无限的计算能力,而宁愿依靠软件来为我们维护共识。在这个意义上,作为代理人的软件是非常聪明的,因为它们能以完美的精确性对非常大体量的状态适用非常复杂的规则;但它们也很无知,因为他们缺乏社会信息,而共识算法的设计挑战正在于创造出所需社会信息输入尽可能少的算法。
弱主观性是正确的解决方案。它依靠人类自驱的社会信息解决了 PoS 的长程攻击问题,共识算法的作用仅在于提高共识的速度(将数周缩短到十几秒)并为大规模的状态执行高度复杂的规则。人类自驱共识的作用是维持对区块哈希值的共识超过一定的时间。假设一个暴虐的政府强大到足以让一年前的区块产生混淆,那么它也会强大到足以干掉任何 PoW 算法,或导致区块链协议规则的混乱。
另外,还请注意,我们不需要固定 N;理论上,我们可以想出一个算法,允许用户锁定押金超过 N 个区块,这些存款可以让用户更精细地解读系统的安全等级。例如,如果用户的上一次登录在 T 个区块以前,而从当前来看, 23% 的押金的锁定时长大于T, 然后用户可以使用自己的主观评分函数,忽略新押金的签名,从而成功防御来高达总权益 11.5% 的攻击。逐渐上升的利率安排可以被用来激励长期的押金,或为简单起见,我们可以仅仅依赖利他主义主导型人格。
边际成本:其他异议
对于长期存款的一个反对意见是,它鼓励用户锁定自己的资本,这是无效率的,和 PoW 有同样的问题。然而,可以从三种角度反对这种意见。
第一,边际成本不是总成本,PoS 边际成本占总成本的比例比 PoW 要小得多。用户可能把他们的资本的 50% 锁上几个月也不感觉有什么, 70% 会有点小痛,但如果没有大的奖励,锁定 85% 以上就无法忍受了。此外,不同的用户在锁定资产方面会有各自不同的偏好。由于这两个因素叠加在一起,不管最终是什么样的均衡利率,绝大部分的锁定资本的边际成本都远远较低。
第二,锁定的资本是私人成本,但也是一种有益公共利益的行为。锁定资本意味着只有更少的币可供交易,所以货币的价值将增加,并导致对其他人的资本再分配,这会创造社会效益。
第三,安全押金是一种非常安全的价值储藏,所以(1)他们把货币的使用替代为一种个人的保险工具,及(2)许多用户将能够用安全押金获得同等货币额担保的贷款。
幸运的是,有一种方法来测试这些假设:发布一个 PoS 币,设置成每年 1%,2%,3%的权益奖励,看看在每一种情况下币存入的百分比有多大。用户不会和自己的利益过不去,所以我们可以拿用户在共识上会花费多少钱来看这种共识算法会带来多少的无效率;如果证明权益证明在比工作证明更低的回报水平的情况下,具有合理的安全级别,那么我们就知道 PoS 是一种更高效的共识机制,而且我们可以用不同的报酬水平,得到一个总成本和边际成之间的比率的准确概念。最终,我们可能需要几年时间,才能得出确切的资金锁定成本的值有多大。
总之,我们现在确定了两点:
(1)PoS 算法也可以安全,要想避开 “nothing-at-stake” 问题,改变安全模型、弱拥抱主观性,既有必要,也已充足。
(2)有大量的经济理由,相信 PoS 比 PoW 更具经济效率。PoS 不是不可知的;过去六个月的形式化及研究已经确定了其优劣势所在,至少在很大程度上与 PoW 不相上下,PoW 的挖矿集中化的不确定性可能永远都存在。现在,这只是一个如何标准化算法的简单问题,也给了区块链开发者一个选择。
(完)
编者注:此文发表于 2014 年,说明了 PoS 系统的运行需要我们如何更改安全假设。引人注意的是作者在文章的末段提出的意见:“人类本身非常善于达成共识;共识算法只是加快了达成共识的速度”,这似乎意味着,人类自驱的社会共识,足以支撑一个分布式系统的安全性,而 “弱主观性” 也仅仅是白玉微瑕。但是,人类善于 “达成” 共识吗?并不。小到打官司、政策争论,大到国际争端乃至战争,无一例外都暗示着,人类并不善于达成共识,因为作为共识对象的状态的背后是规则,而人类会不断冲击规则、对规则作出有利于自己的解释,乃至直接破坏规则。因为说到底,人类只是善于发现自己的利益,而不是达成共识,达成共识许多时候只是达成利益的一个步骤,而利益如果转移共识也就会被破坏。回到问题本身,在客观性共识的世界里,“创世块” + 最长链规则,就能确切地定义一种币并解决伪币问题;但在弱主观性的世界里,创世块定义不了币种,要解决伪币问题,除非你从创世块开始就是验证者,否则你只能假手他人。要是一个系统的最新状态的裁决和解读是依赖于一小部分人的,那么不信任这一小部分人的人就根本不会去用这个系统。这就丧失了所谓的 “社会可扩展性”。
(完)
微信掃描關注公眾號,及時掌握新動向
2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表比特範的觀點或立場
2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表比特範的觀點或立場