Bài học 5

智能合約優化之高級技巧與訣竅

在之前的章節中,我們介紹了在以太坊智能合約上優化gas的基本概念和所需工具,併以Remix IDE爲例進行了重點講解。在本課程的最後一章,我們將深入探討一些高級技術和最佳實踐。本章將綜合我們學到的知識,確保大家對以太坊智能合約中的gas優化有一個全麵的理解。

重構和降低代碼覆雜性

節省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進行的智能合約優化既是一門藝術,也是一門科學。綜合使用本課程介紹的優化方法有望大大降低合約的gas成本。由於以太坊生態繫統及其工具(包括Remix)總是在不斷變化,我們一定要及時了解社區和生態繫統的最新動態,併定期測試和優化合約。以太坊擁有一個龐大且樂於助人的社區,因此永遠不要害怕尋求指導或學習最佳實踐。祝編程愉快!

Tuyên bố từ chối trách nhiệm
* Đầu tư tiền điện tử liên quan đến rủi ro đáng kể. Hãy tiến hành một cách thận trọng. Khóa học không nhằm mục đích tư vấn đầu tư.
* Khóa học được tạo bởi tác giả đã tham gia Gate Learn. Mọi ý kiến chia sẻ của tác giả không đại diện cho Gate Learn.
Danh mục
Bài học 5

智能合約優化之高級技巧與訣竅

在之前的章節中,我們介紹了在以太坊智能合約上優化gas的基本概念和所需工具,併以Remix IDE爲例進行了重點講解。在本課程的最後一章,我們將深入探討一些高級技術和最佳實踐。本章將綜合我們學到的知識,確保大家對以太坊智能合約中的gas優化有一個全麵的理解。

重構和降低代碼覆雜性

節省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進行的智能合約優化既是一門藝術,也是一門科學。綜合使用本課程介紹的優化方法有望大大降低合約的gas成本。由於以太坊生態繫統及其工具(包括Remix)總是在不斷變化,我們一定要及時了解社區和生態繫統的最新動態,併定期測試和優化合約。以太坊擁有一個龐大且樂於助人的社區,因此永遠不要害怕尋求指導或學習最佳實踐。祝編程愉快!

Tuyên bố từ chối trách nhiệm
* Đầu tư tiền điện tử liên quan đến rủi ro đáng kể. Hãy tiến hành một cách thận trọng. Khóa học không nhằm mục đích tư vấn đầu tư.
* Khóa học được tạo bởi tác giả đã tham gia Gate Learn. Mọi ý kiến chia sẻ của tác giả không đại diện cho Gate Learn.
It seems that you are attempting to access our services from a Restricted Location where Gate is unable to provide services. We apologize for any inconvenience this may cause. Currently, the Restricted Locations include but not limited to: the United States of America, Canada, Cambodia, Thailand, Cuba, Iran, North Korea and so on. For more information regarding the Restricted Locations, please refer to the User Agreement. Should you have any other questions, please contact our Customer Support Team.