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.
( 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.
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
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.
Ajouter #[init(ignore_state(] avant la fonction de migration
Supprimez la fonction de migration après que la migration soit terminée.
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.
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.
17 J'aime
Récompense
17
4
Partager
Commentaire
0/400
PretendingToReadDocs
· 07-23 12:26
Les contrats d'agence sont plus sûrs.
Voir l'originalRépondre0
ArbitrageBot
· 07-23 12:19
Avoir peur de se faire prendre pour des cons en mettant à niveau.
Voir l'originalRépondre0
LiquidityNinja
· 07-23 12:10
La mise à niveau des contrats est difficile.
Voir l'originalRépondre0
EthMaximalist
· 07-23 12:04
Les mises à niveau peuvent également avoir des vulnérabilités.
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); }
}
( 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
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.
Ajouter #[init(ignore_state(] avant la fonction de migration
Supprimez la fonction de migration après que la migration soit terminée.
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,>