GTokenTool全网最好的代币发行工具平台
当前位置:首页 >> solana教程 >> 如何降低 Solidity Gas 成本 – 完整指南

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

admin solana教程 54

Solidity Gas 成本是多少? 

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

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

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

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

这表明 Solidity gas 成本指的是执行 Solidity 智能合约时必须支付的实际价格。此外,随着对 Web3 开发的关注度不断提高,gas 价格飙升,使得运行智能合约的成本变得昂贵。因此,优化 gas 费用现在比以往任何时候都更加紧迫。但是,gas 费用优化到底是什么呢?

什么是 Gas 费用优化? 

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

正如我们在上一节中所述,gas 既是衡量标准,也是与 EVM 使用相关的燃料。执行合约所需的计算能力越多,所需的 gas 就越多。此外,执行交易所需的 gas 是固定的;然而,gas 的实际价格会根据供需因素而变化。基于此,可以确定影响 gas 价格的两个变量示例:1) 计算能力和 2) 供需。

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

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

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

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

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

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

这些函数被标记为“A”到“D”,其中第一个函数消耗的 gas 最多,最后一个函数消耗的 gas 最少。此外,我们将仔细研究这四个函数,看看它们是如何优化的,以及“幕后”到底发生了什么。

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

如何降低 Solidity Gas 成本:功能 A – C

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

功能A 

 函数选项A 外部{
       对于uint i = 0 ;i <arrayFunds.length i++ {
           总资金 = 总资金 + arrayFunds [ i ] ;
       }
   }

从上面的代码可以看出,该函数相对简单。但是,“optionA()”在函数的“ for ”循环的每次迭代中直接与区块链通信。这意味着该函数在执行过程中多次从“arrayFunds”获取信息并填充“totalFunds”状态变量。因此,会发生几次不同且不必要的区块链交互,从而增加 gas 成本。那么,我们如何改进这一点呢? 

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

功能B

函数选项B 外部{
       uint _总资金;
       对于uint i = 0 ;i <arrayFunds.length i++ {
           _totalFunds = _totalFunds + arrayFunds [ i ] ;
       }
       总资金 = _总资金;
   }

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

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

功能C

函数选项C 外部{
       uint _总资金;
       uint [ ]内存 _arrayFunds = arrayFunds;
       对于uint i = 0 ;i < _arrayFunds.length i++ {
           _totalFunds = _totalFunds + _arrayFunds [ i ] ;
       }
       总资金 = _总资金;
   }

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

如何降低 Solidity Gas 成本:功能 D

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

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

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

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

 函数unsafe_inc ( uint x )私有返回( uint ) {
       未选中{返回x + 1 ; }
   }

我们将在执行“optionD()”时使用此函数。因此,最终且最便宜的函数如下所示: 

函数选项D 外部{
       uint _总资金;
       uint [ ]内存 _arrayFunds = arrayFunds;
       对于uint i = 0 ; i < _arrayFunds.length ; i = unsafe_inc i {
           _totalFunds = _totalFunds + _arrayFunds [ i ] ;
       }
       总资金 = _总资金;
   }

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

四个函数处于四个不同的优化级别,观察它们之间的差异会很有趣。因此,可以通过运行每个函数来说明优化合约的价值。 

为了测试合约,我们将使用Remix编译并部署它。如果您想自己执行此操作,请导航至 Remix 界面中的“Solidity Compiler”选项卡。编译合约后,您可以单击“Deploy & Run Transactions”选项卡。从那里,您需要选择“Injected Web3”,然后您就可以部署合约了。 

部署合约后,我们可以直接通过 Remix 测试每个功能。要测试每个功能,您可以点击以下按钮,这将提示您的MetaMask钱包: 

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

选项A():

选项B():

选项C():

选项D():

随着每次优化,您可以看到我们正在逐步降低 Solidity 的 gas 成本。 

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

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

如何降低 Solidity Gas 成本 – 摘要

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

在本文中,我们向您展示了一个包含四个不同功能的合约示例,这些功能已逐步改进以尽量降低 gas 价格。主要关注点是减少区块链交互的数量,从而推高 gas 价格。在本例中,这是通过创建内存变量来实现的,允许合约避免循环内不必要的区块链交互。 

这只是一个简单的例子,说明如何优化智能合约以降低 Solidity gas 成本。但是,如果你将此策略应用于更复杂的交易,逻辑仍然相同。因此,本教程有望让你在未来开发更优化的智能合约以降低成本。


另外,您是否知道可以使用 RPC 方法优化 gas 费用?使用该eth_createAccessList方法为假设交易生成访问列表,并通过预先指定交易密钥将与之交互的账户和密钥来优化 gas 费用。 

作者:GTokenTool一键发币平台

交流群:https://t.me/+Kz4u3xoDpFo3ZWY1

同类推荐