Советы по обновлению смарт-контрактов на Rust: лучшие практики перехода от Ethereum к NEAR

robot
Генерация тезисов в процессе

Rust смарт-контракты养成日记(9):合约安全之合约升级

Смарт-контракты как форма программного кода неизбежно могут содержать дефекты и уязвимости. Даже контракты, прошедшие тщательное тестирование и аудит, могут иметь невыявленные проблемы. Как только эти потенциальные проблемы будут использованы, это может привести к серьезным последствиям, таким как потеря активов пользователей. Поэтому способность к обновлению контрактов имеет важное значение для исправления уязвимостей и добавления новых функций. В данной статье будет рассмотрен способ обновления Rust-контрактов на платформе NEAR.

1. Необходимость обновления смарт-контрактов

Смарт-контракты по своей сути являются программным кодом и неизбежно могут содержать недостатки. Даже после многочисленных тестов и аудитов могут оставаться уязвимости. Если эти уязвимости будут использованы злоумышленниками, это может привести к серьезным последствиям, таким как потеря активов пользователей. Исправление уязвимостей часто требует обновления контракта. Кроме того, добавление новых функций также требует обновления контракта. Поэтому возможность обновления контракта крайне необходима.

!

2. Общие способы обновления контрактов Ethereum

Смарт-контракты на Ethereum обладают неизменяемостью, и после развертывания их невозможно изменить. Чтобы решить эту проблему, обычно используется способ прокси-контрактов (Proxy Contract):

  • Агенты используют смарт-контракты для хранения данных и вызывают логические контракты с помощью deleGatecall
  • Логические контракты содержат конкретную бизнес-логику
  • При обновлении необходимо просто развернуть новый логический смарт-контракт и обновить адрес прокси-контракта.

Этот способ позволяет сохранить исходные данные, обновляя только логическую часть.

!

3. Способы обновления контрактов NEAR

В качестве примера проекта StatusMessage, представим методы обновления контракта NEAR:

3.1 Структура данных смарт-контрактов не изменена

Если изменить только логику контракта, не затрагивая изменения в структуре данных, можно напрямую использовать команду near deploy для повторного развертывания нового кода. Существующие данные будут сохранены.

3.2 Структура данных смарт-контрактов была изменена

Если изменить структуру данных контракта, повторное развертывание приведет к несовпадению старой и новой структуры данных, что сделает невозможным нормальное чтение существующих данных.

3.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 при развертывании:

near развертывание
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction "миграция"
--initArgs "{}"
--accountId statusmessage.blocksec_upgrade.testnet

Таким образом, можно завершить миграцию данных, даже если структуры данных старых и новых смарт-контрактов не совпадают, обновление пройдет нормально.

4. Безопасные аспекты обновления смарт-контрактов

При обновлении смарт-контрактов необходимо учитывать следующие факторы безопасности:

  • Строго контролировать права на обновление, разрешать обновление только разработчикам или DAO
  • Рекомендуется установить владельцем контракта DAO, управляя через предложения и голосование
  • Перед функцией migrate добавьте #[init(ignore_state)]
  • Удалите функцию migrate после миграции, чтобы гарантировать ее вызов только один раз
  • Новая структура данных инициализируется во время миграции

С помощью этих мер можно обеспечить безопасность обновления смарт-контрактов и снизить риски в процессе обновления.

!

Посмотреть Оригинал
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Награда
  • 5
  • Поделиться
комментарий
0/400
liquiditea_sippervip
· 20ч назад
Звучит так сильно, но я все равно не осмеливаюсь попробовать.
Посмотреть ОригиналОтветить0
NeverVoteOnDAOvip
· 20ч назад
Насчет обновления, кажется, не слишком хорошая идея, все время чувствую, что не могу очистить это полностью.
Посмотреть ОригиналОтветить0
BrokenDAOvip
· 20ч назад
Права равны бэкдору, о какой безопасности может идти речь?
Посмотреть ОригиналОтветить0
LayerZeroHerovip
· 20ч назад
Как только обновление будет завершено, никто не сможет управлять.
Посмотреть ОригиналОтветить0
ser_ngmivip
· 20ч назад
потолок rug контракта
Посмотреть ОригиналОтветить0
  • Закрепить