05-Solidity8.0如何降低 Solidity Gas 成本 – 完整指南

Solidity8.0

05-Solidity8.0如何降低 Solidity Gas 成本 – 完整指南


在这里插入图片描述


前言

粗体字样链接:https://moralis.io/how-to-reduce-solidity-gas-costs-full-guide/


一、Solidity8.0如何降低 Solidity Gas 成本 – 完整指南

如何降低 Solidity Gas 成本 – 完整指南

在本文中,我们将仔细研究如何在开发智能合约时降低 Solidity 的 gas 成本。为了说明优化过程,我们将使用一个已经准备好的包含多个功能的智能合约。如果您愿意,可以直接跳到以下 GitHub 存储库中的合约代码:

完整的气体优化文档 – https://github.com/DanielMoralisSamples/32_Gas_Optimization

无论您在哪个部门经营,降低成本都是经营企业的重要组成部分,因为它是获得竞争优势和最大化价值的潜在方式。因此,如果您在与 EVM 兼容的(以太坊虚拟机)链上开发dapps (去中心化应用程序),则应始终优先考虑降低 Solidity 的 gas 成本。但是,如果您不熟悉或不熟悉Web3 开发领域,这将是一项不习惯的任务。由于情况可能如此,本文将说明如何优化您的智能合约开发以降低 Solidity gas 成本。

我们测量 EVM 在 gas 中的使用情况,这意味着使用越密集,我们需要的 gas 就越多。这表明可以优化智能合约功能以减少 EVM 的使用,进而降低Solidity成本。为了展示其工作原理并提供一个清晰的示例,我们将仔细研究一个简单的 Solidity 函数,以及如何以三种不同的方式对其进行优化,以减少区块链的计算能力。

了解如何优化智能合约以降低 Solidity 的 gas 成本将被证明对任何未来的Web3开发工作都有帮助。此外,如果您真的想成为一名区块链开发人员,请注册Moralis,因为该操作系统提供了市场上最好的开发人员体验!

什么是 Solidity Gas 成本?

在探索降低 Solidity gas 成本的过程之前,我们需要先了解一下“gas”的概念以及它的重要性。此外,要充分了解关于 Solidity 的 gas 含义,我们必须首先对以太坊虚拟机(EVM)有更深入的了解。那么,什么是EVM?

如果您熟悉区块链开发,您就会知道 EVM 是一个由矿工网络提供支持的全球处理器。矿工执行与 EVM 兼容的合约——例如本教程的 Solidity 合约——并通过创建新块并将它们附加到区块链来应用他们的工作。本质上,EVM 网络提供计算能力来执行智能合约和链上交易。

然而,利用 EVM 的计算能力和功能并不是免费的。因此,社区将驱动这个全球 EVM 处理器的燃料称为“气体”。此外,gas 也是系统的计量单位,用于跟踪执行合约或功能所使用的计算能力。这表明更密集地使用 EVM 需要更多的 gas。

在以太坊网络上,所有特定操作都有特定的 gas 价格;然而,天然气的价值和价格因供需因素而异。这意味着 gwei 不存在固定价格,因此很难预测执行智能合约的长期成本。

这表明 Solidity 的 gas 成本是指某人在执行 Solidity 智能合约时必须支付的实际价格。此外,随着对 Web3 开发的关注度增加,gas 价格飙升,使得运行智能合约变得昂贵。出于这个原因,优化gas费用现在比以往任何时候都更加紧迫。然而,gas费用优化究竟是什么?

什么是汽油费优化?

随着 Web3 领域内竞争的加剧和 Solidity gas 成本居高不下,现在比以往任何时候都更重要的是降低成本以提高市场竞争力。可以通过优化 gas 费用来降低 Solidity 的 gas 成本;然而,这究竟意味着什么?

正如我们在上一节中建立的,气体既是与 EVM 使用相关的测量值,也是燃料。执行合约所需的计算能力越多,我们需要的 gas 就越多。此外,还设置了执行交易所需的气体;然而,天然气的实际价格因供需因素而异。基于此,可以确定影响 gas 价格的两个变量示例:1)计算能力和 2)供需。

因此,优化 gas 费用的一种方法是在一天中网络不那么拥挤的特定时间执行功能和合同。这意味着运行合约的价格可能会根据执行合约的特定时间而有所不同。

此外,影响 gas 费用的附加变量是我们执行交易或函数所需的计算能力。因此,还可以通过减少所有区块链交互的数量和复杂性来优化 gas 费用。

在以下部分中,我们将仔细研究后者的替代方案。这意味着我们将通过降低执行 Solidity 智能合约所需的区块链交互的复杂性和数量来深入研究 Gas 费用优化的工作原理。所以,事不宜迟,让我们仔细看看如何降低 Solidity 的 gas 成本!

如何降低 Solidity Gas 成本——智能合约示例

在本文的以下部分中,我们将研究一个智能合约,其中包含存储在区块链上的两个状态变量和四个简单函数。每个功能的基本功能是相同的;但是,我们逐渐优化每个功能以降低 Solidity 的 gas 成本。

这些函数的基本功能是遍历一个名为“arrayFunds”的包含多个整数的数组,将所有元素相加,最后用数组的总和填充“totalFunds”变量。

这些函数被标记为“A”到“D”,初始函数需要的气体最多,最后一个函数需要的气体最少。此外,我们将仔细研究这四个函数中的每一个,以了解它们是如何优化的,以及“幕后”实际发生了什么。

一旦我们知道如何降低 Solidity 的 gas 成本,我们还将简要介绍每个函数的结果。这将有助于确定差异并说明未来优化智能合约的能力。

但是,如果您想观看完整教程的视频指南,请仔细查看Moralis YouTube频道中的以下剪辑。该视频更详细地解释了整个合同:

此外,如果您想了解有关智能合约开发的更多信息,请访问 Moralis 博客并查看我们关于如何创建智能合约的文章!

如何降低 Solidity Gas 成本:函数 A – C

让我们先仔细看看第一个函数“optionA()”,它需要最高的 Solidity 气体成本。但是为什么这个比其他的贵呢?要充分理解这一点,我们需要分析函数本身:

功能A

  function optionA() external {
        for (uint i =0; i < arrayFunds.length; i++){
            totalFunds = totalFunds + arrayFunds[i];
        }
    }

从上面的代码可以看出,功能比较简单。然而,“optionA()”在函数的“ for ”循环的每次迭代中直接与区块链通信。这意味着该函数既从“arrayFunds”中获取信息,又在函数执行期间多次填充“totalFunds”状态变量。结果,发生了几种不同且不必要的区块链交互,从而推高了gas成本。那么,我们该如何改进呢?

逐渐优化函数的一种方法是为“totalFunds”变量添加一个内存变量;这正是我们在“optionB()”中所做的:

功能 B

function optionB() external {
        uint _totalFunds;
        for (uint i =0; i < arrayFunds.length; i++){
            _totalFunds = _totalFunds + arrayFunds[i];
        }
        totalFunds = _totalFunds;
    }

在循环之前,我们创建了一个名为“_totalFunds”的内存变量。然后在循环的每次迭代中,我们填充这个变量而不是状态变量“totalFunds”。因此,当循环执行时,我们不会写入区块链。这使我们能够在减少与区块链的交互时节省大量气体。现在,我们怎样才能进一步改进呢?

在“optionC()”中,我们基本上遵循相同的主题,为“arrayFunds”变量创建一个内存变量。因此,这是功能:

功能 C

function optionC() external {
        uint _totalFunds;
        uint[] memory _arrayFunds = arrayFunds;
        for (uint i =0; i < _arrayFunds.length; i++){
            _totalFunds = _totalFunds + _arrayFunds[i];
        }
        totalFunds = _totalFunds;
    }

在这个选项中,我们创建了一个名为“_arrayFunds”的内存变量,它等于“arrayFunds”。然而,由于这是本地存储的,我们不需要在每次循环迭代时从“arrayFunds”变量中获取信息。这表明我们在进一步减少区块链交互的数量时改进了功能。

如何降低 Solidity Gas 成本:函数 D

最后一个函数是“optionD()”,这个函数有点复杂。然而,要理解这个选项,我们需要更深入地了解 Solidity 的历史。

在 Solidity 编程语言的早期版本中,Solidity 没有恢复到变量溢出的功能。开发了“SafeMath”库来解决这个问题,它变得非常流行。尽管如此,随着 Solidity 的更新版本,该语言不断发展并得到进一步发展。这增加了在变量溢出时恢复的能力,使“SafeMath”过时了。

然而,这是有代价的,因为 Solidity 的算法在 gas 方面变得更加昂贵。请注意,我们在之前的选项中执行了“检查算术”;但是,“不加检查”这样做会更便宜。此外,这样做是可能的,因为变量“i”很难溢出。

因此,为了实现这一点,我们使用了名为“unsafe_inc(unit x)”的辅助函数:

  function unsafe_inc(uint x) private pure returns (uint) {
        unchecked { return x + 1; }
    }

我们将在执行“optionD()”时使用这个函数。因此,这就是最终和最便宜的函数的样子:

 function optionD() external {
        uint _totalFunds;
        uint[] memory _arrayFunds = arrayFunds;
        for (uint i =0; i < _arrayFunds.length; i = unsafe_inc(i)){
            _totalFunds = _totalFunds + _arrayFunds[i];
        }
        totalFunds = _totalFunds;
    }

此外,如果您想了解有关 Web3 开发和所需技能的更多信息,请查看我们关于区块链开发的最佳语言的文章!

测试功能——有什么区别?

在四个不同优化级别的四个函数中,看到它们之间的差异变得很有趣。因此,可以通过运行每个函数来说明优化合约的价值。

为了测试合约,我们将使用Remix编译和部署它。如果您想自己这样做,请导航到 Remix 界面中的“Solidity Compiler”选项卡。一旦你编译了合约,你可以点击“Deploy & Run Transactions”选项卡。从那里,您需要选择“Injected Web3”,您应该能够部署合约。

部署合约后,我们可以直接通过 Remix 测试每个功能。要测试每个功能,您可以点击以下按钮,这应该会提示您的MetaMask钱包:
在这里插入图片描述

下面,我们将发布每种替代方案,以展示 Solidity 天然气价格的差异:

选项A():
在这里插入图片描述

选项B():
在这里插入图片描述

选项C():
在这里插入图片描述

选项D():
在这里插入图片描述

通过每次优化,您可以看到我们正在逐渐降低 Solidity 的 gas 成本。

这就是本教程的内容;您现在希望知道如何通过优化您的智能合约来降低 Solidity 的 gas 成本。此外,即使本教程涵盖了一个基本功能,您也应该能够将相同的逻辑用于更复杂的合约,并在未来显着降低 gas 成本。

如果您还有其他问题,请查看我们在本文前面链接到的视频。您会发现我们的一位开发人员在该视频中更详细地解释了整个过程!您还可以通过仔细阅读以下文章来了解有关以太坊汽油费的更多信息:“以太坊汽油费 – 2022 年终极指南”

如何降低 Solidity Gas 成本——总结

随着 Web3 行业走向主流和大规模采用,它的竞争越来越激烈。因此,最小化运营成本和最大化客户价值以获得竞争优势变得至关重要。实现这一目标的一个有效策略是通过优化智能合约来降低 Solidity gas 成本。

在本文中,我们向您展示了一个包含四个不同功能的合约示例,这些功能已逐渐改进以最小化 gas 价格。主要关注的是降低区块链交互的数量,这会推高汽油价格。在这种情况下,这是通过创建内存变量来实现的,该变量允许合约避免循环内不必要的区块链交互。

这只是对如何优化智能合约以降低 Solidity gas 成本的简单说明。但是,如果将此策略应用于更复杂的事务,则逻辑保持不变。因此,本教程有望让您在未来开发更优化的智能合约以降低成本。

如果您觉得这篇文章有帮助,请随意浏览Moralis 的博客。在这里,您将找到更多文章,让您能够加强 Web3 开发游戏。此外,Moralis 提供了最令人惊叹的开发工具,如Moralis Speedy Nodes、Metaverse SDK、NFT API等。


总结

日拱一卒。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值