什么是 Gas
Gas 是理解以太坊网络的最重要和最基本的方面之一。
Gas 是让它(以太坊)运行的燃料,就像汽车需要汽油来运行一样。
在浏览入门教程时,你可能已经注意到,在以太坊网络上进行的交易需要用户支付一笔交易费。
- 这个交易费是如何计算的?
- 你需要为一笔交易支付多少 ETH?
- 为什么有些交易比其他交易更贵?
- 为什么会存在 Gas 费用?
这些问题的答案就在 Gas 的概念中。
最近的一次升级,即 2021 年 8 月的伦敦升级,稍微改变了交易费用的计算方式和 Gas 的工作方式。出于这个原因,我们将把本教程分为两个部分。
- 伦敦升级前
- 伦敦升级后
伦敦升级前的内容很好理解,比伦敦升级后的内容更容易让你初步理解,同时也提供了升级的动机。
Gas 一般概念
就像秒是时间单位,米是距离单位一样,Gas 本身就是以太坊网络上的一个计算单位。
Gas 单位是用来衡量在以太坊上执行交易所需的计算量的。由于每笔交易的执行都需要一定的计算资源,因此需要支付一定的费用,通常称为 Gas 费或交易费。
Gas 费是以以太坊的原生货币--以太坊或 ETH 支付的。燃气费的计算方式在伦敦升级之前和之后略有不同。
注意:一般来说,当有人说'Gas'--他们指的是'Gas 费用'而不是单位本身。然而,为了本教程的目的,我们将在技术上正确地说 "Gas",指的是单位,而 "Gas 费用 "指的是以太币的费用。
伦敦升级前
在伦敦升级之前,你需要为一笔交易支付多少以太币是用一个简单的公式计算的。
燃气费 = 燃气花费 * 燃气价格
- Gas Spent 是指用于执行交易的 Gas 总量(以 Gas 为单位)。
- Gas 价格是指你愿意为每一个 Gas 单位的执行支付的乙醚数量
Gas 价格以 gwei 为单位--ETH 的一种计价方式。
1 Gwei = 0.000000001 ETH
1ETH = 10^9 Gwei
因此,你可以说你的天然气价格是 0.000000001 ETH,而不是说你的天然气价格是 1 Gwei。
Gwei 是 Giga-Wei 的缩写,等于 1,000,000,000 (10^9)Wei。Wei 是 ETH 的最小面额。1ETH=10^18 魏。
例子
就执行所需的 Gas 量而言,最便宜的交易只是将 ETH 从一个账户转移到另一个账户。这笔交易需要 21,000 个 Gas 单位。
假设 Alice 想给 Bob 支付 1 个 ETH。Gas 成本是 21,000 个 Gas。假设 Gas 价格为 200Gwei。
因此,燃气费=21,000 * 200 = 4,200,000 Gwei = 0.0042 ETH
因此,当 Alice 寄钱时,1.0042 ETH 将从她的账户中扣除,而 Bob 将收到 1 ETH。0.0042 ETH 的费用将归于开采包含 Alice 交易的区块的矿工。
你可能想知道,天然气价格是如何被设定为 200Gwei 的?燃气价格设置为多少是由用户决定的。气价较高的交易有较高的优先权被纳入区块,因为矿工首先开采这些交易会得到较高的报酬。因此,天然气价格,基本上就像一个公开的拍卖,或对矿工的贿赂。谁愿意向矿工支付最高的价格,或最高的贿赂,谁就能比低价的人更快地得到他们的交易。
像 Metamask 这样的钱包会根据当前的网络条件为要执行的交易提供合理的天然气价格估算--因此大多数用户不需要自己去碰天然气价格值。(虽然,你可以通过 Metamask 设置启用修改)。
燃气成本计算
当一个智 能合约被编译成字节码,在部署到以太坊网络之前,它被编译成 OPCODES。这些是简单的操作,可以直接在以太坊虚拟机上运行。你可以认为它们类似于可以直接在英特尔或 AMD CPU 上运行的基本操作。这些 OPCODES 包括基本操作,如 ADD、MUL、DIV、SUB、SHA3 等。
每个 OPCODE 都有一个固定的 Gas 成本。智能合约中一个特定功能的 Gas 成本是它所有 OPCODES 的 Gas 成本的总和。如果感兴趣,你可以在这里找到所有 OPCODES 及其相关 Gas 成本的列表。
因此,更复杂的交易需要更多的 OPCODES 来执行,最终会比简单的交易(如将 ETH 从一个账户转移到另一个账户)使用更多的 Gas(单位)。
气体限制
现在,你可以想象,存在着很多比仅仅从一个账户向另一个账户发送 ETH 复杂得多的功能。那些涉及循环,或随机性,或依赖用户输入的功能。
对于这样的函数,可能很难准确预测执行所需的气体量,因为它取决于其他变量。
因此,在决定为交易支付多少费用时,你可以指定一个上限限制,而不是指定确切的气体费用。
气体上限
指的是你愿意为交易使用的最大气体量(单位)。这是由用户设置的。
同样,像 Metamask 这样的钱包提供合理的估计。
如果你的交易使用的气体少于你的限额,未使用的气体将被退还到你的账户。
因此,你的钱包必须有 gas limit * gas price ether
来支付发送交易时的 gas。任何未使用的气体将在交易被执行和开采时被退还。
然而,如果你的交易使 用的气体超过你的限额,交易将失败,你的气体将消失。
区块气体限制
除了用户指定的每笔交易的气体限制外,以太坊网络还对单个区块中允许的最大气体量(单位)进行了限制。
这样做是为了确保每个区块保持在一个可允许的计算成本范围内。由于更复杂的交易需要更长的时间来执行,这确保了节点不会因为计算复杂性的增加而开始与网络的其他部分不同步。
伦敦会议后的升级
2021 年 8 月 5 日--伦敦升级在以太坊网络上实施。这次升级主要引入了三个好处。
- 更好的气体费用估算
- 更快的交易纳入
- 燃烧一定比例的 ETH 作为交易费用
就本文而言,我们主要关注的是前两点。
在伦敦升级之前,像 Metamask 这样的钱包会根据过去的网络活动提供对天然气价格的估计。每个钱包都使用自己的方法来做到这一点。特别是 Metamask,扫描了以太坊上的最后 1000 个区块,并预测了你的交易的天然气价格。
然而,从伦敦升级开始,每个区块都被设定为有一个基本的天然气价格费用。这是让你的交易包含在这个区块中的每单位气体的最低价格。这是由网络根据区块空间的需求来计算的。这些基本费用将被以太坊网络烧掉,因此永远摆脱了 ETH 来抵消发行量。由于以太坊没有整体的最大供应量(不像比特币,它的最大供应量是 2100 万 个比特币),燃烧有助于 ETH 供应达到平衡,不会无限膨胀。
除了基本费用外,还引入了小费(优先费)的概念。由于基本费用被烧毁,小费的存在是为了补偿矿工执行和传播用户交易的费用。这又是由大多数钱包自动设置的,尽管你可以选择手动设置。更高的小费交易往往会得到更高的优先权。
随着这次升级,计算瓦斯费的公式改为如下。
汽油费 = 花费的汽油 *(基本费用 + 优先费用)
例子
回到前面的例子,如果 Alice 要付给 Bob 1 个 ETH,那么汽油费(单位)是 21,000。假设基本费用是 100Gwei,而 Alice 决定包括 10Gwei 的小费。
总油费=21,000 * (100 Gwei + 10 Gwei) = 2,310,000 Gwei = 0.00231 ETH
可变的区块大小
在伦敦升级之前,所有区块的气体限制是不变的。每个区块的最大容量为 15M 气体。在高需求时期,这导致了糟糕的用户体验,因为区块在满负荷运行,而用户不得不等待需求减少,以获得区块中。
这次升级为以太坊引入了可变大小的区块。每个区块现在有一个 15M 气体的目标限制,但大小可以随着网络需求增加或减少,直到最大的 30M 气体。
平均而言,网络通过修改区块大小和基础费用在 15M gas 左右达到平衡。
如果区块气体大于 15M 的目标,下一个区块的基本费用会增加。同样地,如果区块气体小于 15M 的目标,下一个区块的基本费用就会减少。基本费用 的调整额度取决于区块气体离 15M 目标有多远。
花一些时间阅读最后几段并完全掌握它们--这是相当吸引人的东西,但可能会有点棘手,让你的头脑陷入混乱。
可变的基本费用
让我们来看看,在网络需求量大的时候,基本费用会发生什么变化。
如果超过 15M 然料的目标,基本费用每块最多增加 12.5%。这种指数式增长使得区块气体无限期地保持在高位在财务上是不可行的,因此允许节点与网络保持同步,而不是不断地执行 30M 气体区块。
在这个例子中,区块 2 看到了可能的最大增长,从目标 15M 到 30M。因此,区块 3 的基本费用增加了 12.5%,从 100 Gwei 到 112.5 Gwei。
同样,由于 3 号区块也达到了 30M 气体的最大限度,也就是与目标的最大可能距离,4 号区块的基本费用再次增加了 12.5%,达到 126.6 桂。以此类推...
这种情况一直在发生,到了第 8 区,基本费用为 202.7Gwei。比 7 个区块前增加了 102.7%! 到了 100 区块,基本费用是 10302608.6Gwei - 这是疯狂的(也是不现实的)。这意味着,在第 100 区块,一个简单的 ETH 转移将花费你(21000 * 10302608.6 Gwei)= 216 ETH。
由于基本费用的这种指数式增长,可以注意到,极不可能看到全区块的扩展峰值。
应该注意的是,基本费用也最多减少 12.5%,在流量开始放缓后,帮助尖峰回到平衡状态。
更好的气体估计
相对于伦敦升级前的机制,这种基本收费机制的变化使得收费预测更加可靠。按照上表,在第 9 个区块创建交易,钱包可以让用户 100%确定地知道,下一个区块的最大基础费用是当前的基础费用(前一个区块的基础费用)112.5%=202.8112.5/100 或 228.1Gwei。反之,最低的基本费用可以确定,知道减少只能是 12.5%:当前基本费用(前一区块的基本费用)87.5%=202.887.5/100 或 177.45Gwei。
因此,钱包现在知道一个最小和最大的基本费用范围,在提供估计时提供给用户。最低是目前的基本费用87.5%,最高是目前的基本费用112.5%,然后用户可以直接调整矿工的小费,这通常是基本费用的一小部分。
为什么 Gas 会存在?
Gas 费用有助于保持以太坊网络的安全。通过要求在网络上执行的每一次计算都要收费,可以防止坏的行为者向网络发送垃圾邮件。
为了避免智能合约中的意外或恶意的无限循环,这将导致所有以太坊节点永远被卡住,交易的气体限制为一个交易可以使用的计算量设置了限制。
像这样的代码会用完所有提供的气体,直到限制,然后交易会失败。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
contract Gas {
uint public i = 0;
// Using up all of the gas that you send causes your transaction to fail.
// State changes are undone.
// Gas spent are not refunded.
function forever() public {
// Here we run a loop until all of the gas are spent
// and the transaction fails
while (true) {
i += 1;
}
}
}
使这一切成为可能的基本单位是燃气。
减少气体费用
以太坊的高费用是最近的一个热门话题。以太坊社区曾独自发誓不伤害网络的去中心化或安全性。因此,做出了有利于安全的权衡,这导致以太坊网络目前的交易费用高于其他区块链,如 Solana,它以牺牲安全和去中心化为代价做出了有利于降低费用的权衡。
以太坊的基本目标是成为一个能够执行智能合约的高度安全和高度分散的区块链网络。
但是,如果用户必须不断花费数百美元来移动一美元,那么这一切都不重要。
因此,有很多东西正在努力,有些已经可以使用,以允许减少汽油费和改善用户体验。
主要是,以太坊 2.0(也称为 Eth2)将提供的网络升级将最终解决一些气体问题,这反过来将使网络能够每秒处理成千上万的交易并在全球范围内扩展。
此外,在第二层扩展方面也在做大量的工作。我们以后会更深入地了解第 2 层扩展和第 2 层平台,但基本上它们是将智能合约的重计算方面转移到其他地方的网络,并使用以太坊的主网。