Что происходит, когда у отправителя заканчивается газ в середине выполнения функции? - PullRequest
0 голосов
/ 28 ноября 2018

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

   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 ]

0 голосов
/ 28 ноября 2018

Транзакция, в которой закончился газ, не будет выполнена, и ни одна из переменных состояния не будет обновлена.Неудачные транзакции по-прежнему включены в блок, как вы можете видеть в этом out of gas примере.

В вашем примере balances[msg.sender] -= result не будет выполнено, а balances[msg.sender] останетсяточно так же, как и до транзакции.

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

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

0 голосов
/ 28 ноября 2018

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

Подробнее о газе можно прочитать в этой главе Книга Эфириума

...