Rust смарт-контракты разработка серия: методы обновления контракта
Смарт-контракты, будучи программным кодом, неизбежно могут содержать недостатки и нуждаться в улучшениях. Даже после большого количества тестов и аудита контракты все еще могут иметь уязвимости. Если уязвимости будут использованы злоумышленниками, это может привести к серьезным последствиям, таким как потеря активов пользователей. Поэтому возможность обновления контрактов имеет огромное значение, так как она может использоваться как для исправления уязвимостей, так и для добавления новых функций. В этой статье будут рассмотрены несколько способов обновления смарт-контрактов на Rust.
Способы обновления контрактов NEAR
На примере проекта StatusMessage рассмотрим распространенные методы обновления контрактов NEAR.
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. Обновление структуры данных смарт-контрактов
Если изменить структуру данных контракта, повторное развертывание приведет к сбою десериализации состояния.
Таким образом, можно успешно перенести старые данные в новую структуру данных.
!
Безопасные аспекты обновления смарт-контрактов
Контроль доступа - Функция обновления должна быть эксклюзивной для владельца, рекомендуется установить владельца как DAO
Перед функцией миграции добавьте #[init(ignore_state)]
Удалите функцию миграции после завершения миграции
Новая структура данных инициализируется при миграции
Путем разумного проектирования механизма обновления можно обеспечить возможность обновления смарт-контрактов при гарантии безопасности, что заложит основу для долгосрочного обслуживания и оптимизации.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
Практическое руководство по обновлению смарт-контрактов на 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); }
}
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
Таким образом, можно успешно перенести старые данные в новую структуру данных.
!
Безопасные аспекты обновления смарт-контрактов
Контроль доступа - Функция обновления должна быть эксклюзивной для владельца, рекомендуется установить владельца как DAO
Перед функцией миграции добавьте #[init(ignore_state)]
Удалите функцию миграции после завершения миграции
Новая структура данных инициализируется при миграции
Путем разумного проектирования механизма обновления можно обеспечить возможность обновления смарт-контрактов при гарантии безопасности, что заложит основу для долгосрочного обслуживания и оптимизации.
! </string,></string,></string,>