Problem
互換性のないスマートコントラクトのアップグレードがあります。これをデプロイするにはどうすればよいですか?
Solution
同じアカウント内のコントラクトバージョン間で互換性のないアップグレードを行わないでください。問題が発生する可能性が高すぎます。
互換性のあるアップグレードを行い、必要に応じて新しいコントラクトコードでアップグレード後の関数を実行することができます。
コントラクトを更新するのではなく置き換える必要がある場合は、互換性のない変更を行うことに加えて、コントラクトコード内の任意の名前付きパスに接尾辞を追加または増やす(例:/public/MyProjectVaultが/public/MyProjectVault002になる)という最もシンプルな方法があります。その後、新しいアカウントを作成し、更新したコントラクトをそこにデプロイします。
⚠️ Flowはアドレスに関連するタイプを識別するため、古いコントラクトのリソースを新しいコントラクトのリソースと交換するためのアップグレードトランザクションも提供する必要があります。ユーザーに、このタスクをいつどのように実行する必要があるかをできるだけ早く伝えるようにしてください。
互換性のないアップグレードを行う際に、どうしても古いアドレスを維持する必要がある場合は、ご自身の責任において行ってください。以下のアクションをこの順序で実行するようにしてください。
- コントラクトアカウントで使用されているリソース(例えば、管理リソース)を削除します。
- アカウントからコントラクトを削除します。
- アカウントに新しいコントラクトをデプロイします。
⚠️注意:ユーザーアカウントに、古いバージョンのコントラクトから新しいバージョンで互換性のないバージョンに置き換えられたstructsまたはresourcesが含まれている場合、それらはロードされず、それらにアクセスしようとするトランザクションがクラッシュする可能性があります。このため、ユーザーがコントラクトから構造体またはリソースを受け取った後は、互換性のないアップグレードを行うこの方法は試さないでください!
翻訳元->https://cadence-lang.org/docs/contract-upgrades