接上篇gas优化1defi上有一类很火的项目,就是借贷,如Aave,Compound。用户任何一个简单的操作,合约都要进行各种if判断,比如:是否已经计算过利息上次更新的区块是否就是当前区块你的总额度是否透支很多逻辑的执行,都需要多个条件,这里的代码需要考虑gas吗?上篇的lo
接上篇 gas优化1
defi上有一类很火的项目,就是借贷,如Aave,Compound。
用户任何一个简单的操作,合约都要进行各种if判断, 比如:
很多逻辑的执行,都需要多个条件,这里的代码需要考虑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少的那个放在前面!!!
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!