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

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

Подробное объяснение методов обновления смарт-контрактов на Rust

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

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

Смарт-контракты на Ethereum обладают неизменяемостью, и после развертывания их нельзя напрямую изменять. Обычно для обновления используются следующие методы:

  1. Развертывание нового контракта, изменение адреса контракта в DApp. Недостаток в том, что необходимо мигрировать состояние данных старого контракта.

  2. Архитектура разделения данных и логики. Данные хранятся в состоянии смарт-контрактов, логика реализована в другом контракте. При обновлении необходимо только обновить логический контракт.

  3. Используйте прокси-контракты. Прокси-контракты хранят данные и вызывают логические контракты через deleGatecall, при обновлении необходимо просто обновить адрес логического контракта.

!

Метод обновления контрактов NEAR

На примере проекта StatusMessage рассматривается метод обновления контрактов NEAR:

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

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

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

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

3. Используйте метод Migrate для обновления

NEAR предоставляет метод Migrate для помощи в обновлении:

  1. Добавить метод migrate в новый контракт
  2. Во время развертывания вызывайте метод migrate для миграции данных
  3. После завершения миграции можно нормально использовать функции нового контракта.

!

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

  1. Контроль доступа - Функция обновления должна быть функцией только для владельца
  2. Рекомендуется установить владельцем DAO, чтобы избежать рисков централизации
  3. Используйте #[init(ignore_state)], чтобы убедиться, что состояние не загружается перед выполнением миграции.
  4. Удалите функцию миграции после миграции, чтобы избежать повторных вызовов
  5. Новая структура данных инициализируется во время миграции.

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

!

ETH5.34%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 6
  • Поделиться
комментарий
0/400
FlatlineTradervip
· 7ч назад
Уязвимость это Кошелек...
Посмотреть ОригиналОтветить0
Deconstructionistvip
· 13ч назад
Рекомендуется добавить горячую перезагрузку
Посмотреть ОригиналОтветить0
rekt_but_not_brokevip
· 13ч назад
Смарт-контракты на самом деле такие обманчивые.
Посмотреть ОригиналОтветить0
LiquidityWizardvip
· 14ч назад
теоретически говоря, прокси-шаблоны это всего лишь сахарные состояния мутаций с 73.4% дополнительными Газ-расходами... смх
Посмотреть ОригиналОтветить0
SchrödingersNodevip
· 14ч назад
Снова старая операция по изменению адреса контракта
Посмотреть ОригиналОтветить0
NestedFoxvip
· 14ч назад
rust здесь слишком сложно.
Посмотреть ОригиналОтветить0
  • Закрепить