Gas优化学习笔记2

  • 老白
  • 更新于 2023-11-30 14:53
  • 阅读 520

接上篇gas优化1defi上有一类很火的项目,就是借贷,如Aave,Compound。用户任何一个简单的操作,合约都要进行各种if判断,比如:是否已经计算过利息上次更新的区块是否就是当前区块你的总额度是否透支很多逻辑的执行,都需要多个条件,这里的代码需要考虑gas吗?上篇的lo

接上篇 gas优化1

defi上有一类很火的项目,就是借贷,如Aave,Compound。

用户任何一个简单的操作,合约都要进行各种if判断, 比如:

  1. 是否已经计算过利息
  2. 上次更新的区块是否就是当前区块
  3. 你的总额度是否透支

很多逻辑的执行,都需要多个条件,这里的代码需要考虑gas吗?

上篇的lowGas和highCas,我做一下简单的修改。

返回类型:由uint改为bool

返回:之前返回x,改为 x是否等于value的布尔值

    function lowGas(uint value) costGas('lowGas') public view returns(bool) {
        uint x=10;
        x = x + x;

        return x == value;
    }

    function highGas(uint value)  costGas('highGas') public view returns(bool)  {
        uint x=10;
        x = x * 2;
        return x == value;
    }

增加一个方法

    function fn_or(uint value) costGas('fn_or') public view returns(bool){
        return lowGas(value) || highGas(value);
    }

fn_or: 对两个函数进行or运算

代码很简单,看下运行效果。

注意,代码进行了编译优化,run=200

fn_or, 入参=10

CALL
[call]from: 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4to: Gas2.fn_or(uint256)data: 0x33b...0000a
console.log:
lowGas costGas: 100
highGas costGas: 116
fn_or costGas: 7416

fn_or, 入参=20

CALL
[call]from: 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4to: Gas2.fn_or(uint256)data: 0x33b...00014
console.log:
lowGas costGas: 100
fn_or costGas: 4964

对比下两次gas。

输入10,

lowGas返回false,highGas返回false

lowGas执行了,gas fee:100

highGas执行了,gas fee:116

总gas fee:7416

输入20

lowGas返回true,

lowGas执行了,gas fee:100

highGas根本没执行

总 gas fee:4964

lowGas返回false,没啥影响。

lowGas返回true,会把highGas都节省掉。

结论:如果两个函数作为条件判断有一个成立即可,那么gas少的那个放在前面!!!

再新增一个函数

    function fn_add(uint value) costGas('fn_and') public view returns(bool){
        return lowGas(value) && highGas(value);
    }

fn_and:对两个函数进行and运算

fn_and, 入参=20

CALL
[call]from: 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4to: Gas2.fn_add(uint256)data: 0x81e...00014
console.log:
lowGas costGas: 100
highGas costGas: 116
fn_and costGas: 7419

fn_and, 入参=10

CALL
[call]from: 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4to: Gas2.fn_add(uint256)data: 0x81e...0000a
console.log:
lowGas costGas: 100
fn_and costGas: 4967

对比下两次gas。

输入20,

lowGas返回true,highGas返回true

lowGas执行了,gas fee:100

highGas执行了,gas fee:116

总gas fee:7419

输入10

lowGas返回false,

lowGas执行了,gas fee:100

highGas根本没执行

总 gas fee:4967

lowGas返回true,没啥影响。

lowGas返回false,会把highGas都节省掉。

结论:如果两个函数作为条件判断必须两个都成立即可,那么gas少的那个放在前面!!!

点赞 1
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
老白
老白
0x02e8...8358
江湖只有他的大名,没有他的介绍。