节省gas最直接的方法之一是简化代码。执行的代码越少,消耗的gas就越少。
请看以下函数:
Solidity
pragma solidity ^0.8.9;
contract OptimizationExample {
address[] public admins;
function isUserAdmin(address user) public view returns (bool) {
for (uint i = 0; i < admins.length; i++) {
if (admins[i] == user) return true;
}
return false;
}
}
上面的函数使用了一个循环,随着更多管理员被添加其中,循环的成本会更高。更节省gas的结构将使用映射:
Solidity
contract OptimizationExampleOptimized {
mapping(address => bool) public admins;
function isUserAdmin(address user) public view returns (bool) {
return admins[user];
}
}
在使用以太坊时,你需要为每一个存储付费。如果你在多个地方存储了相同的数据,可以考虑仅在一个地方存储并在其他地方引用。
Solidity中的库是可复用的代码,可以帮助你编写模块化代码。由于库只部署一次并链接到其他合约,因此从长远来看可以节省gas。
Solidity
library SafeMath {
function add(uint a, uint b) internal pure returns (uint) {
uint c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
//... other math functions
}
contract UsingSafeMath {
using SafeMath for uint;
uint public value;
function increment(uint _value) public {
value = value.add(_value);
}
}
Solidity中的delete
关键字可以使变量无效,从而返还部分gas。如果你不再需要特定的存储数据,请使用delete操作以申请gas返还。
虽然在区块链上存储数据可能成本高昂,但记录事件相对便宜。如果有不需要从合约中读取但需要进行验证的数据,可以考虑使用事件日志。
某些操作消耗的gas相对更高,如:
为节省gas进行的智能合约优化既是一门艺术,也是一门科学。综合使用本课程介绍的优化方法有望大大降低合约的gas成本。由于以太坊生态系统及其工具(包括Remix)总是在不断变化,我们一定要及时了解社区和生态系统的最新动态,并定期测试和优化合约。以太坊拥有一个庞大且乐于助人的社区,因此永远不要害怕寻求指导或学习最佳实践。祝编程愉快!
节省gas最直接的方法之一是简化代码。执行的代码越少,消耗的gas就越少。
请看以下函数:
Solidity
pragma solidity ^0.8.9;
contract OptimizationExample {
address[] public admins;
function isUserAdmin(address user) public view returns (bool) {
for (uint i = 0; i < admins.length; i++) {
if (admins[i] == user) return true;
}
return false;
}
}
上面的函数使用了一个循环,随着更多管理员被添加其中,循环的成本会更高。更节省gas的结构将使用映射:
Solidity
contract OptimizationExampleOptimized {
mapping(address => bool) public admins;
function isUserAdmin(address user) public view returns (bool) {
return admins[user];
}
}
在使用以太坊时,你需要为每一个存储付费。如果你在多个地方存储了相同的数据,可以考虑仅在一个地方存储并在其他地方引用。
Solidity中的库是可复用的代码,可以帮助你编写模块化代码。由于库只部署一次并链接到其他合约,因此从长远来看可以节省gas。
Solidity
library SafeMath {
function add(uint a, uint b) internal pure returns (uint) {
uint c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
//... other math functions
}
contract UsingSafeMath {
using SafeMath for uint;
uint public value;
function increment(uint _value) public {
value = value.add(_value);
}
}
Solidity中的delete
关键字可以使变量无效,从而返还部分gas。如果你不再需要特定的存储数据,请使用delete操作以申请gas返还。
虽然在区块链上存储数据可能成本高昂,但记录事件相对便宜。如果有不需要从合约中读取但需要进行验证的数据,可以考虑使用事件日志。
某些操作消耗的gas相对更高,如:
为节省gas进行的智能合约优化既是一门艺术,也是一门科学。综合使用本课程介绍的优化方法有望大大降低合约的gas成本。由于以太坊生态系统及其工具(包括Remix)总是在不断变化,我们一定要及时了解社区和生态系统的最新动态,并定期测试和优化合约。以太坊拥有一个庞大且乐于助人的社区,因此永远不要害怕寻求指导或学习最佳实践。祝编程愉快!