Как обновить развернутый смарт-контракт? [дубликат]

Я начал разрабатывать смарт-контракты с помощью Truffle , и когда я редактирую контракт, я всегда повторно развертываю его, добавляя еще один скрипт миграции. Меня интересуют две вещи:

  1. Так и должно быть, или есть лучший способ?
  2. Когда я повторно развертываю контракт с новым сценарием миграции, развернутый контракт также получает новый адрес. Можно ли также перенести смарт-контракт и оставить существующий адрес?

Все советы приветствуются!

Вы не можете обновить существующий контракт. Вот и вся идея блокчейна. Децентрализованные смарт-контракты являются автономными и P2P. Если вы, как разработчик, имеете полный контроль над SC и можете манипулировать им как хотите, то это ничем не отличается от клиент-серверного приложения.
@MaxBinnewies - Значит, я могу развернуть только новую версию контракта. Теперь для каждого небольшого изменения мне приходится вручную добавлять еще один сценарий миграции, не проще ли это сделать?

Ответы (1)

Код контракта является постоянным. Невозможно изменить код развернутого контракта, кроме как полностью уничтожив его с помощью SELFDESTRUCTкода операции ( selfdestruct()в Solidity).

Есть четыре способа, более или менее, справиться с этим:

  1. Не. Просто пусть контракт будет вечным, что бы ни случилось.
  2. Используйте какую-нибудь схему, чтобы обойти это ограничение.
  3. Создайте новый контракт и найдите способ повторно подключиться к старым пользователям/другим контрактам.
  4. Создавайте временные контракты.

Обратите внимание, что некоторые из них переходят друг в друга — 3 и 4 очень похожи.

1 — второй по простоте, так как вам не нужно ничего делать. Он также и самый опасный, так как в основном надеется, что никогда не будет критической ошибки. Это почти наверняка ложная надежда.

2 намного сложнее. Есть способы добиться эффекта изменяемого кода контракта. Например, вы можете поместить данные в один неизменяемый контракт, а затем вызвать библиотеку для фактического его выполнения. Вот мой совет, как это сделать. Однако, как я уже упоминал, это не для слабонервных, и, вероятно, оно того не стоит в небольших масштабах.

3 — это то, что DAO использовала бы для обновления, если бы не была атакована. Один из вариантов — использовать простой контракт, выступающий в качестве точки входа в текущий, «настоящий» контракт.

4 самый простой, и ИМХО, лучший, если это возможно. Если ни один контракт не нуждается в долгосрочном состоянии, то лучше сразу создавать новый при каждом обновлении. Будильник Ethereum, насколько я понимаю, просто имеет более новую и более старую версии в цепочке. Нет необходимости в сложных схемах, и если вам нужна более старая версия, она может остаться.

Лучший вопрос — спросить себя, что вам нужно. Будет ли у контракта «окончательное» состояние? В этом случае вам может сойти с рук 1. Если его нет, вы можете использовать 4. Если ни того, ни другого или если вам абсолютно необходимо сохранить тот же адрес, возможно, пришло время изучить 2 или 3.

РЕДАКТИРОВАТЬ: см. также этот вопрос для других идей.