# Rustスマートコントラクトアップグレードテクニックスマートコントラクトはプログラムコードの一種であり、欠陥や脆弱性が存在することは避けられません。多くのテストや監査を経ても、セキュリティの問題が発生する可能性があります。一旦、契約の脆弱性が攻撃者に利用されると、ユーザーの資産損失などの深刻な結果を招く可能性があります。したがって、契約のアップグレードは脆弱性を修正し、新しい機能を追加するために非常に重要です。本記事では、Rustスマートコントラクトのアップグレード方法について紹介します。! [](https://img-cdn.gateio.im/social/moments-54db9c46be493cda1cd1968fc890b4d6)## NEAR契約アップグレードの一般的な方法StatusMessageプロジェクトを例にとり、NEARコントラクトの一般的なアップグレード方法について紹介します:さび#[near_bindgen]#[derive(BorshDeserialize、BorshSerialize)]pub struct ステータスメッセージ { レコード: LookupMap<string, string="">,}StatusMessageのデフォルト実装を行います。 fn default() -> 自己 { セルフ { レコード: LookupMap::new(b'r'.to_vec()), } }}#[near_bindgen]ステータスメッセージ{ pub fn set_status(&mut self, メッセージ: String) { account_id = env::signer_account_id(); self.records.insert(&account_id, &message); } pub fn get_status( self, account_id: String) -> オプション<string> { self.records.get(&account_id)を返します。 }}### 合約データ構造は変更されていませんもし新しい関数を追加するだけで、データ構造の変更が関与しない場合は、near deployコマンドを使用して新しいコードを再デプロイすることができます。既存のデータは正常に読み取ることができます。### 合約データ構造が変更されましたデータ構造を変更した場合、直接再デプロイすると新旧データ構造が一致せず、データを正常に読み取ることができなくなります。この場合、Migrateメソッドを使用してアップグレードする必要があります:1. 新しいスマートコントラクトに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()), }}2. デプロイ時にmigrateメソッドを呼び出す:近くにデプロイ \ --wasmファイルターゲット/wasm32-unknown-unknown/release/status_message.wasm \ --initFunction 'migrate' \ --initArgs '{}' \ --accountId statusmessage.example.testnetこれにより、古いデータを新しいデータ構造に移行できます。! [](https://img-cdn.gateio.im/social/moments-73f5e5195fa71f1f25f5d35ba1e8b8ec)## 契約のアップグレードにおける安全性の考慮1. アクセス制御を実施し、開発者またはDAOのみがスマートコントラクトをアップグレードできるようにします。2. コントラクトのオーナーをDAOに設定し、提案と投票を通じて共同管理することをお勧めします。3. 移行機能の前に #[init(ignore_state)] を追加します。4. 移行が完了したら、migrate関数を削除して、1回だけ呼び出されることを確認してください。5. 新しいデータ構造は、移行時に初期化を完了します。上記の方法を通じて、Rustのスマートコントラクトのアップグレードを安全かつ効率的に完了できます。! [](https://img-cdn.gateio.im/social/moments-af3fe22c1999da5db0e2853b8a271276)</string></string,>
Rustスマートコントラクトアップグレードテクニック:NEAR契約の安全な更新方法
Rustスマートコントラクトアップグレードテクニック
スマートコントラクトはプログラムコードの一種であり、欠陥や脆弱性が存在することは避けられません。多くのテストや監査を経ても、セキュリティの問題が発生する可能性があります。一旦、契約の脆弱性が攻撃者に利用されると、ユーザーの資産損失などの深刻な結果を招く可能性があります。したがって、契約のアップグレードは脆弱性を修正し、新しい機能を追加するために非常に重要です。本記事では、Rustスマートコントラクトのアップグレード方法について紹介します。
!
NEAR契約アップグレードの一般的な方法
StatusMessageプロジェクトを例にとり、NEARコントラクトの一般的なアップグレード方法について紹介します:
さび #[near_bindgen] #[derive(BorshDeserialize、BorshSerialize)] pub struct ステータスメッセージ { レコード: LookupMap<string, string="">, }
StatusMessageのデフォルト実装を行います。 fn default() -> 自己 { セルフ { レコード: LookupMap::new(b'r'.to_vec()), } } }
#[near_bindgen] ステータスメッセージ{ pub fn set_status(&mut self, メッセージ: String) { account_id = env::signer_account_id(); self.records.insert(&account_id, &message); }
}
合約データ構造は変更されていません
もし新しい関数を追加するだけで、データ構造の変更が関与しない場合は、near deployコマンドを使用して新しいコードを再デプロイすることができます。既存のデータは正常に読み取ることができます。
合約データ構造が変更されました
データ構造を変更した場合、直接再デプロイすると新旧データ構造が一致せず、データを正常に読み取ることができなくなります。この場合、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()), } }
近くにデプロイ \ --wasmファイルターゲット/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'migrate'
--initArgs '{}'
--accountId statusmessage.example.testnet
これにより、古いデータを新しいデータ構造に移行できます。
!
契約のアップグレードにおける安全性の考慮
アクセス制御を実施し、開発者またはDAOのみがスマートコントラクトをアップグレードできるようにします。
コントラクトのオーナーをDAOに設定し、提案と投票を通じて共同管理することをお勧めします。
移行機能の前に #[init(ignore_state)] を追加します。
移行が完了したら、migrate関数を削除して、1回だけ呼び出されることを確認してください。
新しいデータ構造は、移行時に初期化を完了します。
上記の方法を通じて、Rustのスマートコントラクトのアップグレードを安全かつ効率的に完了できます。
! </string,>