Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-6475: SSZ 可选项

用于表示可选值的新的 SSZ 类型

Authors Etan Kissling (@etan-status), Zahary Karadjov (@zah)
Created 2023-02-09
Discussion Link https://ethereum-magicians.org/t/eip-6475-ssz-optional/12891

摘要

本 EIP 引入了一种新的 简单序列化 (SSZ) 类型 来表示 Optional[T] 值。

动机

目前,可选项只能通过变通方法在 SSZ 中表示。添加适当的支持具有以下好处:

  1. 更好的可读性: 具有可选项的 SSZ 结构可以使用底层编程语言的惯用类型来表示,例如 Python 中的 Optional[T],从而使它们更容易交互。

  2. 紧凑的序列化: SSZ 序列化可以依赖于可选值的二进制性质;它们要么存在,要么不存在。这允许比使用基于变通方法的替代方法更紧凑的序列化。

规范

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

类型定义

Optional[T] 定义为可以表示以下内容的类型:

  • SSZ 类型 T 的值
  • 缺少值,用 None 表示

默认值

Optional[T] 的默认值为 None

序列化

if value is None:
    return b""
else:
    return b"\x01" + serialize(value)

反序列化

Optional[T] 的反序列化取决于输入长度:

  • 如果输入长度为 0,则值为 None
  • 否则,必须检查反序列化范围的第一个字节是否为 0x01,范围的其余部分的反序列化方式与 T 相同。

Merkle 化

Optional[T] 被 Merkle 化为 List[T, 1]

  • 如果值为 None,则列表长度为 0
  • 否则,列表长度为 1,并且第一个列表元素包含基础值。

理由

为什么不是 Union[None, T]

Union[None, T] 留下了关于类型是否可能在将来扩展的意图的歧义,例如 Union[None, T, U]

此外,SSZ Union 类型目前未在任何最终的 Ethereum 规范中使用,并且本身没有最终的设计。如果唯一的用例是解决缺少 Optional[T] 的问题,则更简单的 Optional[T] 类型就足够了,并且对通用 Union 的支持可以延迟到真正需要时。请注意,Optional[T] 的设计可以用作更通用的 Union 的基础。

为什么不是 List[T, 1]

对于可变长度的 T,序列化不够紧凑,因为列表开头的额外偏移表用于指示列表长度。

向后兼容性

目前未使用 Union[None, T]List[T, 1] 解决方法来表示 Optional[T]

测试用例

参见 EIP 资产

参考实现

  • Python: 参见 EIP 资产,基于 protolambda/remerkleable
  • Nim: status-im/nim-ssz-serialization

安全注意事项

版权

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

Citation

Please cite this document as:

Etan Kissling (@etan-status), Zahary Karadjov (@zah), "EIP-6475: SSZ 可选项 [DRAFT]," Ethereum Improvement Proposals, no. 6475, February 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-6475.