主要是通过代码中memory来大幅度减少gas使用,示例代码如下:
pragma solidity ^0.5.10;
contract Test{
struct User{
uint age;
uint balance;
uint num;
}
User user;
function initUser() public{
user = User({age:20,balance:1000,num:1});
}
function setUser1() public {
user.age = 30;
user.balance = 20000;
user.num = 2;
}
function setUser2() public {
User memory temp = user;
temp.age = 40;
temp.age = 20001;
user.num = 3;
user = temp;
}
}
pragma solidity ^0.5.10;
contract Test{
struct User{
uint age;
uint balance;
uint num;
}
User user;
function initUser() public{
user = User({age:20,balance:1000,num:1});
}
function setUser1() public {
user.age = 30;
user.balance = 20000;
user.num = 2;
}
function setUser2() public {
User memory temp = user;
temp.age = 40;
temp.age = 20001;
user.num = 3;
user = temp;
}
}
我们首先通过initUser方法来初始化一个User对象的数据,然后分别调用setUser1和setUser2两个方法。
你会发现,setUser1需要消耗36476gas,而setUser2只需要效果31595gas,它们的效果相同,消耗的gas却差了5000gas,如果User的字段增多,那么此差距会越来越大。
那么这两种写法的区别是什么呢?我们知道,区块链上的写操作是比较昂贵的,而setUser1进行了多次的写操作,而setUser2只进行了一次整体的写操作。因此,节省了相当大一部分的gas。