EIP-3529后清除存储变量是否已无意义?实测存疑
EIP-3529后存储操作Gas退款测试分析
测试合约
针对EIP-3529实施后Gas退款减少的情况,编写了以下Solidity合约进行测试:
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.23; contract GasStorage { event GasLeft(uint256 gasLeft); uint256[] private arr; // 初始值设为uint256最大值或0 uint256 val1 = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; constructor() { } function gasGasGas() external { emit GasLeft(gasleft()); // 模拟高Gas消耗操作 for (uint256 i = 0; i < 10; i++) { arr.push(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); } // 以下为四种存储变更操作的测试分支(每次测试仅启用其中一种) // 无操作 // 设置为零:val1 = 0; // 设置为非零值:val1 = 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef; // 设置为最大值:val1 = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; emit GasLeft(gasleft()); } }
测试结果
测试基于Hardhat及Hardhat Network,所有存储变更操作均产生Gas消耗,未出现Gas减少或零消耗的情况:
当val1初始值为0x0时
- 无操作:总Gas消耗246898
- 设置为非零值:269004(较无操作场景+22106)
- 设置为最大值:269004(较无操作场景+22106)
- 设置为零:249104(较无操作场景+2206)
当val1初始值为uint256最大值时
- 无操作:总Gas消耗246898
- 设置为非零值:251904(较无操作场景+5006)
- 设置为最大值:249104(较无操作场景+2206)
- 设置为零:251904(较无操作场景+5006)
疑问与困惑
测试中发现,即使将最大值存储清零仍会消耗Gas。已知EIP-3529的核心目标是阻止Gas代币通过存储滥用获取退款,但目前测试结果显示清理存储完全不值得——未发现任何接近零Gas的清理场景。是否在测试逻辑或对EIP-3529的理解上存在遗漏?
注:测试中加入arr循环是为了模拟高Gas消耗,原以为需要满足退款覆盖交易20%的要求,现在对此必要性存疑。
内容的提问来源于stack exchange,提问作者jsonDoge
相关产品推荐
相关产品推荐

