内存优化:事件
分析
使用汇编记录最多 96 个字节的未索引数据
contract ExpensiveLogger {
event BlockData(uint256 blockTimestamp, uint256 blockNumber, uint256 blockGasLimit);
// cost: 26145
function returnBlockData() external {
emit BlockData(block.timestamp, block.number, block.gaslimit);
}
}
contract CheapLogger {
event BlockData(uint256 blockTimestamp, uint256 blockNumber, uint256 blockGasLimit);
// cost: 22790
function returnBlockData() external {
assembly {
mstore(0x00, timestamp())
mstore(0x20, number())
mstore(0x40, gaslimit())
log1(0x00,
0x60,
0x9ae98f1999f57fc58c1850d34a78f15d31bee81788521909bea49d7f53ed270b // event hash of BlockData
)
}
}
}上面的示例展示了如何通过使用内存来存储我们希望在BlockData事件中发出的数据,从而节省近 2,000 Gas。这里无需更新可用内存指针,因为执行在事件发出后立即结束,并且我们无需返回 Solidity 代码。让我们再举一个例子,其中我们需要更新可用内存指针
测试
文件位置:
src/assembly/MemoryExp.sol
test/assembly/MemoryExp.t.sol测试结果:
forge test --gas-report --mt test_memexp_logger_ -vvv --optimize
总结
对应源码
本文配套代码固定到提交
8960383;Gas 数据会随编译器、优化器参数和 EVM 版本变化。