
Контракт, который продолжает выполнение после неудачного вызова, сегодня не имеет надежного способа определить, был ли откат вызванного контракта намеренным или просто вызван нехваткой газа, выбранной отправителем. Этот пробел является корнем атаки «недостаточного газа», и новое предварительное предложение пытается устранить его на уровне EVM. EIP-8456, открытое для обсуждения на Ethereum Magicians в понедельник, добавляет инструкцию под названием CALLSTATUS, предварительно с opcode 0xA5 за 2 газа. Она помещает статус завершения последнего вызова или создания операции в текущем фрейме в виде трех битов. Бит 0 означает откат, бит 1 — исключительную остановку, например, нехватку газа, а бит 2 — остановку в каком-либо фрейме ниже. Автор отмечает, что единственным доказательством сегодня является арифметика gasleft() после вызова, и каждый форк переоценки газа нарушал эти пороги. Предлагаемая двухмерная система газа EIP-8037 сделает эту арифметику еще слабее, поскольку ее резервуар недоступен через opcode GAS. Так почему же третий бит? Большинство реальных вызовов проходят через посредников, таких как прокси, обертка functionCall от OpenZeppelin, Multicall3 или проверщики подписей ERC-1271. Если бы сообщался только конечный статус прямого вызванного контракта, обертка, перехватывающая остановку из-за нехватки газа и выполняющая откат с причиной, выглядела бы как намеренный откат. Черновик сохраняет «липкий» флаг, который передается вверх по каждому фрейму, так что отправитель, контролирующий только газ, никогда не сможет заставить вызывающий контракт прочитать простой откат. Он сообщает результаты, а не причины, и вызванный контракт все еще может намеренно вызвать остановку с помощью INVALID. Он защищает только код, написанный после его внедрения, поскольку развернутые контракты его не будут читать. Пока нет внешних обзоров, номер opcode остается открытым, а прототип и тесты для 58 указанных случаев все еще ожидают реализации. Ссылка - https://t.co/KnByUBgWrY
