Возвращается ли плата за газ в случае сбоя транзакции?

Я путаю правило оплаты газа, когда вызывающий абонент совершает транзакцию.

Плата за газ требуется при совершении транзакции, и я знаю, что функция require() является защитной функцией, которая возвращает всю плату за газ вызывающей стороне.

Оплачивается ли плата за газ после всех операций в функции в смарт-контракте?

Затем, если функция require() размещена в начале функции, а коды вообще не работают, означает ли это, что плата за газ не требуется?

А что, если значение в этом операторе require() является ложным условием, и поэтому транзакция завершается неудачно?

Плата за газ возвращается звонящему на 100% или абонент должен оплатить оставшуюся плату за газ после того, как некоторые операции в функции сработали?

Можно ли вернуть звонящему весь бензин?

function burn(uint256 _value) public returns (bool success) {
    require(balances[msg.sender] >= _value);
    balances[msg.sender] = balances[msg.sender].sub(_value);
    totalSupply = totalSupply.sub(_value);
    Burn(msg.sender, _value);
    return true;
}

Если плата за газ должна быть оплачена после выполнения кода, что произойдет, если вызывающий (msg.sender) не сможет оплатить плату за газ, потому что на счете вызывающего абонента нет баланса после условного прохода require ()?

Сомневаюсь, что я правильно знаю.

Ответы (2)

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

Исходный код компилируется в ассемблерный код, и каждый раз, когда что-то происходит, используются OPCODES. Газ начисляется за OPCODES по мере его использования, поэтому, даже если первая строка — это a require()и это false, все равно потребовалось много OPCODES для распаковки данных транзакции и оценки require()— так что немного газа было сожжено.

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

Если перед неудавшейся операцией, возвращающей все в исходное состояние, разворачивается много процессов, возможно, большая часть газа была израсходована.

Надеюсь, поможет.

Классные аналогии!
Спасибо за хорошее объяснение! Это легко понять! Спасибо.

Для каждой операции, выполняемой EVM, он потребляет некоторое количество газа. Если какая-либо инструкция приводит к сбою транзакции, выполнение останавливается, и после этой точки газ больше не используется.

Плата за газ оплачивается после всех операций в функции, которая есть в смарт-контракте?

Газ расходуется на каждом этапе выполнения транзакции

Затем, если функция require() размещена в начале функции, а коды вообще не работают, плата за газ не требуется?

Да. Если require вызывает остановку выполнения, газ больше не потребляется, поэтому газ больше не используется после выполнения require.

А что, если значение недействительно в этом условии инструкции require() и транзакция не удалась?

Как указано в первом заявлении, газ будет использоваться на каждом этапе. И будет продолжаться до инструкции, которая приводит к сбою транзакции. Вот почему желательно заранее знать, сорвется транзакция или нет. И для этого эти чеки ставятся в начале.

Плата за газ будет возмещена вызывающему абоненту на 100%, или абонент должен будет оплатить оставшуюся плату за газ после выполнения некоторых операций в функции?

Необходимо оплатить оставшуюся плату за газ после выполнения некоторых операций в функции

Звонящему можно вернуть всю плату за газ?

Нет require. Также используется некоторое количество газа, и это не будет возмещено. Он был потреблен.

Если плата за газ должна быть оплачена после выполнения кода, что произойдет, если вызывающий (msg.sender) не сможет оплатить плату за газ, потому что на счете вызывающего абонента нет баланса после условного прохода require ()?

gas fee = amount of gas* price of 1 gas

Так расходуется газ . Блокчейн-клиент(geth/parity/...) не примет транзакцию, в которой gasPrice*amountOfGasпревышается баланс аккаунта. Итак, мы видим, что цена газа оплачивается, когда транзакция отправляется клиенту блокчейна.