Посібник з оновлення смартконтрактів Rust: детальний опис методів безпеки платформи NEAR

robot
Генерація анотацій у процесі

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

Смартконтракти як програма можуть мати недоліки та вразливості. Навіть після численних тестів та аудиту можуть виникнути проблеми, які залишилися непоміченими. Як тільки вразливість контракту буде використана зловмисником, це може призвести до втрати активів користувачів, що має серйозні наслідки. Тому можливість оновлення контракту має вирішальне значення, оскільки може використовуватися для виправлення вразливостей, а також для додавання нових функцій. У цій статті буде представлено методи оновлення контрактів Rust на платформі NEAR.

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

На прикладі проекту StatusMessage розглянемо поширені методи оновлення контрактів NEAR.

1. Структура даних смартконтракту не була змінена

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

іржавчина #[near_bindgen] impl StatusMessage { pub fn set_get_status(&mut self, повідомлення: String) -> Option { let account_id = env::signer_account_id(); self.records.insert(&account_id, &message); return 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 статусповідомлення.blocksec_upgrade.testnet

Таким чином, можна успішно оновити смартконтракти та мігрувати старі дані.

!

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

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

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

  3. Додайте #[init(ignore_state)] перед функцією міграції, щоб переконатися, що стан не завантажується перед виконанням.

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

  5. Нові структури даних ініціалізуються під час міграції.

Оновлення смартконтрактів є складним процесом, який вимагає обережного підходу. Завдяки розумному проектуванню та суворому тестуванню можна досягти безпечного та надійного оновлення контрактів.

! </string,></string,>

NEAR-2.32%
Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • 3
  • Поділіться
Прокоментувати
0/400
SchrodingerWalletvip
· 1год тому
цінні інсайти啊 варто зафіксувати~
Переглянути оригіналвідповісти на0
WalletDetectivevip
· 07-20 23:00
Це справжній хардкор.
Переглянути оригіналвідповісти на0
MetaverseVagrantvip
· 07-20 22:55
Знову займаються смартконтрактами
Переглянути оригіналвідповісти на0
  • Закріпити