Gas 是指在以太坊网络上执行特定操作所需的计算工作量。
由于每笔以太坊交易都需要计算资源才能执行,每笔交易都需要付费。 在这个方面上,Gas 是指在以太坊成功进行交易所需的费用。
本质上,Gas 费用是以太坊的货币以太 (ETH) 支付的。 Gas 价格以 Gwei 标明,Gwei 本身就是 ETH 的一个单位――每个 Gwei 等于 0.000000001 ETH (10-9 ETH)。 例如,您可以说您的 Gas 成本为 1 Gwei,而不是说您的 Gas 成本为 0.000000001 以太。 “gwei”一词本身表示“giga-wei”,等于 100,000,000 wei。 Wei 本身(以 b-money 的发明者 Wei Dai 命名)是 ETH 中最小的单位。
伦敦升级 于 2021 年 8 月 5 日 实施,目的是通过彻底改造以太坊的交易费用机制,使用户更容易预测以太坊的交易费用。 这一升级带来的更高一层的收益包括更好地估算交易费,通常会加快纳入交易,并通过燃烧一定比例的交易费来抵消 ETH 的发行。
从伦敦网络升级开始,每个区块都有基本费,由网络根据区块空间需求来计算每单位 gas 最低价格。 由于交易费的基本费会被燃烧掉,因此用户还要在其交易中设定一个小费(优先费)。 小费用于满足矿工执行和广播包含用户交易的区块,预计将由大多数钱包自动设置。
交易总费用的计算用如下所示:Gas 单位 (限额) * (基本费用 + 小费)
假设 Jordan 需要向 Taylor 支付 1 ETH。 在交易中,矿工报酬限额为 21,000 单位,基本费用的价格是 100 gwei。 Jordan 支付了 10 gwei 作为小费。
使用上面的公式,我们可以计算 21,000 * (100 + 10) = 2,310,000 gwei 或 0.00231 ETH。
当 Jordan 发送钱时,将从 Jordan 账户中扣除 1.00231 ETH。 Taylor 将获得 1.0000 ETH。 矿工得到 0.00021 ETH。 0.0021 ETH 的基本费用被燃烧。
此外,Jordan 还可以为交易设定最高费用 (maxFeePergas)。 最高费用与实际收费之间的差额将归还给 Jordan。如: 退款 = 最高费用 - (基本费用 + 优先费)。 Jordan 可以为执行交易费用设定一个最高金额,而不必担心在执行交易时“超额”支付基本费用。
伦敦升级在以太坊中引入了大小可变区块。 每个区块的目标大小为 1500 万 gas,但区块的大小将根据网络需求增减。最多到 3000 万 gas 的区块限制(目标区块大小的 2 倍)。 该协议通过 tâtonnement 的过程使区块大小平均达到 1,500 万。 这意味着如果区块大小超出目标区块大小,协议将增加以下区块的基本费用。 同样,如果区块大小低于目标区块大小,协议将减少基本费用。 基本费用的调整金额与当前区块大小和目标区块大小的差距是成比例。
在伦敦升级中执行 EIP-1559 使得交易费机制比以前的 gas 竞价招标更加复杂,但优点是提高 gas 费用的可预测性,从而使交易费市场更加有效。 用户可以在提交交易时设定 maxFeePergas
,表示他们愿意为执行交易支付多少费用,同时清楚该数额不会超过 gas 的市场价格 (BaseFeePergas
),并且获得减去小费后的剩余退款。
为什么存在 GAS 费用?
简而言之,Gas 费用有助于确保以太坊网络安全。 在网络上执行的每次计算都需要收费,这样可以防止参与者对网络造成垃圾信息。 为了防止代码中无意、恶意的无限循环或其他计算浪费,要求每个事务对代码可以执行的计算步骤设置一个限制。 基本计算单位是“gas”。
尽管交易中包含费用限制,但交易中未使用的 gas 将退还给用户(如:返还最高费用 - (基本费用 + 小费))。
什么是 GAS 限额?
Gas 限额是指您愿意在交易中消耗的最大 gas 数量。 涉及智能合约的更复杂交易需要更多的计算工作,因此相比较简单的支付,它们需要更高的 gas 限额。 标准的 ETH 转账一般要求 gas 的限额为 21,000 单位。
例如,如果您对简单的 ETH 转账设置 50,000 gas 限额。EVM 将消耗 21,000,您将收到剩余的 29,000。 然而,如果您设置的 gas 太少,比如说,对于简单的 ETH 转账,gas 限额为 20,000。EVM 将消耗您 20,000 gas 试图实现交易,但不会完成。 然后,EVM 会恢复所有变化,但由于矿工已经完成了价值 20k gas 的工作,所以 gas 被消耗掉了。
Gas Price决定你的交易走多快(多快被矿工打包),
Gas Limit 决定你的交易可以走多远(可以运行多么复杂的合约)。
怎样合理设置Gas Price和Gas Limit?
如果你是一个普通用户,那么你不需要考虑这些问题。譬如imtoken,比特派这样的钱包,在转账时会根据当前网络状态帮你自动计算推荐矿工费,为你设置当前最合理的Gas Price 和 Gas Limit。
如果你是一个不甘心做普通用户的普通用户,那我就带你一起琢磨一下
首先设置的矿工费= 设置Gas Price * 设置Gas Limit
虽然把Gas Price 和 Gas Limit 任意一个数值降低你的矿工费的值都会降低,但是最好不要随意降低 Gas Limit 。正确降低矿工费的方法应该是调低 Gas Price。
因为降低 Gas Limit不仅不会给你省钱,还会徒增你交易失败的概率,同时你也知道,交易失败后的矿工费是不会退还的,所以千万不要随意降低 Gas Limit,这是很不明智的一种行为。
为什么交易在区块链上会失败,提示Out Of Gas?
Out Of Gas 就是指上面的第三种情况,Gas Limit < Gas Used,即预设的Gas不够实际使用的,这种情况在按钱包或者交易所推荐的预设Gas费下基本上都不会发生,如果发生,通常只会发生在以下几种情况之下:
1、以太坊线上交易量太多,太拥堵,你的交易可能是因Gas Price设置得太低而被遗忘所以被迫交易失败
2、在去中心化交易所的交易池内交易时,池内筹码比例变化得太快,你的交易自发出那一刻就已经是不成立了,所以会交易失败
3、智能合约不够健全,项目方太应付,没有提前预设返回Gas Limit 值,导致我们的钱包设置了错误的Gas Limit数据
解决办法:
1、在以太坊拥堵时候,要想交易成功迅速,就是要设置高额一点的Gas Price
2、在筹码比例变化快的池子内交易,你的交易速度,也就是你交易时选择交易数额已经输入密码的手速要快一些,这样还能大致跟得上流动性池子内的变化
3.如果是项目智能合约不健全,首先要考虑的是这个项目还值不值得去参加,最基础的交易Gas Limit 值都不能提前反馈,技术与审查实在是不到位;如果接受项目,要想交易成功,那你就要设置尽可能高的Gas Limit 值,多试几次,这由于是项目技术本身的不到位,所以并没有什么更好地办法
设置Gas Limit是不是越高越好?
前面说当Gas Limit > Gas Used 时,即预设的Gas没有完全消耗完,多设置的的部分Gas还会返还给我们。
所以很多人就会想,那我设置尽可能高的Gas Limit岂不是万无一失了?反正用不完的会还我。实际上过高的Gas Limit并不会提高你的交易速度。反而会给你带来风险。
因为以太坊每个区块可以处理的交易也是有限的,因此矿工需要在有限的交易数中获得更高的收益,而过高的Gas Limit在矿工眼中属于画大饼的行为,他们并不喜欢这种泡沫,会宁愿去选择数据更实在单价更高的交易,从而去实打实地填满一个区块,并且部分的挖矿策略中还会后置处理Gas Limit过高的交易。
而且,Gas Limit的存在可以有效的防止一些合约死循环漏洞去恶意消费你的矿工费,如果你设置了过高的Gas Limit,恰巧又碰到了有问题的合约,那么你Gas将会一直消耗下去,直到设置的Gas Limit将会被消耗光,这将是得不偿失的。
结语
现阶段高额的Gas费用将会是以太坊交易中一直存在的大问题;怎样去合理地设置Gas费,将会帮助我们去进行更精确的交易费用支出;但我们相信在以太坊2.0到来之后,以太坊能真正履行区块链去中心化交易的速率与低手续费,从而真正达到交易的性价比。
Gas 价格指示器,它的作用是告诉你,你设置多少的 Gas Price,就能让自己的交易在自己想要的时间内被打包。比如下图展示的就是生态里可能是最常用的 Gas 价格指示器:Gas Station。
它的大意是说:如果你想要自己的交易在 2 分钟之内被打包,那就要设置 118 Gwei 乃至更高的 Gas 价格;如果你只需要它在 5 分钟之内被打包,那设置成 95 Gwei 以上就好
大多数像你我一样的用户,在使用 Gas Station 时都不会发觉有什么问题。但是,假如你要做高频的交易呢?或者假如你要写一个交易机器人呢?Gas Station 真的可以依赖吗?
在以太坊协议中,一个账户发起的交易是有顺序的,由一个只增不减的流水号 nonce 来标记顺序;当你的前序交易因为 Gas Price 太低而被出块节点丢弃的时候,不论你给后序交易设置再高的 Gas Price,都于事无补,因为节点不能越过前序交易直接打包后序交易,但是前序交易已经丢弃了,这就等于使你的账户锁死了。唯一的解救办法就是找回你最早一笔还未上链的交易,使用这笔交易的流水号重发一笔交易,并且 Gas Price 要足够高。同样地,许多交易机器人也因为同样的原因被卡,原因就是因为它们依赖的 Gas 价格报告器对网络 Gas 价格的预估有误,发出几笔交易之后,机器人就卡死了。
这些血淋淋的教训充分说明了,为每一笔交易安排合适的 Gas 价格,有多么重要。因为当链上应用活跃的时候(比如前一段时间的 Yield Farming 热潮),一笔交易的成功不仅会影响这笔交易,还会影响后序交易。
但是,是什么阻碍了我们获得准确的 Gas 价格估计呢?我们能克服吗?
在最根本上来说,阻碍我们的是区块链网络的点对点网络架构:所有节点都是分散的,当某一笔交易被发送到一个节点时,该节点做一定的校验之后会把交易数据广播给其它节点;这种网络结构决定了,没有任何一个节点能实时获得整个网络的未处理交易的全局状态,交易的传播需要时间,也需要偶然(某些节点可能会用更高的 Gas Price 作为门槛、拒收低手续费的交易来保护自己)。对于这一点,我们只能改善,不可能从根本上克服,因为我们不想要一个中心化的网络结构。
但另一方面,至关重要的是我们预估 Gas 价格的方法。目前为止,绝大部分 Gas 价格指示器所用的方法,都是根据过去一段时间里被打包到区块里的交易的 Gas 价格加以统计方法处理,得出对未来 Gas 价格的估计。仔细想想这其实很不合理,在你发交易的这一刻,决定你的交易多快能上链的是现有未处理交易中比你交易的 Gas 价格更高的交易有多少,以及在你的交易还未打包的这段时间里有多少人发出了比你的 Gas 价格更高的交易。拿已经上链的交易,也就是历史数据,去做这样的预估,貌似合理,实则荒谬。当网络活动快速增加、Gas 价格快速攀升的时候,按历史数据估计的方法大概率只能给出低估的 Gas 价格。更准确的估计应该基于现有未处理交易的 Gas 价格分布,哪怕还需要统计方法处理,也会比拿历史数据来估计要更简单。
这就是 GasNow 厉害的地方。它不再基于历史数据来预测未来,它基于星火矿池节点的交易池中交易的 Gas 价格分布。为了收益的最大化,矿池一方面要尽可能地收集交易,另一方面,要从高到低打包交易池中待打包的交易。所以,GasNow 给出的数据,是真正具有参考意义的。