智能合约Gas费太高?这几个优化技巧帮你省钱
写智能合约的人,没有不被Gas费刺痛过的。部署一次合约、调用几个函数,眼睁睁看着ETH从钱包里溜走,那种感觉就像在给矿工打工。Gas费不是玄学,它背后有一套清晰的计费逻辑——存储越贵、计算越贵、数据越多越贵。理解了这一点,优化就有了方向。
省Gas先懂存储变量

存储是合约里最烧钱的地方。EVM把数据分成几种存储位置,storage贵得离谱,memory便宜得多,calldata几乎免费。很多新手习惯把所有变量都塞进storage,结果每次读写都在烧钱。其实,函数参数和临时变量完全可以用memory或calldata,尤其是只读的数据,直接用calldata能省下一大笔。
还有个常见误区:用uint256还是uint8?很多人以为越小越省,其实EVM的存储槽固定是256位,除非你把多个小变量打包进同一个槽,否则用uint8和uint256花一样的钱。真正该做的是把多个小变量塞进一个struct或紧凑排列,让它们共享存储槽。比如地址和状态码放一起,一个槽就装下了。
能用immutable和constant就别用普通变量。常量直接写进字节码,不占存储槽,部署和调用都便宜。构造函数里设置一次就不变的参数,用immutable,比存到storage省得多。这个改动几乎零成本,收益却立竿见影。

减少调用次数和事件数据
合约之间的交互是Gas大头。每调用一次外部合约,都要付出额外的开销。能合并的调用就合并,能批量处理的就批量处理。比如批量转账,与其循环调transfer,不如写一个批量函数,一次循环处理所有转账,省掉重复的外部调用开销。循环里尽量用memory数组缓存数据,别反复读storage。
事件(Event)也是很多人忽略的Gas漏洞。事件里的数据会写入日志,日志数据越多,Gas越贵。很多项目喜欢把大量数据塞进事件里,其实链上只需要存索引和必要的哈希,完整数据放IPFS或者链下存储就行。indexed参数最多三个,别贪多,非索引数据能省则省。

优化循环和条件判断也是省钱的好办法。循环里避免重复计算,把不变的值提到循环外。条件判断的顺序也有讲究,把最容易失败、成本最低的判断放前面,能提前revert就提前revert,省下后面昂贵的操作。还有,require的错误信息别写太长,字符串越长Gas越贵,简短明了就行。
Gas优化不是一次性的工作,每次部署前都应该用工具分析一下。Hardhat和Foundry都有Gas报告插件,能精确看到每个函数的消耗。养成看报告的习惯,比凭感觉猜靠谱得多。省下的Gas就是省下的真金白银,尤其在高频调用的合约里,积少成多,差距非常可观。
文章评论