Почему самоуничтожение используется в контрактном программировании?

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

Этот вопрос очень неясен. Вы спрашиваете о заказных самоубийствах, или клиентах, или о чем?
Извините за это - контракт.
Последнее предложение сбивает с толку, потому что клиент go — это клиент, Solidity — это язык, а python может относиться к клиенту python или, возможно, к змее, похожему на python языку Ethereum.
попробовал еще раз - дайте мне знать, если это станет более ясным - просто пытаюсь увидеть, есть ли какие-либо различия в каждой реализации?

Ответы (5)

Самоуничтожение в Ethereum — это операция (фактически OPCODE) на уровне EVM, независимо от того, какой язык или клиент вы используете.

Например, вызов selfdestruct(address)отправляет весь текущий баланс контракта на address.

Это полезно, когда вы закончили с контрактом, потому что это стоит гораздо меньше газа, чем просто отправка баланса с помощью address.send(this.balance).

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

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

Что произойдет, если вы попытаетесь назвать самоубийство контрактом? Это состояние возвращается к нулю или EVM устанавливает какой-то флаг, говорящий, что этого контракта больше нет?
Что будет, если отправить эфир на контракт, который покончил жизнь самоубийством?
Баланс адреса увеличивается, но так как по адресу уже нет кода, то ETH просто застревает. Затем этот ETH по существу сжигается.

Примечание: этот вопрос изначально задавался о коде suicideоперации, который selfdestructтем временем стал соответствовать EIP6 .

selfdestructэто рекомендуемый термин, который можно найти в более новых версиях кода Solidity и Serpent. Это тот же API и поведение, как описано в других ответах, и это псевдоним для suicide.

EIP6 описывает мотивацию:

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

Псевдоним selfdestruct был применен к кодовым базам Solidity и Serpent и является предпочтительным термином для использования.

Функция selfdestruct()и относительный OPCODE используются, когда у вас есть контракт с ошибкой или нежелательным поведением, и вы хотите от него избавиться.

Это selfdestruct(address)лучшая версия, как указал @tjaden-hess, когда у вас есть контракты с оплатой (контракты, которые получают эфиры), эфиры будут перенаправлены, addressчто является большой победой.

Когда вы взаимодействуете с саморазрушающимся контрактом, ОБРАТИТЕ ВНИМАНИЕ: если вы отправляете транзакцию и/или средства на него, ваши средства ПОТЕРЯНЫ . Не отправляйте на него средства или другие транзакции после самоуничтожения контракта.

Это проблема, которую вы всегда должны иметь в виду при разработке приложений, использующих контракты с функцией самоуничтожения, убедитесь, что адрес контракта удален из вашего приложения после selfdestruct()вызова контракта, возможно, вы всегда можете вызвать метод получения для посмотрите, отвечает ли контракт допустимым значением, прежде чем отправлять транзакцию и/или переводить на него эфиры.

Обновлять

Имя метода теперь selfdestruct. У нас есть его описание в новой документации Solidity .

Вот пост от r/ethereum о самоубийстве с дополнительной информацией и небольшим обсуждением этого.

Это должен быть принятый ответ.
не будет ли в блокчейне самоуничтожающегося смарт-контракта? Я думаю, люди все еще могут его видеть, но это нефункциональный смарт-контракт. Это правда?
@ender - да, цель / преимущество в selfdestruct()том, что если у вас есть опасный ошибочный контракт, вы можете «расторгнуть» его.
@makevoid спасибо, я нашел ответ в тот же день. Люди могут видеть это после уничтожения. Например , etherscan.io/address/…
@ender на странице контракта etherscan (или etherchain) вы видите источник контракта, только если он загружен пользователем (он сравнивается и проверяется etherscan byw). Единственный способ взаимодействовать с этим контрактом/кодом — это извлечь байт-код из блока, в котором он был развернут, и повторно развернуть его, если вы хотите «воскресить» его, вы по-прежнему ABI, и вы не сможете тор восстановить любое состояние/эфиры/токены, отправленные на контракт.

ИМХО selfdestructэто плохая вещь, которую никогда не следует внедрять. Это нарушает принцип неизменности контракта и создает множество проблем:

  1. Позволяет успешно отправлять эфир на контракт, который пытается запретить входящий перевод эфира (не имеет оплачиваемых функций)
  2. Если позволяет отправлять эфир контракту, который пытается активно реагировать на входящие переводы эфира, таким образом, что контракт не заметит перевод
  3. Хотя он отправляет весь эфир с баланса контракта на указанный адрес, он не отправляет токены и другие активы.
  4. Активы, отправленные на контракт после selfdestruct, в большинстве случаев теряются, проверка того, что контракт не самоуничтожается перед передачей, не очень помогает, потому что передача может быть запущена с помощьюselfdestruct
  5. Он позволяет изменять байт-код развернутого смарт-контракта ( EIP-1014 ) .

Почему selfdestructsиспользуются в контрактном программировании

После создания контракта в блокчейне Ethereum его нельзя изменить.

  1. Каждый блок в цепочке блоков фиксирует все транзакции в блоке и в том порядке, в котором они находятся. Он делает это, включая хэш всех транзакций в заголовок блока, который затем является частью данных, которые хешируются для доказательство работы.
  2. Изменение смарт-контракта в блоке изменит хэш всех транзакций, что в конечном итоге изменит хэш заголовка блока. Это, вероятно, приведет к тому, что хеш заголовка блока будет иметь недействительное доказательство работы. Таким образом, для того, чтобы изменить транзакцию, вам придется переделать доказательство работы блока, т.е. перемайнить блок.
  3. Кроме того, заголовок блока включает хэш предыдущего блока. Поэтому, если вы хотите изменить транзакцию, которая в конечном итоге будет содержать смарт-контракт, вам также необходимо будет повторно создать все блоки, следующие за блоком, который содержит транзакцию (смарт-контракт), которую вы изменили. Наконец, ваш набор модифицированных блоков на самом деле является форком блокчейна. Чтобы его приняла остальная часть сети, ваша вилка должна иметь больше совокупной работы, чем текущая цепочка блоков, что фактически означает, что ваша вилка должна быть длиннее, чем текущая цепочка блоков.

ПРЕИМУЩЕСТВА ИСПОЛЬЗОВАНИЯ САМОРАЗРУШЕНИЯ

+-----------------+---------------------------------------------------------------------------------------+
|     Benefit     |                                       Reasoning                                       |
+-----------------+---------------------------------------------------------------------------------------+
| Stop Execution  | If you no longer want the contract running, you can selfdestruct it to “turn it off”. |
| Eliminate Bugs  | (Similar to above). You can kill off smart contracts that are buggy.                  |
| Lower Gas Price | It costs less gas to selfdestruct a contract.                                         |
+-----------------+---------------------------------------------------------------------------------------+