Mise à niveau pratique des smart contracts Rust : trois méthodes et considérations de sécurité dans l'écosystème NEAR

Développement de contrats intelligents en Rust : Méthodes de mise à niveau des contrats

Les smart contracts, en tant que code programmatique, peuvent inévitablement présenter des défauts et des points à améliorer. Même après de nombreux tests et audits, il se peut que des vulnérabilités subsistent dans le contrat. Une fois qu'une vulnérabilité est exploitée par un attaquant, cela peut entraîner des pertes d'actifs pour les utilisateurs et d'autres conséquences graves. Par conséquent, la capacité de mise à niveau des contrats est très importante, tant pour corriger les vulnérabilités que pour ajouter de nouvelles fonctionnalités. Cet article présentera plusieurs méthodes de mise à niveau des smart contracts en Rust.

Méthodes de mise à niveau des contrats NEAR

Prenons l'exemple du projet StatusMessage pour présenter les méthodes courantes de mise à niveau des contrats NEAR.

Exemple de code de contrat StatusMessage :

rouille #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct StatusMessage { records: LookupMap<string, string="">, }

impl Default pour StatusMessage { Self { Self { enregistrements : LookupMap::new(b'r'.to_vec)((, } } }

#[near_bindgen] impl StatusMessage { pub fn set_status)&mut self, message: String) { let account_id = env::signer_account_id(); self.records.insert(&account_id, &message); }

pub fn get_status(\u0026self, account_id: String) -\u003e Option\u003cstring\u003e {
    return self.records.get(&account_id);
}

}

( 1. La structure des données de contrat n'a pas été modifiée pour la mise à niveau.

Si vous ne modifiez que la logique du contrat et qu'il n'y a pas de changement dans la structure des données, vous pouvez simplement utiliser la commande near deploy pour redéployer le nouveau code.

Par exemple, ajouter une nouvelle fonction :

rouille Option { let account_id = env::signer_account_id)###; self.records.insert(&account_id, &message); return self.records.get(&account_id); }

Après le redéploiement, les données existantes peuvent toujours être lues normalement.

( 2. Mise à niveau de la structure de données des contrats

Si la structure de données du contrat est modifiée, le redéploiement direct entraînera un échec de la désérialisation de l'état.

Par exemple, modifier la structure des données :

rouille pub struct StatusMessage { taglines: LookupMap<string, string="">, bios: LookupMap<string, string="">, }

Dans ce cas, il est nécessaire d'utiliser la méthode Migrate pour effectuer la mise à niveau.

) 3. Utiliser la méthode Migrate pour mettre à niveau

Ajouter la méthode migrate dans le nouveau contrat :

rouille #( #[init)ignore_state###] Self { let old_state: OldStatusMessage = env::state_read###[private].expect('failed'); Self { taglines: old_state.records, bios: LookupMap::new(b'b'.to_vec)(), } }

Appeler la méthode migrate en même temps lors du déploiement :

déployer près
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm \ --initFunction 'migrate'
--initArgs '{}'
--accountId statusmessage.blocksec_upgrade.testnet

Cela permettra de migrer avec succès les anciennes données vers la nouvelle structure de données.

Considérations de sécurité sur la mise à niveau des contrats

  1. Contrôle d'accès - La fonction de mise à niveau doit être réservée au propriétaire, il est conseillé de définir le propriétaire comme DAO.

  2. Ajouter #[init(ignore_state(] avant la fonction de migration

  3. Supprimez la fonction de migration après que la migration soit terminée.

  4. La nouvelle structure de données est initialisée lors de la migration.

En concevant raisonnablement un mécanisme de mise à niveau, il est possible d'assurer la possibilité de mise à niveau des contrats tout en garantissant la sécurité, posant ainsi les bases pour un entretien et une optimisation à long terme.

![])https://img-cdn.gateio.im/webp-social/moments-af3fe22c1999da5db0e2853b8a271276.webp)</string,></string,></string,>

GET-0.08%
Voir l'original
Cette page peut inclure du contenu de tiers fourni à des fins d'information uniquement. Gate ne garantit ni l'exactitude ni la validité de ces contenus, n’endosse pas les opinions exprimées, et ne fournit aucun conseil financier ou professionnel à travers ces informations. Voir la section Avertissement pour plus de détails.
  • Récompense
  • 4
  • Partager
Commentaire
0/400
PretendingToReadDocsvip
· 07-23 12:26
Les contrats d'agence sont plus sûrs.
Voir l'originalRépondre0
ArbitrageBotvip
· 07-23 12:19
Avoir peur de se faire prendre pour des cons en mettant à niveau.
Voir l'originalRépondre0
LiquidityNinjavip
· 07-23 12:10
La mise à niveau des contrats est difficile.
Voir l'originalRépondre0
EthMaximalistvip
· 07-23 12:04
Les mises à niveau peuvent également avoir des vulnérabilités.
Voir l'originalRépondre0
  • Épingler
Trader les cryptos partout et à tout moment
qrCode
Scan pour télécharger Gate app
Communauté
Français (Afrique)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)