当发送方 运行 在函数执行过程中耗尽 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 很好地遍历了各种故障场景。
假设我们有一个包含以下定义函数的合约:
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 很好地遍历了各种故障场景。