logo头像
Snippet 博客主题

EVM存储结构和相关优化

存储结构

Syntax Storage memory calldata
生命周期 永久 函数执行期 函数执行期
可修改性 可修改 可修改 只读
gas 查看操作成本 3gas/字节 3gas/字节

storage操作成本

  1. 写入新变量 约 20000 Gas
  2. 修改已有变量 约5000 Gas
  3. 读取存储变量 冷访问800gas,热访问 100 Gas
  4. 删除存储槽 可获得 15000 Gas返还
  5. 冷读取(第一次):~2,100 gas
  6. 热读取(同一交易内再次读取):~100 gas

storage的优化方式

upload successful

变量打包规则

  1. 变量必须连续声明,中间不能有大类型变量间隔
  2. 只有静态大小类型可以打包(排除mapping和动态数组)
  3. 当累计大小超过32字节时,使用新的存储槽

存储结构gas优化实践

upload successful

Calldata vs Memory

原理说明:

1
2
3
4
5
6
7
当你使用memory参数时,EVM会进行以下操作:
从交易输入(calldata区域)读取数据
复制到内存(memory区域)
函数访问memory区域的数据
当你使用calldata参数时:
直接从交易输入读取数据
无需复制,节省Gas