Journal de développement des smart contracts Rust (10-2) : Analyse du code du contrat de la fabrique SputnikDAO
Cet article présentera en détail la mise en œuvre du modèle d'usine de la plateforme Sputnik-DAO ( sputnikdao-factory).
1. Sputnik-DAO smart contracts
Sputnik-DAO utilise le modèle de conception de fabrique de création pour réaliser la création et la gestion unifiée de l'organisation autonome décentralisée (DAO) sur cette plateforme.
2. Introduction aux fonctionnalités du module DAPP
La page DAPP de la plateforme Sputnik DAO montre qu'un certain nombre de DAO ont déjà créé des objets d'instance sur cette plateforme. En date de mars 2022, le DAO le plus actif est news.sputnik-dao.near, avec 3051 propositions en cours de vote public ou déjà clôturées.
Tous les contrats d'instance DAO créés sur la plateforme Sputnik DAO sont déployés sous le sous-compte du compte sputnik-dao.near, par exemple :
pcp.sputnik-dao.near
test-dao-bro.sputnik-dao.near
blaqkstereo.sputnik-dao.near
octopode-dao.sputnik-dao.near
Les organisations peuvent appeler la méthode create() du contrat sputnikdao-factory sur le réseau principal NEAR pour créer de nouvelles instances de DAO.
3. Interprétation du code du contrat sputnikdao-factory
3.1 créer DAO
L'état du contrat sputnikdao-factory est principalement composé des deux parties suivantes :
la mise en œuvre spécifique de factory_manager.create_contract:
rouille
pub fn create_contract(
&self,
code_hash: Base58CryptoHash,
account_id: AccountId,
new_method: &str,
args: [u8],
callback_method: &str,
callback_args: &[u8],
) {
// 1. Charger le code du modèle de contrat
// 2. Construire une Promesse
// 3. Créer un compte de déploiement
// 4. Transférer NEAR
// 5. Déployer le contrat
// 6. Appeler la fonction d'initialisation new()
// 7. rappel on_create()
}
Logique de traitement de la fonction de rappel on_create :
Si les étapes 3-6 échouent, rembourser NEAR
Si l'exécution réussit, enregistrez la nouvelle adresse du compte de l'instance DAO
3.2 mise à jour DAO
Le contrat de l'usine fournit l'interface update() pour mettre à niveau le 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 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é des contrats de la Fabrique Sputnik-DAO
Contrôle d'accès : les méthodes de type view ne modifient pas les variables d'état
Contrôle d'accès : Les fonctions privilégiées ne peuvent être exécutées que par le propriétaire du contrat ou un compte DAO.
Gestion des erreurs : mettre en œuvre un mécanisme de gestion des erreurs raisonnable pour les situations exceptionnelles
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.
Analyse des contrats de l'usine SputnikDAO : création et gestion en masse de DAO sur la chaîne Near
Journal de développement des smart contracts Rust (10-2) : Analyse du code du contrat de la fabrique SputnikDAO
Cet article présentera en détail la mise en œuvre du modèle d'usine de la plateforme Sputnik-DAO ( sputnikdao-factory).
1. Sputnik-DAO smart contracts
Sputnik-DAO utilise le modèle de conception de fabrique de création pour réaliser la création et la gestion unifiée de l'organisation autonome décentralisée (DAO) sur cette plateforme.
2. Introduction aux fonctionnalités du module DAPP
La page DAPP de la plateforme Sputnik DAO montre qu'un certain nombre de DAO ont déjà créé des objets d'instance sur cette plateforme. En date de mars 2022, le DAO le plus actif est news.sputnik-dao.near, avec 3051 propositions en cours de vote public ou déjà clôturées.
Tous les contrats d'instance DAO créés sur la plateforme Sputnik DAO sont déployés sous le sous-compte du compte sputnik-dao.near, par exemple :
Les organisations peuvent appeler la méthode create() du contrat sputnikdao-factory sur le réseau principal NEAR pour créer de nouvelles instances de DAO.
3. Interprétation du code du contrat sputnikdao-factory
3.1 créer DAO
L'état du contrat sputnikdao-factory est principalement composé des deux parties suivantes :
rouille pub struct SputnikDAOFactory { factory_manager: FactoryManager, daos: UnorderedSet, }
La méthode de création d'une instance de DAO create() est définie comme suit :
rouille #[payable] pub fn create(&mut self, name: AccountId, args: Base64VecU8) { let account_id: AccountId = format!('{}.{}', name, env::current_account_id()) .parse() .unwrap(); 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'); self.factory_manager.create_contract( self.get_default_code_hash(), account_id, 'new', &args.0, 'on_create', &callback_args, ); }
la mise en œuvre spécifique de factory_manager.create_contract:
rouille pub fn create_contract( &self, code_hash: Base58CryptoHash,
account_id: AccountId, new_method: &str, args: [u8], callback_method: &str, callback_args: &[u8], ) { // 1. Charger le code du modèle de contrat // 2. Construire une Promesse // 3. Créer un compte de déploiement // 4. Transférer NEAR // 5. Déployer le contrat // 6. Appeler la fonction d'initialisation new() // 7. rappel on_create() }
Logique de traitement de la fonction de rappel on_create :
3.2 mise à jour DAO
Le contrat de l'usine fournit l'interface update() pour mettre à niveau le 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 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é des contrats de la Fabrique Sputnik-DAO