Что происходит, когда у отправителя заканчивается газ во время выполнения функции?

Предположим, у нас есть контракт со следующей определенной функцией:

   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] останется таким же, как и до транзакции.

Отправитель транзакции все равно будет платить майнеру плату за включение транзакции в блок.

Этот пост хорошо разбирается в различных сценариях сбоев.

Если у вас кончится бензин в середине транзакции, он потерпит неудачу. Вы будете платить только за использованные вычисления, а это означает, что весь использованный газ, пока он не выйдет из строя, не будет возвращен, а остальной будет.

Вы можете прочитать больше о газе в этой главе Книги Эфириума.

Другие вопросы по тегам