使用枚举而不是字符串
与其他数据类型相比,字符串的 Gas 消耗更高。如果可能,请考虑使用枚举代替字符串来表示有限的选项集。枚举提供了一种紧凑高效的方式来处理预定义的值列表。使用枚举可以降低与字符串操作和存储相关的 Gas 成本。
存储成本
-
**字符串存储:**字符串是动态数据类型,需要额外的长度信息;短字符串(≤31字节):打包存储,但仍需长度标记;长字符串(>31字节):分别存储长度和数据,消耗多个存储槽
-
**枚举存储:**枚举本质上是 uint8(最多256个选项);固定大小,直接存储在一个存储槽中;无需额外的长度信息
比较操作成本
-
比较两个字符串时(如
if (str1 == str2)),编译器会展开为字节数组逐字节比较,在 EVM 层面通常涉及keccak256或内联循环比较,gas 昂贵。 -
枚举比较实际上就是比较整数(
uint8),非常便宜(~3 gas)。
测试
文件位置:
src/compiler/Enums.sol
test/compiler/Enums.t.sol测试结果:
forge test --gas-report --mt test_enums_ -vvv --optimize
总结
在需要表示固定选项集的场景中,使用枚举代替字符串能显著降低 gas 成本,因为它能减少存储槽占用和运行时操作复杂度,是 Solidity 编码中的推荐实践之一。
对应源码
本文配套代码固定到提交
8960383;Gas 数据会随编译器、优化器参数和 EVM 版本变化。