Alert Source Discuss
⚠️ Draft Standards Track: Core

EIP-7778: 不含退款的区块 Gas 限制计算

通过从区块 Gas 计算中排除退款来防止绕过区块 Gas 限制

Authors Ben Adams (@benaadams), Toni Wahrstätter (@nerolation)
Created 2024-10-01
Discussion Link https://ethereum-magicians.org/t/eip-7778-prevent-block-gas-smuggling/21234

摘要

此 EIP 修改了区块 gas 计算机制,以防止绕过区块 gas 限制。它建议 gas 退款,特别是那些来自将存储槽设置为零的 SSTORE 操作的退款,不应减少计入区块 gas 限制的 gas,同时仍然适用于用户的交易 gas 成本。

动机

目前,来自清除存储槽(设置为零)等操作的 gas 退款,既减少了用户的交易 gas 成本,也减少了计入区块 gas 限制的 gas。这在执行的计算工作量与区块中计算的 gas 之间造成了差异。

示例:区块 20878522 显示净使用量为 28.5 MGas,但包含 4.01 MGas 的退款,使总使用量达到 32.51 MGas——超过区块 gas 限制 2.51 MGas。

这种机制可以被利用,在一个区块中执行比 gas 限制本意允许的更多的操作,可能导致:

  1. 由于超大区块导致的网络不稳定
  2. 拒绝服务向量
  3. 计算负载超过预期的区块 gas 限制

规范

Gas 计算变更

  1. 用户 Gas 成本(不变):
    • 用户继续收到符合条件的 операций 的 gas 退款(例如,将存储设置为零)
    • 交易 gas 成本保持不变:tx.gas_used = gas_used - gas_refund
  2. 区块 Gas 计算(已修改):
    • 在计算用于强制执行区块 gas 限制的 gas 时,不减去退款
    • 区块 gas 计算变为:block.gas_used += gas_used(不减去退款)
    • 反映实际减少的计算工作量的存储折扣(例如,热存储访问,恢复到原始值)仍然适用于区块 gas 计算

区块 Gas 限制实施

  • 所有交易使用的未退还 gas 总和不得超过区块 gas 限制
  • 这确保了区块 gas 限制准确反映了计算和存储工作负载

理由

使 Gas 限制与计算工作量对齐

  • 区块 gas 限制旨在约束每个区块的计算负载
  • 引入 gas 退款是为了激励“清理”状态,而不是允许超过计算限制
  • 通过从区块 gas 计算中排除退款,我们确保区块 gas 限制有效地约束计算负载

保持用户激励

  • 用户仍然收到 gas 退款,从而保持了高效状态管理的激励措施
  • 仅更改区块级别约束的计算方式,而不更改单个用户的经济模型

向后兼容性

  • 此更改不向后兼容,需要硬分叉
  • 单个交易的用户和开发者体验保持不变
  • 只有区块生产者需要调整其交易选择算法,以适应新的 gas 计算规则

测试用例

  1. SSTORE 操作:
    • 将存储设置为零:用户收到退款,但区块 gas 计算使用全部成本
    • 验证包含许多存储清除操作的区块仍然遵守 gas 限制
  2. 区块 Gas 限制边缘情况:
    • 构建具有不同数量的可退款操作的区块
    • 确保区块无法通过退款机制超过 gas 限制
  3. 交易 Gas 与区块 Gas:
    • 验证用户的交易成本保持不变
    • 确认区块 gas 计算正确地排除了退款

安全注意事项

  • 消除了利用 gas 退款来超过区块计算限制的潜在拒绝服务向量
  • 通过对计算工作量实施更严格的限制,提高了区块处理时间的可预测性
  • 阻止矿工/验证者包含集体包含比预期更多计算工作量的交易

版权

版权及相关权利通过 CC0 1.0 Universal 放弃。

Citation

Please cite this document as:

Ben Adams (@benaadams), Toni Wahrstätter (@nerolation), "EIP-7778: 不含退款的区块 Gas 限制计算 [DRAFT]," Ethereum Improvement Proposals, no. 7778, October 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7778.