Alert Source Discuss
🛑 Withdrawn Standards Track: Core

EIP-1706: 禁用 gasleft 低于 call stipend 时的 SSTORE

Authors Alex Forshtat <alex@tabookey.com>, Yoav Weiss <yoav@tabookey.com>
Created 2019-01-15
Discussion Link https://github.com/alex-forshtat-tbk/EIPs/issues/1
Requires EIP-1283

简单总结

已被接受的提案改变了现有合约代码库中很大一部分的安全属性,这些代码库可能无法更新和验证。该提案将使旧的假设即使在网络升级后仍然成立。

摘要

EIP-1283 显著降低了写入合约存储的 gas 成本。这造成了一种新型的重入攻击的危险,因为 Solidity 默认情况下会向简单的 transfer 调用授予 2300 gas 的 ‘stipend’。 如果在低 gasleft 状态下不允许 SSTORE,则可以轻松缓解这种危险,而不会破坏向后兼容性和此 EIP 的初衷。

动机

这篇文章 中描述了一种攻击。 将 call stipend 明确指定为不变量将对以太坊协议安全性产生积极影响: https://www.reddit.com/r/ethereum/comments/agdqsm/security_alert_ethereum_constantinople/ee5uvjt

规范

将以下条件添加到 SSTORE 操作码 gas 成本计算中:

  • 如果 gasleft 小于或等于 2300,则使当前调用帧失败,并抛出 ‘out of gas’ 异常。

理由

为了保持现有合约的隐式重入保护,如果剩余 gas 低于 Solidity 中 ‘transfer’/’send’ 授予的 2300 stipend,则不应允许交易修改状态。 以下是其他提议的补救措施和对实施它们的反对意见:

  • 删除 EIP-1283 并放弃修改 SSTORE 成本
    • EIP-1283 是一项重要的更新
    • 它已被接受并在测试网络和客户端中实施。
  • 添加一个新的调用上下文,允许 LOG 操作码但不允许更改状态。
    • 在现有的 regular/staticcall 之外添加另一种调用类型
  • 将 SSTORE 对脏槽的成本提高到 >=2300 gas
    • 使净 gas 计量的用处大大降低。
  • 降低 gas stipend
    • 使 stipend 几乎毫无用处。
  • 将写入脏槽的成本增加回 5000 gas,但向退款计数器添加 4800 gas
    • 仍然没有明确说明不变量。
    • 要求调用者提供更多 gas,只是为了获得退款
  • 添加合约元数据,指定每个合约的 EVM 版本,并且仅将 SSTORE 更改应用于使用新版本部署的合约。

向后兼容性

使用少于 5000 gas 执行 SSTORE 从未成为可能,因此它不会对以太坊主网引入不兼容性。Gas 估算应考虑此要求。

测试用例

对于影响共识变更的 EIP,测试用例是强制性的。其他 EIP 可以选择包含指向适用测试用例的链接。 TODO

实现

TODO

版权

通过 CC0 放弃版权和相关权利。

Citation

Please cite this document as:

Alex Forshtat <alex@tabookey.com>, Yoav Weiss <yoav@tabookey.com>, "EIP-1706: 禁用 gasleft 低于 call stipend 时的 SSTORE [DRAFT]," Ethereum Improvement Proposals, no. 1706, January 2019. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-1706.