
Контракт, який продовжує виконуватися після невдалого виклику, сьогодні не має надійного способу визначити, чи було відмінено викликану операцію навмисно чи просто вичерпано газ, обраний відправником. Ця прогалина є коренем недостатнього газового зловживання, і новий проект пропозиції намагається закрити її на рівні 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
