Análisis del contrato de fábrica SputnikDAO: creación y gestión masiva de DAO en la cadena Near

robot
Generación de resúmenes en curso

Diario de desarrollo de contratos inteligentes en Rust (10-2): Análisis del código del contrato de fábrica de SputnikDAO

Este artículo presentará en detalle el diseño y la implementación del modo fábrica de la plataforma Sputnik-DAO ( sputnikdao-factory ).

1. Contrato de fábrica Sputnik-DAO

Sputnik-DAO adopta el patrón de diseño de fábrica de creación para implementar la creación y gestión unificada de la organización autónoma descentralizada (DAO) en esta plataforma.

2. Introducción a las funciones del módulo DAPP

En la página DAPP de la plataforma Sputnik DAO se puede ver que ya se han creado varios objetos de instancia en esta plataforma. Hasta marzo de 2022, el DAO más activo es news.sputnik-dao.near, con 3051 propuestas en votación pública o ya concluidas.

Todos los contratos de instancias de DAO creados en la plataforma Sputnik DAO se despliegan bajo la subcuenta de la cuenta sputnik-dao.near, como:

  • pcp.sputnik-dao.near
  • test-dao-bro.sputnik-dao.near
  • blaqkstereo.sputnik-dao.near
  • octopode-dao.sputnik-dao.near

Las organizaciones pueden llamar al método create() del contrato sputnikdao-factory en la red principal de NEAR para crear nuevas instancias de DAO.

3. Interpretación del código del contrato sputnikdao-factory

3.1 Crear DAO

El estado del contrato sputnikdao-factory se compone principalmente de las siguientes dos partes:

óxido pub struct SputnikDAOFactory { factory_manager: FactoryManager, daos: UnorderedSet\u003caccountid\u003e, }

  • factory_manager: proporciona métodos para crear/eliminar/actualizar instancias de DAO
  • daos: registra todas las direcciones de cuentas NEAR de las instancias DAO creadas.

La definición del método create() para crear una instancia de DAO es la siguiente:

oxidación #[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('Falló al serializar'); self.factory_manager.create_contract( self.get_default_code_hash(), account_id, 'nuevo', &args.0, 'on_create', &callback_args, ); }

Implementación específica de factory_manager.create_contract:

óxido pub fn create_contract( &self, code_hash: Base58CryptoHash,
account_id: AccountId, new_method: &str, args: [u8], callback_method: &str, callback_args: &[u8], ) { // 1. Cargar el código de la plantilla del contrato // 2. Construir una Promesa // 3. Crear cuenta de despliegue // 4. Transferir NEAR // 5. Desplegar contratos inteligentes // 6. Llamar a la función de inicialización new() // 7. Callback on_create() }

Lógica de manejo de la función de devolución de llamada on_create:

  • Si la ejecución de los pasos 3-6 falla, reembolsar NEAR
  • Si se ejecuta con éxito, registre la dirección de la cuenta de la nueva instancia de DAO.

3.2 actualización DAO

El contrato de fábrica proporciona una interfaz update() para actualizar el DAO:

óxido 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, 'Debe ser actualizado por el propietario de la fábrica o por el DAO mismo' ); assert!( self.daos.contains(&account_id), 'Debe ser un contrato creado por la fábrica' ); self.factory_manager .actualizar_contrato(id_cuenta, hash_codigo, 'actualizar'); }

4. Análisis de seguridad del contrato de fábrica Sputnik-DAO

  • Control de permisos: los métodos de tipo view no modifican las variables de estado
  • Control de permisos: las funciones privilegiadas solo pueden ser ejecutadas por el propietario del contrato o cuentas DAO
  • Manejo de errores: implementar un mecanismo razonable de manejo de errores para situaciones excepcionales

\u003c/accountid\u003e

Ver originales
Esta página puede contener contenido de terceros, que se proporciona únicamente con fines informativos (sin garantías ni declaraciones) y no debe considerarse como un respaldo por parte de Gate a las opiniones expresadas ni como asesoramiento financiero o profesional. Consulte el Descargo de responsabilidad para obtener más detalles.
  • Recompensa
  • 5
  • Compartir
Comentar
0/400
ChainSpyvip
· hace6h
El patrón de fábrica merece ser estudiado
Ver originalesResponder0
AirdropSweaterFanvip
· hace6h
Tutorial imprescindible para novatos
Ver originalesResponder0
SandwichVictimvip
· hace6h
El patrón de fábrica es realmente bueno
Ver originalesResponder0
RuntimeErrorvip
· hace6h
El patrón de fábrica es muy clásico.
Ver originalesResponder0
Web3ExplorerLinvip
· hace6h
Interesante diseño de DAOfactory
Ver originalesResponder0
  • Anclado
Opere con criptomonedas en cualquier momento y lugar
qrCode
Escanee para descargar la aplicación Gate
Comunidad
Español
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)