Посібник з оновлення смартконтрактів на Rust: Безпечні оновлення контрактів NEAR та міграція даних

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

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

!

Спосіб оновлення контрактів 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); } }

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

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 під час розгортання:

недалеко розгорнути
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'migrate'
--initArgs '{}'
--accountId статусповідомлення.blocksec_upgrade.testnet

Це дозволить успішно оновити смартконтракти та здійснити міграцію старих даних.

!

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

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

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

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

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

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

Дотримуючись наведених принципів, можна безпечно оновлювати та підтримувати смартконтракти.

! </string,></string,>

Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • 5
  • Репост
  • Поділіться
Прокоментувати
0/400
GweiWatchervip
· 20год тому
Гравець контракту гримнув: Зростати чи ні - це вже тобі вирішувати!
Переглянути оригіналвідповісти на0
ContractHuntervip
· 20год тому
А-а-а, знову натрапив на знайомі проблеми з оновленням rust.
Переглянути оригіналвідповісти на0
NFTRegrettervip
· 20год тому
Гань! Знову потрібно оновлювати, дістало!
Переглянути оригіналвідповісти на0
TokenVelocityvip
· 20год тому
Стільки вразливостей, хто наважиться торкнутися?
Переглянути оригіналвідповісти на0
DuskSurfervip
· 20год тому
Вразливості в контрактах з'являються щодня, дійсно викликають роздратування.
Переглянути оригіналвідповісти на0
  • Закріпити