Fusaka对智能合约安全的影响

本文分析了以太坊Fusaka升级的关键变化及其对智能合约安全性的潜在影响。Fusaka引入了blob扩展、DoS抵抗措施和新功能,包括交易Gas上限、MODEXP输入大小限制与Gas成本增加、CLZ操作码、secp256r1曲线预编译等,开发者应关注这些变化并进行充分测试,确保应用在升级后正常运行。

以下是我们之前对以太坊 Pectra 升级的分析之后,Fusaka 升级代表了以太坊持续发展的下一个阶段。在之前硬分叉奠定的基础上,Fusaka 在引入令人兴奋的新功能的同时,还引入了 blob 扩展和一些 DoS 抵抗措施。其中一些更改对智能合约开发者以及他们所依赖的安全假设具有重要意义。

在这篇文章中,我们将探讨 Fusaka 升级中的这些关键更改及其对智能合约安全性的潜在影响。

EIP-7825:交易 Gas 限制上限

EIP-7825 引入了对单笔交易的最大 gas 使用量的上限,将其限制为 2^24(约 1678 万)gas。以前,一笔交易可能会占用整个区块,gas 限制为 6000 万。

注意事项:

  • 拒绝服务风险: 假设大型、复杂函数可以在单笔交易中完成的智能合约,如果这些操作超过 1600 万 gas 上限,则可能变得不可用。开发者应确保 gas 密集型函数可以拆分到多个交易中,以避免拒绝服务的情况。

例如,如果第一个 getUsers() 函数需要超过 1600 万 gas,则可能无法执行。相比之下,第二个函数没有这个问题,因为它可以在多个交易中执行。

// 必须在单个交易中执行,如果 gas 使用量 > 16M,则会失败
function getUsers() external view returns (User[] memory users) {
    for (uint256 i = 0; i < allUsers.length; i++) {
        users[i] = // ...
    }
}

// 可以在多个交易中执行,并且没有 DoS 风险
function getUsers(
    uint256 start,
    uint256 limit
) external view returns (User[] memory users) {
    for (uint256 i = start; i < limit; i++) {
        users[i] = // ...
    }
}

请注意,这是一个非常简单的例子。相同的概念适用于更复杂的函数,如清算或预言机更新。

EIP-7823:MODEXP 输入大小限制

EIP-7823 设置了 MODEXP 预编译的有效输入大小的上限。MODEXP 预编译执行模幂运算,用于某些密码学操作,如 RSA 验证。这个 EIP 将输入的大小限制为 8192 比特,而以前它们可以是任意大小的。在这个 EIP 激活后,任何输入大于 8192 比特的 MODEXP 调用都将返回错误并消耗所有 gas。

注意事项:

  • 输入大小限制: 依赖于使用大于 8192 比特的输入调用 MODEXP 的智能合约在此升级后将不再正常工作。但是,正如 EIP-7823 中指出的那样,没有合约成功使用大于 513 字节的输入调用过 MODEXP,因此预计实际影响很小。

EIP-7883:MODEXP Gas 成本增加

EIP-7883 增加了 MODEXP 的 gas 成本,在某些情况下增加了很大的幅度。任何调用 MODEXP 的智能合约都会看到它们的 gas 使用量增加。确切的增加取决于输入参数,因此开发者应该查看 EIP-7883 规范 以获取更新的定价算法。

注意事项:

  • 固定 gas 补贴: 使用固定 gas 补贴调用 MODEXP 的合约可能会发现在升级后,调用因 gas 不足错误而回滚,这可能会导致拒绝服务问题。通常,强烈建议不要使用固定 gas 补贴,因为 EVM 中的 gas 成本经常变化。

EIP-7939:计算前导零(CLZ)操作码

EIP-7939 引入了一个新的操作码 CLZ,用于计算 256 位值中前导零的数量。这可以大大提高某些数学运算的效率,特别是那些涉及位操作或对数计算的运算。

注意事项:

  • L2 兼容性: 与任何新操作码一样,大多数Layer2网络不会立即支持 CLZ。在使用它之前,请确保你要部署到的 L2 支持此操作码。调用不支持的操作码将导致交易回滚,这可能会导致拒绝服务问题。
  • Solidity 支持: 目前,Solidity 不使用 CLZ 进行代码生成期间的优化。但是,从 0.8.31 版本 开始,CLZ 可以在内联汇编中使用。
  • 潜在的边界情况: 对于输入 0CLZ 返回 256,表明所有位都是零。确保你的代码适当地处理这种情况。

EIP-7951:secp256r1 曲线支持的预编译

EIP-7951 引入了一个新的预编译 P256VERIFY,用于对 secp256r1(NIST P-256)曲线执行 ECDSA 签名验证。该曲线广泛用于许多现有系统中,包括 WebAuthn、安全 enclave 和各种硬件钱包,从而使与这些系统的集成更加容易和更节省 gas。

注意事项:

  • 输入格式: 预编译需要精确的 160 字节的连接输入:
    • 32 字节:消息哈希 h
    • 32 字节:签名组件 r
    • 32 字节:签名组件 s
    • 32 字节:公钥 x 坐标
    • 32 字节:公钥 y 坐标
  • 返回行为: 如果签名有效,则预编译返回 0x01。至关重要的是,如果签名无效或输入格式不正确,则预编译不会回滚,而是返回空数据 0x。你的合约必须显式检查 0x01 返回值,并将空返回数据视为验证失败。
  • Solidity 支持: Solidity 目前没有对这个预编译的内置支持,因此必须使用对 EIP 中指定的预编译地址的底层调用来调用它。
  • L2 兼容性: 确保 L2 网络支持这个预编译,然后再部署依赖于它的合约。请记住,对不存在的合约的底层调用会成功返回,没有返回数据,这可能会被误认为是无效签名,而不是不支持的预编译。

其他更改

Fusaka 中引入了其他几个 EIP,但对智能合约安全性没有直接影响:

Fusaka 升级继续了以太坊的演进,重点是扩展。虽然大多数更改都保持了向后兼容性,但交易 gas 限制上限、MODEXP 修改以及新的操作码和预编译可能需要开发者和安全工程师的关注。通过理解这些更改并彻底测试合约,开发者可以确保他们的应用程序在以太坊不断发展的平台上继续正常运行。

  • 原文链接: blog.sigmaprime.io/fusak...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
sigmaprime
sigmaprime
江湖只有他的大名,没有他的介绍。