Руководство по обновлению смарт-контрактов Rust: безопасные обновления и миграция данных для контрактов NEAR

Руководство по обновлению смарт-контрактов на Rust

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

!

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

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

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

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

ржавчина #[near_bindgen] impl StatusMessage { pub fn set_get_status(&mut self, message: String) -> Option { let account_id = env::signer_account_id(); self.records.insert(&account_id, &message); вернуть self.records.get(&account_id); } }

После повторного развертывания данные из оригинального контракта все еще могут быть успешно прочитаны.

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

Если изменена исходная структура данных, например:

ржавчина #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct StatusMessage { слоганы: LookupMap<string, string="">, bios: LookupMap<string, string="">, }

Прямое повторное развертывание приведет к ошибке десериализации состояния смарт-контрактов.

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 при развертывании:

near развертывание
--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. Новая структура данных инициализируется во время миграции.

Следуя вышеуказанным принципам, можно безопасно выполнять обновление и обслуживание смарт-контрактов.

! </string,></string,>

Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 5
  • Репост
  • Поделиться
комментарий
0/400
GweiWatchervip
· 23ч назад
Игроки контрактов громко закричали: Расти или не расти - решать тебе!
Посмотреть ОригиналОтветить0
ContractHuntervip
· 23ч назад
А-а-а, снова попал в знакомую яму с обновлением rust.
Посмотреть ОригиналОтветить0
NFTRegrettervip
· 23ч назад
Чёрт, снова надо обновляться, достало.
Посмотреть ОригиналОтветить0
TokenVelocityvip
· 23ч назад
Так много уязвимостей, кто осмелится к этому прикоснуться?
Посмотреть ОригиналОтветить0
DuskSurfervip
· 23ч назад
Уязвимости в контрактах появляются каждый день, это действительно вызывает гнев.
Посмотреть ОригиналОтветить0
  • Закрепить