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:
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.
Análisis del contrato de fábrica SputnikDAO: creación y gestión masiva de DAO en la cadena Near
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:
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, }
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:
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