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

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

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

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

Метод обновления контракта 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); } }

После компиляции используйте near deploy для повторного развертывания. Данные из исходного контракта по-прежнему можно нормально считывать.

!

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

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

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

В этом случае необходимо использовать метод 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 "миграция"
--initArgs "{}"
--accountId statusmessage.blocksec_upgrade.testnet

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

!

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

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

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

  3. Перед функцией миграции добавьте #[init(ignore_state)], чтобы гарантировать, что состояние не загружается перед выполнением.

  4. После завершения миграции удалите функцию миграции, чтобы она вызывалась только один раз.

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

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

! </string,></string,>

NEAR3.77%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 2
  • Поделиться
комментарий
0/400
WalletDetectivevip
· 07-20 23:00
Да, это довольно хардкорно!
Посмотреть ОригиналОтветить0
MetaverseVagrantvip
· 07-20 22:55
Снова занимаемся смарт-контрактами.
Посмотреть ОригиналОтветить0
  • Закрепить