干货 | 权益证明 FAQ:Part-1
编者按:本文原文为以太坊 GitHub 上的《Proof of Stake FAQ》。EthFans 曾经在 2016 年10月编发过中译本,那时候大家还将 Proof of Stake 翻译为“股权证明”。(见文末超链接)。物换星移,PoS 在中文社区中的译名随着认识的深入而变化,FAQ 原文也在持续更新。现在,我们发布新译本,供大家参考,对照。
什么是权益证明
权益证明(PoS)是一类应用于公共区块链的共识算法,取决于验证者在网络中的经济权益。在基于公共区块链的工作量证明(PoW)(如比特币和当前的以太坊用例)中,算法会奖励那些为了验证交易并创建新区块(即挖矿)解决密码难题的参与者。在基于权益证明的公共区块链(如以太坊即将实现的Casper协议)中,一组验证者轮流提议并票决下一个区块,而每位验证者的投票权重取决于其保证金额的大小(即权益)。权益证明的重要优势包括保障安全性、降低中心化危险以及提升能源效率。
通常来说,权益证明算法如下所示。区块链会追踪一个验证者集,而任何持有该区块链的基础加密货币(对以太坊来说就是以太币)的人都可以通过发送一种将以太币锁定为保证金的特殊交易成为验证者。随后,创造并认可新区块的过程可通过当前所有验证者均可参与的共识算法来完成。
共识算法有很多种类,将奖励分配给参与共识算法的验证者的方式也有很多种,因此权益证明也有多种“风格”。从算法的角度来看,主要有两种:基于区块链的权益证明和拜占庭容错(BFT)型权益证明。
在基于区块链的权益证明中,共识算法在每个时段内伪随机地选择一个验证者(例如,每10秒钟为一个时间段),赋予该验证者出块的权力,新创造的区块必须跟在之前的某个区块(通常是位于最长链的末端的区块)后面。因此,随着时间的推移,大多数区块会填加到同一条区块链上,使之不断增长。
在拜占庭容错型权益证明中,虽然提议区块的权力会随机分配给验证者,但是决定哪一个区块是“合法的”要通过一个多轮过程来完成。每个验证者在每一轮都会给某个特定的区块投出一票,在这个多轮过程的最后,所有(诚实并联网的)验证者会就是否将这个区块添加到链上做出最终决定。要注意的是这些区块可能仍然链接在一起,其关键区别在于对一个区块的共识可以仅限于这个区块本身,与它后面的那条链的长度和大小无关。
权益证明相对于工作量证明有哪些优点?
详见《权益证明设计哲学》(https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51)这篇长文。(编者注:中译本见文末)
简言之:
不需要为了保护区块链而消耗大量电力(例如,比特币和以太坊预计每天要在共识机制的电力和硬件上耗费超过100万美元的成本)。
由于权益证明避免了高电耗,就没有太多必要为了保持网络中参与者的积极性而发行很多新代币。从理论上来说,甚至有可能变为负发行量,其中一部分交易费被“烧掉(burned)”,因此供应量会逐渐减少。
权益证明有助于实现更多采用博弈论机制设计的技术,从而更好地抑制中心化卡特尔式机构的形成,如果这种机构确实形成了的话,也能够阻止它们危害网络(如工作量证明中的自私挖矿)。
降低中心化风险,因此规模经济不会造成太大问题。你不会因为负担得起更好的大批量矿机而获得与投入资金不成比例的收益,在PoS中,1000万美元投资带给你的收益就是100万美元投资的整整十倍。
能够采用经济处罚,这让发动各种形式的51%攻击所要付出的代价比在工作量证明中高出许多——Vlad Zamfir说过这样一句话,大意是:“就好像如果你参与了51%攻击,你的ASIC矿场就会烧毁一样”。
权益证明将如何适应传统拜占庭容错研究?
拜占庭容错研究的一些基本成果适用于所有共识算法,不仅包括实用拜占庭容错算法等传统的共识算法,还有一切权益证明算法,以及经过适当数学建模的工作量证明。
这些关键性成果包括:
CAP定理(CAP theorem) (https://en.wikipedia.org/wiki/CAP_theorem)——“如果网络出现分区,你必须在一致性和可用性中选择一个,不能二者兼得。”直观一点来说很简单:如果网络一分为二,我在其中一半网络中发起交易“发送10枚代币给A”,在另一半网络中发起交易“发送10枚代币给B”,要么就是这个交易系统不可用,致使其中一个或两个交易无法处理,要么就是交易系统不一致,致使一半网络只会达成第一个交易,而另一半网络只会达成第二个交易。要注意的是CAP定理与可扩展性无关,它可以同样运用于分片系统和非分片系统。
FLP不可能定理(FLP impossibility)(http://the-paper-trail.org/blog/a-brief-tour-of-flp-impossibility/)——在异步环境中(即,即使在正常运行的节点之间,也无法控制网络延时上限),不可能创造出一种算法,在出现单个故障或不诚实的节点之时,确保能在任和特定的有限时间内达成共识。要注意的是这并非排除了 “拉斯维加斯(Las Vegas)”(https://en.wikipedia.org/wiki/Las_Vegas_algorithm)算法,该算法每轮都有一定的概率达成共识,因此在T秒内达成共识的概率会随着T的增加呈指数增长并向1趋近;这实际上是许多成功的共识算法都会使用的“应急之策”。
容错范围——在DLS的这篇文章(http://groups.csail.mit.edu/tds/papers/Lynch/jacm88.pdf)中,我们可以得知:(i)在部分同步的网络模型(即网络延时虽有上限,却不知上限值)中运行的协议可以容忍超过1/3的任意错误(即“拜占庭”错误);(ii) 在异步模式(即对网络延时没有范围限制)下的决定性协议不能容忍错误(虽然文章中没有提及随机化算法<http://link.springer.com/chapter/10.1007%2F978-3-540-77444-0_7>的容错率高达1/3);(iii)在同步模式(即网络延时保证会低于某个已知数)下的协议竟然能够实现100%的容错,不过在出错节点大于等于1/2时有一些限制条件。请注意值得我们注意的是“已验证的拜占庭(Authenticated Byzantine)”模型而非“拜占庭”模型;“已验证”在这里意味着我们可以在容错算法中使用公钥加密算法,该算法如今已经进行过了充分研究,而且成本很低。
经过Andrew Miller等人(https://socrates1024.s3.amazonaws.com/consensus.pdf)的严谨分析,工作量证明作为一种依赖于同步网络模型的算法符合整体蓝图。我们可以将网络模拟成由接近无穷数量的节点组成,每个节点代表很小单位的算力,单个节点在给定时间内创造一个区块的可能性很小。在这个模型下,假设不存在网络延时的话,协议有50%的容错率,实际观察到的情况是,以太坊的容错率为46%左右,比特币的容错率为49.5%左右。然而,如果网络延时等于区块生成时间的话,协议的容错率会下降至33%,并且随着网络延时接近正无穷,容错率不断向0趋近。
权益证明共识更为直接地适用于构建拜占庭容错共识,因为所有验证者的身份都是已知的(拥有稳定的以太坊地址),该网络还会跟进验证者的总人数。权益证明研究有两条总路线,一条着眼于同步网络模型,而另一条着眼于部分异步网络模型。“基于区块链的”权益证明算法几乎一直依赖同步网络模型,这些算法的安全性可以在这些模型中得到证明,形式上与证明工作量算法(http://nakamotoinstitute.org/static/docs/anonymous-byzantine-consensus.pdf)的安全性相似。还有一个研究方向是将部分同步网络中的传统拜占庭容错共识与权益证明联系起来,但是这个研究方向解释起来更为复杂;会在后续小节中详细介绍。
工作量证明算法和基于区块链的权益证明算法选择了可用性而非一致性,然而拜占庭容错型共识算法更青睐一致性;Tendermint (https://github.com/tendermint/tendermint)明确选择了一致性,Casper 采用的混合模型虽然偏向可用性,却又尽可能地实现一致性,让链上应用和客户端在任何时候都能感觉到强有力的一致性保障。
需要注意的是,Ittay Eyal 和 Emin Gun Sirer 在关于自私式挖矿(https://bitcoinmagazine.com/articles/selfish-mining-a-25-attack-against-the-bitcoin-network-1383578440)的研究中,(取决于网络模型)对比特币挖矿的激励兼容性设定了25%和33%的界限(即只有网络窜谋不超过25%或33%,挖矿才能激励相容)。该研究与传统共识算法研究得出的成果毫无关系,后者不涉及及激励兼容性。
“无利害关系”问题是什么?如何解决?
在许多早期(基于区块链的)权益证明算法(包括 Peercoin)中,只为创造区块提供奖励,且没有惩罚措施。这就造成了不幸的结果,在出现多条区块链相互竞争的情况下,会激励验证者在每条链上都创造区块,以确保获得奖励:
在工作量证明中,这么做需要将算力一分为二,因此会影响收益:
因此,在之前的权益证明中,如果所有参与者都唯利是图,即使没有攻击者,区块链也可能达不成共识。在PoS中如果有攻击者的话,攻击者只需要拥有比无私节点(只在原链上下注)更多的算力,无需理会理性节点(在原链和攻击者的链上都下了注)。相比之下,在工作量证明中,攻击者必须拥有比无私节点和理性节点都要多的算力(至少也要对它们有威胁:参见 P + epsilon <https://blog.ethereum.org/2015/01/28/p-epsilon-attack/>攻击)
有人认为权益持有者为了“保护他们的投资价值”,会有动力去采取正确的行为, 只在最长的链上下注,然而这忽略了这种动力存在公地悲剧问题:每位个人利益相关者可能只有1%的概率成为“关键人物”(即攻击的成败与否取决于“关键人物”参与与否),因此(行贿者)说服他们参与攻击只需要他们代币的1%;因此,所需的贿赂加起来只会占所有保证金总量的0.5-1%。另外,该论点意味着任何零出错情况都不会维持在稳定均衡的状态,因为如果出错率为0,那每个人都不可能成为关键人物。
可以通过两个策略解决这个问题。这篇以“slasher”为题的文章从广义上描述了第一个策略,并由 Iddo Bentov 的这篇文章进一步发展。其中涉及到对在多条链上同时出块的验证者的惩罚措施,通过将惩罚证明(即两个冲突的已签名区块头)纳入区块链,之后再适当扣除有恶意行为的验证者的保证金。这改变了激励结构:
要注意的是,要让该算法有效运行,需要提前很久确定验证者集。否则,如果一个验证者拥有1%的权益,在存在A和B两个分叉的情况下,验证者有0.99%的概率会下注在A而非B上,或是在B而非A上,验证者能够同时在两条链上下注的概率只有0.01%。因此,验证者有99%的概率会实现双重权益:可能在A上下注,也可能在B上下注,只有两种选择都开放的情况下会在更长的那条链上下注。这只有在两条链上的每个区块都会进行相同的验证者选择之时才能避免,这就要求在分叉产生之前选好验证者。
该算法有自己的弊端,包括要求节点保持联网状态来保障区块链的安全,以及存在中程验证者窜谋的风险(比方说连续30名验证者中有25人联合起来,提前同意在之前的19个区块上发动51%攻击),但是如果这些风险被认为是可接受的话,那么这个策略还算有效。
第二个策略就是惩罚在错误的链上出块的验证者。也就是说,如果有A和B两条竞争链,那么如果验证者在B链上出块,并在B链上得到+R的奖励,但B链区块头可以包含在A链中(在Casper中这被称为“dunkle”),那么在A链上的验证者会遭到-F的罚金处罚(F可能等于R)。这改变了经济计算:
直觉上,我们可以把工作量证明中的经济模式复制到权益证明中。在工作量证明中,在错误的链上创造区块的行为同样会遭到惩罚,不过这种惩罚在外部环境中是隐性的:矿工必须花费额外的电力并且获得或租用额外的硬件。在权益证明中,我们只是让惩罚更明确。该机制的一大弊端是它给验证者带来的风险更多了一点(尽管这种影响会逐渐消除),不过它的一大优点是不需要提前知道验证者是谁。
这表明了基于区块链的算法是如何解决无利益关系问题的。拜占庭容错型权益证明算法目前是如何运作的?
拜占庭容错型(部分同步的)权益证明算法允许验证者通过发送一种或多种类型的签名信息对区块进行“投票”,并且详细说明了两种规则:
确定条件——规定在什么样的情况下一个特定的哈希值可以被认为是确认值。
惩罚条件——规定在什么情况下一个特定的验证者可以被认定是恶意行为者(例如,同时为多个冲突区块投票)。如果一个验证者触发了其中一条规则,所有的保证金都会被删除。
为了说明惩罚条件可以采用的不同形式,这里给出了两个例子(在下文中,“2/3的验证者”是“占保证金总数2/3的验证者”的简写,对于其它分数和百分比来说也是一样)。在这些例子中,应该将"PREPARE"和"COMMIT"简单理解为验证者可以发送的两种信息。
如果 MESSAGES 包含 ["COMMIT", HASH1, view] 和 ["COMMIT", HASH2, view] 形式的信息,其中由同一个验证者签署的 view 是相同的,但 HASH1 和 HASH2 是不同的,那么该验证者就会受到惩罚。
如果 MESSAGES 包含 ["COMMIT", HASH, view1] 形式的信息,那么除非view1 = -1或是同时包含某个特定 view2 的 ["PREPARE", HASH, view1, view2] 形式的信息,且 view2 < view1 ,由 2/3 的验证者签署,那么下达COMMIT命令的验证者就会受到惩罚。
一组适宜的惩罚条件必须具备两大重要特点:
可问责安全性——如果互相冲突的 HASH1 和 HASH2 (也就是说 HASH1 和 HASH2 是不同的,且互不为衍生值)是确定值,那么至少有1/3的验证者违反了某个惩罚条件。
似乎合理的活性——除非有1/3以上的验证者违反了惩罚条件,只要有2/3以上的验证者就可以产生确定值。
如果我们拥有一组满足上述两大特点的惩罚条件的话,我们就可以激励参与者来发送信息,并且开始从经济确定性中受益。
“经济确定性”的一般概念是什么?
经济确定性的意思是一旦某个区块确定了下来,或者更普遍地说,一旦已经签署了足够的特定消息,在未来的任意时刻,想要让合法的历史记录包含冲突区块,只有在很多人愿意为此消耗大笔金钱的情况下才能实现。如果一个节点认为某个区块满足了该条件,就会有强大的经济保障来支持这个区块将成为所有人都认同的合法区块历史的一部分。
达到经济确定性有两种方式:
如果足够数量的验证者已经签署了“我同意在所有不包含区块B的链中损失X”这种形式的加密经济声明,就可以从经济上确定一个区块。这就向客户端保证了两种情况:要么(i) B是合法链的一部分,要么(ii)验证者通过消耗大量资金来误导客户端,使其相信是(i)的情况。
如果足够数量的验证者已经签署了支持区块B的信息,就可以从经济上确定一个区块。而且从数学角度可以证明,某种B' != B 的关系如果在相同的定义(条件)下也能达到确定性的话,验证者就会损失大笔金钱。如果客户端发现了这点,并仍旧验证了这条链,有效性加上确定性就是合法分叉选择规则中获得优先权的充分条件,那么就可以保证:(i) B是合法链的一部分, 或者(ii)验证者损失了大量资金生成出了一条同样达到了确定性的冲突链(分叉)。
实现确定性的两种方法源自非利害关系问题的两个解决方案:通过惩罚”验证错误区块“,以及惩罚”同时验证冲突区块“来实现确定性。第一种方法的主要优点在于更适合轻客户端而且更易于推断,而第二种方法的主要优点在于 (i) 更容易发现诚实验证者不会受到惩罚 (ii) 更有利于诚实验证者的不良因素。
Casper 遵循的是第二种方式,不过它有可能添加一个链上机制,能让验证者自愿选择签署第一种情况的确定性信息,因而可适用于更高效的轻客户端。
那么经济确定性与拜占庭容错理论有何关联?
传统的拜占庭容错理论假设除去部分差异大体会具有相似的安全性(safety)和活跃度(liveness)特点。首先,传统的拜占庭容错理论只需要在2/3的验证者是诚实的情况下就可以实现安全性。在这种模型下运作更为容易;传统的拜占庭容错试图证明的是“如果机制M出现安全故障,会有至少1/3的节点出了错”,然而我们的模型试图证明的是“如果机制M出现安全故障,会有至少1/3的节点出了错,即使你在发生故障时离线了,也能知道是那些节点发生了故障”。从活跃度角度来看,我们的模型更加容易,因为我们不需要证明网络将达成共识,只需要证明网络不会阻塞。
幸运的是,我们可以表明另外的问责要求并非特别难以实现;实际上,有了正确的“协议盔甲"(编者按:即协议的防御措施),我们可以将任意的传统型部分同步或异步拜占庭容错算法转化成问责型算法(accountable algorithm)。错误可以全部分为几类,每一类不是问责型(即如果你犯了可被抓住的那类错误,我们就可以为之制定惩罚条件)就是会与延迟混淆型(要注意即使是信息发送过早这样的错误也会与延迟混淆,通过调快所有人的时间并让没有过早发送的信息出现更高的延迟可以模拟出这一情况)。
原文链接: https://github.com/ethereum/wiki/wiki/Proof-of-Stake-FAQ
作者: Community
翻译&校对: 闵敏 & Elisa
岗位:兼职翻译(英译中)
地点:不限
要求:熟练掌握翻译技能;工作态度认真;对区块链相关内容感兴趣者优先。
联系方式:阿剑(微信号:704180550)
(小提示:正式录用前会有试译环节)
你可能还会喜欢:
Vitalik谈|一种权益证明设计哲学
干货 | 以太坊 Casper FFG Overview
POS 股权证明系列1