Alert Source Discuss
Standards Track: Core

EIP-3675: 将共识升级到权益证明

以太坊主网上共识机制升级的规范,该升级引入了权益证明机制

Authors Mikhail Kalinin (@mkalinin), Danny Ryan (@djrtwo), Vitalik Buterin (@vbuterin)
Created 2021-07-22
Requires EIP-2124

摘要

本 EIP 弃用工作量证明(PoW),并用信标链驱动的新的权益证明共识机制(PoS)取而代之。有关新共识机制引导的信息记录在 EIP-2982 中。信标链的完整规范可以在 ethereum/consensus-specs 存储库中找到。

本文档规定了共识升级引入的对区块结构、区块处理、分叉选择规则和网络接口的一系列更改。

动机

信标链网络自 2020 年 12 月以来一直在运行。在此期间未检测到安全或活跃性故障。这段长时间无故障运行证明了信标链系统的可持续性及其成为以太坊主网安全提供商的准备程度。

要了解引入权益证明共识机制的动机,请参阅 EIP-2982 的动机部分。

规范

定义

  • PoW 区块:由现有的工作量证明机制构建和验证的区块。换句话说,共识升级之前的以太坊网络区块。
  • PoS 区块:由新的权益证明机制构建和验证的区块。
  • 终端 PoW 区块:满足以下条件的 PoW 区块—— pow_block.total_difficulty >= TERMINAL_TOTAL_DIFFICULTY pow_block.parent_block.total_difficulty < TERMINAL_TOTAL_DIFFICULTY。 网络中可以存在多个终端 PoW 区块,例如,同一预终端区块的多个子区块。
  • TERMINAL_TOTAL_DIFFICULTY:网络达到的触发共识升级的总难度值。以太坊主网配置必须将此参数设置为值 58750000000000000000000
  • TRANSITION_BLOCK:规范链中最早的 PoS 区块,即区块高度最低的 PoS 区块。
  • POS_FORKCHOICE_UPDATED:更新权益证明分叉选择状态时发生的事件。
  • FORK_NEXT_VALUE:为即将到来的共识升级设置的 FORK_NEXT 参数的区块号。
  • TERMINAL_BLOCK_HASH:如果设置了终端 PoW 区块的哈希,则指定该哈希,即如果未用 0x0000000000000000000000000000000000000000000000000000000000000000 存根化。
  • TERMINAL_BLOCK_NUMBER:如果设置了 TERMINAL_BLOCK_HASH,则指定终端 PoW 区块的编号。

PoS 事件

名称中具有 POS_ 前缀的事件(PoS 事件)由新的权益证明共识机制发出。它们表示已对事件指定的区块做出的相应断言。PoS 事件的底层逻辑可以在信标链规范中找到。在每次发生 PoS 事件时,必须采取此 EIP 指定的相应操作。

在阅读参考 PoS 事件的规范部分时,必须考虑以下提供的详细信息:

  • PoS 事件中包含的区块的引用以区块哈希的形式提供,除非另有明确指定。
  • POS_FORKCHOICE_UPDATED 事件包含对规范链的头部和最近确定的区块的引用。在系统中出现第一个确定的区块之前,此事件提供的确定的区块哈希用 0x0000000000000000000000000000000000000000000000000000000000000000 存根化。
  • FIRST_FINALIZED_BLOCK:由 POS_FORKCHOICE_UPDATED 事件指定的第一个确定的区块,并且具有与存根不同的哈希。

客户端软件配置

以下参数集是客户端软件配置的一部分,必须包含在其二进制分发中:

  • TERMINAL_TOTAL_DIFFICULTY
  • FORK_NEXT_VALUE
  • TERMINAL_BLOCK_HASH
  • TERMINAL_BLOCK_NUMBER

注意:如果 TERMINAL_BLOCK_HASH0x0000000000000000000000000000000000000000000000000000000000000000 存根化,则 TERMINAL_BLOCK_HASHTERMINAL_BLOCK_NUMBER 参数不得生效。

PoW 区块处理

不得导入任何终端 PoW 区块的后代 PoW 区块。这意味着终端 PoW 区块将是规范链中的最后一个 PoW 区块。

常量

名称
MAX_EXTRA_DATA_BYTES 32

区块结构

TRANSITION_BLOCK 开始,通过强制将这些值改为常量,许多以前的动态区块字段被弃用。下表中列出的每个区块字段必须替换为相应的常量值。

字段 常量值 注释
ommersHash 0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347 = Keccak256(RLP([]))
difficulty 0  
mixHash 0x0000000000000000000000000000000000000000000000000000000000000000  
nonce 0x0000000000000000  
ommers [] RLP([]) = 0xc0

TRANSITION_BLOCK 开始,区块的 extraData 字段的验证发生变化:区块的 extraData 的长度必须小于或等于 MAX_EXTRA_DATA_BYTES 字节。

注意:此处指定的区块字段的逻辑和有效性条件必须保持不变。此外,整体区块格式必须保持不变。

注意:后续 EIP 可能会覆盖上面指定的常量值,以提供额外的功能。例如,请参阅 EIP-4399

区块有效性

TRANSITION_BLOCK 开始,区块有效性条件必须按以下方式更改:

  • 删除对区块 difficulty 值相对于难度公式的验证。
  • 删除对区块 noncemixHash 值相对于 Ethash 函数的验证。
  • 删除对 ommers 列表和此列表的每个成员进行评估的所有验证规则。
  • 添加对 区块结构 部分中指出的字段的验证。

注意:如果其中一个新规则失败,则必须使区块无效。

注意:上面列表中未指定的有效性规则必须保持不变。

过渡区块有效性

除了满足上述条件外,TRANSITION_BLOCK 必须是终端 PoW 区块的子区块。也就是说,TRANSITION_BLOCK 的父区块必须满足终端 PoW 区块条件。

区块和 ommer 奖励

TRANSITION_BLOCK 开始,区块和 ommer 奖励被弃用。具体来说,必须采取以下操作:

  • 删除按区块奖励增加区块 beneficiary 账户的余额。
  • 删除按每个 ommer 的 ommer 包含奖励增加区块 beneficiary 账户的余额。
  • 删除按每个 ommer 的 ommer 区块奖励增加 ommer 的 beneficiary 账户的余额。

注意:影响区块 beneficiary 账户的交易费用机制必须保持不变。

分叉选择规则

如果设置了 TERMINAL_BLOCK_HASH 参数,则会以下列方式影响 PoW 最重链规则:

  • 规范区块链必须包含一个区块,其哈希由 TERMINAL_BLOCK_HASH 参数定义,高度由 TERMINAL_BLOCK_NUMBER 参数定义。

注意:此规则类似于客户端软件实现中已存在的区块哈希白名单功能。

从第一个 POS_FORKCHOICE_UPDATED 事件开始,必须按以下方式更改分叉选择规则:

  • 删除现有的 PoW 最重链规则。
  • 遵守新的 PoS LMD-GHOST 规则。

新的 PoS LMD-GHOST 分叉选择规则指定如下。每次发生 POS_FORKCHOICE_UPDATED 事件(包括第一个事件)时,必须采取以下操作:

  • 将从创世区块开始并以事件指定的头部区块结束的链视为规范区块链。
  • 将规范区块链的头部设置为事件指定的相应区块。
  • FIRST_FINALIZED_BLOCK 开始,将最近确定的区块设置为事件指定的相应区块。

与上述操作相关的对区块树存储的更改必须以原子方式应用。

注意必须严格执行此规则。不得进行对头部的“乐观”更新。也就是说——如果在当前头部区块之上处理一个新区块,则仅当发生随附的 POS_FORKCHOICE_UPDATED 事件时,此新区块才会成为新头部。

网络

分叉标识符

为了 EIP-2124 分叉标识符的目的,实现此 EIP 的节点必须FORK_NEXT 参数设置为 FORK_NEXT_VALUE

devp2p

如果网络堆栈宣传任何终端 PoW 区块的后代,则不应发送以下消息:

  • NewBlockHashes (0x01)
  • NewBlock (0x07)

从接收到 FIRST_FINALIZED_BLOCK 开始,网络堆栈必须丢弃以下入口消息:

  • NewBlockHashes (0x01)
  • NewBlock (0x07)

从接收到 FIRST_FINALIZED_BLOCK 旁边的确定的区块开始,网络堆栈必须删除与以下消息对应的处理程序:

  • NewBlockHashes (0x01)
  • NewBlock (0x07)

在删除处理程序后仍继续发送这些消息的对等方断开连接。

注意:不受此部分影响的消息处理程序的逻辑必须保持不变。

理由

此 EIP 中指定的更改针对共识和客户端软件修改的最低要求集,以安全地将现有的工作量证明共识算法替换为已在生产中的信标链所代表的新的权益证明共识机制。

此 EIP 旨在最大限度地降低热切换以太坊网络实时共识的复杂性。在操作的安全性和生产时间方面都得到了考虑。此外,最小的变更集有助于确保大多数智能合约和服务在过渡期间和过渡后继续按预期运行,而几乎不需要干预。

触发升级的总难度

请参阅 安全注意事项

参数化终端区块哈希

请参阅 安全注意事项

停止导入 PoW 区块

请参阅 安全注意事项

用常量替换区块字段

弃用的区块字段将替换为常量值,以确保区块格式保持向后兼容。保留区块格式有助于现有的智能合约和服务在此过渡期间和过渡后提供不间断的服务。

特别是,这对于那些通过验证外部提供的区块头的哈希与 BLOCKHASH 操作返回的相应值来验证交易/收据包含和状态的 Merkle 证明的智能合约非常重要。

此更改引入了一个额外的有效性规则,该规则强制替换弃用的区块字段。

0 替换 difficulty

在弃用工作量证明后,难度的概念不再存在,并且用 0 常量替换区块头 difficulty 字段在语义上是合理的。

更改区块有效性规则

强制执行 PoW 密封有效性的规则集将随着共识升级一起替换为相应的 PoS 规则,这是此更改背后的理由。

此规范引入的区块格式更改需要一个额外的规则来验证一组已弃用的区块字段。

删除区块奖励

现有的用于生成和密封区块的奖励与 PoW 机制一起被弃用。一旦此规范生效,新的 PoS 共识机制将负责密封区块和发行区块奖励。

取代分叉选择规则

在升级后,PoW 机制的分叉选择规则变得完全无关紧要,并被新的 PoS 共识机制的相应规则所取代。

删除 POS_CONSENSUS_VALIDATED

在此 EIP 的先前草案版本中,需要额外的 POS 事件——POS_CONSENSUS_VALIDATED——作为区块的验证条件。此事件发出信号,指示是完全合并还是从区块树中删除区块。

删除此事件的原因有两个:

  1. 此事件是不必要的优化,允许从区块树中删除“坏”区块。此优化是不必要的,因为 PoS 共识永远不会为任何此类坏区块或其后代发送 POS_FORKCHOICE_UPDATED,并且最终在区块树中备用分支的 PoS 确定性事件之后,任何此类区块都将能够被删除。
  2. 在某些情况下,此事件是危险的,因为一个区块可能被两个不同且冲突的 PoS 分支引用。因此,对于某些情况下的同一区块,可能会发送 POS_CONSENSUS_VALIDATED == TRUEPOS_CONSENSUS_VALIDATED == FALSE 事件,从而完全否定了安全执行 (1) 中优化的能力。

EIP-2124 分叉标识符

EIP-2124 中 FORK_NEXT 的值是指给定节点知道的下一个分叉的区块号,否则为 0

鉴于过渡触发条件的动态特性,无法提前知道 TRANSITION_BLOCK 的数量。由于无法先验地知道区块,因此节点无法使用其编号作为 FORK_NEXT,并且鉴于此事实,改为使用显式设置的 FORK_NEXT_VALUE

删除区块 Gossip

在共识机制升级后,只有信标链网络才有足够的信息来验证区块。因此,由 eth 网络协议提供的区块 Gossip 将变得不安全,并且被弃用,取而代之的是信标链网络中存在的区块 Gossip。

建议客户端软件不要传播任何终止 PoW 区块的后代,以减少处理 P2P 组件的负载,并停止在具有未知安全属性的环境中运行。

限制 extraData 的长度

extraData 字段在黄皮书中定义为最大 32 字节。因此,主网和大多数 PoW 测试网将该值限制为 32 字节。较大长度的 extraData 字段由 clique 测试网和其他网络用于携带特殊的签名/共识方案。此 EIP 将 extraData 的长度限制为 32 字节,因为任何从另一种共识机制过渡到信标链 PoS 共识机制的网络都不再需要扩展或无限制的 extraData

向后兼容性

此 EIP 在区块有效性、区块奖励和分叉选择规则中引入了向后不兼容性。

除非下面 EVM 部分中描述的那些或以任何其他方式严重依赖 PoW 共识,否则本文档中指定的共识升级设计不会为构建在以太坊之上的现有应用程序和服务引入向后不兼容性。

EVM

尽管此 EIP 未对 EVM 引入任何显式更改,但在某些地方可能会影响现有智能合约的逻辑。

DIFFICULTY

在此 EIP 生效并弃用 difficulty 字段(用 0 常量替换它)之后,DIFFICULTY 操作将始终返回 0

注意:正在考虑更改 DIFFICULTY 语义以返回信标链积累的随机性,但将在单独的 EIP 中引入。

BLOCKHASH

在此 EIP 生效并且 PoW 机制(降低了区块哈希的可塑性)被 PoS 取代后,作为 BLOCKHASH 操作的输出获得的伪随机数变得更加不安全。

测试用例

  • 区块有效性
    • TRANSITION_BLOCK 开始,如果以下任何一项为真,则区块无效:
      • ommersHash != Keccak256(RLP([]))
      • difficulty != 0
      • nonce != 0x0000000000000000
      • len(extraData) > MAX_EXTRA_DATA_BYTES
    • TRANSITION_BLOCK 开始,区块奖励不会添加到 beneficiary 账户
  • 客户端软件遵守 PoS LMD-GHOST 规则
    • 头部和确定的区块根据最近的 POS_FORKCHOICE_UPDATED 事件设置
    • 除非收到 POS_FORKCHOICE_UPDATED 事件,否则不会更新任何分叉选择状态
  • 过渡过程
    • 客户端软件不会处理任何终端 PoW 区块之后的 PoW 区块
    • TRANSITION_BLOCK 开始,客户端软件应用新的区块有效性规则
    • 从第一个 POS_FORKCHOICE_UPDATED 开始,客户端软件将其分叉选择规则切换到 PoS LMD-GHOST
    • TRANSITION_BLOCK 必须是终端 PoW 区块的子区块
    • 在收到 FIRST_FINALIZED_BLOCK 后,将丢弃 NewBlockHashes (0x01)NewBlock (0x07) 网络消息

安全注意事项

信标链

请参阅 EIP-2982 的安全注意事项部分。

过渡过程

用于使此规范生效的过渡过程是硬分叉的更复杂版本——在以太坊网络中应用向后不兼容更改的常规过程。此过程有多个连续步骤,而不是更简单的硬分叉的普通区块高度点条件。

此升级过程的复杂性源于此分叉的目标是底层共识机制,而不是共识机制内的执行层。尽管该设计在可能的情况下寻求简单性,但在过渡期间已优先考虑安全性和活跃性。

终端总难度与区块号

在此上下文中,对硬分叉使用预定义的区块号是不安全的,因为在过渡期间 PoS 分叉选择会优先。

攻击者可以使用少数哈希能力来构建一个恶意链分叉,该分叉将满足区块高度要求。然后,第一个 PoS 区块可能会在来自此对抗性分叉的 PoW 区块之上恶意提出,从而成为头部并破坏过渡的安全性。

为了保护网络免受此攻击方案的影响,链积累的难度(总难度)用于触发升级。

在终端 PoW 区块之间跳转的能力

可能存在由于(暂时性)网络分区,大多数网络参与者未观察到终端 PoW 区块的情况。在这种情况下,少数人会将其分叉选择切换到由基于他们观察到是少数的终端 PoW 区块的 PoS 提供的新的规则。

过渡过程允许网络在具有不同终端 PoW 区块的分叉之间重新组织,只要 (a) 这些区块满足终端 PoW 区块条件且 (b) 尚未收到 FIRST_FINALIZED_BLOCK。这提供了针对过渡过程中不利网络条件和防止无法修复的分叉/分区的弹性。

停止导入 PoW 区块

假设连接到信标链网络的客户端软件部分在以太坊网络达到 TERMINAL_TOTAL_DIFFICULTY 之前脱机,并且在网络满足此阈值时保持脱机状态。此事件使客户端软件无法切换到 PoS,并允许它在 PoW 链超出终端 PoW 区块构建的情况下继续遵循该链。根据信标链部分脱机的时间长短,可能会导致不同的不利影响,例如:

  • 客户端没有终端 PoW 区块的后状态(该状态已被删除),这阻止了它重新组织到 PoS 链,并使从头开始同步作为恢复的唯一选择。
  • 应用程序、用户或服务使用来自错误分叉(持续构建的 PoW 链)的数据,这可能会在其方面造成安全问题。

不导入超过终端 PoW 区块的 PoW 区块可以防止这些对安全/重组的不利影响,以支持活跃性失败。

终端 PoW 区块覆盖

有一种机制允许在紧急情况下加速共识升级。 此 EIP 考虑了以下紧急情况,以使加速生效:

  • 网络哈希率的下降,从而大大延迟了升级。
  • 在升级之前对 PoW 网络的攻击。

可以通过更新以下参数来安全地加速第一种情况:

  • TERMINAL_TOTAL_DIFFICULTY - 重置为比原始参数更接近时间的值。
  • FORK_NEXT_VALUE - 相应地进行调整。

第二种更 dire 的攻击情况需要更具侵入性的覆盖:

  • TERMINAL_BLOCK_HASH - 设置为某个区块的哈希以成为终端 PoW 区块。
  • TERMINAL_BLOCK_NUMBER - 设置为由 TERMINAL_BLOCK_HASH 指定的区块编号。
  • TERMINAL_TOTAL_DIFFICULTY - 设置为由 TERMINAL_BLOCK_HASH 指定的区块的总难度值。
  • FORK_NEXT_VALUE - 相应地调整。

注意:在第二种情况下的加速被认为是针对最极端的情况,因为它将导致以太坊主网上出现一些重要的活跃性失败。

古老的区块不再是网络安全的必要条件

从创世区块开始保留历史区块在 PoW 网络中至关重要。每个属于特定链的区块的表头都需要证明此链相对于 PoW 密封的有效性。

新的 PoS 机制不需要验证链的整个历史。相反,PoS 网络中的同步过程依赖于弱主观性检查点(网络上的对等方共享的历史快照)。这意味着超出弱主观性检查点的历史区块不再是确定规范区块链的必要条件。

弱主观性检查点的规范可以在 ethereum/consensus-specs 存储库中找到。

版权

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

Citation

Please cite this document as:

Mikhail Kalinin (@mkalinin), Danny Ryan (@djrtwo), Vitalik Buterin (@vbuterin), "EIP-3675: 将共识升级到权益证明," Ethereum Improvement Proposals, no. 3675, July 2021. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-3675.