【问题标题】:What happens when the sender run out of gas in the middle of a function execution?当发送者在函数执行过程中耗尽气体时会发生什么?
【发布时间】:2018-11-28 20:09:01
【问题描述】:

假设我们有一个定义如下函数的合约:

   function send(address receiver, uint amount) public {
        if (balances[msg.sender] < amount) return;
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        emit Sent(msg.sender, receiver, amount);
    }

并假设发件人在以下行之后用完gas:

balances[msg.sender] -= amount;

状态变量发生了什么?区块中是否包含不完整的 tx?

【问题讨论】:

  • “没油了”是什么意思?这是 Solidity 的事情还是你在使用一个词组?

标签: ethereum solidity evm


【解决方案1】:

如果您在交易过程中用完 gas,它将失败。您只需为使用的计算付费,这意味着在失败之前使用的所有 gas 将不会返还,但其余的会返还。

您可以在Ethereum Book的这一章中阅读更多关于gas的信息

【讨论】:

    【解决方案2】:

    耗尽gas的交易将失败,并且不会更新任何状态变量。如this out of gas 示例中所示,失败的交易仍包含在区块中。

    在您的示例中,balances[msg.sender] -= result 不会被执行,balances[msg.sender] 将保持与事务前完全相同。

    交易的发送者仍将向矿工支付费用,以将交易包含在区块中。

    This 的帖子很好地解决了各种故障情况。

    【讨论】:

      猜你喜欢
      • 2013-06-09
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多