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

Descargo de responsabilidad
* La inversión en criptomonedas implica riesgos significativos. Proceda con precaución. El curso no pretende ser un asesoramiento de inversión.
* El curso ha sido creado por el autor que se ha unido a Gate Learn. Cualquier opinión compartida por el autor no representa a Gate Learn.
Catálogo
Lección 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)總是在不斷變化,我們一定要及時了解社區和生態繫統的最新動態,併定期測試和優化合約。以太坊擁有一個龐大且樂於助人的社區,因此永遠不要害怕尋求指導或學習最佳實踐。祝編程愉快!

Descargo de responsabilidad
* La inversión en criptomonedas implica riesgos significativos. Proceda con precaución. El curso no pretende ser un asesoramiento de inversión.
* El curso ha sido creado por el autor que se ha unido a Gate Learn. Cualquier opinión compartida por el autor no representa a Gate Learn.