gas成本限制和gas耗尽

在发送交易之前,发起方必须指定gas limit - 他们愿意购买的最大gas数量。他们还必须指定gas price - 他们愿意为每单位gas支付的以太价格。

以ether计算的`gas limit * gas price`在交易执行开始时从发起方的账户中扣除作为存款。这是为了防止发送者在执行中期“破产”并且无法支付gas费用。由于这个原因,用户也无法设置超出其帐户余额的gas限制。

理想情况下,发起方将设置一个高于或等于实际使用的gas的gas限制。如果gas限制设置高于消耗的gas量,发货人将收到超额金额的退款,因为矿工只获得他们实际工作的补偿。

在这种情况下:

`(gas限制 - 多余gas)*gas价格以太以矿块作为块奖励

(gas limit - excess gas) * gas price ether作为矿工的区块奖励

excess gas * gas price ether退回发起方

但是,如果使用的gas超过规定的gas限制,即如果在执行期间交易“runs out of gas”,则操作终止。虽然交易不成功,但由于矿工已经完成了计算工作,不会退回发送人的交易费用,矿工因此得到补偿。

示例

如果交易是从外部拥有账户(EOA)发送的,则从EOA的余额中扣除gas费。换句话说,交易的发起人正在支付gas费。发起人为交易消耗的总gas以及随后的任何子执行提供资金。这意味着如果发起者X附加1000个gas来调用合约A,其在计算上花费500个gas然后向合约B发送另一个消息,则A用于将消息发送到B的gas也会再已开始从X的gas限制中扣除。

  1. EOA帐户X启动交易并调用合约帐户A上的功能,附带1000gas
  2. 合约A在计算上花费500gas,并向合约B发送消耗100gas的消息
  3. 合约B在计算上花费300gas并完成交易。
  4. 100gas退还给X.

因此,如果该交易的发起人在开始时没有附加足够高的gas费,那么在交易中执行一部分操作的中间合约(例如,在我们的示例中为合约A)理论上可以耗尽gas。如果合约在执行中期用完,除了gas费支付外,所有状态变更都会被撤销。