主页 > 官网imtoken安卓版 > 深入理解以太坊Gas机制:从概念起源和21个EIP说起

深入理解以太坊Gas机制:从概念起源和21个EIP说起

官网imtoken安卓版 2023-06-26 08:16:03

gas费问题是目前以太坊1.0链面临的最严重的问题之一。 以太坊虽然算力很大,但是任务容量大是因为区块链的结构问题(每个全节点计算的数据一样,所以任务很仓促)。 单个节点的计算资源),以太坊在处理大量任务时会出现拥塞,拥塞后gas费会很高。

DeFi 应用的爆发式增长加剧了这种现象。 这里要提一下的是,以太坊除了对区块链交易进行封装外,还会在链上发布智能合约,所以智能合约在链上执行时会消耗资源,所以用户在DeFi中几乎每一步操作,都需要支付Gas费用,这也是 Gas 模型的一个问题。

最近,以太坊社区对EIP-1559的讨论也更加激烈,因为很多矿池不同意部署这个提案。 该提案调整了 Gas 费用的构成。 虽然不能解决Gas费高的问题,但是可以增加Gas费的成本。 期待,完美体验。

还有最近的相关新闻。 3 月 16 日,以太坊开发者 Philippe Castonguay 提出了另一项提案 EIP-3382,提议将区块 Gas 上限固定为每个区块 12,500,000 Gas。 并更新区块验证规则,如果gas limit不等于12,500,000,则该区块无效。 这是为了对区块gas limit达成共识,不受矿工限制。

在原有规则中,区块gas limit是以太坊中唯一不由节点共识决定的数据部分,是矿工选择的参数。 他认为这是一个关键参数,需要节点达成共识,以避免少数参与者对网络其余部分施加任何突然的有害变化。

像EIP1559和EIP-3382这样调整gas fee的提案很多,因为gas fee在以太坊的运行中占有重要地位,所以关于gas fee的历史故事很多。 如果你浏览所有关于gas费的新闻,可以发现要解决gas费并不容易。

今天White Project团队会在文章中为读者提及所有以太坊gas费相关的信息,包括设计变更、EIP改版等,希望对大家有所帮助。

如果想了解gas fee,可以从TXStreet的动图上形象地理解。

深入理解以太坊 Gas 机制:从概念起源和 21 个 EIP 开始

TXStreet 将以太坊区块打包过程可视化为运输

如果把block packaging抽象成一个car-carrying的过程,会遇到路宽有限,car capacity有限等因素,所以在进入car的过程中会有竞争,可以理解为最高的那个价格,平均成本也将因拥堵而“抬高”。

汽车行驶的道路是基础资源,需要交“过路费”才能覆盖,而打包所需的gas费就是“gas费”,羊毛出在羊身上,gas费就用上了最终支付“通行费”。 所以Gas费(Gas fee)是以太坊资源使用的最终支付。

早期关于Gas的第一把钥匙

Gas的概念来源于计算机领域。 它可以在以太坊中看到。 它首先来自以太坊黄皮书。 黄皮书的作者是Polkadot的创始人Gavin。 是一个任意值,因为理论上有更多的交易要覆盖,最多 2^256(它可以覆盖几乎与已知宇宙中的原子一样多的交易)。

虽然设计是无限的,但处理能力是有限的。 在 Geth 1.6 版本中,Gas 计算被切换为使用 64 位值,这样 Gas 限制为 64 位的单个区块可以容纳 44 倍于人体红细胞数量的交易。 但这是理论,实际情况相差甚远。

在这个版本确定之前,还有一个有趣的细节。 在 Vitalik 设计的以太坊 Gas 模型中,合约中默认了 gas 费用支付流程,即在合约执行过程中,合约中的余额会减少。 如果因执行消耗导致余额不足,合约将被暂停。

sitecsdn.net 以太坊和以太币的关系_以太坊和以太经典是什么关系_以太坊的定义

深入理解以太坊 Gas 机制:从概念起源和 21 个 EIP 开始

早期以太坊合约执行设置的内置扣除

后来Gavin开始参与以太坊,进入后修改了Gas的支付机制,从这个合约执行支付变成了transferer payment,即contract executor payment。 Vitalik 描述了从“合同支付”方式到“发送方支付”方式的转变,即用立即获取少量 ETH 代替每个单独的交易步骤。

深入理解以太坊 Gas 机制:从概念起源和 21 个 EIP 开始

以太坊早期,Vitalik 和 Gavin 参加迷你黑客马拉松,中间的高手是 Jeffrey

这是一个比较容易理解的“Gas费支付”。 如果要剖析更详细的部分,就得看黄皮书中Gas的相关部分了。

Gas 是以太坊所有计算的计算单位。 你想在以太坊上执行的计算越多,你需要支付的 Gas 就越多。

这种用户付费的方式可以避免资源滥用。 可以这么理解,一旦开发者为每个操作付费,他们就会把代码写得尽可能的简洁高效。 另外,Gas的存在也可以防止攻击者通过无效的操作(所以很多操作都需要消耗Gas)。 泛洪攻击方网,下面统计的一个EIP是为了增加账户访问的gas值,降低被攻击的可能性。

除了知道在哪里支付 Gas 之外,我们还需要了解 GasPrice 和 GasLimit。

GasPrice 是交易发送方愿意支付的每单位 Gas 的价格(以 Wei 为单位),交易发送方可以自定义交易发送方愿意支付的每单位 Gas 的价格。 假设一笔交易花费10个Gas,发送方愿意支付3 Wei/Gas,那么这笔交易的总费用为30 Wei,我们使用的钱包中会有高级选项来调整Gas费。

GasLimit 是交易发送方可以接受以执行交易的最大 Gas 数量。 如果没有 GasLimit,发送方的账户余额可能会被误耗尽。 GasLimit 是一种安全机制,可以防止账户中的所有 ETH 被消耗掉。

另外,GasLimit也可以定义为预付Gas。 节点在验证交易时,首先通过 GasPrice 乘以 GasLimit 来计算交易的固定成本。 如果交易发送方的账户余额小于交易的固定成本,则交易被视为无效。 交易执行后,剩余的Gas会返还给发送方的账户,这也是为什么我们在使用MetMask执行合约时,预估Gas非常昂贵,但执行价格并没有那么高的原因。

深入理解以太坊 Gas 机制:从概念起源和 21 个 EIP 开始

块中包含的内容

这是块中的固有内容。 交易部分,转账237笔,内部合约交易39笔。 如果您具体查看交易,您可以看到更详细的 gas 成本。 还可以看到gas limit为12493113,在文章开头提到的EIP-3382中,每个区块的Gas limit被限制为12500000,也就是这部分。 这样,每个区块获得的奖励总和就会更加可控。

以太坊和以太经典是什么关系_以太坊的定义_sitecsdn.net 以太坊和以太币的关系

关于ETH1.0链,每个操作代码都有gas费计算,我们截取了价格较高的部分供读者参考。 操作码最终决定了链的执行和资源的使用。 例如,一个基本的想法是,如果你创建一个合同。 成本计算如下:

固有成本 = Gtransaction + Gtxdatazero * Nzeros + Gtxdatanonzero * Nnonzeros + Gtxcreate

在:

您可以在以下操作码上就座。

深入理解以太坊 Gas 机制:从概念起源和 21 个 EIP 开始

以太坊1.0链运行代码对应的gas值消耗

根据上面的介绍,我们可以得到的基本理解是,Gas费是使用以太坊链上的资源产生的。 计算越多,Gas越高。 在智能合约合约运行中,每个单独的步骤都需要支付Gas。 另外需要补充的是,如果发送方将Gas设置的很高,矿工会优先执行交易,因为矿工可以选择先打包某些交易。

21 个与 Gas 费密切相关的 EIP

接下来,我们可以详细了解一下关于 Gas 的 EIP 提案。 提案大致按时间顺序排列。

EIP-5:调整RETURN和CALL的gas使用量

这个 EIP 可以调用返回字符串和其他动态大小数组的函数。 目前,当从以太坊虚拟机中调用另一个合约/函数时,必须预先指定输出的大小。 您还必须为未写入的内存付费,这使得返回动态大小的数据非常昂贵且不灵活,以至于几乎无法使用。 这个EIP提出的解决方案是只为CALL返回时实际写入的内存付费。

EIP-150:大量 IO 操作的 Gas 成本变化 EIP-158:状态清算

无论如何,调用余额等为0的账户将不再消耗25,000个账户创建Gas的成本

EIP-1108:降低 alt_bn128 预编译 Gas 成本

预编译椭圆曲线计算目前定价过高。 重新定价预编译将对以太坊上的许多隐私和扩展解决方案大有帮助。 对于基于以太坊的 zk-SNARK 协议,EIP-1108 不仅可以大大降低验证 zk-SNARK 的 gas 成本,还有助于批量合并多个 zk-SNARK 证明。 这也是一种技术,可用于将单片 zk-SNARK 电路拆分为一批具有更小单个电路尺寸的 zk-SNARK,这使得两个 zk-SNARK 更易于构建和部署。

以太坊的定义_以太坊和以太经典是什么关系_sitecsdn.net 以太坊和以太币的关系

目前,这些交易花费了大约 6,000,000 Gas。 这个 EIP 可以减少到 1,000,000Gas,这使得协议更加实用。

EIP-1283:SSTORE操作码的gas调整

该 EIP 提议对 SSTORE 操作码进行计量更改,以启用合约存储的新用途,并减少与大多数实现方式不匹配的过度 gas 成本。 这可以作为 EIP-1087 的替代方案,在 EIP-1087 中以太坊的定义,它尝试使用不同的优化策略来更易于实现以更改缓存。

EIP-2028:降低交易数据 gas 成本

建议将Calldata(GTXDATANONZERO)的Gas成本从目前的68字节降低到16字节,并通过数学建模和经验估算来支持。

EIP-2200:净燃气计量的结构定义

该 EIP 为 SSTORE 操作码提供了净 gas 计量变化的结构化定义,支持合约存储的新用途,并在与大多数实施方式不匹配的情况下减少过多的 gas 成本。 这可以被认为是 EIP-1283 和 EIP-1706 的组合。

EIP-2565:ModExpGas 成本

为了准确反映ModExp预编译的实际运行成本,本EIP规定了计算gas成本的算法。 该算法估计乘法复杂性成本并将其乘以执行求幂所需的迭代次数的近似值。

EIP-1559:ETH 1.0 链的手续费市场变化

以太坊使用简单的拍卖机制以历史价格为交易费用定价,用户发送带有出价的交易(“Gasprices”),矿工选择出价最高的交易,并以指定的出价支付包含的交易。 这导致效率低下。

该 EIP 中的提议是从基础费用金额开始,该费用金额由协议根据网络拥塞情况向下调整。 当网络超过每块 Gas 的目标使用量时,基本费用会略有增加,而当容量低于目标量时,基本费用会略有下降。

由于这些基本费用的变化是有限的,因此不同区块之间基本费用的最大差异是可以预测的。 然后,这允许钱包以高度可靠的方式自动为用户设置汽油费。 预计即使在网络活动期间,大多数用户也不必手动调整汽油费。 对于大多数用户,基本费用将由他们的钱包估算。

EIP-2929:状态访问操作码的 gas 成本增加

将 Gas 成本 SLOAD (0x54) 增加到 2100,*CALL 操作码系列(0xf1、f2、f4、fA)、BALANCE 0x31 和 EXT* 操作码系列(0x3b、0x3c、0x3f)和 2600 无 CD (i) 预编译。 此外,可以改革 SSTORE 计量以确保正确定价这些 SELFDESTRUCT 操作码中固有的“实际存储负载”。

sitecsdn.net 以太坊和以太币的关系_以太坊和以太经典是什么关系_以太坊的定义

通常,操作码的 gas 成本的主要功能是估计处理该操作码所需的时间,目标是使 gas 限制与处理块所需的时间限制相对应。 然而,存储访问操作码(SLOAD,以及 CALL、BALANCE 和 EXT 操作码)历来被低估。 在 2016 年上海 DoS 攻击期间,在修复了最严重的客户端错误之后,攻击者使用的一种一直有效的策略就是简单地发送可以访问或调用大量帐户的交易。

提议的 EIP 将这些操作码的成本增加了大约 3 倍,将最坏情况下的处理时间减少到大约 7-27 秒。 数据库布局的改进包括重新设计客户端直接读取存储而不是跳转到 Merkle 树应该会进一步减少这种情况,尽管这些技术可能需要很长时间才能完全铺开,而且即使有了这种技术,访问 Storage IO 的开销也会增加仍然很大。

EIP-1077:合约调用的气体中继

采用 DApp 的主要障碍是需要多个代币来执行链操作。 允许用户签署消息以显示执行意图,但允许第三方中继器执行消息可避免此问题,尽管以太坊交易始终需要 ETH,但可以使用 EIP-191 签署智能合约,并且远期付款激励不受 ETH 方信任执行交易。 它们可以标准化的通用格式,以及用户允许使用代币支付交易的方式,为应用程序开发人员提供了很大的灵活性,并且可以成为应用程序用户与区块链交互的主要方式。

EIP-1087:SSTORE 操作的燃气计量

该 EIP 提议更改 EVMSSTORE 操作的 gas 收费方法,以减少不必要的 gas 成本并为合约存储提供新的用例。

EIP-1285:将 GcallstipendGas 添加到 CALL 操作码

Gcallstipend 将 CALL 操作码中的费用参数从 2,300 增加到 3,500 Gas 单位。

EIP-1380:降低内部调用的 Gas 成本

降低内部调用的 gas 成本将大大受益于 Solidity 和 Vyper 等智能合约语言,使它们可以使用 CALL 而不是 JUMP 内部操作调用来使用操作码。

EIP-1613:加油站网络

通过允许合约接受 COI 和支付 Gas,让非 ETH 用户可以访问智能合约(例如 dapps)。

目前与 dapp 通信需要向 ETH 支付 gas 费用,这将 dapp 的采用仅限于以太坊用户。 因此,合约所有者可能希望支付 gas 以增加用户获取,或者让他们的用户以法定货币支付 gas。 或者,第三方可能希望补贴某些合同的天然气成本。 EIP-1077 中描述的解决方案可以允许来自不包含 ETH 的地址的交易。

EIP-1930:CALL 具有严格的 gas 语义。如果没有足够的 Gas,则恢复

添加智能合约功能以使用特定数量的 Gas 执行 CALL。 如果这不可能,则应返回执行。

以太坊和以太经典是什么关系_以太坊的定义_sitecsdn.net 以太坊和以太币的关系

EIP-2045:EVM 操作码的粒度 gas 成本

相对于用于存储操作码(SLOAD、SSTORE 等)的 I/O,计算性 EVM 操作码(ADD、SUB、MUL 等)通常被高估。 目前,最小的 gas 成本是 1(即一个单位的 gas),而大多数计算操作码的成本接近 1(例如 3、5 或 8),因此您可以将成本降低多少是有限的。 一个新的最小气体单位,称为“颗粒”,是气体的一小部分,它将扩大气体成本的范围,因此它们可以降低到当前的最小值以下。

EIP-2046:减少静态调用预编译的 gas 成本

将调用预编译的 STATICCALL 基础气体成本从 700 次减少到 40 次。这将允许更有效地使用预编译,并且总成本低于 700 次预编译。

EIP-2542:新操作码 TXGASLIMIT 和 CALLGASLIMIT

允许智能合约访问有关当前交易和执行框架的气体限制的信息。 随着中继、元交易、gas 费和账户抽象等概念的流行,某些合约能够绝对精确地跟踪 gas 支出变得至关重要。

EIP-3322:账户气体存储操作码

Gas 供应弹性和价格稳定是通过将​​ Gas 从需求较少的区块转移到需求较大的区块来实现的。 不幸的是,这会奖励不必要的状态增长。 通过引入先进的气体存储机制,气体市场将需要更少的存储和计算。

EIP-2780:减少内部交易 gas

将内部交易的成本从 21,000 Gas 降低到 7,000 Gas。

当前 21,000 笔交易的固有 gas 成本使得发送 ETH 非常昂贵,而小批量(数十美元)的成本往往高得令人望而却步。 虽然其他 EIP(例如 EIP-1559)也考虑了天然气价格和首次拍卖价格的变化,但如果以安全的方式进行,大幅降低发送 ETH 的成本并实现更多此类交易将是积极的。

第二把钥匙:Rollup 和 Gas

早期的 Gas 故事是关于以太坊 Gas 费用模型的制定。 目前,除了降低Gas费外,扩大和降低Gas费的最佳方式是压缩交易数据。

这与 Rollup 有很大关系。

一个简单的以太坊交易(发送 ETH)大约需要 110 个字节。 但是,Rollup 中的 ETH 传输只需要 12 个字节,因此 Rollup 可能会将基础链的扩展性提升 10 倍左右,在具体计算中,使用 Rollup 甚至可以提升 100 倍以上的扩展性。

这是一个绝对令人印象深刻的成就,这也是为什么 Eth2.0 成为了以 Rollup 为中心的发展路线。

Gas费调整是一个长期的概念和过程。 它是无数以太坊工程师修复细节的结果。 如果只看单个GasEIP的调整以太坊的定义,还不足以感受到gas fee的重要性和gas fee调整的难度。 不过可以肯定的是,以太坊Gas问题的最终解决方案一定是Eth2.0,请保持期待的心。