Обговорення методів оновлення смартконтрактів на Rust
Оновлення контракту є важливим етапом у розробці смартконтрактів. Завдяки незмінності блокчейну, як тільки смартконтракт, розгорнутий на ланцюгу, не може бути безпосередньо змінений. Проте в реальних застосуваннях контракти часто потребують виправлення вразливостей або додавання нових функцій, для чого необхідно здійснити оновлення. У цій статті будуть представлені поширені методи оновлення смартконтрактів на Rust.
1. Необхідність оновлення смартконтрактів
Смартконтракти як програмний код, неминуче можуть містити вразливості. Навіть після великої кількості тестування та аудиту, можуть залишитися невиявлені проблеми. Як тільки вразливість буде зловмисно використана, це може призвести до серйозних втрат активів. Тому можливість оновлення є дуже важливою для смартконтрактів, основні цілі:
Наступне на прикладі проекту StatusMessage буде представлено методи оновлення контрактів NEAR:
2.1 Структура даних смартконтракту не змінена
Якщо потрібно лише змінити логіку контракту і не вносити зміни в структуру даних, можна безпосередньо використовувати команду near deploy для повторного розгортання нового коду. Приклад:
Баш
близьке розгортання
--accountId statusmessage.testnet
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
У цьому випадку дані з попереднього контракту будуть збережені.
2.2 Структура даних смартконтракту була змінена
Якщо змінено структуру даних контракту, то пряме повторне розгортання призведе до помилки несумісності нової та старої структур даних. У такому випадку необхідно використовувати метод міграції для оновлення.
Таким чином, старі дані можуть бути перенесені в нову структуру даних.
!
3. Безпекові аспекти оновлення смартконтрактів
При оновленні смартконтрактів необхідно звернути увагу на такі пункти:
Строго контролювати права на оновлення, дозволяючи оновлення лише власнику контракту або DAO
Рекомендується встановити власника контракту на DAO, щоб керувати оновленнями через пропозиції та голосування.
Додайте перед функцією міграції #[init(ignore_state)], щоб забезпечити, що стан не завантажується перед виконанням
Після завершення міграції видаліть функцію міграції, щоб уникнути повторних викликів
Нову структуру даних ініціалізовано під час міграції
Розумне проектування та виконання плану оновлення можуть забезпечити можливість оновлення контракту, водночас максимально захищаючи безпеку контракту та активів користувачів.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
Методи оновлення смартконтрактів Rust та питання безпеки
Обговорення методів оновлення смартконтрактів на Rust
Оновлення контракту є важливим етапом у розробці смартконтрактів. Завдяки незмінності блокчейну, як тільки смартконтракт, розгорнутий на ланцюгу, не може бути безпосередньо змінений. Проте в реальних застосуваннях контракти часто потребують виправлення вразливостей або додавання нових функцій, для чого необхідно здійснити оновлення. У цій статті будуть представлені поширені методи оновлення смартконтрактів на Rust.
1. Необхідність оновлення смартконтрактів
Смартконтракти як програмний код, неминуче можуть містити вразливості. Навіть після великої кількості тестування та аудиту, можуть залишитися невиявлені проблеми. Як тільки вразливість буде зловмисно використана, це може призвести до серйозних втрат активів. Тому можливість оновлення є дуже важливою для смартконтрактів, основні цілі:
!
2. Способи оновлення контрактів NEAR
Наступне на прикладі проекту StatusMessage буде представлено методи оновлення контрактів NEAR:
2.1 Структура даних смартконтракту не змінена
Якщо потрібно лише змінити логіку контракту і не вносити зміни в структуру даних, можна безпосередньо використовувати команду near deploy для повторного розгортання нового коду. Приклад:
Баш близьке розгортання
--accountId statusmessage.testnet
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
У цьому випадку дані з попереднього контракту будуть збережені.
2.2 Структура даних смартконтракту була змінена
Якщо змінено структуру даних контракту, то пряме повторне розгортання призведе до помилки несумісності нової та старої структур даних. У такому випадку необхідно використовувати метод міграції для оновлення.
Додати метод 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.testnet
Таким чином, старі дані можуть бути перенесені в нову структуру даних.
!
3. Безпекові аспекти оновлення смартконтрактів
При оновленні смартконтрактів необхідно звернути увагу на такі пункти:
Розумне проектування та виконання плану оновлення можуть забезпечити можливість оновлення контракту, водночас максимально захищаючи безпеку контракту та активів користувачів.
!