Смартконтракти за своєю суттю є програмами, які, безперечно, мають недоліки. Навіть після численних тестувань та аудитів можуть існувати вразливості. Атака на вразливість контракту може призвести до втрати активів користувачів, що має серйозні наслідки. Виправлення вразливостей та додавання нових функцій вимагає оновлення контракту. Тому можливість оновлення контракту є вкрай необхідною. У цій статті буде розглянуто способи оновлення контрактів на Rust.
!
Спосіб оновлення контрактів 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
Це дозволить успішно перенести дані старого контракту до нового контракту.
!
Безпекові аспекти оновлення смартконтрактів
Функція оновлення повинна бути функцією only owner, щоб забезпечити виклик тільки власником.
Рекомендується встановити власника контракту як DAO, щоб спільно управляти через пропозиції та голосування.
Додайте #[init(ignore_state)] перед функцією міграції
Видалити функцію міграції після завершення міграції
Нові структури даних ініціалізуються під час міграції
Оновлення смартконтрактів є важливим засобом забезпечення безпеки контрактів, розробники повинні обережно ставитися до цього, забезпечуючи безпеку процесу оновлення.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
9 лайків
Нагородити
9
2
Репост
Поділіться
Прокоментувати
0/400
SandwichVictim
· 08-13 22:24
Так багато вразливостей, дивитися страшно.
Переглянути оригіналвідповісти на0
BlockImposter
· 08-13 22:24
Яка різниця, оновлюй чи ні, все одно не втечеш з дупла~
Усе про оновлення смартконтрактів Rust: від NEAR до питань безпеки
Практика оновлення смартконтрактів на Rust
Смартконтракти за своєю суттю є програмами, які, безперечно, мають недоліки. Навіть після численних тестувань та аудитів можуть існувати вразливості. Атака на вразливість контракту може призвести до втрати активів користувачів, що має серйозні наслідки. Виправлення вразливостей та додавання нових функцій вимагає оновлення контракту. Тому можливість оновлення контракту є вкрай необхідною. У цій статті буде розглянуто способи оновлення контрактів на 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
Це дозволить успішно перенести дані старого контракту до нового контракту.
!
Безпекові аспекти оновлення смартконтрактів
Функція оновлення повинна бути функцією only owner, щоб забезпечити виклик тільки власником.
Рекомендується встановити власника контракту як DAO, щоб спільно управляти через пропозиції та голосування.
Додайте #[init(ignore_state)] перед функцією міграції
Видалити функцію міграції після завершення міграції
Нові структури даних ініціалізуються під час міграції
Оновлення смартконтрактів є важливим засобом забезпечення безпеки контрактів, розробники повинні обережно ставитися до цього, забезпечуючи безпеку процесу оновлення.
!