# Rust スマートコントラクト開発シリーズ:コントラクトアップグレード方法スマートコントラクトはプログラムコードとして、欠陥や改善の必要があることは避けられません。大量のテストや監査を経ても、契約には脆弱性が存在する可能性があります。一度脆弱性が攻撃者に利用されると、ユーザーの資産損失など深刻な結果を招くことがあります。そのため、契約のアップグレード可能性は非常に重要です。脆弱性を修正するためにも、新しい機能を追加するためにも利用できます。本記事では、Rustスマートコントラクトのいくつかのアップグレード方法について紹介します。## NEAR コントラクトアップグレード方法StatusMessageプロジェクトを例に挙げて、NEARスマートコントラクトの一般的なアップグレード方法について説明します。StatusMessage スマートコントラクトコード例:さび#[near_bindgen]#[derive(BorshDeserialize、BorshSerialize)]pub struct ステータスメッセージ { レコード: LookupMap<string, string="">,}StatusMessage { の impl デフォルト 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)を返します。 }}### 1. 合約データ構造未修正のアップグレード契約のロジックを変更するだけで、データ構造の変更が関与しない場合は、直接 near deploy コマンドを使用して新しいコードを再デプロイできます。例えば、新しい関数を追加する:さびpub fn set_get_status(&mut self, message: String) -> Option<string> { account_id = env::signer_account_id(); self.records.insert(&account_id, &message); self.records.get(&account_id)を返します。}再デプロイ後、元のデータは正常に読み取ることができます。! [](https://img-cdn.gateio.im/social/moments-54db9c46be493cda1cd1968fc890b4d6)### 2. 合約データ構造の変更アップグレード契約のデータ構造を変更した場合、直接再デプロイすると状態の逆シリアル化に失敗します。例えばデータ構造を変更する:錆 pub struct ステータスメッセージ { タグライン: LookupMap<string, string="">, bios: LookupMap<string, string="">,}この場合、Migrate メソッドを使用してアップグレードする必要があります。### 3. 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. マイグレーション関数の前に #[init(ignore_state)]を追加します。3. 移行が完了したら、移行関数を削除する4. 新しいデータ構造は移行時に初期化を完了します合理的な設計によるアップグレードメカニズムを通じて、安全性を確保した上でスマートコントラクトのアップグレード可能性を実現し、長期的なメンテナンスと最適化の基盤を築くことができます。! [](https://img-cdn.gateio.im/social/moments-af3fe22c1999da5db0e2853b8a271276)</string,></string,></string></string></string,>
Rustスマートコントラクトアップグレード実践:NEARエコシステムにおける3つの方法と安全性の考慮
Rust スマートコントラクト開発シリーズ:コントラクトアップグレード方法
スマートコントラクトはプログラムコードとして、欠陥や改善の必要があることは避けられません。大量のテストや監査を経ても、契約には脆弱性が存在する可能性があります。一度脆弱性が攻撃者に利用されると、ユーザーの資産損失など深刻な結果を招くことがあります。そのため、契約のアップグレード可能性は非常に重要です。脆弱性を修正するためにも、新しい機能を追加するためにも利用できます。本記事では、Rustスマートコントラクトのいくつかのアップグレード方法について紹介します。
NEAR コントラクトアップグレード方法
StatusMessageプロジェクトを例に挙げて、NEARスマートコントラクトの一般的なアップグレード方法について説明します。
StatusMessage スマートコントラクトコード例:
さび #[near_bindgen] #[derive(BorshDeserialize、BorshSerialize)] pub struct ステータスメッセージ { レコード: LookupMap<string, string="">, }
StatusMessage { の impl デフォルト 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); }
}
1. 合約データ構造未修正のアップグレード
契約のロジックを変更するだけで、データ構造の変更が関与しない場合は、直接 near deploy コマンドを使用して新しいコードを再デプロイできます。
例えば、新しい関数を追加する:
さび pub fn set_get_status(&mut self, message: String) -> Option { account_id = env::signer_account_id(); self.records.insert(&account_id, &message); self.records.get(&account_id)を返します。 }
再デプロイ後、元のデータは正常に読み取ることができます。
!
2. 合約データ構造の変更アップグレード
契約のデータ構造を変更した場合、直接再デプロイすると状態の逆シリアル化に失敗します。
例えばデータ構造を変更する:
錆 pub struct ステータスメッセージ { タグライン: LookupMap<string, string="">, bios: LookupMap<string, string="">, }
この場合、Migrate メソッドを使用してアップグレードする必要があります。
3. 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に設定することをお勧めします。
マイグレーション関数の前に #[init(ignore_state)]を追加します。
移行が完了したら、移行関数を削除する
新しいデータ構造は移行時に初期化を完了します
合理的な設計によるアップグレードメカニズムを通じて、安全性を確保した上でスマートコントラクトのアップグレード可能性を実現し、長期的なメンテナンスと最適化の基盤を築くことができます。
! </string,></string,></string,>