# Rust スマートコントラクトアップグレードガイドスマートコントラクトはプログラムの一種であり、欠陥が存在する可能性があります。大量のテストや監査を経ても、脆弱性が残る可能性があります。一旦脆弱性が悪用されると、ユーザーの資産損失などの深刻な結果を招くことがあります。したがって、コントラクトのアップグレード可能性は非常に重要であり、主に脆弱性の修正や新機能の追加に使用されます。! [](https://img-cdn.gateio.im/social/moments-54db9c46be493cda1cd1968fc890b4d6)## NEAR コントラクトアップグレード方法StatusMessageプロジェクトを例にして、NEARコントラクトの一般的なアップグレード方法を紹介します。### 1. 合約データ構造は変更されていません契約ロジックのみを変更し、データ構造の変更がない場合は、near deploy コマンドを使用して新しいコードを再デプロイできます。元の契約のデータは正常に読み取ることができます。### 2. コントラクトデータ構造が変更されました契約のデータ構造を変更した場合、直接再デプロイすると新しいデータ構造が古い状態と一致せず、エラーが発生します。### 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 'migrate' \ --initArgs '{}' \ --accountId statusmessage.blocksec_upgrade.testnetこれにより、新しいスマートコントラクトを正常にデプロイし、古いデータを移行できます。! [](https://img-cdn.gateio.im/social/moments-73f5e5195fa71f1f25f5d35ba1e8b8ec)## コントラクトのアップグレードにおけるセキュリティ考慮事項1. アップグレード関数は権限管理を行う必要があり、通常は開発者またはDAOのみが呼び出すことができます。2. 契約のオーナーをDAOに設定し、提案と投票を通じて共同管理することをお勧めします。3. マイグレーション関数の前に #[init(ignore_state)] を追加し、実行前に状態をロードしないようにします。4. 移行が完了したら、移行関数を削除し、1回だけ呼び出されることを確認します。5. 新たに追加されたデータ構造は、移行時に初期化を完了します。合理なアップグレードメカニズムは、安全を保証する前提で、スマートコントラクトに柔軟性と保守性を提供できます。! [](https://img-cdn.gateio.im/social/moments-af3fe22c1999da5db0e2853b8a271276)
Rustスマートコントラクトアップグレードガイド:NEARプラットフォームセキュリティ移行実践
Rust スマートコントラクトアップグレードガイド
スマートコントラクトはプログラムの一種であり、欠陥が存在する可能性があります。大量のテストや監査を経ても、脆弱性が残る可能性があります。一旦脆弱性が悪用されると、ユーザーの資産損失などの深刻な結果を招くことがあります。したがって、コントラクトのアップグレード可能性は非常に重要であり、主に脆弱性の修正や新機能の追加に使用されます。
!
NEAR コントラクトアップグレード方法
StatusMessageプロジェクトを例にして、NEARコントラクトの一般的なアップグレード方法を紹介します。
1. 合約データ構造は変更されていません
契約ロジックのみを変更し、データ構造の変更がない場合は、near deploy コマンドを使用して新しいコードを再デプロイできます。元の契約のデータは正常に読み取ることができます。
2. コントラクトデータ構造が変更されました
契約のデータ構造を変更した場合、直接再デプロイすると新しいデータ構造が古い状態と一致せず、エラーが発生します。
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 'migrate'
--initArgs '{}'
--accountId statusmessage.blocksec_upgrade.testnet
これにより、新しいスマートコントラクトを正常にデプロイし、古いデータを移行できます。
!
コントラクトのアップグレードにおけるセキュリティ考慮事項
アップグレード関数は権限管理を行う必要があり、通常は開発者またはDAOのみが呼び出すことができます。
契約のオーナーをDAOに設定し、提案と投票を通じて共同管理することをお勧めします。
マイグレーション関数の前に #[init(ignore_state)] を追加し、実行前に状態をロードしないようにします。
移行が完了したら、移行関数を削除し、1回だけ呼び出されることを確認します。
新たに追加されたデータ構造は、移行時に初期化を完了します。
合理なアップグレードメカニズムは、安全を保証する前提で、スマートコントラクトに柔軟性と保守性を提供できます。
!