以太坊:通往单个 slot 实现最终确定性之路_POW

特别感谢JustinDrake,DankradFeist,AlexObadia,Hasu,AndersElowsson和各位hackmd匿名者对这篇文章各个版本的审校和反馈。

当前,以太坊区块需要64到95个slot才能实现最终确定性。这是合理的,是在去中心化/最终确定性时间/开销曲线上的一个折衷取值:15分钟不算太长,而且与现有交易所的确认时间相当,它让用户能够在常规计算机上运行节点,即使因为存款大小为32ETH(而不是前期要求质押的1500ETH)而出现了大量的验证者。

然而,我们仍然有充分的理由把最终确定性时间缩短为一个slot。这是一篇研究现状综述,回顾了实现该目标的路线图。

当前以太坊staking的运作方式及依据

以太坊的?LMDGHOST?+?CasperFFG?共识是权益证明区块链中流行的两类主流共识算法间的折衷:

基于链的共识算法:每个slot生成一条消息。基于链的共识算法最大限度地提高了参与者的数量以及减少了链的负载,但很容易出现分叉,而且没有任何最终确定性的概念。传统的BFT(拜占庭容错)共识算法:每个slot内,除了某个验证者生成一个区块外,每个验证者会生成两条消息,而且一个slot的区块在下一个slot开始之前实现了不可逆转的“最终确定性”。传统的BFT共识算法最大限度地缩短了实现最终确定性的时间,但是以链的高负载和仅支持少量的参与者为代价。与单纯的基于链的系统不同,以太坊共识算法在每个slot都会并行对链头进行数以千计的见证投票。每一个epoch,所有活跃的验证者都有机会见证一次。两个epoch后,CasperFFG最终确定性工具敲定了区块,自此之后,回滚该区块需要至少三分之一的验证者销毁其质押存款:攻击成本会超过400万?ETH。这就区别于单纯的传统BFT系统,后者在一个slot后实现最终敲定。

因此,今天的以太坊实现的是:

适中的最终确定时间——与传统BFT在单个slot完成最终确定相比时间更长,但不是几周或几个月,或像基于链的共识算法那样未曾提供过适中的链负载——每个slot会有数千条消息,但少于使用传统BFT时的数十万条信息适中的节点数——成为一个验证者要求质押32ETH:与基于链的共识算法相比门槛更高,在基于链的共识算法中即使拥有很少量的Token也可以参与共识,但与传统BFT共识算法要求的超大量Token相比门槛低很多

以太坊对更高强度链负载的支持是由?BLS签名聚合的效率提升来实现的。由于这些效率的提升,能实现高强度的链负载(每秒消息量的角度)得以转化为只需适中数据和CPU开销的链负载。

BLS签名聚合的工作原理是将多个签名聚合成一个,这样,验证聚合后的签名只需每个参与者进行一次额外的椭圆曲线加法,并且64字节可以容纳任意数量参与者的签名,而每个参与者只需一个额外的位来存储。

基于链的共识算法和传统BFT共识算法的结合折衷,再加上源于BLS的纯效率提升,形成以太坊当前的共识算法。

那为何要改变它呢?

在使用上述推理开发出原初的以太坊共识协议后的几年内,我们得到了一个重大的好消息和一个重大的坏消息。

坏消息:混合型共识机制实际上有许多不可避免的问题

混合型共识机制结合了分叉选择规则以及最终确定性工具,前者用于逐个slot推进共识,后者用于后续敲定区块。混合型共识机制最大的问题是:

用户体验:大多数用户不愿为交易最终确定而等待15分钟。当前,即使交易所也通常认为资金存入在12到20次确认后才“最终敲定”,尽管12到20次PoW确认所提供的安全性保证也很弱。

MEV重组:混合型共识机制仍保有这样的实际情况——短期重组是可能的,因此为占据近多数或多数的恶意验证者共谋重组区块链来提取MEV价值敞开大门。这篇文章更为详尽地对这个论点进行了阐述。交互缺陷:CasperFFG最终敲定和LMDGHOST分叉选择间的“接口”是重要复杂性的来源,导致了很多需要相当复杂的补丁去修复的攻击,还有更多的弱点被时不时地发现。其他协议复杂性:数百行规范被用于维护验证者集合洗牌等机制。好消息:超大规模的验证者集合因BLS聚合变得比想象中更有可能

在过去三年内,BLS实现的具体效率得到了突飞猛进的提升,同时我们掌握了更多高效地处理组合大量消息和数据的知识。

使用BLS支持大量验证者面临着两个主要的瓶颈:

最后的验证:验证来自N个验证者的签名需要多达N/2次ECADD来计算群公钥,并需要N位的位域来存储参与者。实际上,由于view-merge需要冗余的聚合者,这些数值需要增加多达16倍。聚合:将N个验证者各自发送的签名组合为一个聚合签名。这需要总共至少96*N个字节的带宽来处理,并且需要至少N次在G2群之上的ECADD,但分配到各个子网中会更为简单。实际上,最后的验证扩展能力很强。单次ECADD可以在约500毫微秒(ns)内完成,因此100万次ECADD将花费约500毫秒(ms)。100万验证者位域的大小仅为128kB。

view-merge的冗余可能需要每个slot验证多达16个单独的签名;这将数据存储需求提升到仍然可控的2MB,同时在最坏情况下ECADD运算成本增加约8倍。

这些是最坏情况下的数值;在通常情况下,16个聚合者的位域是基本一致的,这让多个聚合的主要额外成本得以压缩。

聚合更具挑战性,但也是相当可行的。最新研究大大加深了我们对如何在一个slot内聚合大量签名的理解。好消息是,我们有充分的理由相信,每个slot处理数十万的签名是可能的,尽管仍需更深入的研究工作来确定和商定最佳解决方案。

这两个事实结合在一起意味着,权衡的结果不再倾向于在基于链和基于BFT的PoS间进行折衷,而是更接近完全的传统BFT路线的解决方案,即在下个区块开始前敲定每个区块。

我们需要解决哪些关键问题以实现单个slot最终确定性?

共有三个关键问题:

开发确切的共识算法:我们不太能接受Tendermint或其他现有的BFT算法,因为我们十分看重这一点:即使在大于验证者离线的情况下,区块链仍然能够保持活性。我们需要添加一个分叉选择规则、怠工惩罚和恢复机制来实现这种活性。理想情况下,我们能够获得最佳的安全性:网络同步时,容错率为;当网络不同步时,容错率为。确定最优聚合策略。对于尽可能高的,我们想聚合来自个验证者的签名并将其打包进一个块内,而且节点开销是我们愿意接受的水平。确定验证者的经济模型。尽管聚合和最后的验证这两个步骤有所改进,单个slot实现最终确定性的以太坊可能最终能够支持的的验证者数量理论上限比当前的以太坊更小。如果这个数值最终低于欲参与的验证者数量,我们该如何限制参与,以及我们会做出什么样的牺牲?确切的共识算法会是怎样的?

如上所述,我们想要一个遵循CasperFFG+LMDGHOST“最终确定链+乐观链”范式的共识算法,在极端条件下,乐观链可以回滚,但最终确定链永远不能回滚。

这需要一个与分叉选择规则和最终确定性工具与现有共识类似的结合,但其中有一个关键的区别:当前,我们通常会同时运行分叉选择规则与最终确定性工具,但在单个slot实现最终确定性的世界中,我们会要么运行分叉选择规则,要么运行最终确定性工具:如果小于三分之二的验证者在线并且诚实地工作,那么运行前者;否则,运行后者。

对该算法的具体提案仍在进行中;目前仍未发布正式的成果或文章。

开发一个最优的聚合策略会面临哪些问题?

先让我们看看当前是如何进行聚合的。在单个slot内,约有2的14次方个验证者,这些验证者被划分为

个委员会,每个委员会约有

个验证者。首先,每个委员会中的验证者在该委员会专用的p2p子网中广播他们的签名。每个委员会中有16个指定的聚合者,每个聚合者将看到的所有签名合并为一个聚合签名。指定的聚合者将其聚合签名发布到主子网中。

然后,区块提议者从每个委员会中挑选最佳的聚合签名,并将其打包进区块。有了viewmerge分叉选择的补丁,它们还会添加一个包含其他聚合签名的跨斗(sidecar)对象;只要每个委员会中至少有一个聚合者是诚实的,就可以保护viewmerge机制免受恶意聚合者的影响。

如果我们想把这个模型扩展到单个slot实现最终确定性的场景,那么我们需要能够在每个slot之内处理所有的2的19次方?(或无论我们有多少)个验证者。这需要在以下两种取舍中取其一:

增加单个委员会的验证者数量或者增加委员会数量,或两者兼而有之,以适应更多的验证者。转向三层聚合,两层委员会的结构。首先,签名先划分成大小为

的小组进行聚合,然后大小为

的小组,最后是完整的验证者集合。

前者要求更大的p2p网络带宽,后者要求接受更高的延迟,更多的p2p子网层级带来更高的风险以及额外复杂性来确保viewmerge免受所有层级中的恶意聚合者所影响。

对这两种策略的分析研究在持续进行中。

验证者经济模型存在着哪些问题?

当前,以太坊有着约2的19次方个活跃的验证者,每个验证者都质押了32个ETH。到单个slot最终确定性实现时,验证者数量可能会增加到2的20次方甚至更高。

这带来了一个重大问题:如果我们每个slot只能处理来自N个验证者的签名,但如果有超过N个以上的验证者想要参与,那么我们该如何确定谁去谁留?

这是一个重大问题,因为任何方案都将涉及弱化staking系统的一个或多个被视为安全保障的特性。

好消息:源于支持自发验证者余额合并的收益

因为单个slot最终确定性移除了委员会的概念,我们不再需要32ETH的验证者有效余额上限。考虑到p2p网络稳定性的因素,我们仍然想要一个更高的上限,但即便如此,这也意味着本来属于富有用户的大量验证者槽位将会被合并成数量少得多的验证者槽位。

我们可以用Zipf定律估计整合富有用户的验证者slot的收益:某个拥有特定余额的质押者数量与其余额成反比。

使用了信标链的早期历史数据,Zipf定律似乎相当准确地拟合了分布:

假设符合Zipf定律,N个质押者将拥有大约

个ETH,那么今天就需要

?个验证者槽位。把

3350万ETH填入该式子,我们可以得到共计65536个质押者,在今天的以太坊则需要消耗

个验证者槽位。因此,完全移除有效余额上限让需要处理的验证者槽位数量减少到65536个,而维持2048ETH的上限只会额外增加约1000到2000个验证者。只需将聚合性能提升约2倍或让负载增加约2倍,就能够处理当前情况下的单slot最终确定性!

作为一个附带的好处,这也对小型质押者更加公平,因为小型质押者可以质押全部余额而不是一部分。质押奖励将自动被重新质押,即使是小型验证者也能从复利中获益。事实上,出于这个原因,把质押上限提高到2048ETH甚至可能是一个好主意!

然而,我们仍需要处理例外情况:验证者余额分布不再符合Zipf定律,或富有的验证者不打算合并其余额,或质押了超过3300万的ETH。

我想到了处理这些情况的两种现实策略:超级委员会和设定验证者集合大小上限。

思路1:超级委员会

不是所有验证者都参与每一轮CasperFFG,而是只有一个由数万人组成的中型超级委员会参与,让每轮共识都在一个slot内发生。

这一技术思路在这篇帖子中首次介绍。这篇帖子更加详细地描述了该思路,但其核心原则很简单:在任何给定的时间,只有一个从完整验证者集合随机抽样得到的中型超级委员会被激活。每次链达到最终确定性,委员会都会改变,其中多达25%的成员会被随机采样的新验证者替换。

在该策略中,“谁留谁走?”就是:每个人都会逗留一部分时间,而在另一部分时间离开。

超级委员会得有多大?

这个问题可以归结为一个更简单的问题:51%攻击以太坊需要多少代价?理想情况下,由于攻击被罚没以及怠工惩罚的ETH数量需要大于从攻击中实际获得的收益。攻击的成本甚至应该足够高,从而让那些有强烈外部动机去毁灭这条链的强大攻击者受到威慑或损失惨重。

回答实现这一目标需要多少ETH这一问题不可避免地要依赖直觉。以下是一些我们可以问的问题:

假设以太坊受到51%攻击,社区需要花几天时间协调链下治理来恢复,而X%的ETH被烧毁。X需要多大才能对以太坊生态产生净效益?假设一个大型交易所被黑客入侵导致损失了数百万的ETH,攻击者将收益存入并占有超过51%的验证者。在被盗资金被完全销毁前,攻击者能够对链进行多少次51%攻击?假设某个51%攻击者在短时间内反复重组区块链来捕获所有的MEV。我们想让攻击者每秒付出什么级别的代价?来自JustinDrake的估算表明,当前对比特币进行spawn-camp攻击的成本约为100亿美元,或比特币市值的1%。对以太坊进行一次51%攻击的成本应该是该水平的多少倍?

以太坊研究员的内部投票

如果我们仅关注不依赖网络延迟的51%攻击,100万枚ETH的攻击成本意味着200万枚ETH规模的超级委员会。如果我们还考虑涉及恶意验证者和网络操纵的复杂组合的34%攻击,那么规模为300万枚ETH(大约97,152个验证者)。

复杂性成本

除了降低攻击成本以外,该方案的另一个主要弱点是复杂性,包括协议复杂性和分析复杂性。特别是:

我们需要数百行规范代码来选举超级委员会并进行轮换。富有的验证者会在多个验证者槽位间分配其ETH以减少收益波动,因此我们会因提高有效余额上限失去了一些好处。若出现临时性的高手续费或高MEV,超级委员可能会故意拖延最终确定性的达成来避免被换出,从而可以继续收取手续费和MEV。思路2:设置验证者集合规模上限

我们可以试着采用两类设置上限方案中的一种:

设置ETH质押总量上限设置验证者总量上限每种设置上限的方案都可以选择基于顺序的机制(堆栈或队列)或经济模型调节的机制来实现。

基于顺序的机制有着很多问题。要了解其中原因,可以考虑两类基于顺序的策略:

保留最旧的验证者:如果验证者集合已满,那么其他人无法加入保留最新的验证者:如果验证者集合已满,那么最旧的验证程序将被踢出这两类都有着严重的问题。OVS有着转向一个早期质押者盘踞其中的“王朝”的风险,质押者一旦离开,则可能会永远失去再加入的机会。这也会导致每当某个验证者离开都会出现MEV拍卖或排着长队以加入验证者集合。另一方面,NVS可能会引发持久的MEV竞拍,这会干扰整条链,因为被踢出的验证者会想立即重新加入,从而与真正的新参与者进行竞争。

通过经济模型设置ETH质押总量上限

另一种可选机制是使用经济学模型设置上限:如果存在过多的验证者想参与,那么惩罚所有新旧验证者,直至某些验证者放弃并离开。一个简单的方法是将验证者奖励公式从当前的

更改为形如:

其中R是对表现良好的验证者的奖励,而D是当前活跃验证者的ETH总余额。该曲线大致如下:

在曲线的左侧,验证者奖励起到与当前机制一致的作用。但是,随着ETH质押总量增加到数百万,奖励函数开始加速下降,在约2500万ETH时,奖励会降至零以下。在优先费用和MEV收益足以覆盖其损失的特殊情况下,尽管基本收益为零或负数,验证人可能会愿意继续质押。奖励曲线在2的25次方?ETH处趋于负无穷,从而无论外部奖励有多高,验证者集合的大小无法越过该上限。

该方法的优势在于它完全避开动态队列的设计:无论均衡点在哪里,它都能达到均衡;验证者集合大小最终会达到均衡点。

该方法的主要缺点是在曲线右侧附近持续进行阻拦攻击:攻击者可以加入并快速赶出其他验证者。但这是相对其他方案而言的一个小问题,因为它只能在MEV异常高的情况下发生,而且这种攻击非常昂贵。

另一个主要缺点是,它可能使得我们趋于一个大多数验证者都被“边缘化”的未来,大型质押者由于更能容忍收益波动,从而在竞争中会胜过小型质押者。

通过经济模型设置验证者总量上限

通过添加正比于验证者总量的惩罚项,我们可以使用相同的逻辑来设置验证者总量上限。例如,如果我们想要设置的验证者上限为

2的17次方,我们可以这样做:

另一种方法是添加浮动最低余额:如果验证者总量超过上限,则将拥有最低余额的验证者踢出。

浮动最低余额会面临一类新型的恶意攻击的挑战:富有的验证者划分他们的质押资金,以便踢走小型验证者。我们可以通过增加每个验证者槽位的费用来缓解这一问题,并达到这样的目的:在Zipf分布下,不值得进行此类攻击。然而,如果不再服从Zipf分布,那么仍会留下一个潜在的漏洞。

所有这些提案的一个重要问题是,它们改变了现有安全保证。尤其:

超级委员会将攻击链的成本从质押总量的1/3降低到约1到2百万ETH。通过经济模型设置质押总量或验证者总量上限设计改变ETH发行公式,减少质押者的收益,并增加恶意攻击。如果我们添加浮动最低余额,该余额可能会超过32ETH,违背了当前任何持有32ETH的人都可以参与质押的保证。仍需仔细考虑以确定社区最能接受哪种权衡。

总结

这里有三个主要问题需要研究:

开发具体的共识算法,有限度地将BFT共识算法与分叉选择规则结合起来。确定最佳聚合策略,在一个slot内聚合尽可能多的验证者签名。确定验证者的经济模型:如果成为验证者的需求超过了系统处理验证者的能力,那么需要回答谁去谁留。(1)是一项专业的学术任务,我们了解答案的大致轮廓,主要在于填写细节。也就是说,加快(1)并争取尽快提出具体设计方案是一个好主意,因为它会与其他研究领域交互。

(2)也是一项专业任务,尽管很可能不可避免地揉合复杂性/效率上的权衡。(3)涉及到最为困难的权衡取舍,不仅是技术层面的,也需要社区的参与。

特别感谢ECN社区翻译志愿者@doublespending对本文的翻译贡献。

责任编辑:MK

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

区块博客

[0:15ms0-4:98ms