Практическое руководство по обновлению смарт-контрактов на Rust: три метода и соображения безопасности в экосистеме NEAR

Rust смарт-контракты разработка серия: методы обновления контракта

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

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

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

StatusMessage смарт-контракт кода примеры:

ржавчина #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct StatusMessage { записи: LookupMap<string, string="">, }

impl Default для StatusMessage { fn default() -> Self { Самостоятельно { записи: LookupMap::new(b'r'.to_vec()), } } }

#[near_bindgen] impl StatusMessage { pub fn set_status(&mut self, message: String) { let account_id = env::signer_account_id(); self.records.insert(&account_id, &message); }

pub fn get_status(&self, account_id: String) -> Option<string> {
    вернуть self.records.get(&account_id);
}

}

1. Обновление без изменения структуры данных смарт-контрактов

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

Например, добавьте новую функцию:

ржавчина pub fn set_get_status(&mut self, message: String) -> Option { let account_id = env::signer_account_id(); self.records.insert(&account_id, &message); вернуть self.records.get(&account_id); }

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

!

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

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

Например, изменить структуру данных:

ржавчина pub struct StatusMessage { слоганы: LookupMap<string, string="">, bios: LookupMap<string, string="">, }

В этом случае необходимо использовать метод Migrate для обновления.

3. Используйте метод 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 'migrate'
--initArgs '{}'
--accountId statusmessage.blocksec_upgrade.testnet

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

!

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

  1. Контроль доступа - Функция обновления должна быть эксклюзивной для владельца, рекомендуется установить владельца как DAO

  2. Перед функцией миграции добавьте #[init(ignore_state)]

  3. Удалите функцию миграции после завершения миграции

  4. Новая структура данных инициализируется при миграции

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

! </string,></string,></string,>

GET-0.63%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 4
  • Поделиться
комментарий
0/400
PretendingToReadDocsvip
· 07-23 12:26
Контракт代理 более безопасен.
Посмотреть ОригиналОтветить0
ArbitrageBotvip
· 07-23 12:19
Бояться обновления, чтобы не стать неудачником
Посмотреть ОригиналОтветить0
LiquidityNinjavip
· 07-23 12:10
Обновление контракта имеет сложности.
Посмотреть ОригиналОтветить0
EthMaximalistvip
· 07-23 12:04
Обновления также могут содержать уязвимости
Посмотреть ОригиналОтветить0
  • Закрепить