Alert Source Discuss
⚠️ Draft Standards Track: Core

EIP-7934: RLP 执行区块大小限制

引入协议级别的 RLP 编码区块大小上限为 10 MiB,其中包括为信标区块大小预留的 2 MiB 裕量。

Authors Giulio Rebuffo (@Giulio2002), Ben Adams (@benaadams), Storm Slivkoff (@sslivkoff)
Created 2025-04-16
Discussion Link https://ethereum-magicians.org/t/eip-7934-add-bytesize-limit-to-blocks/23589

摘要

本提案引入协议级别的 RLP 编码执行区块大小上限为 10 兆字节 (MiB),其中包括为信标区块大小预留的 2 MiB 裕量。

动机

目前,以太坊没有对区块的编码大小强制执行严格的上限。 缺乏这种约束可能导致:

  1. 网络不稳定:极大的区块会减慢传播速度,并增加临时分叉和重组的风险。
  2. DoS 风险:恶意行为者可能会生成特别大的区块来扰乱网络性能。

此外,超过 10 MiB 的区块不会通过共识层 (CL) 的 gossip 协议传播,可能导致网络碎片或拒绝服务 (DoS) 的情况。

通过对 RLP 编码的区块大小施加协议级别的限制,以太坊可以确保增强对区块验证时间的目标攻击的抵抗力。 增加额外的 2MiB 裕量明确地适应信标区块的大小,确保跨网络组件的兼容性。

规范

区块大小上限

  • 引入常量:
    • MAX_BLOCK_SIZE 设置为 10 MiB (10,485,760 字节)
    • SAFETY_MARGIN 设置为 2MiB (2,097,152 字节)
    • MAX_RLP_BLOCK_SIZE 计算为 MAX_BLOCK_SIZE - MARGIN
  • 任何超过 MAX_RLP_BLOCK_SIZE 的 RLP 编码区块都必须被视为无效。

因此,将以下检查添加到以太坊协议:

MAX_BLOCK_SIZE = 10_485_760  # 10 MiB
SAFETY_MARGIN = 2_097_152  # 2 MiB
MAX_RLP_BLOCK_SIZE = MAX_BLOCK_SIZE - SAFETY_MARGIN

# if true, the block is invalid and should be rejected/not get built
# 如果为真,则区块无效,应拒绝/不构建
def exceed_max_rlp_block_size(block: Block) -> bool:
    return len(rlp.encode(block)) > MAX_RLP_BLOCK_SIZE

协议行为的更改

  1. 区块创建:验证者必须确保任何生成的区块的总 RLP 编码大小不超过 MAX_RLP_BLOCK_SIZE
  2. 区块验证:节点必须拒绝 RLP 编码大小超过 MAX_RLP_BLOCK_SIZE 的区块。

协议调整

  • 所有以太坊客户端实现都必须将此大小检查集成到区块验证和传播过程中。
  • 此限制独立于 gas 相关指标应用。

理由

为什么是 10 MiB?

10 MiB 的上限与以太坊共识层 (CL) 中的 gossip 协议约束对齐。 额外的 2MiB 裕量明确地考虑了信标区块的大小,确保了整个网络中的兼容性和一致的区块传播。 远大于 10 MiB 的区块将不会被 CL 广播,可能导致网络碎片或拒绝服务的情况。

向后兼容性

此更改与任何大于新指定大小限制的区块不向后兼容。 验证者和矿工需要确保他们的区块构建逻辑严格遵守此限制。

安全考虑

限制最大区块大小提供了对恶意超大区块攻击的固有保护。

版权

CC0 下放弃版权和相关权利。

Citation

Please cite this document as:

Giulio Rebuffo (@Giulio2002), Ben Adams (@benaadams), Storm Slivkoff (@sslivkoff), "EIP-7934: RLP 执行区块大小限制 [DRAFT]," Ethereum Improvement Proposals, no. 7934, April 2025. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7934.