Rustスマートコントラクトアップグレードの詳細:イーサリアムからNEARへのベストプラクティス

robot
概要作成中

Rustスマートコントラクトアップグレード方法詳解

スマートコントラクトはプログラムの一種であり、避けられない欠陥や脆弱性が存在する可能性があります。大量のテストや監査を経ても、問題が発生することがあります。脆弱性が攻撃者によって利用されると、ユーザーの資産損失などの深刻な結果を引き起こす可能性があります。したがって、契約のアップグレード性は非常に重要です。本記事では、Rust契約のアップグレード方法について紹介します。

イーサリアムのスマートコントラクトのアップグレード方法

イーサリアムのスマートコントラクトは不変性を持ち、デプロイ後に直接変更することはできません。通常、以下の方法でアップグレードされます:

  1. 新しいスマートコントラクトをデプロイし、DApp内のコントラクトアドレスを変更します。欠点は、古いコントラクトの状態データを移行する必要があることです。

  2. データとロジックの分離アーキテクチャ。データは状態コントラクトに保存し、ロジックは別のコントラクトで実装します。アップグレード時にはロジックコントラクトのみを更新します。

  3. プロキシコントラクトを使用します。プロキシコントラクトはデータを保存し、deleGatecallを通じてロジックコントラクトを呼び出します。アップグレード時にはロジックコントラクトのアドレスを更新するだけです。

!

NEARコントラクトのアップグレード方法

StatusMessageプロジェクトを例に挙げて、NEARコントラクトのアップグレード方法を紹介します:

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

契約のロジックのみを変更し、データ構造の変更が含まれない場合は、near deployコマンドを使用して新しいコードを再デプロイできます。既存のデータは保持されます。

2. コントラクトデータ構造が変更されました

データ構造を変更した場合、直接再デプロイすると新旧のデータ構造が一致せず、データを正常に読み取れなくなります。

3. Migrate方法を使用してアップグレードする

NEARはアップグレードを支援するMigrateメソッドを提供しています:

  1. 新しいスマートコントラクトにmigrateメソッドを追加する
  2. デプロイ時にmigrateメソッドを呼び出してデータ移行を行います。
  3. 移行が完了した後、新しいスマートコントラクト機能を正常に使用できます

!

契約のアップグレードに関する安全性の考慮

  1. 権限管理 - アップグレード関数はonly owner関数であるべきです
  2. ownerをDAOに設定することを推奨し、中央集権リスクを回避します。
  3. #[init(ignore_state)]を使用して、移行を実行する前に状態をロードしないようにします。
  4. 移行後に移行関数を削除し、重複呼び出しを避ける
  5. 新しいデータ構造は移行時に初期化を完了します

合理的な設計によるアップグレードプランを通じて、安全性を確保しつつ、契約のアップグレード可能性を実現し、プロジェクトの長期的なメンテナンス性を向上させることができます。

!

ETH2.03%
原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • 5
  • 共有
コメント
0/400
Deconstructionistvip
· 6時間前
ホットリロードを追加することをお勧めします
原文表示返信0
rekt_but_not_brokevip
· 6時間前
スマートコントラクトはこんなにひどいとは思わなかった。
原文表示返信0
LiquidityWizardvip
· 6時間前
理論的に言えば、プロキシパターンは単に73.4%のガスオーバーヘッドを伴う砂糖でコーティングされた状態変異に過ぎない…ため息
原文表示返信0
SchrödingersNodevip
· 6時間前
また契約アドレスを変更する古い操作です。
原文表示返信0
NestedFoxvip
· 6時間前
rustはこの部分がひどすぎる
原文表示返信0
  • ピン
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)