理解以太坊Gas

背景介绍

以太坊是一个区块链网络,而Ether(ETH)是这个网络的助燃器。当你发送Token、执行合约、转移ETH或者在此区块上干其他的。你必须为此计算而支出,此支出是通过 Gas计算,最终将gas以ETH支付。

需要注意的是,无论交易成功与否,你都需为此支付手续费。即使交易失败,可矿工还是得为此交易进行校验和计算,你占用使用了计算资源所以必须和成功的交易一样,为此支付手续费。

你可在 etherscan.io 上查看交易手续费(gas limit * gas price)的情况,在钱包中你是无法选择多少交易费的,因为实际交易费是矿工根据计算得出的,并记录在包含此交易的区块中。

概要

当你听到gas时,是在讨论两个东西:

  • Gas Limit
  • Gas Price

交易费计算就是Gas Limit*Gas Price。大家说“Gas”时,一般所值得是“Gas Limit”

你可以把gas limit看成是汽车所需多少升燃油。把gas price看成是燃油单价。

  • 对于汽车,每升(unit)汽油 ¥6.46 (price)
  • 对于以太坊,每gas( unit)20 GWEI (price)

继续想,就是:

  • 10升汽油就是 ¥64.6
  • 21000 个 gas 就是 20*21000 GWEI= 420000 GWEI= 0.00042 ETH

也就是说本次交易手续为 0.00042 Ether。

发送Token一般需要 ~50000 gas 到 ~100000 gas ,因此交易手续费增加到 0.001 ETH - 0.002 ETH

其中以太坊ETH到GWEI的转换关系是,这些多是以太币的计算单位:

  • Kwei(Babbage) = 10^{3} Wei
  • Mwei(Lovelace) = 10^{6} Wei
  • Gwei(Shannon) = 10^{9} Wei
  • Microether(Szabo) = 10^{12} Wei
  • Milliether(Finney) = 10^{15} Wei
  • Ether = 10^{18} Wei

Gas

Gas 是以太坊中一种特定的命名,表示执行一个操作所需要的多少计算工作。 比如要执行一次加密Keccak256将消耗30gas。在以太坊中每个操作动作都有对应的gas。更多内容可查看What is gas (StackExchange)

一般交易需要花费多少gas则取决于此完成此交易过程中的所执行的操作的累计gas。

Gas Limit

这个 gas limit之所以称之为limit是因为它代表的是你将为此次交易所支付的每单位gas的最大费用。以避免合约中的错误引起不可预计的开销,合约执行进入一个计算死循环就势必会1ETH…10ETH直至耗尽你的余额。

然而,一笔交易所必须支付的gas量已经在区块中通过该交易已执行的代码数记录。如果你不想支出太多在gas上,设置底的gas limit 是没有太多帮助的。你必须支付足够的gas已开销本交易所必要的计算资源,否则将出现一个 Out of Gas的错误。即使交易失败,你也必须为已占用的计算资源所支付手续费。

未使用的gas将在交易后返回给你。比如你发送 1 ETH 到另一个账户B,设置 gas limit 为 400000,将有 400000 - 21000 返回给你。然而如果你是发送 1 ETH 到一个合约且交易失败(说,投票已截止),400000 都会被用掉,没啥返还给你。

21000 是标准转账交易的gas limit。

Gas Price

如果你想让交易花费更少,你能够做的是降低你愿意支付的gas单价。这个价格会此交易影响的确认速度。

正常情况下

  • 50 GWEI Gas Price 几乎总能将你的交易放到下一个区块。
  • 20 GWEI 通常会把它放到未来的几个区块中。
  • 8 GWEI 通常会在未来几分钟内放入区块。

在Token创建后,因为抢购太疯狂

  • 50 GWEI 是创建Token时合同所定义的max gas price。高于这个限制的交易都会失败,交易前你得检查该Token中所设置最大燃油单价。
  • 50 GWEI 是你应该在抢购时所设置的燃油单价。
  • 如果你想在在Token创建期间发送交易(非Token创建),你有两个选择:等待一会儿直到Token创建结束,或者提高燃油单价超过50 GWEI。

提高gas price就能快速打包确认?降低gas price就会难以被确认?

交易手续费将归属于挖出本本区块的矿工。当矿工挖矿时,他需要决定哪些交易放入到区块中。可以不包含任何交易,也可以随机选择交易。为了鼓励让矿工将你的交易放入区块,你会考虑将燃油单价设置得足够高,已确保能优先放入区块。但这还是一厢情愿,这个最终取决于矿工。

大部分矿工遵循一个简单策略,将接受到的交易按燃油单价从高到底排列,依次放入区块中直到塞满区块,或者直到以低于矿工所设置的燃油单价底限。

设得足够高的燃油单价交易会在下一个区块中。如果你着急,高燃油单价会使得你的交易排在别人前面。如果不着急,你只需设置一个足够让矿工包含你交易的燃油单价即可。

为何要设置低gas price?

因为以太坊的价格是浮动的,相对人民币随时都涨跌20%。按人民币考虑,相对于之前的交易,10 gas price 相当于 ¥ 0.3。而现在可能即使 ¥0.4了。所以需要根据实际情况,尽量调低 gas price 。

而当网络中大部分交易都是低gas price时,矿工也会去调整他的底限。

到底设置多少 gas price 合适

可以看这个网站:http://ethgasstation.info

它将告诉你现在整个以太坊的情况,并给你建议的 gas price。

关于作者

虞双齐,一名全栈开发工程师,#热爱编程、#工具控、#爱读书、#宅男

活跃在 知乎,开源项目在Github,博文分享在 个人博客上。