Я начал разрабатывать смарт-контракты с помощью Truffle , и когда я редактирую контракт, я всегда повторно развертываю его, добавляя еще один скрипт миграции. Меня интересуют две вещи:
Все советы приветствуются!
Код контракта является постоянным. Невозможно изменить код развернутого контракта, кроме как полностью уничтожив его с помощью SELFDESTRUCT
кода операции ( selfdestruct()
в Solidity).
Есть четыре способа, более или менее, справиться с этим:
Обратите внимание, что некоторые из них переходят друг в друга — 3 и 4 очень похожи.
1 — второй по простоте, так как вам не нужно ничего делать. Он также и самый опасный, так как в основном надеется, что никогда не будет критической ошибки. Это почти наверняка ложная надежда.
2 намного сложнее. Есть способы добиться эффекта изменяемого кода контракта. Например, вы можете поместить данные в один неизменяемый контракт, а затем вызвать библиотеку для фактического его выполнения. Вот мой совет, как это сделать. Однако, как я уже упоминал, это не для слабонервных, и, вероятно, оно того не стоит в небольших масштабах.
3 — это то, что DAO использовала бы для обновления, если бы не была атакована. Один из вариантов — использовать простой контракт, выступающий в качестве точки входа в текущий, «настоящий» контракт.
4 самый простой, и ИМХО, лучший, если это возможно. Если ни один контракт не нуждается в долгосрочном состоянии, то лучше сразу создавать новый при каждом обновлении. Будильник Ethereum, насколько я понимаю, просто имеет более новую и более старую версии в цепочке. Нет необходимости в сложных схемах, и если вам нужна более старая версия, она может остаться.
Лучший вопрос — спросить себя, что вам нужно. Будет ли у контракта «окончательное» состояние? В этом случае вам может сойти с рук 1. Если его нет, вы можете использовать 4. Если ни того, ни другого или если вам абсолютно необходимо сохранить тот же адрес, возможно, пришло время изучить 2 или 3.
РЕДАКТИРОВАТЬ: см. также этот вопрос для других идей.
Макс Бинневис
Крамер65