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スマートコントラクト育成日記(9):契約安全の契約アップグレード
スマートコントラクトはプログラムコードの一形態であり、欠陥や脆弱性が存在する可能性があります。十分なテストと監査を受けたコントラクトでも、発見されていない問題があるかもしれません。これらの潜在的な問題が悪用されると、ユーザーの資産の損失など深刻な結果を引き起こす可能性があります。したがって、コントラクトのアップグレード能力は、脆弱性の修正や新機能の追加に非常に重要です。本記事では、NEARプラットフォームにおけるRustコントラクトのアップグレード方法について紹介します。
1. 契約のアップグレードの必要性
スマートコントラクト本質的にはプログラムコードであり、避けがたい欠陥が存在する可能性があります。大量のテストや監査を経ても、脆弱性が残ることがあります。これらの脆弱性が攻撃者によって悪用されると、ユーザーの資産損失などの深刻な結果を引き起こす可能性があります。脆弱性を修正するには、しばしば契約のアップグレードを通じて実現する必要があります。さらに、新機能の追加も契約のアップグレードを必要とします。したがって、契約のアップグレード可能性は非常に重要です。
!
2. イーサリアムスマートコントラクトの一般的なアップグレード方法
イーサリアム上のスマートコントラクトは不変性を持ち、一度デプロイされると変更できません。この問題を解決するために、通常はプロキシコントラクト(Proxy Contract)の方式を採用します:
この方法では、元のデータを保持し、ロジック部分のみを更新できます。
!
3. NEARスマートコントラクトのアップグレード方法
以下にStatusMessageプロジェクトを例として、NEARスマートコントラクトのアップグレード方法を紹介します:
3.1 合約データ構造は変更されていません
契約のロジックのみを変更し、データ構造の変更がない場合は、直接 near deploy コマンドを使用して新しいコードを再デプロイできます。既存のデータは保持されます。
3.2 合約データ構造が変更されました
契約のデータ構造を変更した場合、直接再デプロイすると新旧のデータ構造が一致せず、既存のデータを正常に読み取ることができなくなります。
3.3 Migrateメソッドを使用してアップグレードする
NEARは契約のアップグレードのためにMigrateメソッドを提供しています。新しい契約にmigrate関数を追加します:
さび #[private] #[init(ignore_state)] pub fn migrate() -> セルフ { old_stateさせてください: OldStatusMessage = env::state_read().expect("failed"); セルフ { タグライン: old_state.records, bios: LookupMap::new(b"b".to_vec()), } }
デプロイ時にmigrateメソッドを呼び出します:
近くにデプロイ \ --wasmファイルターゲット/wasm32-unknown-unknown/release/status_message.wasm
--initFunction "移行"
--initArgs "{}"
--accountId statusmessage.blocksec_upgrade.testnet
こうすることでデータ移行が完了し、新旧スマートコントラクトのデータ構造が不一致でも正常にアップグレードできます。
4. コントラクトアップグレードの安全性に関する考慮事項
契約のアップグレードには、以下のセキュリティ要因を考慮する必要があります:
これらの措置により、契約のアップグレードの安全性が確保され、アップグレードプロセス中のリスクが低減されます。
!