Sui.

Publication

Partagez vos connaissances.

SuiLover.
Jul 30, 2025
Questions et Réponses avec des Experts

Comment puis-je effectuer des mises à niveau non autorisées d'un package Move ?

J'essaie de comprendre cet aspect du réseau Sui parce que je suis en train de créer, de déboguer ou de déployer quelque chose qui touche à ce domaine. Je souhaite une explication détaillée du fonctionnement de ce mécanisme ou de cette fonctionnalité, ainsi que l'utilisation pertinente de la CLI, la structure du code Move ou les concepts architecturaux. Mon objectif est d'obtenir suffisamment de clarté pour appliquer ces connaissances à un projet réel, qu'il s'agisse d'un contrat intelligent personnalisé, d'un système NFT, d'une intégration de portefeuille ou d'un outil DeFi. Le réseau Sui possède des caractéristiques uniques par rapport aux chaînes EVM. Je m'intéresse donc particulièrement à ce qui le distingue et à la manière dont cela affecte les meilleures pratiques de développement. Il serait utile de disposer d'exemples de code, d'exemples de ligne de commande ou d'erreurs typiques à surveiller, en particulier lors de l'utilisation de la CLI Sui, du SDK ou d'un déploiement sur localnet/testnet. En fin de compte, je souhaite éviter les erreurs courantes, suivre les meilleurs principes de sécurité et m'assurer que les fonctionnalités sur lesquelles je travaille se comportent comme prévu dans des conditions réalistes.

  • Sui
  • Transaction Processing
  • Move
4
14
Partager
Commentaires
.

Réponses

14
BigSneh.
Jul 30 2025, 12:28

Pour empêcher les mises à niveau non autorisées d'un package Move sur Sui, le mécanisme clé est l'objet upgrade_cap. Cet objet agit comme une fonctionnalité en chaîne qui confère l'autorité exclusive de mettre à niveau un package déployé. Sans la possession du upgrade_cap, personne ne peut mettre à niveau le package, le protégeant ainsi contre les modifications non autorisées.

Lorsque vous publiez un package à l'aide de l'interface de ligne de commande Sui :

sui client publish --path. /my_package --budget-gaz 10000

Le système crée un objet upgrade_cap et renvoie son ID d'objet. Cet objet doit être inclus dans toute transaction de mise à niveau, comme suit :

mise à niveau du client sui --package. <upgrade_cap_object_id>/new_package --upgrade-cap --budget-gaz 10000

Pour sécuriser votre colis :

  1. Protégez le upgrade_cap : stockez-le en toute sécurité dans un portefeuille matériel ou un portefeuille multisig pour vous assurer que seules les entités autorisées peuvent signer les transactions de mise à niveau.

  2. Utilisez des portefeuilles multisig pour l'autorité de mise à niveau : insérez le upgrade_cap dans un objet de portefeuille multisig. Cela nécessite plusieurs signatures avant que la transaction de mise à niveau ne soit acceptée, ce qui ajoute une couche de sécurité.

  3. Mettez en œuvre des contrôles de gouvernance hors chaîne : coordonnez les mises à niveau avec les processus d'approbation hors chaîne pour éviter les mises à niveau non autorisées.

  4. Ne partagez pas le fichier upgrade_cap avec des tiers non autorisés et ne l'exposez pas dans des environnements non sécurisés.

  5. Utilisez des contrôles d'accès spécifiques à l'environnement : par exemple, limitez les opérations de mise à niveau à des environnements de déploiement spécifiques ou à des listes blanches d'adresses IP dans votre infrastructure opérationnelle.

  6. Auditez les transactions de mise à niveau : surveillez la blockchain pour détecter tout appel de mise à niveau non autorisé ou inattendu afin de réagir rapidement.

Si vous perdez le contrôle du upgrade_cap, votre package peut être mis à niveau par toute personne qui le détient, ce qui compromet l'intégrité de votre contrat. À l'inverse, si vous perdez complètement le fichier upgrade_cap et que vous n'avez pas de sauvegarde, vous ne pouvez plus mettre à niveau le package, bloquant ainsi son état.

Contrairement aux modèles de mise à niveau du proxy d'Ethereum où l'évolutivité est codée dans la logique des contrats, Sui utilise un objet de capacité explicite. Cette conception améliore la transparence de la sécurité en liant l'autorité de mise à niveau directement à un objet en chaîne que vous contrôlez.

Dans votre code Move, le upgrade_cap n'apparaît pas car les autorisations de mise à niveau sont gérées en dehors de la logique contractuelle, mais elles sont essentielles dans les transactions de déploiement et de mise à niveau via la CLI ou le SDK.

Exemple pour vérifier la capacité de mise à niveau de votre package :

sur le client get-package <package_id>

Cela affichera les métadonnées du package, y compris l'objet upgrade_cap.

En suivant ces pratiques, vous vous assurez que les mises à niveau des packages sont strictement contrôlées, ce qui réduit les risques de modifications non autorisées et préserve la confiance des utilisateurs dans vos contrats intelligents.

7
Meilleure réponse
Commentaires
.
Ashford.
Jul 31 2025, 06:35

Mises à niveau non autorisées dans Sui Network (Move)

Pour empêcher les mises à niveau non autorisées d'un package Move sur le réseau Sui, vous devez vous assurer que seules les entités ou adresses fiables sont autorisées à effectuer des mises à niveau. Cela se fait via le upgrade_capmécanisme**** et en contrôlant soigneusement qui a la capacité de mettre à niveau votre package.

Concepts clés :

*** upgrade_cap** : fonctionnalité qui limite les personnes autorisées à mettre à niveau un package. Vous pouvez le configurer et le vérifier upgrade_caplors du déploiement du contrat. *Processus de mise à niveau des contrats : les contrats Sui, une fois déployés, peuvent être améliorés, mais vous devez contrôler qui peut déclencher ces mises à niveau.

Étapes pour empêcher les mises à niveau non autorisées :

1.Définir upgrade_cap : lors du déploiement de votre package Move, définissez les upgrade_cappersonnes autorisées à mettre à niveau votre contrat. 2.Accorder des autorisations de mise à niveau : ne fournissez la fonctionnalité de mise à niveau qu'aux adresses fiables (par exemple, les administrateurs).

Exemple de code de déplacement :

module MyPackage {
    use 0x1::UpgradeCap;

    public fun initialize(owner: address) {
        let cap = UpgradeCap::new(owner);  // Create upgrade capability for the owner
        // Store the upgrade cap in a resource or object
    }

    public fun upgrade(owner: address) {
        // Only the owner (who has the upgrade cap) can call this function
        UpgradeCap::assert_cap(&cap, owner); // Ensure the caller has the upgrade cap
        // Perform the upgrade logic here
    }
}

upgrade_cap### Exemple de CLI pour la configuration :

Lorsque vous publiez ou déployez un package Move, vous pouvez transmettre l'upgrade_capidentifiant au client Sui :

sui client publish --gas-budget 10000 --upgrade-cap <upgrade-cap-id>

Erreurs courantes :

*Association incorrecte du upgrade_cap : si la fonctionnalité de mise à niveau n'est pas correctement définie, des adresses non autorisées peuvent accidentellement obtenir l'autorisation de mettre à niveau le contrat. *Adresse incorrecte pour la mise à niveau : assurez-vous que seules les adresses autorisées (celles contenant leupgrade_cap) peuvent effectuer la mise à niveau.

Meilleures pratiques :

*Limiter la capacité de mise à niveau : ne donnez les informations qu'upgrade_capà des adresses ou à des administrateurs fiables. *Testez sur Testnet/Localnet : testez toujours votre logique de mise à niveau sur les réseaux locaux/de test pour vous assurer que les mises à niveau non autorisées sont empêchées. ***Stockez le upgrade_cap**en toute sécurité : assurez-vous que l'adresse contenant la fonctionnalité de mise à niveau est gérée de manière sécurisée.

En contrôlant upgrade_capet en limitant soigneusement les personnes pouvant les déclencher, vous pouvez éviter les mises à niveau non autorisées et garantir la sécurité de votre contrat après le déploiement.

7
Commentaires
.
Benjamin XDV.
Jul 31 2025, 09:44

Pourinterdire les mises à niveaud'un package Move dans Sui, vous devezrévoquer ou graver l'upgrade_capobjet, car cette fonctionnalité est le seul mécanisme permettant d'autoriser les mises à niveau de packages. Une fois upgrade_capdétruit (par exemple, via public entry fun burnin Move), le package devientimmuable permanent, car Sui applique un contrôle d'évolutivité strict au niveau du protocole. Cela diffère des chaînes EVM où la mise à niveau repose sur des modèles de proxy ou un stockage mutable : le modèle de SUI garantit une sécurité déterministe en liant explicitement les mises à niveau à la propriété des fonctionnalités. La meilleure pratique consiste à implémenter unwrappercontrôlé par la gouvernance**(par exempleAdminCap) autour de la upgrade_caprévocation programmable, plutôt que de la graver directement, afin de permettre une décentralisation future.

6
Commentaires
.
theking.
Jul 30 2025, 11:25

Pour désactiver ou non autorisées les mises à niveau d'un package Move sur le réseau Sui, vous devez détruire ou transférer l'UpgradeCapobjet généré lors du déploiement initial du package. UpgradeCapIl s'agit d'un objet spécial qui autorise la mise à niveau de ce package spécifique. Sans cette fonctionnalité, aucune mise à niveau future n'est possible.

Pour empêcher les mises à niveau, vous pouvez le transférer UpgradeCapvers une adresse inaccessible (like0x0) ou le détruire à l'aide d'une fonction de déplacement que vous contrôlez. Par exemple, si vous souhaitez rendre le contrat immuable, incluez une public entry fun burn_upgrade_cap(cap: UpgradeCap)fonction dans votre module et appelez-la simplement après le déploiement. Une fois brûlées, les améliorations sont définitivement désactivées.

Voici un exemple d'extrait de code Move à graver :

public entry fun burn_upgrade_cap(cap: UpgradeCap) {
    sui::package::delete_upgrade_cap(cap);
}

Si vous effectuez un déploiement via la CLI, vous pouvez appeler cette fonction de saisie après la publication :

sui client call \
  --package <your_package_id> \
  --module <your_module> \
  --function burn_upgrade_cap \
  --args <upgrade_cap_object_id>

La désactivation des mises à niveau est essentielle lorsque vous souhaitez verrouiller définitivement la logique de votre contrat intelligent pour des raisons de sécurité ou de gouvernance. Une fois que le bouchon est détruit ou déplacé vers une adresse sans clé privée, le package est totalement immuable.

5
Commentaires
.
Paul.
Paul4310
Jul 31 2025, 05:36

Pour empêcher les mises à niveau non autorisées d'un package Move dans Sui, vous pouvez implémenter un contrôle d'accès pour le processus de mise à niveau. Plus précisément, vous pouvez utiliser la upgrade_cap(fonctionnalité de mise à niveau) et vous assurer qu'elle est contrôlée de manière sécurisée par une entité ou un compte de confiance.

Concepts clés :

upgrade_cap*Capacités de mise à niveau : contrôlez qui peut mettre à niveau le package Move en l'associant à une adresse fiable. *Contrôle d'accès : autorisez uniquement le compte qui possède la capacité de mise à niveau à déclencher une mise à niveau.

Meilleures pratiques :

  1. upgrade_capPropriété sécurisée : accordez des droits de mise à niveau uniquement aux adresses fiables (par exemple, le compte du déployeur). 2.Utiliser les signatures : implémentez une logique pour vérifier le signataire pendant le processus de mise à niveau afin de garantir que seuls les utilisateurs autorisés peuvent exécuter la mise à niveau.

Exemple de code :

module MyModule {
    use sui::object::{Object, upgrade_cap};

    public fun upgrade(beneficiary: &signer) {
        let cap = upgrade_cap::get_cap(beneficiary);
        assert!(cap.is_some(), 0); // Ensure the signer is authorized
        // Logic for upgrading the contract
    }
}

Utilisation de la CLI :

Utilisez l'interface de ligne de commande Sui pour publier et gérer les mises à niveau en toute sécurité :

sui client publish --upgrade --package <package-id> --capability <upgrade-cap-id>

Erreurs courantes à éviter :

*Contrôle d'accès perdu : évitez d'attribuer upgrade_capà des comptes non fiables. *Incompatibilité des états : assurez-vous que la mise à niveau n'altère pas les états des objets ou les structures de données existants. Testez toujours d'abord sur localnet/testnet.

5
Commentaires
.
Arnold.
Arnold3036
Jul 31 2025, 08:18

Pour empêcher les mises à niveau non autorisées d'un package Move :

####1. Rendre le package immuable

// During publishing, set `UpgradePolicy` to `immutable`  
let upgrade_cap = package::claim_and_keep(otw);  
package::make_immutable(upgrade_cap);  // 🔐 Burn upgrade capability  

-Effet : aucune autre mise à niveau n'est autorisée (comme les contrats EVM).

####2. Gérez en toute UpgradeCapsécurité Si des mises à niveau sont nécessaires : -Transfert vers upgrade_capun MultiSig/DAO :

 transfer::transfer(upgrade_cap, @multisig_address);  

-Utiliser une logique d'authentification personnalisée :

 public entry fun upgrade(  
   _: &AdminCap,  // Requires admin permission  
   upgrade_cap: &mut UpgradeCap,  
   new_package: vector<u8>  
 ) { package::upgrade(upgrade_cap, new_package); }  

####Exemple de CLI (publication immuable)

sui client publish --gas-budget 100000000  
# Then call `make_immutable` with the returned `upgrade_cap` ID  

###Principales différences par rapport à l'EVM UpgradeCap-Sui : l'évolutivité est optionnelle (via). -EVM : les contrats sont immuables par défaut (aucun mécanisme de mise à niveau natif).

###Pièges courants 1.Perte upgrade_cap : les transferts vers une adresse morte sont irréversibles. 2.Améliorations privilégiées : évitez d'accorder des droits de mise à niveau aux EOA.

4
Commentaires
.
shamueely.
Jul 30 2025, 11:31

UpgradeCapPour vous assurer que personne ne peut mettre à niveau un package Move sur le réseau Sui, y compris vous-même, vous devez révoquer l'autorité liée à l'objet du package. Il s'agit de l'objet qui contrôle les autorisations pour les futures mises à niveau. Si vous supprimez cet objet ou si vous le rendez inaccessible, le package devient immuable et ne pourra plus jamais être modifié.

Vous pouvez le faire en toute sécurité à l'aide de la sui::package::delete_upgrade_capfonction de votre code Move. Voici un exemple simple que vous pouvez ajouter à votre module :

use sui::package;
use sui::package::UpgradeCap;

public entry fun lock_package(cap: UpgradeCap) {
    package::delete_upgrade_cap(cap);
}

Ensuite, une fois que vous avez déployé le package, exécutez cette fonction dans une transaction à l'aide de la CLI ou du SDK Sui :

sui client call \
  --package <your_package_id> \
  --module <your_module_name> \
  --function lock_package \
  --args <upgrade_cap_object_id> \
  --gas-budget 100000000

Ce faisant, le UpgradeCapest brûlé, ce qui signifie qu'il n'existe plus sur la chaîne et que personne ne peut autoriser une autre mise à niveau. Il s'agit d'une bonne pratique si vous souhaitez garantir l'immutabilité du code, en particulier pour les contrats DeFi prêts à la production, les normes NFT ou toute autre logique dans laquelle les utilisateurs s'appuient sur un comportement verrouillé et sans confiance.

Pour le contexte architectural : contrairement à EVM où les contrats intelligents sont immuables par défaut, Sui permet des packages évolutifs, ce qui apporte de la flexibilité mais introduit également une complexit�� de gouvernance. Pour « annuler » les mises à niveau, vous devez détruire explicitement la clé qui les autorise.

Pour en savoir plus, consultez la documentation officielle de mise à niveau du package Sui ici : https://docs.sui.io/build/packages-and-upgrades#making-packages-immutable

3
Commentaires
.
Alya.
Alya-14
Jul 30 2025, 17:29

Pour empêcher les mises à niveau non autorisées d'un package Move dans Sui,détruisez ou verrouillez l'upgrade_capobjetaprès sa publication.

Le upgrade_cap(from0x2::package::UpgradeCap) est un objet de première classe qui confère l'autorité de mise à niveau. S'il reste dans l'adresse de l'éditeur, toute personne y ayant accès peut mettre à niveau le package.

Meilleures pratiques :

-Pour les contrats immuables : gravez la capacité :

 public entry fun burn_upgrade_cap(cap: package::UpgradeCap) {
     package::discard(cap); // Destroys the capability
 }

-Pour les mises à niveau régies : passez upgrade_capà un module multisig ou DAO au lieu de le conserver sur un seul compte.

  • Ne jamais exposer upgrade_capdans des lieux publics sans contrôle d'accès.

Vérification de la CLI :

sui client object --id [PACKAGE_ID]  # Look for associated UpgradeCap object

Une fois upgrade_capdétruit, le package devientdéfinitivement immuable. C'est l'équivalent pour Sui de « verrouiller » un contrat (comme les modèles d'évolutivité d'EVM).

Ce mécanisme est propre au modèle centré sur les objets de Sui : l'autorisation de mise à niveau est imposée par la propriété de l'objet, et non par les rôles d'administrateur ou par la logique du contrat.

3
Commentaires
.
Evgeniy CRYPTOCOIN.
Jul 31 2025, 09:12

Pour empêcher les mises à niveau non autorisées dans Sui :

1.Brûlez le UpgradeCap— Détruisez-le après le déploiement pour des raisons d'immuabilité. 2.Verrouiller init— Ne partagez pas le plafond si une immuabilité permanente est requise.

###Exemple de déplacement :

public fun lock_forever(cap: UpgradeCap) {  
    sui::package::make_immutable(cap) // Burns cap  
}  

Remarques principales : ✔ Sans celaUpgradeCap, aucune mise à niveau n'est possible. ✔ Contrairement à l'EVM, Sui permet une immuabilité réversible.

Alternative CLI :

sui client call --function lock_forever --args <CAP_ID>  
  • (Avertissement : permanent, sauf si vous planifiez à l'avance des méthodes de restauration. ) *
3
Commentaires
.
290697tz.
Jul 30 2025, 12:30

Pour empêcher les mises à niveau non autorisées d'un package Move sur Sui, le mécanisme principal est l'objet upgrade_cap. Cet objet de capacité confère l'autorité exclusive de mettre à niveau un package déployé. Sans posséder le upgrade_cap, personne ne peut mettre à niveau le package, ce qui garantit la sécurité.

Lorsque vous publiez un package via Sui CLI :

sui client publish --path. /my_package --budget-gaz 10000

Un objet upgrade_cap est créé et renvoyé. Cet identifiant d'objet doit être fourni lors de la mise à niveau du package :

mise à niveau du client sui --package. <upgrade_cap_object_id>/new_package --upgrade-cap --budget-gaz 10000

Pour sécuriser le processus de mise à niveau :

  1. Stockez le upgrade_cap en toute sécurité, par exemple dans un portefeuille matériel ou un portefeuille multisig.

  2. Utilisez un portefeuille multisig pour contenir le upgrade_cap afin que plusieurs signatures soient requises pour les mises à niveau.

  3. Évitez de partager l'identifiant de l'objet upgrade_cap ou de l'exposer publiquement.

  4. Mettez en œuvre une gouvernance hors chaîne pour approuver les mises à niveau avant leur exécution.

  5. Restreignez l'accès aux mises à niveau à l'aide de contrôles d'environnement ou d'une liste blanche de l'infrastructure.

  6. Surveillez les transactions de la blockchain pour détecter les tentatives de mise à niveau non autorisées.

  7. Sauvegardez le upgrade_cap en toute sécurité pour éviter de perdre la capacité de mise à niveau.

  8. N'oubliez pas que la perte du upgrade_cap signifie que vous ne pouvez plus mettre à jour votre package.

  9. Contrairement aux proxys EVM, le contrôle de mise à niveau de Sui est géré par un objet distinct, et non par une logique contractuelle.

  10. Le code Move lui-même ne contient pas de logique de mise à niveau ; il est géré en externe via le upgrade_cap.

  11. Le upgrade_cap est lié aux métadonnées du package et est visible lors de la requête d'informations sur le package :

sur le client get-package <package_id>

  1. Vérifiez toujours la propriété de upgrade_cap avant de tenter des mises à niveau.

  2. Lors de la mise à niveau, l'ID du package reste constant ; seul le code change.

  3. La possession non autorisée du upgrade_cap permet des mises à niveau malveillantes.

  4. Utilisez des mécanismes de contrôle d'accès dans votre environnement opérationnel pour protéger les transactions de mise à niveau.

  5. Concevez votre pipeline CI/CD de manière à exiger des étapes d'approbation manuelles pour les mises à niveau.

  6. Suivez qui détient le grade upgrade_cap au sein de votre équipe ou de votre organisation pour des raisons de responsabilité.

  7. Vous pouvez transférer l'objet upgrade_cap vers un autre compte si nécessaire, mais faites-le avec prudence.

  8. Assurez l'efficacité énergétique des transactions de mise à niveau en spécifiant les budgets de gaz appropriés.

  9. La combinaison du contrôle upgrade_cap en chaîne avec une gouvernance hors chaîne est la meilleure pratique pour des mises à niveau sécurisées des packages sur Sui.

2
Commentaires
.
Jeff.
Jeff2046
Aug 23 2025, 08:54

To prevent unauthorized upgrades of a Move package on Sui, the core mechanism is the upgrade_cap object. This capability object grants exclusive authority to upgrade a deployed package. Without possessing the upgrade_cap, no one can upgrade the package, ensuring security.

When you publish a package via Sui CLI:

sui client publish --path ./my_package --gas-budget 10000

An upgrade_cap object is created and returned. This object ID must be provided when upgrading the package:

sui client upgrade --package ./new_package --upgrade-cap <upgrade_cap_object_id> --gas-budget 10000

To secure the upgrade process:

Store the upgrade_cap securely, such as in a hardware wallet or multisig wallet.

Use a multisig wallet to hold the upgrade_cap so multiple signatures are required for upgrades.

Avoid sharing the upgrade_cap object ID or exposing it publicly.

Implement off-chain governance to approve upgrades before execution.

Restrict upgrade access with environment controls or infrastructure whitelisting.

Monitor blockchain transactions to detect unauthorized upgrade attempts.

Back up the upgrade_cap securely to avoid losing upgrade ability.

Remember that losing the upgrade_cap means you cannot upgrade your package anymore.

Unlike EVM proxies, Sui’s upgrade control is managed by a distinct object, not contract logic.

The Move code itself does not hold upgrade logic; it's handled externally via the upgrade_cap.

The upgrade_cap is tied to the package’s metadata and visible when querying package info:

sui client get-package <package_id>

Always verify the upgrade_cap ownership before attempting upgrades.

When upgrading, the package ID remains constant; only the code changes.

Unauthorized possession of the upgrade_cap allows malicious upgrades.

Use access control mechanisms in your operational environment to protect upgrade transactions.

Design your CI/CD pipeline to require manual approval steps for upgrades.

Track who holds the upgrade_cap in your team or organization for accountability.

You can transfer the upgrade_cap object to another account if needed, but do so cautiously.

Keep upgrade transactions gas-efficient by specifying appropriate gas budgets.

Combining on-chain upgrade_cap control with off-chain governance is the best practice for secure package upgrades on Sui.

2
Commentaires
.
Bekky.
Bekky1762
Jul 31 2025, 10:29

###1. Mécanisme de sécurité de base Sui utiliseupgrade caps(UpgradeCap) pour contrôler la mutabilité des packages. Contrairement aux contrats immuables d'EVM, Sui autorise les mises à niveau mais avec des contrôles de propriété stricts.

####Propriétés clées

FonctionnalitéDescription
UpgradeCapObjet transférable octroyant des droits de mise à niveau
PolitiquesBitflags définissant les modifications autorisées (rétrocompatibilité, additif, rupture)
Vérification du condensatGarantit que le bytecode correspond au hachage attendu

###2. Modèles de mise en œuvre

####Package immuable de base

module my_pkg::governance {
    use sui::package;
    use sui::transfer;
    use sui::tx_context;

    // Burn upgrade cap at initialization
    public fun init(ctx: &mut TxContext) {
        let (upgrade_cap, _) = package::claim_upgrade_cap(ctx);
        package::burn_upgrade_cap(upgrade_cap); // Permanent immutability
    }
}

####Mises à niveau contrôlées par la DAO

module my_pkg::dao {
    use sui::voting;
    use sui::package;

    struct DaoCap has key, store {
        id: UID,
        upgrade_cap: UpgradeCap,
        threshold: u64
    }

    public entry fun authorize_upgrade(
        dao: &mut DaoCap,
        proposal_id: ID,
        policy: u8,
        digest: vector<u8>,
        ctx: &mut TxContext
    ) {
        assert!(voting::is_approved(proposal_id, dao.threshold), EACCESS_DENIED);
        package::authorize_upgrade(&mut dao.upgrade_cap, policy, digest);
    }
}

###3. Application de la CLI

####Déployer en tant qu'immuable

sui client publish --gas-budget 1000000000 --with-upgrade-capability false

####Vérifier l'immutabilité

sui client object <UPGRADE_CAP_ID> --json | grep "burned"
# Expected: "burned": true

###4. Meilleures pratiques de sécurité

####Matrice de politique de mise à niveau | Indicateur de politique | Modifications autorisées | Recommandé pour | | -----------------------------| -----------------| | 0x1(COMPATIBLE) | Corrections de bugs uniquement | Protocoles stables | | 0x3(ADDITIF) | Nouvelles fonctions | Systèmes évolutifs | | 0x7(BREAKING) | Changements complets | Développement précoce |

####Protection multisigne

module my_pkg::multisig {
    struct UpgradeVault has key {
        id: UID,
        cap: UpgradeCap,
        required: u8,
        approvals: vector<address>
    }

    public entry fun approve(
        vault: &mut UpgradeVault,
        signer: &signer
    ) {
        let addr = signer::address_of(signer);
        assert!(!vector::contains(&vault.approvals, &addr), EALREADY_APPROVED);
        vector::push_back(&mut vault.approvals, addr);
        
        if (vector::length(&vault.approvals) >= vault.required) {
            package::authorize_upgrade(&mut vault.cap, POLICY_ADDITIVE, digest);
        }
    }
}

###5. Vecteurs d'attaque et atténuations

| Menace | Solution | Exemple de mouvement | | ------------------| --------------| struct TimedCap { unlock_epoch: u64 }|Casquette volée| Améliorations du système de verrouillage temporel | | assert!(digest == expected_digest, EINVALID)|Mise à niveau malveillante| Nécessite une vérification du résumé | | required = 5/7|Prise en charge de la gouvernance| Décentralisation progressive | Commencez par le multisig |


###6. Stratégies de test

####Localnet Dry-Run

sui client publish --upgrade-policy 1 --dry-run
# Verify no upgrade cap is created

####Cas de test négatif

#[test(expected_failure = "EUPGRADE_NOT_AUTHORIZED")]
fun test_unauthorized_upgrade() {
    let (_, publisher) = package::claim_upgrade_cap(ctx);
    package::authorize_upgrade(&mut cap, 0x7, digest); // Should fail
}

###7. Surveillance et restauration

####Vérification en chaîne

// TypeScript SDK check
const isImmutable = await client.getObject({
    id: upgradeCapId,
    options: { showContent: true }
}).then(obj => obj.data?.content?.type === '0x2::package::UpgradeCap');

####Gel d'urgence

public entry fun freeze_forever(cap: UpgradeCap) {
    transfer::freeze_object(cap); // Makes cap non-transferable
}

###Principaux différenciateurs de l'EVM | Aspect | Soi | EVM | | -------------| -----| |Mécanisme de mise à niveau| Centré sur l'objet | Modèles de proxy | |Granularité| Contrôle par emballage | Tout ou rien | |Auditabilité| Historique des mises à niveau en chaîne | Administrateurs proxy opaques |

Pour les systèmes de production :

  1. Conserver UpgradeCapdans une chambre froide
  2. Implémentezplusieurs signatures avec des retards
  3. UtilisezSui Explorerpour suivre les propositions de mise à niveau
1
Commentaires
.

Connaissez-vous la réponse ?

Veuillez vous connecter et la partager.

Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.

1170Publications3665Réponses
Sui.X.Peera.

Gagne ta part de 1000 Sui

Gagne des points de réputation et obtiens des récompenses pour avoir aidé la communauté Sui à se développer.

Campagne de RécompensesAoût