Leçon 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)总是在不断变化,我们一定要及时了解社区和生态系统的最新动态,并定期测试和优化合约。以太坊拥有一个庞大且乐于助人的社区,因此永远不要害怕寻求指导或学习最佳实践。祝编程愉快!

Clause de non-responsabilité
* Les investissements en cryptomonnaies comportent des risques importants. Veuillez faire preuve de prudence. Le cours n'est pas destiné à fournir des conseils en investissement.
* Ce cours a été créé par l'auteur qui a rejoint Gate Learn. Toute opinion partagée par l'auteur ne représente pas Gate Learn.
Catalogue
Leçon 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)总是在不断变化,我们一定要及时了解社区和生态系统的最新动态,并定期测试和优化合约。以太坊拥有一个庞大且乐于助人的社区,因此永远不要害怕寻求指导或学习最佳实践。祝编程愉快!

Clause de non-responsabilité
* Les investissements en cryptomonnaies comportent des risques importants. Veuillez faire preuve de prudence. Le cours n'est pas destiné à fournir des conseils en investissement.
* Ce cours a été créé par l'auteur qui a rejoint Gate Learn. Toute opinion partagée par l'auteur ne représente pas Gate Learn.
It seems that you are attempting to access our services from a Restricted Location where Gate.io 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.