1

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

   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;

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

4

2 回答 2

2

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

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

于 2018-11-28T20:17:19.153 回答
1

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

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

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

这篇文章很好地介绍了各种失败场景。

于 2018-11-28T20:46:20.580 回答