Les smart contracts, en tant que type de programme, ne peuvent éviter d'avoir des défauts et des vulnérabilités. Même après de nombreux tests et audits, il peut encore y avoir des problèmes non découverts. Une fois qu'une vulnérabilité de contrat est exploitée par un attaquant, cela peut entraîner des pertes d'actifs pour les utilisateurs, avec des conséquences graves. Par conséquent, la capacité de mise à niveau des contrats est cruciale, tant pour corriger les vulnérabilités que pour ajouter de nouvelles fonctionnalités. Cet article présentera les méthodes de mise à niveau des contrats Rust sur la plateforme NEAR.
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 du contrat n'a pas été modifiée
Si vous ne modifiez que la logique du contrat, sans changer la structure des données, vous pouvez directement utiliser la commande near deploy pour redéployer le nouveau code. Par exemple, nous ajoutons une nouvelle fonction à la base du contrat original :
Après compilation, utilisez near deploy pour redéployer. Les données dans le contrat d'origine peuvent toujours être lues normalement.
( 2. La structure des données du contrat a été modifiée
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, nous modifions la structure du contrat comme suit :
Considérations de sécurité pour la mise à niveau des contrats
Contrôle des autorisations : la fonction de mise à jour doit être définie comme une fonction only owner, pour garantir qu'elle ne peut être appelée que par le propriétaire.
Il est recommandé de définir le propriétaire du contrat comme DAO, de gérer le contrat par le biais de propositions et de votes.
Ajoutez #[init)ignore_state)] avant la fonction de migration pour vous assurer que l'état n'est pas chargé avant l'exécution.
Après la migration, supprimez la fonction de migration pour garantir qu'elle ne soit appelée qu'une seule fois.
La nouvelle structure de données est initialisée lors de la migration.
La mise à niveau des contrats est un processus complexe qui nécessite une approche prudente. Grâce à une conception appropriée et à des tests rigoureux, il est possible de réaliser une mise à niveau sécurisée et fiable des contrats.
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.
13 J'aime
Récompense
13
2
Partager
Commentaire
0/400
WalletDetective
· Il y a 21h
Ça a l'air assez hardcore.
Voir l'originalRépondre0
MetaverseVagrant
· Il y a 21h
Encore en train de s'enrouler dans des smart contracts.
Guide de mise à niveau des smart contracts Rust : Méthodes de mise à jour de sécurité de la plateforme NEAR
Guide de mise à niveau des smart contracts Rust
Les smart contracts, en tant que type de programme, ne peuvent éviter d'avoir des défauts et des vulnérabilités. Même après de nombreux tests et audits, il peut encore y avoir des problèmes non découverts. Une fois qu'une vulnérabilité de contrat est exploitée par un attaquant, cela peut entraîner des pertes d'actifs pour les utilisateurs, avec des conséquences graves. Par conséquent, la capacité de mise à niveau des contrats est cruciale, tant pour corriger les vulnérabilités que pour ajouter de nouvelles fonctionnalités. Cet article présentera les méthodes de mise à niveau des contrats Rust sur la plateforme NEAR.
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 du contrat n'a pas été modifiée
Si vous ne modifiez que la logique du contrat, sans changer la structure des données, vous pouvez directement utiliser la commande near deploy pour redéployer le nouveau code. Par exemple, nous ajoutons une nouvelle fonction à la base du contrat original :
rouille #[near_bindgen] impl StatusMessage { Option { let account_id = env::signer_account_id(); self.records.insert(&account_id, &message); return self.records.get(&account_id); } }
Après compilation, utilisez near deploy pour redéployer. Les données dans le contrat d'origine peuvent toujours être lues normalement.
( 2. La structure des données du contrat a été modifiée
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, nous modifions la structure du contrat comme suit :
rouille #[near_bindgen] #[derive)BorshDeserialize, BorshSerialize###] 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. Ajoutez la méthode migrate dans le nouveau contrat :
rouille #( #[init)ignore_state[private]] Self { let old_state: OldStatusMessage = env::state_read().expect("failed"); Self { taglines: old_state.records, bios: LookupMap::new(b"b".to_vec)(), } }
Ensuite, appelez la méthode migrate 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
Ainsi, il est possible de mettre à niveau avec succès les contrats intelligents et de migrer les anciennes données.
ignore_state)] avant la fonction de migration pour vous assurer que l'état n'est pas chargé avant l'exécution.
Après la migration, supprimez la fonction de migration pour garantir qu'elle ne soit appelée qu'une seule fois.
La nouvelle structure de données est initialisée lors de la migration.
La mise à niveau des contrats est un processus complexe qui nécessite une approche prudente. Grâce à une conception appropriée et à des tests rigoureux, il est possible de réaliser une mise à niveau sécurisée et fiable des contrats.