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

免責事項
* 暗号資産投資には重大なリスクが伴います。注意して進めてください。このコースは投資アドバイスを目的としたものではありません。
※ このコースはGate Learnに参加しているメンバーが作成したものです。作成者が共有した意見はGate Learnを代表するものではありません。
カタログ
レッスン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)总是在不断变化,我们一定要及时了解社区和生态系统的最新动态,并定期测试和优化合约。以太坊拥有一个庞大且乐于助人的社区,因此永远不要害怕寻求指导或学习最佳实践。祝编程愉快!

免責事項
* 暗号資産投資には重大なリスクが伴います。注意して進めてください。このコースは投資アドバイスを目的としたものではありません。
※ このコースはGate Learnに参加しているメンバーが作成したものです。作成者が共有した意見はGate Learnを代表するものではありません。