un.Block

Posted on Oct 09, 2021Read on Mirror.xyz

Gas Fee 燃油费机制

⛽️ 为什么需要支付 Gas Fee

在 Ethereum 网络以及其他的区块链网络,当你进行转账、通过合约发送代币或在区块链网络上进行任何其他操作的时候,你必须为该运算付费,交易的手续费以 Gas 进行计算,通过 Ether(该网络下的主代币) 支付 Gas Fee(燃油费)。一笔交易的 Gas Fee 可通过 Gas Price(油价) 和 Gas Limit(油量限制) 计算得出。

Gas Price

Gas Price(油价) 是每单位 Gas 的价格,它的计价单位是 Gwei(1 Gwei = 0.000000001 ETH,10 的负 9 次方)。假如 Gas Price 设定为 40,每一 Gwei 就是 0.00000040 ETH。

Gas Price 受网络拥挤程度的影响,当网络资源充裕的时候,Gas Price 低,交易手续费低;当网络拥挤不堪的时候,Gas Price 的价格可以飞上天,不同链的网络情况都不同,因此 Gas Price 都不一样。

Gas Price 的高低决定了交易被矿工打包的快慢,矿工更倾向于先打包 Gas Price 高的交易(钱能使得鬼推磨)以获取更高的挖矿收益。因此,假如你想让交易更快被执行(抢购、恐慌抛售的时候),Gas Price 越高越好,有的时候为了抢购,人们甚至付出比物品价格更高的 Gas Price 来贿赂矿工;假如你想省钱,例如朋友之间转账(不追求到账速度),你可以降低你的 Gas Price,但这样会使交易变慢,要注意的是,过低的 Gas Price 可能导致交易的失败或一直等待,阻塞后续交易。

在阻塞状态下,你可以通过向自己发起一笔0元转账,指定相同的 Nonce 值,支付手续费,以消除阻塞状态。

需要注意的是,在目前的机制下,交易失败,Gas Fee 是不返还的,因此切勿为了省钱设置过低的 Gas Price,这样会导致交易失败或阻塞;交易阻塞后还需要再支付一次手续费消除阻塞,得不偿失。

Gas Limit

Gas Limit(油量) 是你愿意为一笔交易花费的最大数量的 Gas 单位。在去中心化网络中的每一步运算都要消耗 Gas ,Gas Limit 决定了你计划使用的计算资源的上限。

一般的标准交易的 Gas Limit 为 2100,假如 Gas 耗尽了,但运算未完成,交易会因为 “Out of Gas” 而失败(没油了,跑不动了);假如运算在 Gas 耗尽前完成,已消耗的手续费会被矿工收取,未消耗的部分将不会被收取。

因此,一笔交易最高被收取的手续费是 Gas Price * Gas Limit;目前 ETH 网络上每一个区块的 Gas Limit 是 15,000,000 (上段时间经过投票,从 12.5M 提升到了 15M ),区块 Gas Limit 的提升意味着每个区块能存放更多的交易内容,一定程度上降低了 Gas Price。

在智能合约开发中,Gas 消耗也是需要被考虑的在内的因素(每一步运算都在烧钱),死循环、无意义的操作会导致 Gas 的浪费;代码审计中也会找出合约代码中浪费 Gas 的操作。

Tx Fee

Tx Fee = Gas * Gas Limit

Tx Fee 就是最终消耗的交易手续费。

每条链都有自己的 Sacn 工具,以 Ethereum 为例,在 Etherscan 上可以查看全部实时交易记录,每一条录上都记录着 Gas Price、Gas Limit、Tx Fee 等信息。

总结

ETH 网络一直以拥堵出名,UniSwap 空投派钱、CryptoKitties 游戏火热的时候 Gas Price 更是贵上天,庆幸有 ETH 的网络升级和区块 Gas Limit 的上调使 Gas Price 有所回落。相比 ETH,BSC(Binance Smart Chain)的 Gas Price 要低得多。Gas Price 也是影响用户选择使用什么网络的一个重要因素,毕竟谁也不想支付过高的交易手续费。

相关阅读

Ethereum: GAS AND FEES

YouTube: What is Ethereum Gas?

区块链开发:OpenZepplin 发布 4.1

知名智能合约开发库 OpenZepplin 近日发布了 4.1 的版本更新,有如下亮点:

  1. 受以太坊柏林升级的影响,OpenZeppelin 用 UUPSUpgradeable 代替 Transparent Proxy 以降低 Gas。
  2. 发布 Multicall,用户可以在一笔交易中底层调用(call)个多个函数。
  3. ERC20FlashMint 实现了 ERC3156,支持 flashLoan 和 flashMint。

官方更新日志:OpenZeppelin Contracts 4.1