Solidity 语言与大多数语言不同,因此也将造成代码书写时需要注意的侧重点不同。

Solidity 合约特性

  • 一旦发布 gas 费便交了,且无法再次更改,因此,保证合约代码的鲁棒性就非常重要。
  • 与交易资金密切相关,一旦出现漏洞将面临巨大亏损的风险,因此,除了发布需经过完整测试外,还需要考虑如果出现了未知问题,需要如何迭代应用。
  • 没有对各种数据类型提供非常丰富的内置方法,每次多写方法都需要提升 gas 费,为了在合约部署和调用的情况下节约 gas 费,需要十分注意优化代码的性能。

代码复用优化

常用 modifier 控制前置检查

image.png

继承方法多使用 virtual

  • 在使用 override 时同时也使用 virtual,因为重写过的函数在未来再次发送重写的可能性是相当大的。

Gas 优化

1、提前声明常见错误 error

  • 使用 revert 抛出自定义报错 MyError 来取代 require(bool, xxxxxxx)

image.png

2、省略不需要赋值的变量定义

局部变量尽量使用 memory,在函数执行完成后会销毁,需要注意的是,在内存中的数组只能是定长数组,不能 push pop(只能是定长数组)。字符串本质上也是数组,所以在返回的时候也需要加上 memory
image.png

3、适时使用 calldata 代替 memory 传递参数

如果是下方的函数使用 memory,而上方使用 calldata,在上方函数执行的过程中会再次拷贝一份到 memory,因此如果传参只是调用一个函数,那么可以使用 calldata 来提升性能,降低 gas。
image.png
image.png

4、用事件代替状态变量来做存储

image.png