Посібник з оновлення смартконтрактів Rust: практика безпечної міграції платформи NEAR

robot
Генерація анотацій у процесі

Посібник з оновлення смартконтрактів 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

Таким чином, можна успішно розгорнути новий смартконтракт і мігрувати старі дані.

!

Безпекові міркування при оновленні смартконтрактів

  1. Функція оновлення повинна проходити контроль доступу, зазвичай її можуть викликати лише розробники або DAO.

  2. Рекомендується встановити owner контракту як DAO, щоб спільно управляти через пропозиції та голосування.

  3. Додати #[init(ignore_state)] перед функцією міграції, щоб переконатися, що стан не завантажується перед виконанням.

  4. Після завершення міграції видаліть функцію міграції, щоб переконатися, що вона викликається лише один раз.

  5. Нові структури даних ініціалізуються під час міграції.

Розумний механізм оновлення може забезпечити гнучкість і підтримуваність контракту при гарантії безпеки.

!

INIT3.84%
Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • 6
  • Поділіться
Прокоментувати
0/400
SignatureAnxietyvip
· 2год тому
nearгравців тепер gg
Переглянути оригіналвідповісти на0
DAOTruantvip
· 7год тому
Чи переносити дані, залежить від настрою.
Переглянути оригіналвідповісти на0
0xSherlockvip
· 07-25 08:10
Дивитися на це вже важко, не можу вчитися.
Переглянути оригіналвідповісти на0
MEVHunterLuckyvip
· 07-25 08:10
Чесно кажучи, код навіть не викладений, як його вивчати?
Переглянути оригіналвідповісти на0
blocksnarkvip
· 07-25 08:10
Майстер NEAR прийшов навчати
Переглянути оригіналвідповісти на0
rugpull_survivorvip
· 07-25 08:00
Старий слух near стабільно а
Переглянути оригіналвідповісти на0
  • Закріпити