当把多个参数打包成struct,传递给函数的就只有一个引用(栈上的一个指针),而不是多个独立的值。如果struct在memory中:函数接收到的是一个memory指针(通常占用一个栈槽)。如果struct在calldata中:函数接收到的是一个calldata偏移量
Solidity0.8.4引入的自定义错误(customerror)是require("message")的高效替代品。它不仅在部署时节省大量字节码,还在交易失败(revert)时显著降低返回数据带来的gas开销。
用delete释放存储delete会将storage变量重置为零值,获得gas退款。在以太坊当前的机制下,delete释放一个非零存储槽所获得的退款是固定数值4,800gas
把最可能决定最终结果且最便宜的条件放在最前面,让后面的昂贵检查尽可能被短路掉。&&串联:最左边的条件应当是最可能为false且最便宜的。||串联:最左边的条件应当是最可能为true且最便宜的。
1、根据EVM交易/调用的固定成本每一笔外部交易都要支付21000gas的基础成本,还不包括合约调用的额外开销(CALL操作码、输入数据解码等)。如果用户需要执行10次转账,分10次发起交易,光是基础成本就高达10×21000=210000gas。批量处理只需1
在Solidity中,把数组的length提前缓存到一个局部变量中(即“前置计算”),主要是为了避免在循环的每次判断中重复读取同一个状态变量(或内存变量),从而把多次操作压缩为一次。这在storage数组上效果最明显,但也适用于memory和calldata数组。缓存后如何省
++i(前递增):将i加1,然后直接返回新值。i++(后递增):将i加1,但返回的是旧值。这意味着,i++在执行过程中必须“记住”旧值,等加法完成后再把旧值返回。在EVM中,这个“记住”意味着至少一次额外的栈操作(通常是DUP和SWAP),这些操作虽然单价便宜3gas