本文档探讨了EIP4844中BlobsSidecar
和BeaconBlockBody
之间的规范依赖关系,以及由于它们之间的松散耦合而导致的实现复杂性。着重分析了信标链处理、P2P网络处理和分叉选择处理中遇到的问题,特别是当sidecar
在block
之前接收到时的情况,并提出了进一步的考虑。
在 EIP4844 中,引入了 BlobsSidecar
,用于接受需要在信标节点中持久化一段时间的 "blobs" 数据。这些 blobs 大幅度降低了 rollup 费用,并使以太坊能够在不牺牲去中心化的情况下保持竞争力。Blobs 在大约 1 个月后会被修剪掉,时间足够 L2 的所有参与者检索它们。Blobs 持久化在信标节点中,而不是在执行引擎中。与这些 blobs 一起,BeaconBlockBody
包含了一个新的字段 blob_kzg_commitments
。重要的是,这些 kzg 承诺与 blob 内容相匹配。
请注意,在 CL 上,blobs 仅在 BeaconBlockBody
中被引用,而没有编码在 BeaconBlockBody
中。内容不是嵌入完整的内容,而是通过上面的 BlobsSidecar
单独传播。CL 必须正确地完成以下三件事:
在本文档中,我们将探讨 BlobsSidecar
和 BeaconBlockBody
之间松散耦合的规范依赖性,以及由于它们松散耦合而导致的实现复杂性。
作为区块处理的一部分,添加了一个新的函数 process_blob_kzg_commitments
。它确保 BeaconBlockBody
中的 kzg 承诺与区块交易中定义的 SignedBlobTransaction
中的哈希值匹配。给定原始交易,节点应该能够根据字段偏移量查找 blob 版本化的哈希值。在这个验证中,BlobsSidecar
不是必需的。信标节点可以 "乐观地" 处理区块。
我们将分别查看 beacon_block
和 blobs_sidecar
gossip 主题。
在 blobs_sidecar
中,如果 blobs 格式不正确(例如,BLSFieldElement
在无效范围内),并且 kzg 证明被错误地编码为压缩的 BLS G1 点,则节点将拒绝。最后,如果 sidecar 签名无效,它将拒绝。在接受 blobs 之前,最后一步是运行 validate_blobs_sidecar,它验证 sidecar 对象中的聚合证明。在此之前,还要进行一次快速验证,以确保 KZG 证明是正确编码的压缩 BLS G1 点。
在 beacon_block
中,节点将查看 BeaconBlockBody
中的 blob_kzg_commitments
,如果 kzg 承诺被错误地编码为压缩的 BLS G1 点,并且这些承诺与交易列表中的版本化哈希不对应,则节点将拒绝该区块。
正如我们从信标链和 P2P 网络处理中看到的那样,可以独立处理每个对象。它们之间没有严格的依赖关系。这在分叉选择方面发生了变化。今天,客户端实现使用分叉选择存储来缓存有用的状态,例如 VALID
,OPTIMISTIC
,INVALID
... 等。有了 EIP4844,分叉选择存储标记区块(即 protoarray 术语中的节点)数据是否可用(即具有有效的 sidecar)也将很有用。is_data_available
是一条重要的信息,旨在随着后续的分片升级而改变。is_data_available
检索给定 blob_kzg_commitments
的匹配 BlobsSidecar
,并验证 sidecar 是否可靠。重要的是要注意,在 is_data_available
返回 true
之前,区块不能是 VALID
。在此之前,该区块应仅被视为 OPTIMISTIC
。鉴于这些约束,我们分析两种情况
这是一个理想的情况。block
(蓝色)在 sidecar
(红色)之前收到。block
到达 p2p 服务,节点在传递给它的对等方之前验证该区块是否通过 p2p 条件,并将其发送到区块链服务,节点根据共识规则验证该区块,然后将其发送到分叉选择存储和 DB 以进行持久存储。
一旦区块缓存在分叉选择存储中,节点就可以验证 sidecar
,然后将其发送到分叉选择存储,以使该区块具有有效的 sidecar 并在将其存储到 DB 中进行持久存储之前变为 VALID
。总完成时间取决于两个对象之间的时间间隔,为了获得更好的性能,应尽量减小该时间间隔。
这是一个棘手的情况。sidecar
(灰色)在 block
(蓝色)之前收到。在这种情况下,我们将 sidecar
存储在一个挂起的队列中,直到收到,处理该区块并存储在分叉选择存储中。总完成时间取决于区块何时到达
松散耦合的 sidecar
和 block
增加了上述场景的复杂性。
BeaconBlocksByRange
以进行回溯。在紧密耦合的世界中,我们不需要单独调用 BlobsSidecarsByRange
- 原文链接: hackmd.io/_3lpo0FzRNa1l7...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!