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