Alert Source Discuss
⚠️ Draft Standards Track: Core

EIP-6465: SSZ 提款根

将提款 MPT 承诺迁移到 SSZ

Authors Etan Kissling (@etan-status), Mikhail Kalinin (@mkalinin)
Created 2023-02-08
Discussion Link https://ethereum-magicians.org/t/eip-6465-ssz-withdrawals-root/12883
Requires EIP-2718, EIP-4895, EIP-6404

摘要

此 EIP 定义了将现有 Merkle-Patricia Trie (MPT) 提款承诺迁移到 Simple Serialize (SSZ) 的过程。

动机

虽然共识 ExecutionPayloadHeader 和执行区块头在概念上相互映射,但它们的编码方式不同。此 EIP 旨在对齐 withdrawals_root 的编码,利用更现代的 SSZ 格式。这带来了几个优势:

  1. 降低复杂性: 拟议的设计减少了需要支持 Merkle-Patricia Trie (MPT) 的用例数量。

  2. 减少歧义: 名称 withdrawals_root 当前用于指代不同的根。虽然执行区块头指的是 Merkle Patricia Trie (MPT) 根,但共识 ExecutionPayloadHeader 指的是 SSZ 根。通过这些更改,withdrawals_root 始终如一地指代相同的 SSZ 根。

规范

本文档中的关键词“必须”,“禁止”,“必需”,“应”,“不应”,“推荐”,“不推荐”,“可以”和“可选”应按照 RFC 2119 和 RFC 8174 中的描述进行解释。

现有定义

为方便参考,本文档中使用的现有规范中的定义在此处复制。

名称 SSZ 等效项
ValidatorIndex uint64
Gwei uint64
ExecutionAddress Bytes20
WithdrawalIndex uint64
名称
MAX_WITHDRAWALS_PER_PAYLOAD uint64(2**4) (= 16)
SSZ_TX_TYPE 0x1f

SSZ Withdrawal 容器

现有的共识 Withdrawal SSZ 容器用于表示提款。

class Withdrawal(Container):
    index: WithdrawalIndex
    validator_index: ValidatorIndex
    address: ExecutionAddress
    amount: Gwei

执行区块头更改

更新执行区块头的 withdrawals-root 以匹配共识 ExecutionPayloadHeader.withdrawals_root

withdrawals = List[Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD](
    withdrawal_0, withdrawal_1, withdrawal_2, ...)

block_header.withdrawals_root == withdrawals.hash_tree_root()

类型化的提款信封

引入类似于 EIP-2718 的类型化提款信封,用于通过 以太坊 Wire 协议 交换提款。

withdrawal = {legacy-withdrawal, typed-withdrawal}

未类型化的传统提款作为 RLP 列表给出,如 EIP-4895 中定义。

legacy-withdrawal = [
    index: P,
    validator-index: P,
    address: B_20,
    amount: P,
]

类型化的提款编码为 RLP 字节数组,其中第一个字节是提款类型 (withdrawal-type),其余字节是不透明的类型特定数据。

typed-withdrawal = withdrawal-type || withdrawal-data

网络

当通过 以太坊 Wire 协议 交换 SSZ 提款时,使用以下提款信封:

  • Withdrawal: SSZ_TX_TYPE || snappyFramed(ssz(Withdrawal))

对象使用 SSZ 进行编码,并使用 Snappy 帧格式进行压缩,匹配 共识网络规范 中定义的共识对象的编码。作为编码的一部分,会发出未压缩的对象长度;建议每个对象强制执行的限制为 8 + 8 + 20 + 8 (= 44) 字节。

理由

此更改最初是上海升级中包含的候选方案,但为了加速提款的推出而被推迟。

为什么使用类型化的提款信封?

当交换提款时,RLPx 序列化层可能不知道分叉计划和区块时间戳。类型化的提款信封在基于 RLP 和 MPT withdrawals_root 同步历史区块时提供帮助。

向后兼容性

依赖于区块头中被替换的 MPT withdrawals_root 的应用程序需要迁移到 SSZ withdrawals_root

客户端可以通过查看第一个字节来区分传统提款和类型化提款。如果它以 [0, 0x7f] 范围内的值开头,则它是一种新的提款类型,如果它以 [0xc0, 0xfe] 范围内的值开头,则它是一种传统的提款类型。0xff 对于 RLP 编码的提款来说是不现实的,因此它被保留用作扩展标记值。

安全考虑

版权

CC0 下放弃版权及相关权利。

Citation

Please cite this document as:

Etan Kissling (@etan-status), Mikhail Kalinin (@mkalinin), "EIP-6465: SSZ 提款根 [DRAFT]," Ethereum Improvement Proposals, no. 6465, February 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-6465.