当发送方 运行 在函数执行过程中耗尽 gas 时会发生什么?

What happens when the sender run out of gas in the middle of a function execution?

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

   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);
    }

并假设发件人在以下行之后用完了气体:

balances[msg.sender] -= amount;

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

如果您 运行 在交易过程中耗尽了 gas,交易就会失败。您只需为使用的计算付费,这意味着在失败之前使用的所有气体将 不会 返回,但其余部分将被返回。

您可以在 Ethereum Book

的这一章阅读更多关于气体的信息

用完 gas 的交易将失败,none 的状态变量将被更新。正如您在 this out of gas 示例中看到的那样,失败的交易仍包含在一个块中。

在你的例子中,balances[msg.sender] -= result不会被执行,balances[msg.sender]将保持与交易前完全相同。

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

This post 很好地遍历了各种故障场景。