EVM存储结构和相关优化
存储结构
| Syntax | Storage | memory | calldata |
|---|---|---|---|
| 生命周期 | 永久 | 函数执行期 | 函数执行期 |
| 可修改性 | 可修改 | 可修改 | 只读 |
| gas | 查看操作成本 | 3gas/字节 | 3gas/字节 |
storage操作成本
- 写入新变量 约 20000 Gas
- 修改已有变量 约5000 Gas
- 读取存储变量 冷访问800gas,热访问 100 Gas
- 删除存储槽 可获得 15000 Gas返还
- 冷读取(第一次):~2,100 gas
- 热读取(同一交易内再次读取):~100 gas
storage的优化方式

变量打包规则
- 变量必须连续声明,中间不能有大类型变量间隔
- 只有静态大小类型可以打包(排除mapping和动态数组)
- 当累计大小超过32字节时,使用新的存储槽
存储结构gas优化实践

Calldata vs Memory
原理说明:
1 | 当你使用memory参数时,EVM会进行以下操作: |