Что происходит, когда у отправителя заканчивается газ во время выполнения функции?
Предположим, у нас есть контракт со следующей определенной функцией:
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;
Что случилось с переменными состояния? Включены ли неполные передачи в блок или нет?
2 ответа
Транзакция, в которой заканчивается газ, завершится неудачно, и ни одна из переменных состояния не будет обновлена. Неудачные транзакции по-прежнему включены в блок, как вы можете видеть в этомout of gas
пример.
В вашем примере balances[msg.sender] -= result
не будет выполнен, и balances[msg.sender]
останется таким же, как и до транзакции.
Отправитель транзакции все равно будет платить майнеру плату за включение транзакции в блок.
Этот пост хорошо разбирается в различных сценариях сбоев.
Если у вас кончится бензин в середине транзакции, он потерпит неудачу. Вы будете платить только за использованные вычисления, а это означает, что весь использованный газ, пока он не выйдет из строя, не будет возвращен, а остальной будет.
Вы можете прочитать больше о газе в этой главе Книги Эфириума.