Лучшие практики обновления смарт-контрактов Rust: учимся на примере контракта NEAR

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

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

Метод обновления контрактов NEAR

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

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

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

бить близко к развертыванию
--accountId статус_сообщение.example.testnet
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm

Исходные данные контракта могут быть нормально прочитаны.

!

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

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

руда #[private] #[init(ignore_state)] pub fn migrate() -> Self { let old_state: OldStatusMessage = env::state_read().expect("failed"); Самостоятельно { new_field: LookupMap::new(b"n".to_vec()), old_field: old_state.old_field, } }

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

бить
near развертывание
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction "миграция"
--initArgs "{}"
--accountId status_message.example.testnet

Таким образом, старое состояние может быть перенесено в новый смарт-контракт.

!

Рекомендации по безопасности обновления смарт-контрактов

  1. В функцию обновления добавлено управление доступом, только владелец может вызывать.
  2. Установите владельца как DAO, управляя через предложения и голосование
  3. Функция миграции добавляет #[init(ignore_state)]
  4. Удалите функцию миграции после завершения миграции
  5. Новая структура данных инициализируется при миграции

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

!

Посмотреть Оригинал
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Награда
  • 3
  • Поделиться
комментарий
0/400
PumpBeforeRugvip
· 10ч назад
Если вы не можете предотвратить низкоуровневые уязвимости, то о каком голом беге может идти речь?
Посмотреть ОригиналОтветить0
DegenWhisperervip
· 10ч назад
Не зря это rust, удивительный.
Посмотреть ОригиналОтветить0
WalletWhisperervip
· 10ч назад
Новая яма снова пришла, выглядит интересно.
Посмотреть ОригиналОтветить0
  • Закрепить