Розробка смартконтрактів на Rust: методи оновлення контрактів
Смартконтракти як програма коду, неминуче мають недоліки та потребують вдосконалення. Навіть після великої кількості тестувань і аудиту, контракт все ще може містити вразливості. Як тільки вразливість буде використана зловмисником, це може призвести до серйозних наслідків, таких як втрата активів користувачів. Тому можливість оновлення контракту є дуже важливою, оскільки вона може бути використана як для виправлення вразливостей, так і для додавання нових функцій. У цій статті будуть представлені кілька способів оновлення смартконтрактів на Rust.
Спосіб оновлення контрактів NEAR
На прикладі проекту StatusMessage розглянемо поширені методи оновлення контрактів NEAR.
1. Оновлення без змін структури даних смартконтракту
Якщо потрібно лише змінити логіку контракту, не змінюючи структуру даних, можна безпосередньо використовувати команду near deploy для повторного розгортання нового коду.
поблизу розгортання
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'migrate'
--initArgs '{}'
--accountId statusmessage.blocksec_upgrade.testnet
Таким чином, можна успішно перенести старі дані в нову структуру даних.
!
Безпекові міркування щодо оновлення смартконтрактів
Контроль доступу - Функція оновлення повинна бути виключно для власника, рекомендується призначити власника DAO.
Додайте перед функцією міграції #[init(ignore_state)]
Після завершення міграції видаліть функцію міграції
Новий структур даних ініціалізується під час міграції
Завдяки раціональному проектуванню механізму оновлення можна досягти можливості оновлення контракту за умови забезпечення безпеки, що закладає основу для довгострокового обслуговування та оптимізації.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
Практика оновлення смартконтрактів на Rust: три методи та безпекові міркування в екосистемі NEAR
Розробка смартконтрактів на Rust: методи оновлення контрактів
Смартконтракти як програма коду, неминуче мають недоліки та потребують вдосконалення. Навіть після великої кількості тестувань і аудиту, контракт все ще може містити вразливості. Як тільки вразливість буде використана зловмисником, це може призвести до серйозних наслідків, таких як втрата активів користувачів. Тому можливість оновлення контракту є дуже важливою, оскільки вона може бути використана як для виправлення вразливостей, так і для додавання нових функцій. У цій статті будуть представлені кілька способів оновлення смартконтрактів на Rust.
Спосіб оновлення контрактів NEAR
На прикладі проекту StatusMessage розглянемо поширені методи оновлення контрактів NEAR.
Приклад коду смартконтракту StatusMessage:
іржа #[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, повідомлення: String) { let account_id = env::signer_account_id(); self.records.insert(&account_id, &message); }
}
1. Оновлення без змін структури даних смартконтракту
Якщо потрібно лише змінити логіку контракту, не змінюючи структуру даних, можна безпосередньо використовувати команду near deploy для повторного розгортання нового коду.
Наприклад, додати нову функцію:
іржа 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. Оновлення структури даних смартконтракту
Якщо змінити структуру даних контракту, повторне розгортання призведе до невдачі десеріалізації стану.
Наприклад, зміна структури даних:
іржа pub struct StatusMessage { слогани: LookupMap<string, string="">, bios: LookupMap<string, string="">, }
У цьому випадку потрібно використовувати метод Migrate для оновлення.
3. Використання методу 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 statusmessage.blocksec_upgrade.testnet
Таким чином, можна успішно перенести старі дані в нову структуру даних.
!
Безпекові міркування щодо оновлення смартконтрактів
Контроль доступу - Функція оновлення повинна бути виключно для власника, рекомендується призначити власника DAO.
Додайте перед функцією міграції #[init(ignore_state)]
Після завершення міграції видаліть функцію міграції
Новий структур даних ініціалізується під час міграції
Завдяки раціональному проектуванню механізму оновлення можна досягти можливості оновлення контракту за умови забезпечення безпеки, що закладає основу для довгострокового обслуговування та оптимізації.
! </string,></string,></string,>