Почему после SELFDESTRUCT в Ethereum может сохраниться код
В трассировке видны SELFDESTRUCT и перевод остатка, но код контракта по-прежнему читается. Результат зависит от правил форка и от того, в какой транзакции создан аккаунт.
Найдите транзакцию создания
Пусть контракт развёрнут в транзакции A. Позднее, в транзакции B при действующем EIP-6780, его код выполняет SELFDESTRUCT с отдельным адресом получателя. Запросите код после B и проверьте движение баланса в трассировке.
transaction A: CREATE
transaction B: SELFDESTRUCT → beneficiary
В этом случае остаток переходит получателю, текущий кадр завершается, а код и хранилище аккаунта сохраняются. Правило мониторинга, считающее каждый SELFDESTRUCT удалением контракта, ошибочно отметит его исчезновение.
Проверьте исключение для одной транзакции
Когда создание и SELFDESTRUCT произошли в одной транзакции, сохраняется поведение с удалением. Создание и уничтожение в двух разных транзакциях одного блока под исключение не попадают. При разборе исторических блоков и других EVM-сетей уточните правила активного форка. eips.ethereum.org EIP-6780