Почему неудачная транзакция может забрать комиссию, но не забрать токены
Иногда пользователь отправляет транзакцию, платит gas, а в block explorer потом видит:
Failed.
Возникает логичный вопрос: если операция не произошла, почему комиссия всё равно списалась?
Потому что результат транзакции и работа, которую сеть выполнила при её обработке, — две разные вещи.
Представим смарт-контракт.
Чтобы понять, можно ли выполнить запрос, EVM начинает исполнять его код. Она читает данные, делает вычисления, вызывает другие функции.
В какой-то момент обнаруживается условие, при котором операция должна остановиться.
Например, пользователь пытается перевести больше токенов, чем разрешено правилами контракта.
Тогда происходит revert.
Изменения состояния откатываются: токены не должны случайно остаться переведёнными наполовину, а баланс контракта возвращается к состоянию до операции.
Но вычислительная работа уже была выполнена.
Именно за неё и был потрачен gas.
Есть важное различие.
Если транзакция заведомо некорректна ещё до включения в блок — например, указан gas limit ниже базового необходимого уровня для простой операции, — она может быть отвергнута до нормального исполнения.
Но если транзакция попала в блок, код начал выполняться и затем закончился ошибкой или исчерпал предоставленный gas, плата за уже выполненную работу не возвращается.
Можно сравнить это с такси.
Вы попросили отвезти вас по адресу. Машина проехала половину пути, но выяснилось, что дорога закрыта и поездку пришлось прекратить.
Вы не оказались в точке назначения. Но топливо и время водителя уже были потрачены.
Ethereum работает похожим образом.
Это ещё и защита сети. Если неудачные вычисления были бы бесплатными, злоумышленник мог бы бесконечно заставлять тысячи узлов выполнять тяжёлый код, ничего за это не платя.
Если совсем просто: failed означает, что итоговые изменения отменены. Но это не означает, что компьютеры Ethereum не выполняли работу до момента ошибки.
За эту работу и платится gas.
#КартаEthereum #Ethereum #Gas #транзакции #EVM
Иногда пользователь отправляет транзакцию, платит gas, а в block explorer потом видит:
Failed.
Возникает логичный вопрос: если операция не произошла, почему комиссия всё равно списалась?
Потому что результат транзакции и работа, которую сеть выполнила при её обработке, — две разные вещи.
Представим смарт-контракт.
Чтобы понять, можно ли выполнить запрос, EVM начинает исполнять его код. Она читает данные, делает вычисления, вызывает другие функции.
В какой-то момент обнаруживается условие, при котором операция должна остановиться.
Например, пользователь пытается перевести больше токенов, чем разрешено правилами контракта.
Тогда происходит revert.
Изменения состояния откатываются: токены не должны случайно остаться переведёнными наполовину, а баланс контракта возвращается к состоянию до операции.
Но вычислительная работа уже была выполнена.
Именно за неё и был потрачен gas.
Есть важное различие.
Если транзакция заведомо некорректна ещё до включения в блок — например, указан gas limit ниже базового необходимого уровня для простой операции, — она может быть отвергнута до нормального исполнения.
Но если транзакция попала в блок, код начал выполняться и затем закончился ошибкой или исчерпал предоставленный gas, плата за уже выполненную работу не возвращается.
Можно сравнить это с такси.
Вы попросили отвезти вас по адресу. Машина проехала половину пути, но выяснилось, что дорога закрыта и поездку пришлось прекратить.
Вы не оказались в точке назначения. Но топливо и время водителя уже были потрачены.
Ethereum работает похожим образом.
Это ещё и защита сети. Если неудачные вычисления были бы бесплатными, злоумышленник мог бы бесконечно заставлять тысячи узлов выполнять тяжёлый код, ничего за это не платя.
Если совсем просто: failed означает, что итоговые изменения отменены. Но это не означает, что компьютеры Ethereum не выполняли работу до момента ошибки.
За эту работу и платится gas.
#КартаEthereum #Ethereum #Gas #транзакции #EVM