SSZ转换 - 2024互操作性

本文档是关于在以太坊执行层(EL)中逐步实现 SSZ(Simple Serialize)转换的指南。它详细介绍了将交易、交易签名、交易负载、区块构建、收据和提款从 RLP 格式转换为 SSZ 格式的步骤,旨在保持与现有客户端的互操作性,并为未来的优化铺平道路,最终目标是完全采用 SSZ 格式。

SSZ 转换实现指南

M1: StableContainer

规范: EIP-7495: SSZ StableContainer

测试: ethereum/EIPs

对于 EL,需要 StableContainer,但可以跳过初始的 VariantOneOf

StableContainer[N] 的 Merkle 化与常规 Container 相同,但 Merkle 树会被填充到 nextpow2(N) 个成员。

当序列化 StableContainer[N] 时,会添加一个 Bitvector[N] 前缀,用 1/0 表示字段的存在/缺失,顺序按照字段指定的顺序。在编码容器时,会跳过不存在的字段。

当解析时,首先读取 Bitvector[N],然后使用它按顺序读取存在的字段。确保引用未知字段的额外位设置为 0,并且在读取缓冲区后没有留下任何数据。

实现说明:https://hackmd.io/Swl71tWeS7WP_f4D8abKHA

目标:

  • 通过 StableContainer 的测试

参考实现:

M2: TransactionSignature

规范: EIP-6493: SSZ Transaction Signature Scheme

  1. Transaction 分成两部分,TransactionPayload(未签名的交易)和 TransactionSignature(v/r/s)。这种分割是 SSZ 表示的核心。在序列化期间重建 RLP 表示。
  2. 如果你同时拥有 pre- EIP-1559gasPrice 和 post- EIP-1559max_fee_per_gas 字段,去掉 gasPrice 字段,并将其存储在 max_fee_per_gas 中。带外传递 effective_gas_price 或按需计算(需要来自相应区块的 base fee)。
  3. 将交易签名从 v/r/s 切换到 y_parity/r/s。按需从 chain_id + y_parity 重建 v
  4. 实现 EIP-6493 中的 ecdsa_pack_signatureecdsa_unpack_signature 函数,并存储打包后的版本而不是 y_parity/r/s。按需重建 y_parity/r/s
  5. 使用 from_address 扩展 TransactionSignature。当使用 ecrecover 计算发送者时,懒加载地填充它。从 from_address 字段读取,而不是在多个位置计算 ecrecover

目标:

  • 使签名格式接近 SSZ 表示。这也是加密库中的本机格式。

参考实现:

M3: TransactionPayload

规范: EIP-6493: SSZ Transaction Signature Scheme

测试: ethereum/EIPs

  1. 实现从 RLP –> SSZ 的转换例程(参考实现)。
  2. 实现从 SSZ –> RLP 的转换例程(参考实现)。
  3. 实现 compute_sig_hashcompute_tx_hash 函数(参考实现)。
  4. 确保所有哈希计算都经过 compute_sig_hash(未签名的 TransactionPayload)和 compute_tx_hash(已签名的 Transaction)。
  5. 确保 devp2p 协议处理程序通过 SSZ –> RLP 和 RLP –> SSZ 转换函数支持自定义序列化/反序列化。

目标:

  • 仍然可以与未更改的客户端互操作;没有语义更改
  • 具有在 RLP <-> SSZ 格式之间转换交易的所有功能

M4: EL 区块构建

规范: EIP-6404: SSZ Transactions Root

  1. 在构建 EL 区块时,将 transactions_root 的计算替换为基于 SSZ 的计算。
  2. 当将 payload 发送到 CL 时,目前继续以 RLP 形式发送。

目标:

  • 替换 MPT,同时仍然与 stock CL 实现兼容(没有 engine API 更改)

扩展目标: Receipts

规范: EIP-6493: SSZ Transaction Signature Scheme

规范: EIP-6466: SSZ SSZ Receipts Root

总体过程与交易类似,存在以下显着变化:

  1. receipt 现在包含 gas_used 而不是 cumulative_gas_used。SSZ <-> RLP 转换器必须在 receipt 列表上而不是单个 receipt 上。
  2. receipt 现在包含 contract_address,因此在转换 receipt 之前,必须先提供交易列表。

扩展目标: Withdrawals

规范: EIP-6465: SSZ SSZ Withdrawals Root

类似于交易/receipt,除了不需要更改数据结构。

扩展目标: JSON-RPC

  1. 通过 JSON-RPC 发送交易时,添加一个 root 字段,其中包含 hash_tree_root(transaction),紧挨着现有的 hash 字段。
  2. 添加一个 eth_getTransactionByRoot 端点,允许通过 root 而不是哈希进行查找。还允许通过 tx root 查找 receipt。
  3. 稍后,将在此端点中添加一个包含证明的额外字段,该证明证明 root 包含在 transactions_root 中。

扩展目标: Engine API

  1. 更改 engine 的交易编码,使其不再是不透明的,而是使用其规范编码将 backing SSZ Transaction 编码为 JSON。
  2. 这需要一个也支持 EIP-6493 的 CL。在此扩展目标之前,可以使用 stock CL。

扩展目标: SSZ BasicTransaction / BlobTransaction

  • 新的 EIP-2718 交易类型
  • 验证它们时,必须检查收到的 from_address 是否与 ecrecover 值匹配。from_address 在网络上交换。
  • 在网络上以 SSZ 编码,不再需要 RLP <-> SSZ 转换
  • 具有相同的 hashroot 值。
  • 原文链接: hackmd.io/@etan-status/s...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

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