Техніки оновлення смартконтрактів 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 { Self { записи: LookupMap::new(b'r'.to_vec()), } } }

#[near_bindgen] impl StatusMessage { pub fn set_status(&mut self, повідомлення: String) { let account_id = env::signer_account_id(); self.records.insert(&account_id, &message); }

pub fn get_status(&self, account_id: String) -> Варіант<string> {
    return 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 під час розгортання:

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

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

!

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

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

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

  3. Додайте #[init(ignore_state)] перед функцією migrate.

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

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

За допомогою вищезазначеного методу можна безпечно та ефективно виконати оновлення смартконтрактів Rust.

! </string,>

Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • 8
  • Поділіться
Прокоментувати
0/400
GamefiEscapeArtistvip
· 1год тому
Знову стара проблема оновлення контракту, хто знає, той знає
Переглянути оригіналвідповісти на0
CryptoNomicsvip
· 08-01 19:25
*с sigh* дозвольте мені пояснити, використовуючи стохастичні ймовірнісні матриці, чому оновлюваність != безпека
Переглянути оригіналвідповісти на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
  • Закріпити