Полное руководство по обновлению смарт-контрактов на Rust: от NEAR до соображений безопасности

Практика обновления смарт-контрактов на Rust

Смарт-контракты по своей сути являются программами и неизбежно имеют недостатки. Даже после обширного тестирования и аудита могут существовать уязвимости. Атака на уязвимость контракта может привести к потере активов пользователей и иметь серьезные последствия. Исправление уязвимостей и добавление новых функций требует обновления контракта. Поэтому возможность обновления контракта крайне необходима. В этой статье будет представлен способ обновления контрактов на Rust.

!

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

На примере проекта StatusMessage рассмотрим распространенные методы обновления контрактов NEAR.

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

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

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

Если изменить структуру данных контракта, то прямое повторное развертывание приведет к несовпадению новой и старой структуры данных, что сделает невозможным чтение существующих данных.

3. Используйте Migrate для обновления смарт-контрактов

NEAR предоставляет метод Migrate для помощи в обновлении контрактов. В новый контракт добавьте метод 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.blocksec_upgrade.testnet

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

!

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

  1. Функция обновления должна быть функцией only owner, чтобы обеспечить возможность вызова только владельцем.

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

  3. Перед функцией миграции добавьте #[init(ignore_state)]

  4. Удалите функцию миграции после завершения миграции

  5. Новая структура данных инициализируется во время миграции

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

!

INIT-8.15%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 2
  • Репост
  • Поделиться
комментарий
0/400
SandwichVictimvip
· 08-13 22:24
Так много уязвимостей, что это внушает беспокойство.
Посмотреть ОригиналОтветить0
BlockImpostervip
· 08-13 22:24
Неважно, обновляешь ты или нет, все равно не выберешься из этой ямы~
Посмотреть ОригиналОтветить0
  • Закрепить