Смартконтракти як вид програм неминуче можуть містити дефекти. Навіть після численних тестувань та аудитів все ще можуть бути вразливості. Як тільки вразливість буде використана, це може призвести до серйозних наслідків, таких як втрата активів користувачів. Тому можливість оновлення контрактів є вкрай важливою, головним чином для виправлення вразливостей та додавання нових функцій.
!
Способи оновлення смартконтрактів NEAR
На прикладі проекту StatusMessage розглянемо поширені методи оновлення контрактів NEAR.
1. Структура даних смартконтракту не змінена
Якщо змінюється лише логіка смартконтракту, без зміни структури даних, можна безпосередньо використовувати команду near deploy для повторного розгортання нового коду. Дані з оригінального контракту все ще можна нормально зчитувати.
2. Структура даних смартконтракту була змінена
Якщо змінити структуру даних смартконтракту, то пряме повторне розгортання призведе до того, що нова структура даних не зможе відповідати старому стану, що викличе помилку.
3. Використання методу Migrate для оновлення
NEAR надає метод Migrate для допомоги в оновленні контрактів. У новому контракті додайте метод migrate:
Виклик методу migrate під час повторного розгортання:
близько до впровадження
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'migrate'
--initArgs '{}'
--accountId statusmessage.blocksec_upgrade.testnet
Таким чином, можна успішно розгорнути новий смартконтракт і мігрувати старі дані.
!
Безпекові міркування при оновленні смартконтрактів
Функція оновлення повинна проходити контроль доступу, зазвичай її можуть викликати лише розробники або DAO.
Рекомендується встановити owner контракту як DAO, щоб спільно управляти через пропозиції та голосування.
Додати #[init(ignore_state)] перед функцією міграції, щоб переконатися, що стан не завантажується перед виконанням.
Після завершення міграції видаліть функцію міграції, щоб переконатися, що вона викликається лише один раз.
Нові структури даних ініціалізуються під час міграції.
Розумний механізм оновлення може забезпечити гнучкість і підтримуваність контракту при гарантії безпеки.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
18 лайків
Нагородити
18
6
Поділіться
Прокоментувати
0/400
SignatureAnxiety
· 2год тому
nearгравців тепер gg
Переглянути оригіналвідповісти на0
DAOTruant
· 7год тому
Чи переносити дані, залежить від настрою.
Переглянути оригіналвідповісти на0
0xSherlock
· 07-25 08:10
Дивитися на це вже важко, не можу вчитися.
Переглянути оригіналвідповісти на0
MEVHunterLucky
· 07-25 08:10
Чесно кажучи, код навіть не викладений, як його вивчати?
Посібник з оновлення смартконтрактів Rust: практика безпечної міграції платформи NEAR
Посібник з оновлення смартконтрактів Rust
Смартконтракти як вид програм неминуче можуть містити дефекти. Навіть після численних тестувань та аудитів все ще можуть бути вразливості. Як тільки вразливість буде використана, це може призвести до серйозних наслідків, таких як втрата активів користувачів. Тому можливість оновлення контрактів є вкрай важливою, головним чином для виправлення вразливостей та додавання нових функцій.
!
Способи оновлення смартконтрактів NEAR
На прикладі проекту StatusMessage розглянемо поширені методи оновлення контрактів NEAR.
1. Структура даних смартконтракту не змінена
Якщо змінюється лише логіка смартконтракту, без зміни структури даних, можна безпосередньо використовувати команду near deploy для повторного розгортання нового коду. Дані з оригінального контракту все ще можна нормально зчитувати.
2. Структура даних смартконтракту була змінена
Якщо змінити структуру даних смартконтракту, то пряме повторне розгортання призведе до того, що нова структура даних не зможе відповідати старому стану, що викличе помилку.
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 statusmessage.blocksec_upgrade.testnet
Таким чином, можна успішно розгорнути новий смартконтракт і мігрувати старі дані.
!
Безпекові міркування при оновленні смартконтрактів
Функція оновлення повинна проходити контроль доступу, зазвичай її можуть викликати лише розробники або DAO.
Рекомендується встановити owner контракту як DAO, щоб спільно управляти через пропозиції та голосування.
Додати #[init(ignore_state)] перед функцією міграції, щоб переконатися, що стан не завантажується перед виконанням.
Після завершення міграції видаліть функцію міграції, щоб переконатися, що вона викликається лише один раз.
Нові структури даних ініціалізуються під час міграції.
Розумний механізм оновлення може забезпечити гнучкість і підтримуваність контракту при гарантії безпеки.
!