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

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

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

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

!

Часто используемые методы обновления контрактов NEAR

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

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

impl Default для StatusMessage { fn default() -> Self { Самостоятельно { записи: LookupMap::new(b'r'.to_vec()), } } }

#[near_bindgen] impl StatusMessage { pub fn set_status(&mut self, message: String) { let account_id = env::signer_account_id(); self.records.insert(&account_id, &message); }

pub fn get_status(&self, account_id: String) -> Option<string> {
    вернуть self.records.get(&account_id);
}

}

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

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

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

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

  1. Добавьте метод 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()), } }

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

near развертывание
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'migrate'
--initArgs '{}'
--accountId статуссообщение.example.testnet

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

!

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

  1. Реализуйте контроль доступа, разрешая обновление смарт-контрактов только разработчикам или DAO.

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

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

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

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

С помощью вышеуказанных методов можно безопасно и эффективно выполнить обновление смарт-контрактов на Rust.

! </string,>

Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 7
  • Поделиться
комментарий
0/400
CryptoNomicsvip
· 13ч назад
*вздыхает* позвольте объяснить с помощью стохастических вероятностных матриц, почему обновляемость != безопасность
Посмотреть ОригиналОтветить0
HodlBelievervip
· 08-01 07:16
Независимо от того, насколько низкий коэффициент риска контракта, не стоит рисковать.
Посмотреть ОригиналОтветить0
SnapshotLaborervip
· 08-01 07:16
Снова накручиваю смарт-контракты, тихо смотрю на баланс Кошелька
Посмотреть ОригиналОтветить0
MEV_Whisperervip
· 08-01 07:11
Вот так и происходит обновление контракта, ничего особенного.
Посмотреть ОригиналОтветить0
GateUser-beba108dvip
· 08-01 07:09
Такое обновление может сделать каждый!
Посмотреть ОригиналОтветить0
MemeCuratorvip
· 08-01 07:07
Слишком близко, даже не осмеливаюсь подписывать контракт... боюсь быть обманутым.
Посмотреть ОригиналОтветить0
WalletDivorcervip
· 08-01 06:54
Я в убытке как собака, даже обновление не поможет мне вернуть это.
Посмотреть ОригиналОтветить0
  • Закрепить