Смартконтракти як вид програмного коду неминуче мають дефекти та вразливості. Навіть після численних тестів та аудиту можуть виникати проблеми з безпекою. Якщо вразливості контракту будуть використані зловмисниками, це може призвести до серйозних наслідків, таких як втрата активів користувачів. Тому оновлення контракту є надзвичайно важливим для виправлення вразливостей та додавання нових функцій. У цій статті буде представлено методи оновлення смартконтрактів на Rust.
!
Звичайні методи оновлення контрактів NEAR
На прикладі проекту StatusMessage розглянемо звичайні методи оновлення контрактів NEAR:
Якщо просто додати нові функції, не вносячи змін у структуру даних, можна безпосередньо використовувати команду near deploy для повторного розгортання нового коду. Існуючі дані можна нормально читати.
Структура даних смартконтракту була змінена
Якщо змінено структуру даних, пряме повторне розгортання призведе до невідповідності нової та старої структур даних, що ускладнить нормальне зчитування даних. У такому випадку потрібно використовувати метод Migrate для оновлення:
близько до розгортання
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'migrate'
--initArgs '{}'
--accountId статусповідомлення.example.testnet
Таким чином, можна перенести старі дані в нову структуру даних.
!
Безпека оновлення смартконтрактів
Реалізуйте контроль доступу, дозволяючи лише розробникам або DAO оновлювати контракти.
Рекомендується встановити власником контракту DAO, щоб спільно управляти через пропозиції та голосування.
Додайте #[init(ignore_state)] перед функцією migrate.
Після завершення міграції видаліть функцію migrate, щоб забезпечити її виклик лише один раз.
Нова структура даних ініціалізується під час міграції.
За допомогою вищезазначеного методу можна безпечно та ефективно виконати оновлення смартконтрактів Rust.
! </string,>
Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
11 лайків
Нагородити
11
7
Поділіться
Прокоментувати
0/400
CryptoNomics
· 17год тому
*с sigh* дозвольте мені пояснити, використовуючи стохастичні ймовірнісні матриці, чому оновлюваність != безпека
Переглянути оригіналвідповісти на0
HodlBeliever
· 08-01 07:16
Навіть якщо коефіцієнт ризику контракту дуже низький, не можна ризикувати.
Переглянути оригіналвідповісти на0
SnapshotLaborer
· 08-01 07:16
Знову займаюся смартконтрактами, тихенько дивлюся на баланс Гаманець.
Переглянути оригіналвідповісти на0
MEV_Whisperer
· 08-01 07:11
Ось так і відбувається оновлення контракту. Що в цьому особливого?
Переглянути оригіналвідповісти на0
GateUser-beba108d
· 08-01 07:09
Цю модернізацію може зробити кожен!
Переглянути оригіналвідповісти на0
MemeCurator
· 08-01 07:07
Занадто близько, навіть не наважуюся писати контракт... боюся, що мене обдеруть.
Техніки оновлення смартконтрактів Rust: безпечні методи оновлення контрактів NEAR
Техніки оновлення смартконтрактів 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); }
}
структура даних контракту не змінена
Якщо просто додати нові функції, не вносячи змін у структуру даних, можна безпосередньо використовувати команду near deploy для повторного розгортання нового коду. Існуючі дані можна нормально читати.
Структура даних смартконтракту була змінена
Якщо змінено структуру даних, пряме повторне розгортання призведе до невідповідності нової та старої структур даних, що ускладнить нормальне зчитування даних. У такому випадку потрібно використовувати метод 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()), } }
близько до розгортання
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'migrate'
--initArgs '{}'
--accountId статусповідомлення.example.testnet
Таким чином, можна перенести старі дані в нову структуру даних.
!
Безпека оновлення смартконтрактів
Реалізуйте контроль доступу, дозволяючи лише розробникам або DAO оновлювати контракти.
Рекомендується встановити власником контракту DAO, щоб спільно управляти через пропозиції та голосування.
Додайте #[init(ignore_state)] перед функцією migrate.
Після завершення міграції видаліть функцію migrate, щоб забезпечити її виклик лише один раз.
Нова структура даних ініціалізується під час міграції.
За допомогою вищезазначеного методу можна безпечно та ефективно виконати оновлення смартконтрактів Rust.
! </string,>