Что на самом деле удаляется при суициде контракта, и почему это не приводит к изменению блокчейна?

Я пытаюсь понять, как работают контрактные самоубийства и что на самом деле происходит во время них. Я понимаю , почему мы их используем .

В этом посте говорится, что при выполнении SUICIDEопкода данные уничтожаемого контракта удаляются:

Фактически, код операции SUICIDE использует отрицательный газ, потому что операция освобождает место в блокчейне, очищая все данные контракта.

Если данные контракта удаляются для освобождения места, то блок, в котором они находятся, безусловно, изменяется, и, следовательно, хэш этого блока также изменяется. Не будет ли это означать изменение всех последующих блоков, которые полагаются на этот хэш?

Ответы (3)

РЕДАКТИРОВАТЬ: я пытался, но понял, что у меня нет ответа на вопрос: «Если данные контракта удаляются, чтобы освободить место, то, безусловно, блок, в котором они находятся, изменяется, и, следовательно, хеш этого блока также изменяется. Следовательно, не будет ли это означать изменить все последующие блоки, которые полагаются на этот хэш?»

Оставьте это здесь на случай, если это поможет другим объяснить.

Каждый блок имеет «корень состояния», который содержит учетные записи. С опкодом SELFDESTRUCT (оригинальное название SUICIDE) учетная запись обнуляется.

У учетной записи есть nonce, balance, storageRoot, codeHash. StorageRoot — это указатель на древовидную структуру хранилища контракта: когда он установлен в ноль, он устанавливает указатель в нуль (в таких языках, как C), и это удаляет все дочерние элементы дерева. Вы правы в том, что это приводит к новому stateRoot, но это не означает полную копию состояния, поскольку все является указателями.

Изображение стоит 1000 слов, например: блочная архитектура Ethereum (все заслуги https://ethereum.stackexchange.com/users/124/zanzu за усилия по диаграмме)

введите описание изображения здесь

Недавно прочитав о том, как работает блокчейн Биткойн, по крайней мере, в случае Биткойна хэш заголовка блока основан на всем, что находится внутри заголовка блока, за исключением корня Меркла (Tx_Root). Я предполагаю, что то же самое, вероятно, применимо и в случае с Ethereum: хэш основан на всем в заголовке, кроме State Root. (Поэтому изменение содержимого State Root не имеет значения.)

Из раздела 4 желтой книги Ethereum , стр. 3:

4.1. Мировое государство.Мировое состояние (состояние) представляет собой сопоставление между адресами (160-битными идентификаторами) и состояниями учетных записей (структура данных, сериализованная как RLP, см. Приложение ??). Хотя это и не хранится в блокчейне, предполагается, что реализация будет поддерживать это сопоставление в модифицированном дереве Merkle Patricia (trie, см. Приложение ??). Для этого дерева требуется простая серверная часть базы данных, поддерживающая сопоставление массивов байтов с массивами байтов; мы называем эту базовую базу данных государственной базой данных. Это имеет ряд преимуществ; во-первых, корневой узел этой структуры криптографически зависит от всех внутренних данных, и поэтому его хэш может использоваться в качестве безопасного идентификатора для всего состояния системы. Во-вторых, будучи неизменяемой структурой данных, он позволяет вызывать любое предыдущее состояние (чей корневой хеш известен) простым изменением корневого хэша соответствующим образом.

Обратите внимание на последнее предложение. Ethereum может «тривиально вернуться к старому состоянию». Сюда входят состояния перед блоком, включающим транзакцию, выполняющую код операции SELFDESTRUCT. Насколько я понимаю, из этого следует, что «удаление» данных контракта освобождает место, но это не означает, что затронуты какие-либо более ранние блоки. Вместо этого состояние мира, начиная с этого блока, не будет содержать уничтоженную учетную запись контракта, т. е. не будет узла, соответствующего этой учетной записи. Это уменьшает объем хранилища, поскольку в этой учетной записи и ее хранилище больше не будет изменений, которые необходимо записывать. Однако по-прежнему можно вернуться к старому состоянию до того, как эта учетная запись контракта выполнит SELFDESTRUCT.

РЕДАКТИРОВАТЬ 1: Подтверждение моей интерпретации: https://github.com/ethereum/EIPs/pull/42#issuecomment-160237928

РЕДАКТИРОВАТЬ 2: Код операции SUICIDE был переименован в SELFDESTRUCT , чтобы признать серьезность и деликатность проблем с психическим здоровьем. (Я приветствую это изменение. SUICIDE действительно показался мне неприятным)

Также исчезают все журналы событий. Единственный способ получить их после самоубийства — использовать etherum explorer, например etherscan.