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.