Journal de développement des smart contracts Rust (10-2) : Analyse du contrat de la fabrique Sputnik DAO
Cet article analysera en profondeur la mise en œuvre du code des contrats de fabrication de la plateforme Sputnik DAO. Sputnik DAO utilise un modèle de conception de fabrique pour réaliser la création et la gestion unifiée de l'organisation autonome décentralisée (DAO) sur cette plateforme.
1. Sputnik-DAO factory smart contracts
L'état principal du contrat de la fabrique Sputnik-DAO est composé de deux parties :
factory_manager: fournit la logique fonctionnelle interne pour créer/supprimer/mettre à jour les instances de DAO
daos : enregistre l'adresse du compte NEAR de toutes les instances de DAO créées sur cette plateforme.
2. Créer un DAO
Le contrat de l'usine fournit la méthode create() pour créer de nouvelles instances de DAO :
rouille
#[payable]
pub fn create(&mut self, name: AccountId, args: Base64VecU8) {
// Construire le compte de déploiement du contrat DAO
let account_id: AccountId = format!("{}.{}", name, env::current_account_id())
.parse()
.unwrap();
// Construire les paramètres de rappel
let callback_args = serde_json::to_vec(&json!({
"account_id": account_id,
"attached_deposit": U128(env::attached_deposit()),
"predecessor_account_id": env::predecessor_account_id()
}))
.expect("Échec de la sérialisation");
// Appeler factory_manager pour créer des contrats intelligents
self.factory_manager.create_contract(
self.get_default_code_hash(),
account_id,
"new",
&args.0,
"on_create",
&callback_args,
);
}
Les principales étapes de la méthode create_contract() comprennent :
Charger le code du modèle de contrat DAO
Créer un compte de déploiement
Fonds de départ pour le transfert
Déployer le code du contrat
Appeler la fonction d'initialisation du contrat
Callback on_create() function
3. Mise à jour du DAO
Le contrat de l'usine fournit la méthode update() pour mettre à jour le contrat DAO:
rouille
pub fn update(&self, account_id: AccountId, code_hash: Base58CryptoHash) {
let caller_id = env::predecessor_account_id();
assert!(
caller_id == self.get_owner() || caller_id == account_id,
"Doit être mis à jour par le propriétaire de l'usine ou par le DAO lui-même"
);
assert!(
self.daos.contains(&account_id),
"Doit être un contrat créé par la fabrique"
);
self.factory_manager
.update_contract(account_id, code_hash, "update");
}
4. Analyse de la sécurité
La sécurité du contrat de la fabrique Sputnik-DAO est principalement garantie par les aspects suivants :
Contrôle d'accès : la méthode view ne modifie pas l'état, les fonctions privilèges ne peuvent être appelées que par le propriétaire.
Gestion des erreurs : mettre en œuvre un mécanisme de gestion des erreurs raisonnable pour les situations exceptionnelles
Vérification des assertions : ajouter des vérifications d'assertion nécessaires aux opérations clés
Le contrat de l'usine avait une grave vulnérabilité de sécurité, qui pouvait permettre à n'importe quel utilisateur de mettre à niveau le contrat DAO. Cette vulnérabilité a été corrigée en ajoutant un mécanisme de vérification de liste blanche raisonnable.
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.
15 J'aime
Récompense
15
4
Partager
Commentaire
0/400
BearMarketMonk
· Il y a 5h
Un peu de bull, apprendre le rust et faire des contrats.
Voir l'originalRépondre0
AirdropChaser
· Il y a 5h
Encore une autre analyse de code, je suis dizzy
Voir l'originalRépondre0
ProbablyNothing
· Il y a 5h
Je suis perdu en regardant le code du contrat, qu'est-ce qui est écrit là ?
Analyse du code de contrat de la fabrique Sputnik DAO : logique centrale pour la création et la mise à niveau de DAO
Journal de développement des smart contracts Rust (10-2) : Analyse du contrat de la fabrique Sputnik DAO
Cet article analysera en profondeur la mise en œuvre du code des contrats de fabrication de la plateforme Sputnik DAO. Sputnik DAO utilise un modèle de conception de fabrique pour réaliser la création et la gestion unifiée de l'organisation autonome décentralisée (DAO) sur cette plateforme.
1. Sputnik-DAO factory smart contracts
L'état principal du contrat de la fabrique Sputnik-DAO est composé de deux parties :
rouille pub struct SputnikDAOFactory { factory_manager: FactoryManager, daos: UnorderedSet, }
2. Créer un DAO
Le contrat de l'usine fournit la méthode create() pour créer de nouvelles instances de DAO :
rouille #[payable] pub fn create(&mut self, name: AccountId, args: Base64VecU8) { // Construire le compte de déploiement du contrat DAO let account_id: AccountId = format!("{}.{}", name, env::current_account_id()) .parse() .unwrap();
}
Les principales étapes de la méthode create_contract() comprennent :
3. Mise à jour du DAO
Le contrat de l'usine fournit la méthode update() pour mettre à jour le contrat DAO:
rouille pub fn update(&self, account_id: AccountId, code_hash: Base58CryptoHash) { let caller_id = env::predecessor_account_id(); assert!( caller_id == self.get_owner() || caller_id == account_id, "Doit être mis à jour par le propriétaire de l'usine ou par le DAO lui-même" ); assert!( self.daos.contains(&account_id), "Doit être un contrat créé par la fabrique" ); self.factory_manager .update_contract(account_id, code_hash, "update"); }
4. Analyse de la sécurité
La sécurité du contrat de la fabrique Sputnik-DAO est principalement garantie par les aspects suivants :
Le contrat de l'usine avait une grave vulnérabilité de sécurité, qui pouvait permettre à n'importe quel utilisateur de mettre à niveau le contrat DAO. Cette vulnérabilité a été corrigée en ajoutant un mécanisme de vérification de liste blanche raisonnable.