编者按:本文来自以太坊爱好者,作者:JuinChiu,Odaily星球日报经授权转载。本文为TaipeiEthereumMeetup社区成员邱骏的译作,译自2018年8月Vitalik介绍Casper发展历程的长推特。一年过去,Eth2.0的分叉选择规则已确定为LMDGhost,而非Vitalik在该长推特中表示偏爱的IMDGhost,但文中提到的Casper的观念演变史,仍足一观。
前言
以太坊针对PoS共识模型的研究最早始于2014年,这些研究后来演变成目前广为人知的CaspertheFridenlyFinalityGadget/CorrectbyConstruction两种共识模型,它们分别由两个不同的团队开发且存有不少差异。Vitalik用一系列推文简述了从2014以来Casper的开发脉络,由于中文社群仍缺乏针对Casper开发路线相关的总结,因此译者特将此系列推文翻译成中文并且补上一些注解,希望可以成为开发者或研究员在学习Casper时的重要文献,并期望读者对Casper设计理念有更直觉的理解。为了避免读来生硬,建议读者先大略掌握PBFT/CasperFFG/GHOST的重要概念,PBFT的部分可以参考译者的这篇文章:若想搞懂区块链就不能忽视的经典:PBFT。最后要特别感谢以太坊基金会研究员梁智程提供诸多素材与协助校阅。以下正文开始。简介
我将要用一系列的推文来解释以太坊Casper共识协定的研究历史/脉络/进展,包括FFGvsCBC的争论、混合模型到完全PoS的转换、随机性扮演的角色、共识机制的设计考量以及其他议题。无利害关系问题与远程攻击
以太坊的权益证明研究始于2014年1月的Slasher协定。虽然Slasher演算法并不是非常理想,但它引入了一些重要观念,特别是利用罚金来解决「无利害关系问题」。然而,我所使用的罚金相当少,单只取消投票奖励。VladZamfir于2014年中加入了,他迅速引入验证者必须押金的方法。押金是比奖励还大的数字,做出错误的行为将会使押金被取走。我们花了2014下半年的大部分时间试着解决「远程攻击」,攻击者可以将他们的押金从主链提领出来,并且形成另一条具有更多签名的攻击链,如此新加入的节点,让他们以为攻击链是一条主链。如果攻击链与主链分叉的时间点距离当前相当近,攻击链不会造成问题,因为验证者若在两条链上同时对两个互相抵触的讯息签名,则这个签名可以当成惩罚验证者的证据来没收押金;但是若分叉发生在很久之前,攻击者可以取出押金以避免被没收。我们最后得出:远程攻击是无法避免的,原因大致跟PoW拥护者所说的差不多。然而,我们没有接受他们的结论。因为我们发现:我们可以引入两个额外的安全假设来解决远程攻击:1.节点至少每4个月要登入一次;2.节点直接拒绝4个月以上的回溯。这对PoW拥护者来说是个令人厌恶的肉中刺,因为这感觉是一个「信任假设」:每一次同步区块时,你必须先信任某个来源以取得区块链。但是对我们这些龌龊的主观主义者来说,这不是大问题:不管在哪一种情况,你都需要某个可信来源告诉你区块链所使用的共识规则,所以PoS所需的额外信任并不大。确立了押金及罚金的使用后,我们接下来要决定它们「是什么」。我们知道我们希望的是「经济敲定性」,验证者将会基于以下方式对区块签名:一旦一个区块被敲定,如果要敲定一个冲突的区块,则必须要有大部分的验证者签出与自己先前讯息冲突的讯息。但对于这样的讯息,可以被链侦测并惩罚。我写了一篇又臭又长又离题的「注共识」文章。注共识是一个有趣的提案:验证者下注哪一个区块会被敲定,而注决定了哪一个链会形成共识。PoW也具有这样的性质,因为挖矿是一种注。如果你注在对的链上,你会获得奖励;如果你注在错的链上,你失去挖矿成本。但在PoS我们可以有更高的赔率:验证者的赔率一开始很低,但是随着验证者看到彼此对于某个区块的信心逐渐增加,所有人的赔率都会平行地指数上升,直到所有人都注同一个区块,这就是敲定。CasperCBC
同时,Vlad开始大量研究机制设计,特别是让Casper更能抵抗寡占。我们也开始研究受到古典拜占庭容错启发的共识,例如Tendermint。Vlad认为古典BFT并没有说服力,他想透过一个他称为「正确建构」的方法尝试重新发明BFT。正确建构的哲学与传统BFT相当不同的点在于「敲定」是完全主观的。CBC的哲学是,验证节点对讯息签名,且若他们签了与他们先前的讯息相抵触的讯息,则他们必须提交一个「辩护」以证明他们投票的新讯息与旧讯息相比之下有较多的支持,以取得「转换」的权利。为了侦测敲定性,节点寻求讯息的模式。这些讯息可以证明,多数验证节点以一种方式可靠地对某区块B投票,且偏离B必须大部分验证者非法转换投票。例如,若所有节点投给B,则所有节点都投给「包含所有人对B的投票的区块」,这证明了他们支持B且知道其他所有人都支持B,因此他们不会有转换的合法理由。最后我放弃了注共识,因为这个方法似乎有根本上的风险。我也回头试着理解PBFT是怎么运作的。虽然这花了一点时间,但过了几个月后我搞懂了。CasperFFG
我试着简化了PBFT,将其放入区块链的脉络,并把它描述为4个「砍押金条件」,这些规则阐述哪些讯息的组合是自我抵触因此违反规则的。我定义了决定区块是否敲定的规则并且证明了最关键的「安全性」与「可行活跃性」:1.若某区块被敲定了,则无法在不少于1/3验证者违反砍押金条件下敲定另一个抵触的区块;2.若某区块被敲定了,2/3诚实的验证者总是可以合作以敲定新的区块。因此只要有2/3诚实的验证者,演算法就不会推翻之前的决定或卡住。最后我将砍押金条件从4条简化成2条,并发展成CasperFFG——被设计成为任何PoW/PoS/其他类型区块链提供敲定性的覆盖层。敲定性是一个非常重要的进展:一旦区块被敲定,无论网络怎么延迟都能保证安全,而且回溯区块需要超过1/3验证者作弊,且可被检测出来且并销毁押金。因此,回溯敲定性的成本可能会高达数亿美元。透过不同的方式,CasperCBC以及FFG都达到了这个特性。要注意的是:CasperCBC和FFG都是抽象的覆盖层,他们都需要建立在某个现有的分叉选择规则之上。用大白话讲,CasperCBC是敲定覆盖层适应分叉选择规则;而CasperFFG是分叉选择规则适应敲定覆盖层。FFGvsCBC
Vlad最初对分叉选择规则的偏好是「最新讯息驱动GHOST」——一种针对PoS的改版GHOST;而我最初的偏好是先采取「混合式PoS」,使用PoW作为基底的分叉选择规则。在最初版的FFG当中,PoW将会逐个区块地运作一条链,而PoS将会紧随在后敲定区块;CasperCBC从一开始就是完整的PoS。同时,Vlad跟我各自提出了共识诱因的理论。这里有一个非常重要的区别是「唯一可归责错误」——你可以知道出错时谁应该负责而被惩罚,以及「非唯一可归责错误」——一个错误可能是多方中的一方造成的。一个非唯一可归责错误的经典案例是离线vs屏蔽,也称为「言者-听者错误等效性」。惩罚唯一可归责错误是容易的;惩罚非唯一可归责错误则是困难的。如果你无法分辨区块停止敲定是因为少数的节点离线或是因为多数的节点正在屏蔽少数会怎么样?针对这个议题目前有三种解法:1.轻微地惩罚两边;2.严厉地惩罚两边;3.将链一分为二,各自惩罚两条链的其中一边,且让市场决定哪条链较有价值。或者可以参考我写的这篇。2017年11月,我把CasperFFG砍押金条件以及对由于「平方溢金」导致的1/3节点离线的问题的解法写成论文。当然,我非常清楚诉诸社交层面来解决51%攻击并不是很好,因此我开始寻求至少能让链上节点能自动侦测「合法链」与「攻击链」的方法。这是一个早期的想法。这想法还不错,但是仍不是最理想的,除非网络毫无延迟,否则它只能保证节点之间嫌疑分数差异的上限,而并非所有节点完全同意。同时,我对Vlad的模型的主要批判与「泄气攻击」有关,攻击者可以有效威胁要制造51%攻击来造成所有人损失金钱,因而驱使所有其他人退出,因此只用极低的成本便能主导链。Vlad开始建立经济模型以评估在他的模型之下进行上述攻击的实际成本。值得一提的是,上述所有的议题并非为PoS独有。事实上在PoW中,人们倾向直接放弃且假设预防51%攻击几乎不可能,且51%攻击是必须不计代价避免的末日。但是,如同以太坊的传统,Vlad与我误把「有野心的」这个词当成赞美,而继续研究减缓以及恢复51%攻击的不同方法。2018年初,Vlad在CBC的研究开始快速推进,包括安全性证明的进展。—看这个史诗般的2小时简报以跟上2018年3月为止的研究进度同时,CasperFFG也有了重大进展,以合约的方式实现的决定使开发工作变得容易。2017年12月31日,我们发布了Python版的测试网。Casper与分片开发路线的整合
不幸的是,FFG的开发慢了下来。以合约实现FFG虽然把一些事情变得更容易,却让未来要从EVM转到EWASM以及从单链Casper转到分片Casper的工作变得更困难。此外,团队的研发工作被分成「主链Casper」和「分片链Casper」,可想而知在这两个团队之间产生了大量不必要的重复工作。2018年6月,我们做了一个重大的决定:放弃以合约实现的CasperFFG,取而代之的是追求以一条独立链运作的Casper,如此的设计将使分片变得更加容易。完全PoS的转换导致我开始更认真思考PoS的分叉选择规则。CasperFFG与CBC都需要全部的验证节点在每个「时期」投票以敲定区块,这代表每秒将会数以万计的签章传向每个验证节点。BLS签名聚合使其在计算成本上是可行的。但是我想试着利用这些额外的签名以让链更加稳固,在几秒内取得等同于「100个确认」的安全性。这里是我初步的想法。然而,所有这些分叉选择的方法都有一个缺点:它们都将验证节点分为「见证节点」与「出块节点」,而这些负责产生区块的出块节点拥有过大的权力。这样做不太好,主要是因为它需要我们有一个很安全的链上随机数生成器以公平地挑选出块节点,而链上随机数生成器很困难,而且一些简单的方法例如RANDAO似乎有愈来愈多问题。JustinDrake跟我开始解决这个问题:Justin使用VDF,这是一个输出具有确定性与可验证的函数,但需要大量不可平行化处理的序列时间进行运算,使提前窜改变得不可能;而我对Vlad教妥协,使用基于GHOST的分叉选择规则以大幅减少对出块节点的依赖,允许在恶意出块节点大于90%且诚实见证节点大于50%的状况下,链仍能不受干扰地成长。Vlad很开心,但还没开心到极点:他偏好LMDGHOST,而我偏好IMDGHOST。大约同一时间,我也试着想出一个方法来「流水线化」CasperFFG,将敲定时间从2.5个时期减至理论上最佳的2个时期。我对RPJ分叉选择规则能够很好地相容于FFG这件事感到开心。它还有一个很重要的「稳定性」:分叉选择是一个对未来分叉选择的好预测。这看起来很明显,但我们却很容易做出不具有这种特性的分叉规则。最近的进展是:LMDGHOST可能由于技术细节只能在2回合中有25%容错,但是IMDGHOST仍可以有完整的33%容错。FFG与CBC之间主要的取舍是:CBC似乎有较好的理论性质;而FFG似乎比较容易实现。同时,VDF也取得了许多进展。还有,我最近决定研究LeslieLamport1982年的老论文,在这边论文中他提出了一个共识演算法:若假设所有节点,包括观察者,皆在线上且具有很低的网络延迟,则具有99%容错。网络延迟的假设按理来说会使其不适合作为主要的共识算法。然而,它可以在某一个情境运作相当良好:作为51%屏蔽侦测的嫌疑分数替代方案:基本上,如果51%共谋团体开始屏蔽区块,其他验证节点以及一般节点可以侦测到屏蔽的发生,并且使用99%容错的共识演算法来达成屏蔽正在发生的共识,并协调少数分叉。关于这个研究的长期目标就是要尽可能减少对社交层的依赖,并将破坏链稳定的成本最大化,使其利用社交层回溯的可能性最小化。还有什么?FFG的部分还有形式化证明,规格的完善,以及实现的持续进展,并着眼于安全及迅速的开发。CBC的部分也差不多。接下来让我们勇往直前吧!
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。