Rustスマートコントラクトアップグレードのベストプラクティス:NEARコントラクトのケーススタディから学ぶ

Rustスマートコントラクトアップグレードガイド

スマートコントラクトはプログラムの一種であり、欠陥が存在する可能性があります。大量のテストや監査を経ても、脆弱性が残ることがあります。一度攻撃者に利用されると、ユーザーの資産が失われる可能性があり、その結果は深刻です。したがって、契約のアップグレード可能性は非常に重要であり、主に脆弱性の修正や新しい機能の追加に使用されます。本稿ではRust契約のアップグレード方法について紹介します。

NEAR契約のアップグレード方法

StatusMessageプロジェクトを例に、NEARコントラクトの一般的なアップグレード方法を紹介します。

1. 合約データ構造は変更されていません

契約のロジックのみを変更し、データ構造の変更を伴わない場合は、near deployを使用して新しいコードを直接デプロイできます:

バッシュ nearデプロイ
--accountId status_message.example.testnet
--wasmファイルターゲット/wasm32-unknown-unknown/release/status_message.wasm

既存の契約データは正常に読み取れます。

!

2. コントラクト データ構造の変更

契約データ構造を変更した場合、直接再デプロイすると状態の逆シリアル化が失敗します。この場合、migrateメソッドを使用してアップグレードする必要があります:

さび #[private] #[init(ignore_state)] pub fn migrate() -> セルフ { old_stateさせてください: OldStatusMessage = env::state_read().expect("failed"); セルフ { new_field: LookupMap::new(b"n".to_vec()), old_field: old_state.old_field、 } }

デプロイ時にmigrateメソッドを呼び出す:

バッシュ
near デプロイ
--wasmファイルターゲット/wasm32-unknown-unknown/release/status_message.wasm
--initFunction "移行"
--initArgs "{}"
--accountId status_message.example.testnet

これにより、古い状態を新しいスマートコントラクトに移行できます。

!

コントラクトアップグレードに関する安全提案

  1. アップグレード機能に権限管理を追加し、オーナーのみが呼び出せるようにする
  2. ownerをDAOに設定し、提案と投票によって管理する
  3. 移行機能に #[init(ignore_state)] を追加する
  4. 移行が完了したら、移行関数を削除します。
  5. 新しいデータ構造は、移行時に初期化を完了します

合理なアップグレードは、スマートコントラクトの安全性と拡張性を維持することができ、スマートコントラクトの開発において重要な要素です。

!

原文表示
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • 報酬
  • 3
  • 共有
コメント
0/400
PumpBeforeRugvip
· 13時間前
低レベルの脆弱性の防止すらできないのに、何のために裸で走るのか。
原文表示返信0
DegenWhisperervip
· 13時間前
さすがrustだね 素晴らしい
原文表示返信0
WalletWhisperervip
· 13時間前
新しい坑が来たね、面白そうだ
原文表示返信0
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)