交易gas

我们在 [gas] 中详细讨论_gas_。但是,让我们介绍有关交易的 gasPrice 和 startGas 字段的一些基本知识。

gas是以太坊的燃料。gas不是ether,它是独立的虚拟货币,有相对于ether的汇率。以太坊使用gas来控制交易可以花费的资源量,因为它将在全球数千台计算机上处理。开放式(图灵完备的)计算模型需要某种形式的计量,以避免拒绝服务攻击或无意中的资源吞噬交易。

gas与ether分离,以保护系统免受随着ether价值快速变化而产生的波动。

交易中的 gasPrice 字段允许交易创建者设置每个单位的gas的汇率。gas价格以每单位gas多少 wei 测量。例如,在我们最近一个例子创建的交易中,我们的钱包已将 gasPrice 设置为 3 Gwei(3千兆,30亿wei)。

网站 ethgasstation.info 提供有关以太坊主网络当前gas价格以及其他相关gas指标的信息:

https://ethgasstation.info/

钱包可以在他们发起的交易中调整 gasPrice,以更快地确认(挖掘)交易。gasPrice 越高,交易可能被验证的速度越快。相反,较低优先级的交易可能会降低他们愿意为gas支付的价格,导致确认速度减慢。可以设置的最低+gasPrice+ 为零,这意味着免费的交易。在区块空间需求低的时期,这些交易将被开采。

Tip

最低可接受的gasPrice为零。这意味着钱包可以产生完全免费的交易。根据能力的不同,这些可能永远不会被开采,但协议中没有任何禁止免费交易内容。你可以在以太坊区块链中找到几个此类交易成功开采的例子。

web3界面通过计算几个区块的中间价格来提供gasPrice建议:

  1. truffle(mainnet)> web3.eth.getGasPrice(console.log)
  2. truffle(mainnet)> null BigNumber { s: 1, e: 10, c: [ 10000000000 ] }

与gas有关的第二个重要领域是 startGas。这在 [gas] 中有更详细的解释。简单地说,startGas 定义交易发起人愿意花费多少单位完成交易。对于简单付款,意味着将ether从一个EOA转移到另一个EOA的交易,所需的gas量固定为21,000个gas单位。要计算需要花费多少ether,你需要将你愿意支付的 gasPrice 乘以21,000:

  1. truffle(mainnet)> web3.eth.getGasPrice(function(err, res) {console.log(res*21000)} )
  2. truffle(mainnet)> 210000000000000

如果你的交易的目的地址是合约,则可以估计所需的gas量,但无法准确确定。这是因为合约可以评估不同的条件,导致不同的执行路径和不同的gas成本。这意味着合约可能只执行简单的计算或更复杂的计算,具体取决于你无法控制且无法预测的条件。为了说明这一点,我们使用一个颇为人为的例子:每次调用合约时,它会增加一个计数器,并在第100次(仅)计算一些复杂的事情。如果你调用99次合约,会发生一件事情,但在第100次调用时,会发生完全不同的事情。你要支付的gas数量取决于交易开采前有多少其他交易调用了该功能。也许你的估计是基于第99次交易,并且在你的交易被开采之前,其他人已经调用了99次合约。现在,你是第100个要调用的交易,计算工作量(和gas成本)要高得多。

借用以太坊使用的常见类比,你可以将startGas视为汽车中的油箱(你的汽车是交易)。你认为它需要旅行(验证交易所需的计算),就用尽可能多的gas填满油箱。你可以在某种程度上估算金额,但你的旅程可能会有意想不到的变化,例如分流(更复杂的执行路径),这会增加燃油消耗。

然而,与燃料箱的比较有些误导。这更像是一家加油站公司的信用账户,根据你实际使用的gas量,在旅行完成后支付。当你传输你的交易时,首先验证步骤之一是检查它源自的帐户是否有足够的金额支付 gasPrice * startGas 费用。但是,在交易执行结束之前,金额实际上并未从你的帐户中扣除。只收取你最终交易实际消耗的天然气,但在发送交易之前,你必须有足够的余额用于你愿意支付的最高金额。