本文分析了以太坊Fusaka升级的关键变化及其对智能合约安全性的潜在影响。Fusaka引入了blob扩展、DoS抵抗措施和新功能,包括交易Gas上限、MODEXP输入大小限制与Gas成本增加、CLZ操作码、secp256r1曲线预编译等,开发者应关注这些变化并进行充分测试,确保应用在升级后正常运行。
以下是我们之前对以太坊 Pectra 升级的分析之后,Fusaka 升级代表了以太坊持续发展的下一个阶段。在之前硬分叉奠定的基础上,Fusaka 在引入令人兴奋的新功能的同时,还引入了 blob 扩展和一些 DoS 抵抗措施。其中一些更改对智能合约开发者以及他们所依赖的安全假设具有重要意义。
在这篇文章中,我们将探讨 Fusaka 升级中的这些关键更改及其对智能合约安全性的潜在影响。
EIP-7825 引入了对单笔交易的最大 gas 使用量的上限,将其限制为 2^24(约 1678 万)gas。以前,一笔交易可能会占用整个区块,gas 限制为 6000 万。
注意事项:
例如,如果第一个 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 预编译的有效输入大小的上限。MODEXP 预编译执行模幂运算,用于某些密码学操作,如 RSA 验证。这个 EIP 将输入的大小限制为 8192 比特,而以前它们可以是任意大小的。在这个 EIP 激活后,任何输入大于 8192 比特的 MODEXP 调用都将返回错误并消耗所有 gas。
注意事项:
MODEXP 的智能合约在此升级后将不再正常工作。但是,正如 EIP-7823 中指出的那样,没有合约成功使用大于 513 字节的输入调用过 MODEXP,因此预计实际影响很小。EIP-7883 增加了 MODEXP 的 gas 成本,在某些情况下增加了很大的幅度。任何调用 MODEXP 的智能合约都会看到它们的 gas 使用量增加。确切的增加取决于输入参数,因此开发者应该查看 EIP-7883 规范 以获取更新的定价算法。
注意事项:
MODEXP 的合约可能会发现在升级后,调用因 gas 不足错误而回滚,这可能会导致拒绝服务问题。通常,强烈建议不要使用固定 gas 补贴,因为 EVM 中的 gas 成本经常变化。EIP-7939 引入了一个新的操作码 CLZ,用于计算 256 位值中前导零的数量。这可以大大提高某些数学运算的效率,特别是那些涉及位操作或对数计算的运算。
注意事项:
CLZ。在使用它之前,请确保你要部署到的 L2 支持此操作码。调用不支持的操作码将导致交易回滚,这可能会导致拒绝服务问题。CLZ 进行代码生成期间的优化。但是,从 0.8.31 版本 开始,CLZ 可以在内联汇编中使用。0,CLZ 返回 256,表明所有位都是零。确保你的代码适当地处理这种情况。EIP-7951 引入了一个新的预编译 P256VERIFY,用于对 secp256r1(NIST P-256)曲线执行 ECDSA 签名验证。该曲线广泛用于许多现有系统中,包括 WebAuthn、安全 enclave 和各种硬件钱包,从而使与这些系统的集成更加容易和更节省 gas。
注意事项:
0x01。至关重要的是,如果签名无效或输入格式不正确,则预编译不会回滚,而是返回空数据 0x。你的合约必须显式检查 0x01 返回值,并将空返回数据视为验证失败。Fusaka 中引入了其他几个 EIP,但对智能合约安全性没有直接影响:
EIP-7594:PeerDAS - 对等数据可用性抽样 - 增加了 rollup 的数据可用性容量。
EIP-7917:确定性提议者前瞻 - 确保下一个 epoch 的信标提议者计划是完全确定的。
EIP-7918:Blob 基本费用受执行成本限制 - 调整 blob 定价,以确保 blob 至少支付他们从节点请求的计算的市场价格的一部分。
EIP-7934:RLP 执行区块大小限制 - 将 RLP 编码的区块大小限制为 10MB,其中 2MB 保留给信标区块。
EIP-7935:设置默认 gas 限制 - 将默认 gas 限制增加到 6000 万,以增强 L1 扩展。
EIP-7892:仅 Blob 参数的硬分叉 - 引入了一个仅更改 blob 参数的硬分叉框架,从而可以更快地进行扩展,并减少协调开销。
EIP-7642:eth/69 - 删除 pre-merge 字段 - 引入了 eth 协议的新版本,该版本修改了某些 P2P 消息。
EIP-7910:eth_config JSON-RPC 方法 - 添加了一个 RPC 方法,该方法返回节点的当前、下一个和最后一个已知的分叉,可用于确保客户端准备就绪。
Fusaka 升级继续了以太坊的演进,重点是扩展。虽然大多数更改都保持了向后兼容性,但交易 gas 限制上限、MODEXP 修改以及新的操作码和预编译可能需要开发者和安全工程师的关注。通过理解这些更改并彻底测试合约,开发者可以确保他们的应用程序在以太坊不断发展的平台上继续正常运行。
- 原文链接: blog.sigmaprime.io/fusak...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!