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 |
Table of Contents
摘要
此 EIP 定义了将现有 Merkle-Patricia Trie (MPT) 提款承诺迁移到 Simple Serialize (SSZ) 的过程。
动机
虽然共识 ExecutionPayloadHeader
和执行区块头在概念上相互映射,但它们的编码方式不同。此 EIP 旨在对齐 withdrawals_root
的编码,利用更现代的 SSZ 格式。这带来了几个优势:
-
降低复杂性: 拟议的设计减少了需要支持 Merkle-Patricia Trie (MPT) 的用例数量。
-
减少歧义: 名称
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.