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.
Rustスマートコントラクトアップグレードのベストプラクティス:NEARコントラクトのケーススタディから学ぶ
Rustスマートコントラクトアップグレードガイド
スマートコントラクトはプログラムの一種であり、欠陥が存在する可能性があります。大量のテストや監査を経ても、脆弱性が残ることがあります。一度攻撃者に利用されると、ユーザーの資産が失われる可能性があり、その結果は深刻です。したがって、契約のアップグレード可能性は非常に重要であり、主に脆弱性の修正や新しい機能の追加に使用されます。本稿ではRust契約のアップグレード方法について紹介します。
NEAR契約のアップグレード方法
StatusMessageプロジェクトを例に、NEARコントラクトの一般的なアップグレード方法を紹介します。
1. 合約データ構造は変更されていません
契約のロジックのみを変更し、データ構造の変更を伴わない場合は、near deployを使用して新しいコードを直接デプロイできます:
バッシュ nearデプロイ
--accountId status_message.example.testnet
--wasmファイルターゲット/wasm32-unknown-unknown/release/status_message.wasm
既存の契約データは正常に読み取れます。
!
2. コントラクト データ構造の変更
契約データ構造を変更した場合、直接再デプロイすると状態の逆シリアル化が失敗します。この場合、migrateメソッドを使用してアップグレードする必要があります:
さび #[private] #[init(ignore_state)] pub fn migrate() -> セルフ { old_stateさせてください: OldStatusMessage = env::state_read().expect("failed"); セルフ { new_field: LookupMap::new(b"n".to_vec()), old_field: old_state.old_field、 } }
デプロイ時にmigrateメソッドを呼び出す:
バッシュ
near デプロイ
--wasmファイルターゲット/wasm32-unknown-unknown/release/status_message.wasm
--initFunction "移行"
--initArgs "{}"
--accountId status_message.example.testnet
これにより、古い状態を新しいスマートコントラクトに移行できます。
!
コントラクトアップグレードに関する安全提案
合理なアップグレードは、スマートコントラクトの安全性と拡張性を維持することができ、スマートコントラクトの開発において重要な要素です。
!