宁静阶段 0

本文档 EIP 详细阐述了以太坊 2.0 (Eth2) 的零阶段 (Phase 0) 核心机制。它介绍了信标链(beacon chain)的启动,作为权益证明(PoS)共识的核心,并解释了 Casper FFG 和 LMD-GHOST 规则。文章深入探讨了验证者激励、惩罚、分片方案的动机,以及各项技术选择的原理,旨在为未来以太坊主网的升级奠定基础。

markdown

摘要

本 EIP 规定了 Serenity (eth2) 的阶段 0,这是以太坊主网共识机制的一个多阶段升级。在阶段 0 中,现有的 PoW 链和机制完全不受影响,而一个 PoS 链——信标链——并行构建,作为升级共识的核心。在随后的阶段中,信标链将得到增强,以支持和保护多个并行分片链的共识,最终将当前的以太坊主网作为其中一个分片整合进来。

信标链的核心是一个名为 Casper the Friendly Finality Gadget (FFG) 的权益证明共识机制和一个名为 Latest Message Driven Greedy Heaviest Observed Sub-Tree (LMD-GHOST) 的分叉选择规则。阶段 0 主要围绕验证者执行这些算法的机制和激励。eth2 的详细规范包含在一个独立于本 EIP 的存储库中,安全性和活性证明可在 Combining GHOST and Casper 论文中找到。为避免重复,本 EIP 仅引用相关的规范文件和发布版本。

eth2 的早期阶段在当前以太坊主网上不进行任何破坏性的共识变更。本 EIP 旨在记录此共识机制的引导过程,并指出 eth2 取代以太坊当前工作量证明 (PoW) 共识的路径。

动机

Eth2 旨在实现以太坊的最初愿景,即支持一个高效、全球规模、通用型的交易平台,同时保持高密码经济安全性和去中心化。

如今,由于去中心化应用日益增长的需求,以太坊区块持续满负荷。自 2017 年首次出现严重的采用高峰(加密猫)以来,以太坊社区一直持续并强烈地要求扩展解决方案。

自以太坊诞生之日起,对扩展解决方案的调查和期望就是双管齐下的——从Layer1升级和Layer2采用两方面进行扩展。本 EIP 代表了前者的多阶段推广的开始。

通过分片进行扩容

随着以太坊网络及其上构建的应用在过去 5 年中使用量不断增加,区块经常满负荷,Gas 价格市场持续攀升。简单地增加当前以太坊链的区块 Gas 上限无法满足系统日益增长的需求,而不会给消费者节点带来不可持续的高资源负担(以带宽、计算和磁盘资源的形式)。为了在扩展以太坊网络的同时保持去中心化,必须采取另一条路径。

为了为以太坊提供更大的扩展性,同时不给消费者和共识节点带来过高的限制性负担,eth2 引入了一个“分片”解决方案,其中多个区块链分片——每个分片都与当前以太坊主网的容量相似——在一个统一的共识机制下并行运行。核心共识(信标链)和少量这些分片可以通过一台消费者机器处理,而整个系统则提供更高的容量。

通过权益证明实现去中心化和经济最终性

自以太坊早期以来,权益证明一直是人们期待已久的理想选择,原因如下:

  • 通过降低参与的进入门槛和技术要求,增加核心共识的去中心化程度
  • 通过协议内惩罚不当行为和增加经济最终性来增强密码经济安全性
  • 消除当前 PoW 共识机制中耗能的挖矿活动

除了上述优点之外,PoS 还与分片扩容解决方案具有协同效应。由于分片对随机抽样的要求,PoS 提供了比 PoW 更简单、更直接的“活跃验证者集”访问方式,因此允许构建更直接的分片协议。

规范

阶段 0 的设计目标是要求对现有以太坊主网不进行破坏性共识变更。相反,这是引导一个新的 PoS 共识,一旦稳定,它就可以取代当前的 PoW 共识。

阶段 0 规范在独立于本 EIP 的存储库中维护。SPEC_RELEASE_VERSION 版本在 SPEC_RELEASE_COMMIT 上的规范发布被视为本 EIP 的规范阶段 0 规范。

本 EIP 提供了阶段 0 机制的高层视图,特别是那些与以太坊主网(例如存款合约)和用户(例如验证者机制和 eth2 发行量)相关的机制。扩展和低层细节保留在 consensus-specs 存储库中。

参数

参数
SPEC_RELEASE_VERSION v1.0.0
SPEC_RELEASE_COMMIT 579da6d2dc734b269dbf67aa1004b54bb9449784
DEPOSIT_CONTRACT_ADDRESS 0x00000000219ab540356cBB839Cbe05303d7705Fa
MIN_GENESIS_TIME 1606824000
BASE_REWARD_FACTOR $2^6$ (64)
INACTIVITY_PENALTY_QUOTIENT $2^{26}$ (67,108,864)
PROPORTIONAL_SLASHING_MULTIPLIER 1
MIN_SLASHING_PENALTY_QUOTIENT $2^7$ (128)

注意:Eth2 还有许多其他的阶段 0 配置参数,但为了简洁起见,大部分未在本 EIP 中列出。

验证者存款合约

在阶段 0 中,eth2 使用部署在以太坊主网上的合约——存款合约——位于 DEPOSIT_CONTRACT_ADDRESS,将验证者加入信标链的 PoS 共识。

要参与 PoS 共识,用户需要向存款合约提交验证者存款。信标链就该合约的状态达成共识并处理新的验证者存款。这种单向存款机制是系统两个组件(以太坊主网和信标链)在阶段 0 中唯一的技连接。

信标链和验证者机制

选择参与 eth2 共识的用户将 ETH 抵押品存入存款合约,以便被纳入信标链验证者集。从那里开始,这些验证者负责构建信标链(请注意,PoS 中的这些共识参与者类似于 PoW 中的矿工)。

信标链是一个纯粹的 PoS 链,在阶段 0 中主要关注维护其自身的共识并管理验证者注册表。共识规则定义了验证者应参与的角色(例如区块提议、区块证明);表现良好的验证者会获得奖励,而表现不佳或离线的验证者会受到惩罚。阶段 0 尚未包含任何 ETH 转移、分片或智能合约/VM 执行能力。

在后续阶段,将向信标链添加额外的机制和验证者职责,以管理多个并行分片链的共识(“阶段 1”),整合现有以太坊系统(“阶段 1.5”),并全面支持分片智能合约执行(“阶段 2”)。

发行

为了激励验证者存入以太坊抵押品并参与 eth2 共识,我们建议定期向共识参与者发行奖励(以以太坊原生资产 ether 的形式)。由于信标链在 eth2 的早期阶段与现有 PoW 链并行运行,因此在现有链作为分片合并到 eth2 之前,此发行是额外的 PoW 奖励。

信标链上发行给验证者的 ether 数量与已存入 ether 总量的平方根成比例。选择这种发行曲线是因为它比两种显而易见的替代方案(固定总发行量和每个质押以太坊的固定发行量)更稳定和可持续。有关此选择的更术讨论,请参见此处

在 eth2 中,该曲线通过 BASE_REWARD_FACTOR 在Slot时间和 epoch 长度的上下文中进行参数化。下面是发行曲线作为质押 ether 数量的函数,以及一个示例表格用于说明。请注意,所有所示数字均为年化。

活跃存款 **最大年化验证者奖励*** **最大年化 ETH 发行量***
0.5M ETH 23.50% 117,527
1M ETH 16.60% 166,208
2M ETH 11.75% 235,052
4M ETH 8.31% 332,411
8M ETH 5.88% 470,104
16M ETH 4.16% 664,801
32M ETH 2.94% 940,167
64M ETH 2.08% 1,329,603
128M ETH 1.47% 1,880,334

假设验证者 100% 在线并表现最佳。次优的验证者行为将导致奖励减少和/或罚款,从而减少总发行量。

初始惩罚参数

对于 PoS 协议而言,为了实现密码经济安全,协议内惩罚是必需的。小的离线惩罚激励验证者保持活跃,而(可能)大得多的惩罚则在发生尾部风险情景时提供协议安全。

具体来说,存在以下显著惩罚:

  • 不活跃泄漏(Inactivity Leak):在长时间未达最终性(例如,如果三分之一或更多验证者离线或不在规范链上)时,对验证者施加的离线惩罚,每个 epoch 都会增加。这确保了即使在灾难性条件下,链也能最终恢复最终性。
  • 罚没(Slashing):对签署明确恶意消息的验证者施加的惩罚,这些消息可能导致构建和最终确定两条冲突链(例如,同一Slot中的两个区块或证明)。此惩罚旨在按同一时期内可罚没验证者的数量按比例扩大,以确保如果发生关键数量(相对于链安全)的罚没,验证者将受到最大化的惩罚。

对于阶段 0 的首次启动,定义这些惩罚幅度的参数——INACTIVITY_PENALTY_QUOTIENTPROPORTIONAL_SLASHING_MULTIPLIERMIN_SLASHING_PENALTY_QUOTIENT——已调整为低于其最终预期值。这为早期验证者和客户端软件提供了一个更宽容的环境,以鼓励在这个早期、技风险较高的阶段进行验证。

INACTIVITY_PENALTY_QUOTIENT 最初配置为其最终值的四倍。这导致在非最终性期间不活跃泄漏速度较慢,这意味着链对此类事件的响应性较低。如果在 eth2 早期几个月出现长时间的非最终性,则很可能是由于客户端软件的技术问题,而不是某种全球性的灾难性事件。

PROPORTIONAL_SLASHING_MULTIPLIER 最初配置为其最终值的三分之一。这导致在发生攻击时可归咎的安全边际较低。如果在 eth2 早期几个月有任何验证者被罚没,则很可能是由于用户密钥管理不当和/或客户端软件问题,而不是有组织的攻击。

MIN_SLASHING_PENALTY_QUOTIENT 最初配置为其最终值的四倍。这导致可罚没行为的最低保证惩罚较低,从而降低了保持单个验证者系统安全的基线惩罚激励。与 PROPORTIONAL_SLASHING_MULTIPLIER 一样,eth2 早期几个月的罚没很可能是由于用户管理不当或客户端软件问题,而不是有组织的攻击。

基本原理

原则

  • 简洁性:特别是由于密码经济权益证明和二次分片本质上很复杂,协议应尽可能地在决策中力求最大程度的简洁性。这很重要,因为它可以 (i) 最小化开发成本,(ii) 降低出现意外安全问题的风险,以及 (iii) 让协议设计者更容易说服用户参数选择是合法的。当为了实现给定级别的功能而无法避免复杂性时,复杂性的优先顺序是:Layer2协议 > 客户端实现 > 协议规范。
  • 长期稳定性:协议的低层理想情况下应构建得在十年或更长时间内无需更改,任何必要的创新都可以在更高层(客户端实现或Layer2协议)进行。
  • 充分性:在协议之上构建尽可能多的应用程序类别从根本上讲应该是可能的。
  • 纵深防御:协议应在各种可能的安全假设下(例如,关于网络延迟、故障计数、用户动机)尽可能地保持良好运行。
  • 完全轻客户端可验证性:在某些假设下(例如,网络延迟、攻击者预算的限制、1-of-N 或少于 N 个诚实少数),客户端验证少量固定数据(理想情况下仅是信标链)应能间接确保整个系统中的所有数据都是可用和有效的,即使在 51% 攻击下也是如此(注意:这是一种纵深防御形式,但它足够重要,值得单独列出)。

Layer1与Layer2的权衡

以太坊路线图采用混合的Layer1/Layer2方法。我们专注于服务特定类型的Layer2(Rollups),因为它是在继承Layer1安全性的同时提供通用应用程序扩展的唯一类型。然而,Rollups 伴随着成本:它们要求每个交易都有链上数据,因此具有真正高容量 Rollups 的区块链必须能够处理仍然相当高的带宽数据。为了使这更可行,我们正在实施可扩展数据层技术,特别是数据可用性采样。

不采用纯粹的Layer2方法的原因是,纯粹的Layer2扩展只能通过基于信任的解决方案(不可取),或者通过通道或 Plasma(它们有固有的局限性,无法支持完整的 EVM)。

不采用纯粹的Layer1方法的原因是为执行层提供更多实验空间,并允许基础协议更简单,治理强度更低。

为什么选择权益证明

简而言之:

  • 无需消耗大量电力来保护区块链(例如,据估计,比特币和以太坊每天消耗超过 100 万美元的电力和硬件成本作为其共识机制的一部分)。
  • 由于电力消耗不高,不需要发行那么多新币来激励参与者持续参与网络。理论上甚至可能实现负净发行量,其中一部分交易费用被“销毁”,从而使供应量随着时间的推移而减少。
  • 权益证明为更广泛的技术打开了大门,这些技术使用博弈论机制设计,以更好地阻止中心化卡特尔的形成,如果它们形成,则阻止它们采取对网络有害的行为(例如,工作量证明中的自私挖矿)。
  • 降低中心化风险,因为规模经济问题大大减少。1000 万美元的代币将获得比 100 万美元的代币高出正好 10 倍的回报,没有任何额外不成比例的收益,因为在更高水平上你可以负担得起更好的批量生产设备,这对于工作量证明是一个优势。
  • 能够利用经济惩罚使各种形式的 51% 攻击成本大大提高,这比工作量证明要高得多——借用 Vlad Zamfir 的话,“这就像你的 ASIC 农场在参与 51% 攻击时被烧毁了一样”。

为什么是 Casper

目前有三大主流的权益证明共识算法流派:

  • Nakamoto-inspired (Peercoin, NXT, Ouroboros...)
  • PBFT-inspired (Tendermint, Casper FFG, Hotstuff...)
  • CBC Casper

在后两个阵营中,还存在是否以及如何使用保证金和罚没的问题(Nakamoto-inspired 算法与非平凡的罚没不兼容)。所有三种都优于工作量证明,但我们想捍卫我们自己的方法。

罚没

以太坊 2.0 使用罚没机制,如果验证者被检测到行为不当,则会受到惩罚,在最好的情况下约为 1%,但在最坏的情况下可达其全部存款。

我们对使用罚没的解释如下:

  1. 提高攻击成本:我们希望能够坚称,对权益证明区块链发起 51% 攻击会迫使攻击者承担非常高的成本(例如:价值数亿美元的代币)被烧毁,并且任何攻击都可以迅速恢复。这使得攻击/防御的权衡对攻击者非常不利,甚至可能使攻击适得其反,因为服务中断的负面影响会被合法代币持有者的价格上涨所抵消。
  2. 克服验证者困境:节点开始偏离“诚实”行为的最现实、最直接的方式是懒惰(即,不验证应该验证的东西,以防万一签署一切等等)。请参阅验证者困境论文(Luu 等人,CC BY)获取理论依据,以及比特币 SPV 挖矿分叉的例子,说明这种情况是如何发生并导致野外非常有害的后果。对自相矛盾或签署不正确内容的巨额惩罚有助于缓解这种情况。

(2) 的一个更微妙的例子可以这样看。2019 年 7 月,Cosmos 上的一个验证者因签署两个冲突区块而被罚没。调查显示,这是因为该验证者运行了一个主节点和一个备份节点(以确保其中一个节点离线不会阻止他们获得奖励),而这两个节点不小心同时开启,导致它们相互矛盾。

如果拥有主节点和备份节点成为标准做法,那么攻击者就可以划分网络,让所有验证者的主节点和备份节点提交不同的区块,从而导致两个冲突区块被最终确定。罚没惩罚有助于大力抑制这种做法,降低此类情况发生的风险。

共识算法的选择

只有 BFT-inspired 和 CBC 流派的共识算法才具有最终性概念,即一个区块以这样的方式被确认:如果需要恢复该区块以支持某些冲突区块,则需要大量(BFT-inspired 中为 1/3,CBC 中为 1/4)的验证者行为不当并被罚没;Nakamoto-inspired(即最长链规则)共识算法无法实现这种意义上的最终性。

请注意,最终性需要(超)多数验证者在线,但这是分片机制已经要求的一个条件,因为它要求随机抽样验证者委员会的 2/3 签署一个跨链连接才能被接受。

我们选择 Casper FFG 仅仅是因为在协议那部分最终确定时,它是最简单的可用算法。细节仍有待长期变更;特别是,我们正在积极探索实现单槽最终性的解决方案。

分片——或者,为什么我们讨厌超级节点?

除了分片之外,Layer1扩容的另一个主要替代方案是使用超级节点——简单地要求每个共识节点都拥有强大的服务器,以便能够单独处理每笔交易。基于超级节点的扩容很方便,因为它易于实现:它与现在区块链的工作方式相同,只是需要更多的软件工程工作来以更易于并行化的方式构建事物。

我们对这种方法的主要反对意见如下:

  • 矿池中心化风险:在基于超级节点的系统中,运行节点的固定成本很高,因此只有少数用户可以参与。这通常会用“嗯,大多数 PoW 和 PoS 币的共识无论如何都被 5-20 个矿池主导,这些矿池将能够很好地运行节点”来反驳。然而,这种回应忽略了即使在能够负担得起的矿池之间也存在的中心化压力风险。如果运行验证者的固定成本相对于回报而言很高,那么更大的矿池将能够提供比更小的矿池更低的费用,这可能导致更小的矿池被淘汰或感受到合并的压力。另一方面,在分片系统中,拥有更多 ETH 的验证者需要验证更多的交易,因此成本不是固定的。
  • AWS 中心化风险:在基于超级节点的系统中,家庭质押是不可行的,因此大多数质押更有可能发生在云计算环境中,而可供选择的选项很少。这会造成单点故障。
  • 降低抗审查性:使得在没有高计算+带宽要求的情况下无法参与共识,使得对验证者的检测和审查更容易。
  • 可扩展性:随着交易吞吐量的增加,在基于超级节点的系统中,上述风险会增加,而分片系统可以更容易地处理增加的负载。

这些中心化风险也是我们不试图实现超低延迟(<1 秒)区块链的原因,而是选择(相对!)保守的数字。

相反,以太坊采取了一种方法,其中每个验证者只被分配处理所有数据的一小部分。只有质押大量 ETH(例如数万或更多)的验证者才需要处理链中的全部数据。

请注意,分片设计中可能存在一个中间地带,即区块生产是中心化的,但 (i) 区块验证是去中心化的,并且 (ii) 存在“旁路通道”,用户可以发送交易,并且区块生产者被迫将其包含,因此即使是垄断生产者也无法进行审查。我们正在积极考虑在这种方向上略微倾斜的分片设计,以提高简洁性,从而可以更快地部署扩容,但如果需要,即使在此规范中,也可以运行分布式构建器并避免中心化。

安全模型

人们普遍认为,区块链的安全依赖于“诚实多数”假设:即 $\ge 50\%$ 的参与者会忠实地遵循规定的协议,甚至放弃为了自身利益而背叛的机会。实际上,(i) 诚实多数模型是不现实的,参与者会“懒惰”并签署区块而不验证它们(参见验证者困境论文和比特币 SPV 挖矿分叉)是一种非常常见的背叛形式,但幸运的是 (ii) 区块链在更严酷的模型下仍能保持其许多或全部安全属性,并且保留这些额外保证确实非常重要。

一个常见的更严苛的模型是非协调理性多数模型,该模型指出参与者以自身利益行事,但合作的百分比不超过某个阈值(例如,简单 PoW 链中的 23.21%)。一个更严苛的模型是最坏情况模型,其中存在一个控制超过 50% 算力或权益的单一行为者,问题变为:

  • 即使在这种情况下,我们能否迫使攻击者付出非常高的代价来打破链的保证?
  • 我们可以无条件保留哪些保证?

权益证明链中的罚没机制实现了第一个目标。在非分片链中,每个节点验证每个区块实现了第二个目标,用于两个特定的保证:(i) 最长链是有效的,并且 (ii) 最长链是可用的。

分片的一个主要挑战是在不要求每个节点验证完整链的情况下获得相同的两个属性。我们对分片采用的纵深防御方法恰好实现了这一点。核心思想是将随机委员会抽样、托管证明、欺诈证明、数据可用性抽样 (DAS) 以及最终的 ZK-SNARKs 结合起来,允许客户端检测并拒绝无效或不可用的链,而无需下载和验证所有数据,即使无效链由大多数权益证明验证者支持。

交易审查可以通过客户端以共识保持的方式检测,但这项研究尚未纳入以太坊路线图。

下表显示了当前预期的安全属性:

网络延迟 < 3s 网络延迟 3s - 6 分钟 网络延迟 > 6 分钟
>2/3 验证者诚实 完美操作 不完美但可接受的操作。没有严格的活性证明,但实践中预期存在活性。 可能间歇性活性失败,无安全失败。
>2/3 验证者理性,<1/3 协调 完美操作 不完美但可接受的操作,中心化风险增加。 可能间歇性活性失败,无安全失败,中心化风险非常高。
51% 攻击者 可以回滚最终性或进行审查,但成本高昂;不能强制通过无效或不可用的链。 可以回滚最终性或进行审查,但成本高昂;不能强制通过无效或不可用的链。 可以回滚最终性或进行审查;不能强制通过无效或不可用的链。

为什么 Casper 激励机制这样设置?

基础奖励

在每个 epoch 中,每个验证者都被期望进行一次“证明”,即表达该验证者对链头部的意见的签名。如果证明被包含在内,则会获得奖励,该奖励包含四个组成部分(称为“职责”):

  1. 证明被包含的奖励
  2. 证明指定正确 epoch 检查点的奖励
  3. 证明指定正确链头的奖励
  4. 正确参与同步委员会签名的奖励

另请注意,这些职责中还混合了及时性要求:你的证明必须在特定时间内包含才能获得奖励,对于“正确链头”职责,该时间限制是 1 个Slot。

对于每项职责,实际奖励计算如下。如果:

  • $R = B * \frac{nom}{den}$ 等于基本奖励乘以与该特定职责对应的分数 $\frac{nom}{den}$
  • $P$ 是执行所需操作的验证者比例

那么:

  • 履行职责的任何验证者都会获得 $R * P$ 的奖励
  • 未履行职责的任何验证者都会受到 $-R$ 的惩罚

这种“集体奖励”方案的目的,即“如果任何人表现更好,每个人都会表现更好”,是为了限制恶意因子(参见这篇论文恶意因子及其重要性的一些描述)。

基本奖励 $B$ 本身计算为 $k \frac{Di}{\sqrt{\sum{j=1}^{n} D_j}$,其中 $D_1 \dots D_n$ 是存款规模,$k$ 是一个常数;这是两种常见模型之间的折衷方案,(i) 固定奖励率,即 $k D_i$,和 (ii) 固定总奖励,即 $k * \frac{Di}{\sum{j=1}^{n} D_j}$。

反对 (i) 的主要论点是它给网络带来了两种不确定性:总发行量的不确定性,以及总存款量的不确定性(如果固定奖励率设置过低,那么几乎没有人会参与,威胁网络,如果设置过高,那么会有很多验证者参与,导致意外高发行量)。反对 (ii) 的主要论点是更容易受到劝退攻击(再次参见劝退攻击论文)。平方根倒数方法在两者之间折衷,避免了每种方法最坏的后果。

当证明获得奖励时,提议者会获得该奖励的一部分。这是为了鼓励提议者仔细听取消息并接受尽可能多的消息。

另请注意,奖励旨在对经常离线的验证者宽容:1% 的离线时间只会损失大约 1.6% 的奖励。这也是为了促进去中心化:去中心化系统的目标是从不可靠的部件中创建一个可靠的整体,所以我们不应该试图强迫每个单独的节点都极其可靠。

不活跃惩罚(Inactivity leak)

如果链在 $tsf > 4$ 个 epoch($tsf$ = “自最终性以来的时间”)后未能最终确定,则会增加一个惩罚,使得最大可能奖励为零(表现不佳的验证者将受到惩罚),并增加第二个惩罚组件,与 $tsf$ 成比例(也就是说,链未最终确定的时间越长,每 epoch 离线的惩罚越高)。这确保了如果超过 1/3 的验证者离线,离线的验证者将受到更严重的惩罚,并且总惩罚会随着时间的推移呈二次方增长。

这有三个后果:

  • 在你的离线确实阻止区块最终确定的情况下,对离线的惩罚更重
  • 实现了反关联惩罚的目标(参见下文)
  • 确保如果超过 1/3 确实离线,最终在线部分会回到 2/3,因为离线验证者的存款减少

根据当前的参数化,如果区块停止最终确定,验证者在 2.6 天后损失 1% 的存款,8.4 天后损失 10%,21 天后损失 50%。这意味着,例如,如果 50% 的验证者离线,区块将在 21 天后再次开始最终确定。

罚没和反关联惩罚

如果验证者被发现违反 Casper FFG 罚没条件,他们将受到等于其存款一部分的惩罚,该惩罚是同时期被惩罚的验证者比例的三倍(具体而言,在他们被惩罚前 18 天到他们提取资金的大致时间之间)。这有几个目标:

  • 验证者行为不当,只有当他们与许多其他验证者同时行为不当时,才真正对网络有害,因此在这种情况下对他们施加更重的惩罚是合理的
  • 它严厉惩罚实际攻击,但对可能只是诚实错误的单个孤立故障施加非常轻的惩罚
  • 它确保小验证者承担的风险低于大验证者(因为在正常情况下,大验证者将是唯一一个与自己同时失败的)
  • 它阻止所有人加入最大的矿池

BLS 签名

BLS 签名因其聚合友好性而被使用:任何两个消息 $M$ 的签名 $S_1$ 和 $S_2$,由密钥 $k_1$ 和 $k_2$ 签署(对应公钥 $K_1 = G k_1$ 和 $K_2 = G k_2$,其中 $G$ 是椭圆曲线的生成元),可以通过椭圆曲线点加法简单聚合:$S_1 + S_2$,它针对公钥 $K_1 + K_2$ 进行验证。这允许聚合数千个签名,每个签名的边际成本是一个比特的数据(表示特定公钥存在于聚合签名中)和一个椭圆曲线加法的计算。

请注意,这种形式的 BLS 签名容易受到流氓密钥攻击:如果你看到其他验证者已经发布了公钥 $K_1 \dots K_n$,那么你可以生成一个私钥 $r$ 并发布公钥 $G r - K_1 - \dots - K_n$。聚合公钥将简单地是 $G r$,因此你将能够自己创建一个针对组合公钥进行验证的签名。解决此问题的标准方法是要求所有权证明:基本上,是对消息的签名(该消息取决于公钥,并且通常不会被签名),它本身针对公钥进行验证(即 $sign(message=H'(K), key=k)$ 对于私钥 $k$ 和公钥 $K$,其中 $H'$ 是一个哈希函数)。这确保你个人控制与你发布的公钥连接的私钥。

我们使用存款消息的签名(该消息指定了签名密钥以及其他重要数据,例如提款密钥)作为所有权证明

为什么是 32 ETH 的验证者规模?

任何具有可追溯容错性(即如果 2 个冲突区块被最终确定,你可以识别出哪个 1/3 的节点负责)的 BFT 共识算法都必须让所有验证者参与,此外,出于术原因,你需要两轮每个验证者参与才能最终确定一条消息。

这导致了去中心化/最终性时间/开销的权衡:如果 $n$ 是网络中的验证者数量,$f$ 是区块最终确定时间,$\omega$ 是每秒消息开销,那么我们有:

$$\omega \ge \frac{2 * n}{f}$$

例如,如果我们能够接受每秒 10 条消息的开销,那么一个 10000 节点的网络只能拥有至少 2000 秒(约 33 分钟)的最终确定时间。

在以太坊的情况下,如果我们假设总 ETH 供应量约为 $2^{27}$ ETH,那么以 32 ETH 的存款规模,最多有 $2^{22}$ 个验证者(这还是在所有人都验证的情况下;通常我们预计验证的 ETH 会少约 10 倍)。最终确定时间为 2 个 epoch($2 \times 32 \times 12 = 768$ 秒),这意味着最大开销为 $\frac{2^{22}}{768} \approx 5461$ 条消息每秒。我们可以容忍如此高的开销,因为 BLS 聚合将每个签名的边际大小减少到 1 比特,并将边际验证复杂性减少到一次椭圆曲线加法。

32 个Slot是另一个安全最小值的原因:如果攻击者操纵用于提议者选择的随机性,这个数字仍然提供了足够的空间来确保每个 epoch 中至少有一个诚实的提议者,这足以确保区块保持最终确定。我们的计算表明,当前的开销水平是可以接受的,但更高的水平会使运行节点过于困难。最后,验证者存款规模非常适合分片跨链连接(见下文)。

随机抽样

种子选择

用于随机性的种子每当区块由提议者揭示一个必须被“混入”(即 seed &lt;- xor(seed, new_data))的值时,都会更新。就像托管证明子密钥一样,验证者的值一旦验证者存入,就全部预先确定,第三方无法计算子密钥,但可以验证自愿揭示的子密钥(这种机制有时称为 RANDAO)。

这确保了每个提议者对种子都有一个“操纵比特”:他们可以制造一个区块,也可以不制造一个区块。不制造区块是昂贵的,因为提议者会错过许多奖励。此外,由于持久委员会和信标委员会(见下文)的规模很大,对随机性的操纵几乎肯定不能让少数攻击者获得任何委员会的 2/3。

未来我们计划使用可验证延迟函数 (VDF) 进一步提高随机种子对操纵的鲁棒性。

洗牌

我们使用 Viet Tung Hoang、Ben Morris 和 Phillip Rogaway 描述的交换或不交换洗牌算法来洗牌验证者集并分配每个 epoch 的职责。该算法确保:

  • 由于洗牌是一个排列,每个验证者在每个 epoch 中都被分配为一个委员会的成员,并且只有一个(保持他们的负载稳定并减少随机性操纵有利可图的可能性)
  • 由于洗牌在正向是逐点可评估的,验证者可以在 $O(1)$ 时间内确定自己的职责
  • 由于洗牌在反向是逐点可评估的,任何特定委员会的成员或任何特定区块的提议者都可以在 $O(1)$ 时间内计算

按Slot洗牌

一个 epoch 中有 32 个Slot,负责对每个Slot进行证明的验证者是通过洗牌选出的。这确保了拥有相当大但仍占总权益一小部分的攻击者不能接管特定Slot并导致短程重组。

信标委员会

每个Slot的委员会又被分成多个信标委员会。今天(2022 年 1 月),这种设计确实有一个有用的功能,即允许不同子集的证明在独立的子网中聚合,从而使 p2p 网络更高效。然而,它没有其他任何有用的共识相关作用。

在最初的分片设计中,意图是每个信标委员会负责验证一个特定的分片。然而,如果我们切换到单提议者模型,这种方法很可能被弃用。因此,更细粒度的信标委员会很可能只是残留的,最终可能会被移除或以不同的方式重组,以专注于促进证明聚合。

同步委员会

每隔约 27 小时选择一个由 512 个验证者组成的同步委员会来签署一个区块;该委员会的公钥保存在一个易于访问的列表中,允许超轻客户端轻松验证签名。

LMD GHOST 分叉选择规则

信标链使用 LMD GHOST 分叉选择规则。

LMD GHOST 分叉选择规则结合了所有验证者的信息,每个Slot有数百个,使得在正常情况下,即使单个区块被回滚也极不可能。由于分叉选择依赖于所有验证者,这也确保了区块不能被回滚,除非攻击者确实控制了接近整个验证者集的 50%;人们无法通过操纵随机性获得巨大优势。

托管证明博弈

在每个 9 天的周期内,每个验证者都能够私下生成一个“周期子密钥”。验证者的公钥唯一地确定了他们每个周期的周期子密钥,因此一旦验证者存入,他们就无法再自由选择其子密钥。除了验证者本人,没有人可以计算任何给定验证者的子密钥,但是一旦验证者自愿揭示子密钥,任何人都可以验证其正确性(这一切都通过 BLS 法完成,如果未来需要量子安全,则可以通过基于哈希的承诺完成)。

当在周期 $j$ 内签署带有数据 $D$ 和根 $R$ 的区块时,设 $s$ 为该验证者在周期 $j$ 的秘密,验证者需要计算一个位域 $M$ 如下:

  • 将 $D$ 分割成 512 字节的块 $D[0] \dots D[n-1]$
  • 将 $M$ 设置为位域,其中第 i 个位为 $M[i] = \text{mix}(s, D[i])$

他们将 get_chunk_bits_root(M)(这被称为托管位)作为他们签名的一部分包含在内。mixget_chunk_bits_root 都可以被视为输出单个位(但专为多方计算友好而设计)的哈希类函数。

如果一个跨链连接包含多个区块 $B_1 \dots B_n$,并且验证者计算了这些区块的托管位 $c_1 \dots c_n$,那么验证者会签署所有 $(B_i, c_i, i)$ 元组并进行聚合。这种非传统的自聚合用于确保只有 $2n$ 个不同消息($n$ 个不同的区块/索引对 $\times 2$ 个不同的位值)由不同的验证者签署,从而减少验证签名所需的配对数量。

如果验证者在周期 $j$ 期间或之前发布其周期 $j$ 子密钥,任何其他验证者都可以向链发布子密钥的知识证明,然后惩罚被揭示子密钥的验证者。知识证明还证明了是哪个验证者创建了它;这可以防止区块提议者“窃取”吹哨奖励(这再次通过 BLS 法完成,如果未来需要量子安全,则可以通过 STARKs 完成)。这样做的目的是使外包 $M$ 的计算变得危险。

在验证者发布其周期 $j$ 子密钥后,任何人都可以检查他们签署的任何区块的工作。如果他们发现验证者提供了不正确的托管位,他们可以在链上提出质疑,并罚没该验证者。一般来说,随机猜测(或任何不涉及所有 $D$ 的过程)只会有一半时间给出正确答案,导致每个签署区块有 50% 的罚没风险。

该机制的目的是缓解验证者困境问题,即验证者出于懒惰而倾向于避免验证数据,并寄希望于所有其他验证者都是诚实的;如果太多验证者以这种方式思考,可能会导致公地悲剧,从而使链接受无效区块。有了这个方案,如果验证者试图提交他们未亲自处理的数据,那么他们将无法计算 $M$,因此会输掉交互式挑战博弈。

SSZ

SimpleSerialize 套件包含以下算法:

  • 序列化算法
  • 哈希算法(称为 SSZTreeHashhash_tree_root
  • 广义 Merkle 证明算法(称为“SSZ partials”),可以处理多个值的证明,并在此类情况下优化地去重 Merkle 树的兄弟节点。

序列化算法有以下设计目标:

  • 简洁性(例如,不像 RLP 那样根据项目长度有三个子句用于长/列表编码)
  • 在完全固定大小对象的情况下与简单连接等效
  • 既可用作共识层序列化算法,也可用作应用层 ABI

请注意,生成的 SSZ 序列化规范与以太坊 1.0 ABI 非常相似,主要区别在于 (i) 基本数据类型不同,以及 (ii) 将 32 字节长度/位置记录大小替换为 4 字节大小。

哈希算法具有以下设计目标:

  • 计算更新对象的哈希效率,特别是在对象非常大和/或复杂且更改相对较小的情况下
  • 在给定哈希的情况下,证明特定字段值的效率(就验证复杂度和见证大小而言)

这些要求共同使 Merkle 树结构成为显而易见的选择。

广义索引

请参阅 https://github.com/ethereum/eth2.0-specs/blob/dev/ssz/merkle-proofs.md,了解广义索引的描述,以及它们如何通过将路径表示为整数或位域,使 Merkle 证明“戳入”对象中任意位置的验证变得非常容易。

验证者生命周期

存款

验证者通过在 eth1 链上发送调用存款合约上函数的交易来存款(最终,也将添加从 eth2 内部存款的方式)。存款指定:

  • 用于签署消息的私钥对应的公钥
  • 提款凭证(一旦验证者完成验证,将用于提款资金的公钥哈希)
  • 存款金额

这些值都由签名密钥签署。拥有独立的签名密钥和提款密钥的目标是允许更危险的提款密钥更安全地保存(离线,不与任何质押池共享等),而签名密钥用于每个 epoch 主动签署消息。

存款合约维护着所有已进行存款的 Merkle 根。一旦包含存款的 Merkle 根通过 Eth1Data 投票机制被纳入 eth2 链,eth2 区块提议者就可以提交存款的 Merkle 证明并开始存款过程。

激活

验证者立即加入验证者注册表,但最初处于非活跃状态。验证者在 $N \ge 4$ 个 epoch 后变为活跃状态;最小值为 4 是为了确保 RANDAO 不可操纵,如果太多验证者试图同时加入,$N$ 可能会超过 4。如果活跃验证者集大小为 $|V|$,则每个 epoch 最多可以加入 $max(4, \frac{|V|}{65536})$ 个验证者;如果有更多验证者试图加入,他们将被放入队列并尽快处理。

退出

当验证者退出时(无论是通过发布自愿退出消息还是被罚没),他们也会被放入退出队列,具有相同的最大吞吐量。

进/出队列限制的原因是为了确保验证者集在任何两个时间点之间不会变化过快,这确保了只要验证者足够频繁地登录(如果 $|V| \ge 262144$,大约 1-2 个月),最终性保证在两条链之间仍然保持。有关理由(特别是为什么使用速率限制而不是固定等待时间),请参见 https://ethresear.ch/t/rate-limiting-entry-exits-not-withdrawals/4942,有关如何计算离线一段时间的客户端的安全边际,请参见 https://ethresear.ch/t/weak-subjectivity-under-the-exit-queue-model/5187

提款

一旦验证者离开退出队列,他们需要等待大约 27 小时才能提款。此期间有几个作用:

  • 它确保如果验证者行为不当,有一段时期可以发现错误并罚没验证者,即使退出队列几乎是空的。
  • 它提供了时间来包含分片奖励的最后一个周期。
  • 它提供了时间来进行托管证明挑战。

如果验证者被罚没,将额外施加大约 36 天的延迟。这进一步惩罚他们(并强制他们持有 ETH;这使得对于那些试图破坏以太坊区块链的恶意验证者来说,惩罚比那些想支持平台但只是犯了错误的验证者更大一些,因为前者将不得不承担风险或支付衍生品来抵消它),但也允许在这段时间内计算出被罚没的其他验证者数量。

在阶段 0 中,“已提款”的验证者实际上还不能提款到任何地方;唯一的区别是它受到验证者惩罚的保护,并且没有任何职责。在后续阶段,将提供将资金从已提款的验证者Slot转移到执行环境的能力。

有效余额

大多数基于验证者余额的计算都使用验证者的“有效余额”;唯一的例外是增加或减少验证者余额的计算。只有当验证者余额 $B$ 降至 $EB$ 以下或升至 $EB + 1.5$ 以上时,$EB$ 才会调整为等于 $\text{floor}(B)$。这样做是为了确保有效余额不经常变化,从而减少每个 epoch 重新计算状态所需的哈希量;平均而言,只需要更新所有余额,而有效余额对于每个验证者来说相对不常更新。余额都存储在专用向量中,因此需要 $2 \times \frac{N \times 8}{32} = \frac{N}{2}$ 个哈希来重新计算余额数组,而有效余额存储在验证者记录对象中,其中每个验证者至少需要 $5N$ 个哈希来调整 SSZ 哈希根。此外,$EB$ 可以更容易地压缩为 CompactValidator 对象,因为它只有 1 个字节。

分叉机制

Fork 数据结构包含 (i) 当前的“分叉 ID”,(ii) 上一个分叉 ID 和 (iii) 切换Slot。当前高度的分叉 ID 会影响所有消息的有效签名;因此,使用一个分叉 ID 签署的消息对于使用任何其他分叉 ID 的验证函数都是无效的。

分叉通过在某个“分叉Slot” $n$ 处添加状态转换来完成,该转换将上一个分叉 ID 设置为当前分叉 ID,将当前分叉 ID 设置为新值,并将切换Slot设置为 $n$。签名验证函数将使用消息所在Slot的分叉 ID 来验证消息,这可能是上一个分叉 ID 或当前分叉 ID(例如,考虑延迟后包含的证明;分叉Slot之前的证明可能在分叉Slot之后包含)。

如果任何用户不想加入分叉,他们可以简单地继续不更改分叉Slot处的分叉 ID 的链。两条链都可以继续,验证者可以自由地在两条链上进行验证而不会被罚没。

向后兼容性

尽管本 EIP 没有对当前的以太坊主网引入任何即时更改,但本 EIP 通过引入新的 eth2 共识机制为未来的向后不兼容性奠定了基础,以太坊将在后续阶段集成。为了保护该机制,用户将 ether 转移到信标链中,并发行额外的 ether。本 EIP 承诺将此路径作为规范路径,并直接告知以太坊主网的未来和路线图。

安全考虑

Eth2 是对以太坊核心共识从 PoW 到分片 PoS 的重大改革。这种迁移固有风险,但有大量的研究文献分析安全性和权衡。以下仅代表可用资源的高层次选择:

除了支持此路径的研究之外,还对规范、密码学和客户端实现进行了多项审计和形式验证。许多客户端和实用程序库审计正在进行中,完成后将在此处添加。

版权

版权及相关权利通过 CC0 放弃。

  • 原文链接: github.com/nerolation/EI...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Nerolation
Nerolation
江湖只有他的大名,没有他的介绍。