本EIP旨在废弃以太坊的Proof-of-Work (PoW) 共识机制,并用新的Proof-of-Stake (PoS) 机制取而代之。它详细规定了共识升级后区块结构、处理方式、分叉选择规则及网络接口所需进行的各项变更,以确保主网顺利过渡到信标链驱动的PoS系统。
本 EIP 弃用工作量证明(PoW),并以信标链驱动的新的权益证明(PoS)共识机制取而代之。关于新共识机制引导的信息已记录在 EIP-2982 中。信标链的完整规范可在 ethereum/consensus-specs 存储库中找到。
本文档详细说明了共识升级所引入的区块结构、区块处理、分叉选择规则和网络接口的一系列变化。
信标链网络自 2020 年 12 月以来一直在运行。在此期间未检测到安全性或活性故障。这一长时间的无故障运行表明了信标链系统的可持续性及其成为以太坊主网安全提供者的准备就绪。
要了解引入权益证明共识的动机,请参阅 EIP-2982 的“动机”部分。
pow_block.total_difficulty >= TERMINAL_TOTAL_DIFFICULTY 且 pow_block.parent_block.total_difficulty < TERMINAL_TOTAL_DIFFICULTY。
网络中可能存在多个 terminal PoW 区块,例如同一个 pre-terminal 区块的多个子区块。TERMINAL_TOTAL_DIFFICULTY 网络达到的总难度量,触发共识升级。以太坊主网配置必须将此参数设置为值 58750000000000000000000。TRANSITION_BLOCK 规范链中最早的 PoS 区块,即区块高度最低的 PoS 区块。POS_FORKCHOICE_UPDATED 当权益证明分叉选择的状态更新时发生的事件。FORK_NEXT_VALUE 为即将到来的共识升级设置的 FORK_NEXT 参数的区块号。TERMINAL_BLOCK_HASH 如果已设置(即未用 0x0000000000000000000000000000000000000000000000000000000000000000 填充),则指定 terminal PoW 区块的哈希。TERMINAL_BLOCK_NUMBER 如果 TERMINAL_BLOCK_HASH 已设置,则指定 terminal PoW 区块的编号。名称中带有 POS_ 前缀的事件(PoS 事件)由新的权益证明共识机制发出。它们表示对事件指定区块所做的相应断言。PoS 事件的底层逻辑可在信标链规范中找到。当每个 PoS 事件发生时,必须采取本 EIP 规定的相应行动。
阅读规范中提及 PoS 事件的部分时,必须考虑以下细节:
POS_FORKCHOICE_UPDATED 事件包含对规范链头和最近一次最终确定区块的引用。在系统中出现第一个最终确定区块之前,此事件提供的最终确定区块哈希将用 0x0000000000000000000000000000000000000000000000000000000000000000 填充。FIRST_FINALIZED_BLOCK 由 POS_FORKCHOICE_UPDATED 事件指定且哈希与填充值不同的第一个最终确定区块。以下参数集是客户端软件配置的一部分,必须包含在其二进制发行版中:
TERMINAL_TOTAL_DIFFICULTYFORK_NEXT_VALUETERMINAL_BLOCK_HASHTERMINAL_BLOCK_NUMBER注意:如果 TERMINAL_BLOCK_HASH 用 0x0000000000000000000000000000000000000000000000000000000000000000 填充,则 TERMINAL_BLOCK_HASH 和 TERMINAL_BLOCK_NUMBER 参数不得生效。
任何 terminal PoW 区块的后代 PoW 区块不得导入。这意味着 terminal 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 值相对于难度公式的验证。nonce 和 mixHash 值相对于 Ethash 函数的验证。注意:如果其中一条新规则失败,则区块必须失效。
注意:不在上述列表中的有效性规则必须保持不变。
除了满足上述条件外,TRANSITION_BLOCK 必须是 terminal PoW 区块的子区块。也就是说,TRANSITION_BLOCK 的父区块必须满足 terminal PoW 区块条件。
从 TRANSITION_BLOCK 开始,区块和 ommer 奖励被弃用。具体来说,必须采取以下行动:
beneficiary 账户余额的机制。beneficiary 账户余额的机制。beneficiary 账户余额的机制。注意:影响区块 beneficiary 账户的交易费用机制必须保持不变。
如果设置了 TERMINAL_BLOCK_HASH 参数,则它会以下列方式影响 PoW 最重链规则:
TERMINAL_BLOCK_NUMBER 参数定义的区块高度包含由 TERMINAL_BLOCK_HASH 参数定义的哈希的区块。注意:此规则类似于客户端软件实现中已有的区块哈希白名单功能。
从第一个 POS_FORKCHOICE_UPDATED 事件开始,分叉选择规则必须按以下方式更改:
新的 PoS LMD-GHOST 分叉选择规则规定如下。在每次 POS_FORKCHOICE_UPDATED 事件发生时(包括第一次),必须采取以下行动:
FIRST_FINALIZED_BLOCK 开始,将最近一次最终确定区块设置为事件指定的相应区块。与上述行动相关的对区块树存储的更改必须原子地应用。
注意:此规则必须严格执行。“乐观”更新到头部不得进行。也就是说——如果在一个新区块被处理到当前头部区块之上时,当且仅当发生相应的 POS_FORKCHOICE_UPDATED 事件时,这个新区块才成为新的头部。
为了 EIP-2124 分叉标识符的目的,实现此 EIP 的节点必须将 FORK_NEXT 参数设置为 FORK_NEXT_VALUE。
如果以下消息宣传任何 terminal PoW 区块的后代,网络栈不应发送它们:
NewBlockHashes (0x01)NewBlock (0x07)从接收到 FIRST_FINALIZED_BLOCK 开始,网络栈必须丢弃以下入站消息:
NewBlockHashes (0x01)NewBlock (0x07)从接收到 FIRST_FINALIZED_BLOCK 旁边的最终确定区块开始,网络栈必须移除与以下消息对应的处理程序:
NewBlockHashes (0x01)NewBlock (0x07)在处理程序被移除后仍继续发送这些消息的对等节点应被断开连接。
注意:不受此部分影响的消息处理程序的逻辑必须保持不变。
本 EIP 中指定的更改旨在最小化共识和客户端软件修改的必要集合,以安全地将现有工作量证明共识算法替换为由已投入生产的信标链表示的新权益证明共识。
本 EIP 的设计旨在最大限度地降低热插拔以太坊网络实时共识的复杂性。操作的安全性以及投入生产的时间都得到了考虑。此外,最小的更改集有助于确保大多数智能合约和服务在过渡期间和之后能够继续按预期运行,几乎不需要干预。
请参阅安全考虑。
请参阅安全考虑。
请参阅安全考虑。
弃用的区块字段被常量值替换,以确保区块格式保持向后兼容。保留区块格式有助于现有智能合约和服务在此过渡期间和之后提供不间断服务。
特别是,这对于那些通过验证外部提供的区块头的哈希与 BLOCKHASH 操作返回的相应值来验证交易/收据包含和状态的 Merkle 证明的智能合约非常重要。
此更改引入了一个额外的有效性规则,该规则强制替换弃用的区块字段。
difficulty 替换为 0在弃用工作量证明后,难度的概念不再存在,将区块头 difficulty 字段替换为 0 常量在语义上是合理的。
PoW 密封有效性的规则集在共识升级时被替换为相应的 PoS 规则,这是此更改背后的原因。
本规范引入的区块格式更改要求一个额外的规则来验证一组弃用的区块字段。
现有的生产和密封区块的奖励与 PoW 机制一起被弃用。一旦本规范生效,新的 PoS 共识将同时负责密封区块和发行区块奖励。
PoW 机制的分叉选择规则在升级后完全无关紧要,并被新的 PoS 共识机制的相应规则取代。
POS_CONSENSUS_VALIDATED在此 EIP 的早期草案版本中,需要一个额外的 PoS 事件——POS_CONSENSUS_VALIDATED——作为区块的验证条件。此事件发出信号,指示是完全合并区块还是将其从区块树中修剪。
移除此事件有两个原因:
POS_FORKCHOICE_UPDATED,并且最终任何此类区块在区块树中替代分支的 PoS 最终确定事件之后都能够被修剪。POS_CONSENSUS_VALIDATED == TRUE 和 POS_CONSENSUS_VALIDATED == FALSE 事件,完全否定了安全执行 (1) 中优化的能力。EIP-2124 中 FORK_NEXT 的值指的是给定节点知道的下一个分叉的区块号,否则为 0。
鉴于过渡触发条件的动态性质,TRANSITION_BLOCK 的编号无法提前知道。由于区块无法预先知道,节点无法使用其编号作为 FORK_NEXT,鉴于此事实,将使用显式设置的 FORK_NEXT_VALUE。
在共识机制升级后,只有信标链网络才拥有足够的信息来验证区块。因此,eth 网络协议提供的区块传播将变得不安全,并被信标链网络中存在的区块传播所取代。
建议客户端软件不传播任何 terminal PoW 区块的后代,以减少处理 P2P 组件的负载,并停止在具有未知安全属性的环境中运行。
extraData 的长度extraData 字段在黄皮书中定义为最大 32 字节。因此,主网和大多数 PoW 测试网将该值限制为 32 字节。长度大于 32 字节的 extraData 字段被 clique 测试网和其他网络用于承载特殊的签名/共识方案。本 EIP 将 extraData 的长度限制为 32 字节,因为任何从另一种共识机制过渡到信标链 PoS 共识机制的网络不再需要扩展或无限制的 extraData。
本 EIP 在区块有效性、区块奖励和分叉选择规则方面引入了向后不兼容性。
本文件指定的共识升级设计不会对建立在以太坊之上的现有应用程序和服务引入向后不兼容性,除了EVM 部分所述或以任何其他方式严重依赖 PoW 共识的那些。
尽管本 EIP 没有对 EVM 引入任何明确的更改,但在某些地方它可能会影响现有智能合约的逻辑。
在本 EIP 生效并通过将其替换为 0 常量来弃用 difficulty 字段后,DIFFICULTY 操作将始终返回 0。
注意:改变 DIFFICULTY 语义以返回信标链累积的随机性正在考虑中,但将在单独的 EIP 中引入。
在本 EIP 生效且 PoW 机制(降低区块哈希可塑性)被 PoS 取代后,作为 BLOCKHASH 操作输出获得的伪随机数变得更加不安全。
TRANSITION_BLOCK 开始,如果以下任何一项为真,则区块无效:
ommersHash != Keccak256(RLP([]))difficulty != 0nonce != 0x0000000000000000len(extraData) > MAX_EXTRA_DATA_BYTESTRANSITION_BLOCK 开始,区块奖励不会添加到 beneficiary 账户POS_FORKCHOICE_UPDATED 事件设置POS_FORKCHOICE_UPDATED 事件,否则不更新分叉选择状态TRANSITION_BLOCK 开始,客户端软件应用新的区块有效性规则POS_FORKCHOICE_UPDATED 开始,客户端软件将其分叉选择规则切换到 PoS LMD-GHOSTTRANSITION_BLOCK 必须是 terminal PoW 区块的子区块FIRST_FINALIZED_BLOCK 后,NewBlockHashes (0x01) 和 NewBlock (0x07) 网络消息被丢弃请参阅 EIP-2982 的安全考虑部分。
用于使本规范生效的过渡过程是硬分叉的一个更复杂的版本——这是以太坊网络中应用向后不兼容更改的常规程序。此过程具有多个连续步骤,而不是简单硬分叉的正常区块高度点条件。
此升级过程的复杂性源于此分叉针对的是底层共识机制,而不是共识机制内的执行层。尽管设计力求在可能的情况下简化,但在过渡期间的安全性与活性考虑已优先考虑。
在此上下文中,使用预定义的区块号进行硬分叉是不安全的,因为 PoS 分叉选择在过渡期间具有优先权。
攻击者可能会使用少数哈希算力来构建恶意链分叉,以满足区块高度要求。然后,恶意 PoS 区块可能会在恶意分叉的 PoW 区块之上被提议,从而成为头部并颠覆过渡的安全性。
为了保护网络免受此攻击场景的影响,链积累的难度(总难度)用于触发升级。
可能出现 terminal PoW 区块未被大多数网络参与者观察到的情况,原因在于(暂时性)网络分区。在这种情况下,这少数人会将其分叉选择切换到由 PoS 提供的基于他们观察到的少数 terminal PoW 区块的新规则。
过渡过程允许网络在具有不同 terminal PoW 区块的分叉之间进行 re-org,只要 (a) 这些区块满足 terminal PoW 区块条件,并且 (b) FIRST_FINALIZED_BLOCK 尚未收到。这提供了在过渡过程中应对不利网络条件的弹性,并防止不可修复的分叉/分区。
假设连接到信标链网络的客户端软件部分在以太坊网络达到 TERMINAL_TOTAL_DIFFICULTY 之前离线,并在网络达到此阈值时保持离线。此类事件使客户端软件无法切换到 PoS,并允许它在 PoW 链继续构建超出 terminal PoW 区块时继续遵循 PoW 链。根据信标链部分离线的时间长短,可能导致不同的不利影响,例如:
不导入超出 terminal PoW 区块的 PoW 区块,可防止在软件或配置故障导致活性故障时,出现这些对安全性/re-org 的不利影响。
有一种机制允许在紧急情况下加速共识升级。 本 EIP 考虑了以下紧急情况,以使加速生效:
第一种情况可以通过更新以下参数来安全加速:
TERMINAL_TOTAL_DIFFICULTY——重置为比原始值更接近的时间值。FORK_NEXT_VALUE——相应调整。第二种更严重的攻击场景需要更具侵入性的覆盖:
TERMINAL_BLOCK_HASH——设置为某个区块的哈希,使其成为 terminal PoW 区块。TERMINAL_BLOCK_NUMBER——设置为由 TERMINAL_BLOCK_HASH 指定的区块的编号。TERMINAL_TOTAL_DIFFICULTY——设置为由 TERMINAL_BLOCK_HASH 指定的区块的总难度值。FORK_NEXT_VALUE——相应调整。注意:第二种情况下的加速被认为是针对最极端的情况,因为它将导致以太坊主网上的非平凡活性故障。
在 PoW 网络中,从创世块开始保留历史区块至关重要。属于特定链的每个区块的头部都必须用来证明该链相对于 PoW 密封的有效性。
新的 PoS 机制不需要验证链的整个历史记录。相反,PoS 网络中的同步过程依赖于弱主观检查点,这些检查点是网络上对等方共享的历史快照。这意味着超出弱主观检查点的历史区块不再是确定规范区块链的要求。
弱主观检查点的规范可在 ethereum/consensus-specs 存储库中找到。
通过 CC0 放弃版权和相关权利。
- 原文链接: github.com/nerolation/EI...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!