深入了解区块链概念。了解Gas、挖矿和共识。如何在Solidity方面做得更好,以构建全堆栈DAPP、NFT集合、ICO 代币、DAO和DeFi协议。
Gas 是理解以太坊网络最重要和最基本的方面之一。
Gas是允许以太坊(Ethereum)运行的燃料,就像汽车需要汽油一样。
在浏览新手教程时,你可能已经注意到,在以太坊网络上进行的交易需要用户支付一笔交易费。
这些问题的答案在于Gas的概念。
最近的升级,即 2021 年 8 月的伦敦升级,略微改变了交易费用的计算方式和Gas的运作方式。出于这个原因,我们将把本教程分为两个部分:
Pre-London Upgrade 比 Post-London Upgrade 更容易理解,并且也为升级提供了动力。
就像时间单位seconds
和距离单位metres
一样,gas它本身就是以太坊网络上的计算单位。
气体单位用于衡量在以太坊上执行交易所需的计算量。由于每笔交易都需要一些计算资源来执行,因此需要一笔费用,通常称为Gas fee或Transaction fee 。
汽油费以以太坊的本地货币——ether或ETH支付。汽油费的计算方式在伦敦升级前后略有不同。
注意:通常当有人说“Gas”时 - 他们指的是“Gas Fees”而不是单位本身。但是,出于本教程的目的,我们在技术上是正确的,在提到单位时说“Gas”,在提到 Ether 中的费用时说“Gas Fees”。
在伦敦升级发生之前,您需要为一笔交易支付多少以太币是使用一个简单的公式计算出来的。
gas fees = gas spent * gas price
Gas 价格以gwei计价 - 一种 ETH 的计价单位。
1 Gwei = 0.000000001 ETH
1 ETH = 10^9 Gwei
因此,与其说你的 gas 价格是 0.000000001 ETH,不如说你的 gas 价格是 1 Gwei。
Gwei 代表 Giga-Wei,等于 1,000,000,000 (10^9) wei。Wei是ETH的最小面额。1 ETH = 10^18 Wei。
就执行所需的气体量而言,最便宜的交易只是将 ETH 从一个账户转移到另一个账户。这笔交易花费了 21,000 个气体单位。
假设 Alice 想向 Bob 支付 1 ETH。Gas成本为 21,000 Gas。假设 gas 价格为 200 Gwei。
所以,gas fees = 21,000 * 200 = 4,200,000 Gwei = 0.0042 ETH
因此,当 Alice 汇款时,会从她的账户中扣除 1.0042 ETH,而 Bob 将收到 1 ETH。0.0042 ETH 费用归于挖掘包含 Alice 交易的区块的矿工。
您可能想知道 gas 价格是如何设置为 200 Gwei 的? Gas价格设置多少取决于用户。具有较高 gas 价格的交易具有更高的优先级被包含在一个区块中,因为矿工首先倾向于获得更高的小费。因此,Gas价格基本上就像公开拍卖或贿赂矿工一样。谁愿意向矿工支付最高价格或最高贿赂,他们的交易就会比价格较低的交易更快。
像 Metamask 这样的钱包可以根据当前网络条件为要执行的交易提供合理的 gas 价格估算——因此大多数用户不需要自己接触 gas 价格值。(不过,您可以通过 Metamask 设置启用修改)
当智能合约被编译成字节码时,在部署到以太坊网络之前,它会被编译成 OPCODES。这些是可以直接在以太坊虚拟机上运行的简单操作。您可以将它们视为可以直接在 Intel 或 AMD CPU 上运行的基本操作。这些 OPCODES 包括基本操作,如ADD
, MUL
, DIV
, SUB
,SHA3
等。
每个 OPCODE 都有固定的 gas 成本。智能合约中特定功能的 gas 成本是其所有 OPCODES 的 gas 成本之和。如果有兴趣,您可以在此处找到所有 OPCODE 及其相关 gas 成本的列表。
因此,与将 ETH 从一个账户转移到另一个账户这样的简单交易相比,需要更多操作码才能执行的更复杂的交易最终会使用更多的气体(单位)。
现在,您可以想象存在许多功能,这些功能比仅将 ETH 从一个帐户发送到另一个帐户要复杂得多。那些涉及循环,或随机性,或依赖于用户输入。
对于此类函数,可能很难准确预测执行所需的气体量,因为它取决于其他变量。
因此,您可以指定一个上限,而不是在决定为交易支付多少费用时指定确切的 gas 成本。
Gas Limit是指您愿意为交易使用的最大 Gas 量(单位)。这是由用户设置的。
同样,像 Metamask 这样的钱包提供了合理的估计。
如果您的交易使用的 gas 少于您的限额,则未使用的 gas 将退还到您的帐户。
因此,您的钱包在发送交易时必须有gas limit * gas price以太币来支付 gas。当交易被执行和开采时,任何未使用的 gas 都将被退还。
但是,如果您的交易使用的 gas 超过了您的限制,则交易将失败并且您的 gas 将消失。
除了用户指定的每笔交易的气体限制外,以太坊网络还对单个区块中允许的最大气体量(单位)施加了限制。
这样做是为了确保每个块都保持在允许的计算成本范围内。由于更复杂的事务需要更长的时间来执行,这可以确保节点不会由于计算复杂性的增加而开始与网络的其余部分不同步。
2021 年 8 月 5 日 - 伦敦升级在以太坊网络上实施。本次升级主要引入了三个好处:
就本文而言,我们主要对前两点感兴趣。
在伦敦升级之前,像 Metamask 这样的钱包会根据过去的网络活动提供对 gas 价格的估计。每个钱包都使用自己的方法来做到这一点。具体来说,Metamask 扫描了以太坊上的最后 1000 个区块,并预测了您交易的 gas 价格。
然而,从伦敦升级开始,每个区块都设置了基本汽油价格费用。这是将您的交易包含在此区块中的每单位 gas的最低价格。这是由网络根据对块空间的需求本地计算的。这些基本费用将继续被以太坊网络烧毁,因此永远摆脱该 ETH 以抵消发行。由于以太坊没有总体最大供应量(与比特币的最大供应量为 2100 万比特币不同),因此销毁有助于 ETH 供应量达到平衡,而不是无限膨胀。
除了基本费用外,还引入了小费(优先费用)的概念。随着基本费用被烧毁,提示用于补偿矿工执行和传播用户交易。大多数钱包都会自动设置,但您可以选择手动设置。更高的小费交易往往会获得更高的优先级。
此次升级后,gas 费用的计算公式更改为:
gas fees = gas spent * (base fees + priority fees)
回到前面的例子,如果 Alice 必须向 Bob 支付 1 ETH,那么 gas 成本(以单位为单位)为 21,000。假设基本费用为 100 Gwei,Alice 决定包含 10 Gwei 的小费。
total gas fees = 21,000 * (100 Gwei + 10 Gwei) = 2,310,000 Gwei = 0.00231 ETH
在伦敦升级之前,所有区块的区块气体限制是恒定的。每个区块的最大容量为 15M 气体。在需求量大的时候,这会导致糟糕的用户体验,因为区块正在满负荷运行,用户必须等待需求减少才能被包含在区块中。
升级为以太坊引入了可变大小的块。每个区块现在有一个15M gas的目标gas 限制,但大小可以随着网络需求而增加或减少,最高可达30M gas。
平均而言,网络通过修改区块大小和基本费用达到了 1500 万左右的平衡。
如果块气体大于 15M 目标,则增加下一个块的基本费用。同样,如果区块气体小于 15M 目标,则下一个区块的基本费用会降低。调整基本费用的金额取决于区块气体与 1500 万目标的距离。
花一些时间阅读最后几段并完全掌握它们 - 这是非常迷人的东西,但可能有点棘手。
让我们看看在高网络需求时基本费用会发生什么变化。
如果超过目标 15M gas,则每个区块的基本费用最多增加 12.5%。这种指数增长使得区块气体无限期地保持在高位在财务上是不可行的,因此允许节点与网络保持同步,而不是不断地执行 30M 的气体块。
在此示例中,第 2 块看到了从目标 15M 到 30M 的最大可能增长。结果,区块 3 的基本费用从 100 Gwei 增加到 112.5 Gwei,增加了 12.5%。
同样,由于区块 3 也达到了 30M gas 的最大限制,这是与目标的最大可能距离,因此区块 4 的基本费用再次增加了 12.5% 至 126.6 Gwei。等等...
这种情况一直在发生,到第 8 块时,基本费用为 202.7 Gwei。比 7 个街区前增加了 102.7%!到第 100 块时,基本费用为 10302608.6 Gwei——这太疯狂了(也是不现实的)。这意味着在区块 100 进行简单的 ETH 转账将花费您 (21000 * 10302608.6 Gwei) = 216 ETH。
由于基本费用呈指数级增长,因此可以注意到极不可能看到完整块的扩展峰值。
需要注意的是,基础费用也最多降低了 12.5%,帮助峰值在流量开始放缓后恢复平衡。
相对于 Pre-London 升级机制,这种基本费用机制的改变使得费用预测更加可靠。按照上表,要在第 9 个区块创建交易,钱包可以让用户 100% 确定地知道要添加到下一个区块的最大基本费用current base fees (base fees of prev block) * 112.5%
为=202.8 * 112.5/100
或228.1 Gwei
。相反,可以确定最低基本费用current base fees (base fees of prev block) * 87.5%
,因为知道减少只能是 12.5%: =202.8 * 87.5/100或177.45 Gwei
.
因此,钱包现在知道在提供估算时提供给用户的基本费用的最小和最大范围。最小值是current base fees * 87.5%
,最大值是 ,current base fees * 112.5%
然后用户可以调整矿工的小费,这通常是基本费用的一小部分。
汽油费有助于保持以太坊网络的安全。通过对网络上执行的每次计算收取费用,可以防止不良行为者向网络发送垃圾邮件。
为了避免智能合约中的意外或恶意无限循环,这将导致所有以太坊节点永远卡住,交易的气体限制设置了交易可以使用多少计算的限制。
像这样的代码将耗尽所有提供的气体,达到限制,然后交易将失败:
// 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),从而以牺牲安全性和去中心化为代价,进行了有利于降低费用的权衡。
以太坊的基本目标是成为一个能够执行智能合约的高度安全和高度去中心化的区块链网络。
但是,如果用户必须继续花费数百美元来移动一美元,那么这些都不重要。
因此,有很多事情正在进行中,其中一些已经可用,以降低 gas 费用并改善用户体验。
首先,以太坊 2.0(也称为 Eth2)将提供的网络升级最终将解决一些气体问题,这反过来将使网络能够每秒处理数千笔交易并在全球范围内扩展。
此外,在第 2 层扩展方面正在进行大量工作。稍后我们将更深入地了解第 2 层扩展和第 2 层平台,但本质上它们是将智能合约的繁重计算方面转移到其他地方的网络,并使用以太坊主网作为最终结算层,从而继承了安全性和以太坊的去中心化优势,并为用户保持低gas费和高交易速度。
推荐使用以下资源(但可选)阅读/查看以了解有关气体的更多信息:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!