Методы обновления смарт-контрактов на Rust и вопросы безопасности

robot
Генерация тезисов в процессе

Обсуждение методов обновления смарт-контрактов на Rust

Обновление контракта является важным этапом разработки смарт-контрактов. Из-за неизменяемости блокчейна, смарт-контракт, развернутый на цепочке, не может быть изменен напрямую. Однако в реальном применении контракты часто требуют исправления уязвимостей или добавления новых функций, и это необходимо реализовать через обновление. В данной статье будут рассмотрены распространенные методы обновления смарт-контрактов на Rust.

1. Необходимость обновления смарт-контрактов

Смарт-контракты как программный код неизбежно могут содержать уязвимости. Даже при проведении большого количества тестов и аудитов могут остаться невыявленные проблемы. Если уязвимости будут злоупотреблены, это может привести к серьезным потерям активов. Поэтому возможность обновления очень важна для смарт-контрактов, в основном для:

  • Исправление обнаруженных уязвимостей безопасности
  • Добавить новые функциональные возможности
  • Оптимизация логики смарт-контрактов, повышение производительности

!

2. Способы обновления смарт-контрактов NEAR

Следующий пример проекта StatusMessage иллюстрирует методы обновления контрактов NEAR:

2.1 Структура данных смарт-контрактов не изменена

Если нужно изменить только логику контракта, не затрагивая изменение структуры данных, можно просто использовать команду near deploy для повторного развертывания нового кода. Пример:

бить развертывание \ --accountId statusmessage.testnet
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm

В этом случае данные из исходного контракта будут сохранены.

2.2 Структура данных смарт-контрактов была изменена

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

Добавить метод migrate в новый смарт-контракт:

ржавчина #[private] #[init(ignore_state)] pub fn migrate() -> Self { let old_state: OldStatusMessage = env::state_read().expect('failed'); Самостоятельно { Слоганы: old_state.records, bios: LookupMap::new(b'b'.to_vec()), } }

Затем вызывайте метод migrate при развертывании:

бить развертывание \ --wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'migrate'
--initArgs '{}'
--accountId statusmessage.testnet

Таким образом, можно перенести старые данные в новую структуру данных.

!

3. Безопасные аспекты обновления смарт-контрактов

При обновлении контракта необходимо обратить внимание на следующие моменты:

  • Строго контролировать права на обновление, разрешать обновление только владельцу контракта или DAO.
  • Рекомендуется установить владельца контракта как DAO и управлять обновлениями через предложения и голосования.
  • Перед функцией миграции добавьте #[init(ignore_state)], чтобы убедиться, что состояние не загружается перед выполнением.
  • Удалите функцию миграции после завершения миграции, чтобы избежать повторных вызовов.
  • Новая структура данных инициализируется во время миграции

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

!

INIT-1.62%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 5
  • Поделиться
комментарий
0/400
NFTArchaeologistvip
· 6ч назад
Улучшение - это жесткая правда
Посмотреть ОригиналОтветить0
HappyToBeDumpedvip
· 23ч назад
Обновление означает исправление уязвимостей
Посмотреть ОригиналОтветить0
NftBankruptcyClubvip
· 23ч назад
Не будем много говорить, просто действуем.
Посмотреть ОригиналОтветить0
NFTHoardervip
· 23ч назад
Безопасность действительно важна
Посмотреть ОригиналОтветить0
FundingMartyrvip
· 07-29 01:36
Я выбираю бороться с комиссиями
Посмотреть ОригиналОтветить0
  • Закрепить