#35563·go-ethereum

core/ssz: 添加 SSZ 编码、解码、墨柯利化和证明生成

作者: vivek-0509创建于 2026年8月21日更新于 2026年8月24日
标签type:feature

□ 理由

这样做有两个原因,我想将它们分开,因为一个是立即的,一个是前瞻性的。

□ 1. 2023年起开放的 " 美洲/类型 " 中的两个待处理事项

2023年5月,

开始 //信标/型号/标头. go:79 // TODO(zsfelfoldi): 当SSZ编码器降落时删除此内容. func (h *header) Hash () 常见. 散开 {

//信标/类型/委员会.go:85 //TODO(zsfelfoldi):当SSZ编码着陆时,把它处理掉. func (s *序列化同步委员会) root () 常见. 散开 {


两者都通过打开树码来计算出一个值的"hash tree root",SSZ 默克勒根. 头. Hash ' 分配一个 16- slot 阵列, 将每个字段写入硬编码的叶子位置, 从索引 7 向下折叠到 1 。 `序列式委员会。 根垫和花序有512个地基,再折成两半。 两者都是正确的,但被分解成一种类型的精确形状。

这需要两样东西

首先,它并不笼统。 树的深度和每个叶子的位置都是用手为某一个特定类型制定的,所以下一个需要根的信标类型需要自己复制相同的逻辑. 两个已经存在。

第二,这两个函数只返回根并丢弃其他一切. 为了证明一个单一的字段,例如,一个给定的`StateRoot'属于已知头根,一个核查员需要在该叶子下行道的每个级别上的兄弟散列。 头. hash ' 计算出所有它们,并在它们返回时放弃它们; 根在折叠时覆盖它们。 因此,今天没有办法对这两棵树提出证据。

这些是典型的SSZ类型,它们会保持经典. EIP-7688在其"不可移动类型"表中将"BeaconBlockheader"和"SyncCommittee"都列出,这意味着它们被故意不转换为"进步容器",而它们的分层化是永远固定的. 所以经典的编码和默克勒化就是这两种东西永远需要的,而只有这一点就足以去除这两种功能.

□ 2. 进步型已到来,盖特无法计算出其根源

一个经典的SSZ容器从野外计数中得到它的树形,所以形状在叉口之间并不稳定. EIP-7495陈述了案例:"当字段数达到2个新功率时,或者一个字段被取出或者取而代之,取出一个不同类型之一时,所下植入的默克勒树的外形会改变,为这些容器破解了默克勒证明的验证器". 每一个球场的位置移动,包括无人触及的球场.

代价落在谁必须重新部署上。 正如EIP-7495所指出,"部署新的核查员可能涉及安全委员会提升智能合同逻辑,或要求嵌入式设备的固件更新. 即使没有语义变化适用于核查者感兴趣的字段,也需要这一努力".

EIP-7495 " 进步包容者 " 和EIP-7916 " 进步包容者 " 解决了这一问题,为每个领域分配了一个永不移动的稳定位置,在缺少一个领域时允许出现空白,并记录哪些职位。
. . . . . . .

内容来源: ethereum/go-ethereum