Автор: Павел Найданов 🕵️♂️
Смарт-контракты в сети Ethereum по умолчанию неизменны. Однако для некоторых сценариев желательно иметь возможность их модифицировать.
Обновление смарт-контракта - это изменение бизнес-логики контракта при сохранении состояния контракта. Можно обновить кодовую базу, при этом адрес контракта, состояние и баланс должны оставаться неизменными.
Для чего это нужно?
Во-первых, в смарт-контракте могут обнаружиться ошибки или потенциальные уязвимости, которые необходимо будет исправить.
Во-вторых, может быть необходим сценарий, когда нужно внести улучшения или новые функциональные возможности.
Важно! Контроль над обновлениями должен быть децентрализован, чтобы избежать злонамеренных действий.
Можно изменить исполняемый код несколькими способами:
- Создание нескольких версий смарт-контрактов и миграция состояния из старого контракта в новый контракт. Подробнее.
- Создание нескольких смарт-контрактов для раздельного хранения состояния и бизнес логики. Подробнее.
- Использование Proxy patterns для делегирования вызова функций из неизменяемого прокси-контракта в изменяемый логический контракт. Подробнее.
- Использование Strategy pattern. Создание неизменного основного контракта, который взаимодействует с гибкими вспомогательными контрактами и полагается на них для выполнения определенных функций. Подробнее.
- Использование Diamond pattern для делегирования вызовов функций из прокси-контракта логическим контрактам. Подробнее.
- Подход в Pendle маршрутизации. Подробнее.
- Дает возможность исправить уязвимость после деплоя. Можно даже сказать (но это спорно), что это повышает безопасность, так как можно исправить уязвимость.
- Дает возможность добавлять функциональность к логике контракта после деплоя.
- Открывает новые возможности проектирования и построения децентрализованной системы с изолированием отдельных частей приложения и разграничением доступа и управления.
- Отменяет идею блокчейна о неизменности кода. А значит с точки зрения безопасности, это плохо. Пользователи должны доверять разработчикам, чтобы они не изменяли смарт-контракты произвольно.
- Чтобы завоевать доверие пользователей, нужны дополнительные слои защиты,например DAO, которое будет защищать от несанкционированных изменений.
- Закладывание возможности обновления контракта может сильно увеличить его сложность.
- Небезопасный контроль доступа или централизация в смарт-контрактах может упростить злоумышленникам выполнение несанкционированных обновлений.