節省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)總是在不斷變化,我們一定要及時了解社區和生態繫統的最新動態,併定期測試和優化合約。以太坊擁有一個龐大且樂於助人的社區,因此永遠不要害怕尋求指導或學習最佳實踐。祝編程愉快!