Почему после SELFDESTRUCT в Ethereum может сохраниться код

В трассировке видны SELFDESTRUCT и перевод остатка, но код контракта по-прежнему читается. Результат зависит от правил форка и от того, в какой транзакции создан аккаунт.

Найдите транзакцию создания

Пусть контракт развёрнут в транзакции A. Позднее, в транзакции B при действующем EIP-6780, его код выполняет SELFDESTRUCT с отдельным адресом получателя. Запросите код после B и проверьте движение баланса в трассировке.

transaction A: CREATE
transaction B: SELFDESTRUCT → beneficiary

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

Проверьте исключение для одной транзакции

Когда создание и SELFDESTRUCT произошли в одной транзакции, сохраняется поведение с удалением. Создание и уничтожение в двух разных транзакциях одного блока под исключение не попадают. При разборе исторических блоков и других EVM-сетей уточните правила активного форка. eips.ethereum.org EIP-6780