Gas 是 EVM 执行操作的单位。每条指令消耗固定的 gas,具体可以看以太坊 操作码,gas 优化目标是减少交易所需的总 gas,提高用户体验并降低成本。
区块链数据存储位置有三种:storage(存储,也就是磁盘)、memory(内存,临时的)、calldata(只读数据)
常见优化技巧
减少对 storage 操作
-
首次读取
storage需 2100 gas(后续是热读取需 100 gas),而读取memory仅 3 gas。推荐多次访问同一存储数据时,将其缓存到memory以减少 SLOAD 次数。 -
首次初始化写入
storage的成本高达 20,000 gas,修改storage中已有的存储值成本是 2,900 - 5,000;storage成本远高于memory,所以能用memory就不要用storage。

示例:
|
|
使用位压缩(Bit Packing)
EVM 存储是以 32 字节(256 位)为基本单位的。定义一个 uint256 会占满一整个插槽;定义一个 uint8,它只需要 1 字节,但如果不进行压缩,剩下的 31 字节就会被浪费掉。位压缩的目的就是通过多个连续小尺寸变量,让它们在物理上存储在同一个插槽内。
示例:
|
|
循环优化
减少不必要的运算,如 array.length 缓存到变量中定义在循环外,而非每次都在循环中反复定义。
示例:
|
|
函数可见性选择
external 比 public 更节省 gas,适用于仅被外部调用的函数。
由于 public 函数既可以被外部调用,也可以被合约内部函数调用。为了兼容内部调用,Solidity 编译器通常会将 calldata 中的参数**拷贝到内存(Memory)**中,这样就会消耗 gas。