# Rustスマートコントラクトアップグレードガイドスマートコントラクトはプログラムの一種であるため、欠陥が存在することは避けられません。大量のテストと監査を経ても、脆弱性が残る可能性があります。もし攻撃者に利用されれば、ユーザーの資産が失われる可能性があり、深刻な結果を招くことがあります。脆弱性を修正するためには、通常、契約のアップグレードが必要です。それに加えて、新機能の追加も契約のアップグレードを必要とします。したがって、契約のアップグレード可能性は非常に重要です。本稿では、Rust契約のアップグレード方法について紹介します。! [](https://img-cdn.gateio.im/social/moments-54db9c46be493cda1cd1968fc890b4d6)## NEAR契約アップグレード方法StatusMessageプロジェクトを例に、NEARコントラクトの一般的なアップグレード方法を紹介します。### 1. 合約データ構造は変更されていません契約のロジックのみを変更し、データ構造の変更が関与しない場合は、near deployコマンドを使用して新しいコードを再デプロイできます。例えば、新しい関数を追加すること:さび#[near_bindgen]ステータスメッセージ{ 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)を返します。 }}再デプロイ後、元のスマートコントラクトのデータは引き続き正常に読み取ることができます。### 2. コントラクトデータ構造が修正されましたもし元のデータ構造を変更した場合、例えば:さび#[near_bindgen]#[derive(BorshDeserialize、BorshSerialize)]pub struct ステータスメッセージ { タグライン: LookupMap<string, string="">, bios: LookupMap<string, string="">,}直接再デプロイすると、コントラクトの状態を逆シリアル化できないエラーが発生します。### 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. アクセス制御: アップグレード関数はonly owner関数であるべきで、ownerのみが呼び出せるようにする。2. コントラクトのオーナーをDAOに設定し、提案と投票を通じて共同管理することをお勧めします。3. マイグレーション関数の前に#[init(ignore_state)]を追加し、実行前に状態をロードしないことを確認します。4. 移行が完了したら、移行関数を削除し、一度だけ呼び出されることを確認してください。5. 新しいデータ構造は移行時に初期化を完了します。上記の原則に従うことで、スマートコントラクトのアップグレードとメンテナンスを安全に行うことができます。! [](https://img-cdn.gateio.im/social/moments-af3fe22c1999da5db0e2853b8a271276)</string,></string,></string>
Rustスマートコントラクトアップグレードガイド:NEAR契約のセキュリティアップデートとデータ移行
Rustスマートコントラクトアップグレードガイド
スマートコントラクトはプログラムの一種であるため、欠陥が存在することは避けられません。大量のテストと監査を経ても、脆弱性が残る可能性があります。もし攻撃者に利用されれば、ユーザーの資産が失われる可能性があり、深刻な結果を招くことがあります。脆弱性を修正するためには、通常、契約のアップグレードが必要です。それに加えて、新機能の追加も契約のアップグレードを必要とします。したがって、契約のアップグレード可能性は非常に重要です。本稿では、Rust契約のアップグレード方法について紹介します。
!
NEAR契約アップグレード方法
StatusMessageプロジェクトを例に、NEARコントラクトの一般的なアップグレード方法を紹介します。
1. 合約データ構造は変更されていません
契約のロジックのみを変更し、データ構造の変更が関与しない場合は、near deployコマンドを使用して新しいコードを再デプロイできます。例えば、新しい関数を追加すること:
さび #[near_bindgen] ステータスメッセージ{ 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. コントラクトデータ構造が修正されました
もし元のデータ構造を変更した場合、例えば:
さび #[near_bindgen] #[derive(BorshDeserialize、BorshSerialize)] pub struct ステータスメッセージ { タグライン: LookupMap<string, string="">, bios: LookupMap<string, string="">, }
直接再デプロイすると、コントラクトの状態を逆シリアル化できないエラーが発生します。
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
これにより、契約を正常にアップグレードし、古いデータを移行できます。
!
コントラクトのアップグレードにおけるセキュリティの考慮
アクセス制御: アップグレード関数はonly owner関数であるべきで、ownerのみが呼び出せるようにする。
コントラクトのオーナーをDAOに設定し、提案と投票を通じて共同管理することをお勧めします。
マイグレーション関数の前に#[init(ignore_state)]を追加し、実行前に状態をロードしないことを確認します。
移行が完了したら、移行関数を削除し、一度だけ呼び出されることを確認してください。
新しいデータ構造は移行時に初期化を完了します。
上記の原則に従うことで、スマートコントラクトのアップグレードとメンテナンスを安全に行うことができます。
! </string,></string,>