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 |
Table of Contents
摘要
本 EIP 引入了一种新的 简单序列化 (SSZ) 类型 来表示 Optional[T] 值。
动机
目前,可选项只能通过变通方法在 SSZ 中表示。添加适当的支持具有以下好处:
-
更好的可读性: 具有可选项的 SSZ 结构可以使用底层编程语言的惯用类型来表示,例如 Python 中的
Optional[T],从而使它们更容易交互。 -
紧凑的序列化: 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.