Análisis del código del contrato de la fábrica Sputnik DAO: lógica central para crear y actualizar DAO

robot
Generación de resúmenes en curso

Diario de desarrollo de contratos inteligentes Rust (10-2): Análisis del contrato de fábrica de Sputnik DAO

Este artículo analizará en profundidad la implementación del código del contrato de fábrica de la plataforma Sputnik DAO. Sputnik DAO ha implementado un modelo de diseño de fábrica de creación para la creación y gestión unificada de la organización autónoma descentralizada (DAO).

1. Contrato de fábrica Sputnik-DAO

El estado principal del contrato de la fábrica Sputnik-DAO se compone de dos partes:

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

  • factory_manager: proporciona la lógica funcional interna para crear/eliminar/actualizar instancias de DAO
  • daos: registra las direcciones de cuentas NEAR de todas las instancias de DAO creadas en la plataforma

2. Crear DAO

El contrato de fábrica proporciona el método create() para crear nuevas instancias de DAO:

rust #[payable] pub fn create(&mut self, name: AccountId, args: Base64VecU8) { // Construir la cuenta de despliegue del contrato DAO let account_id: AccountId = format!("{}.{}", name, env::current_account_id()) .parse() .unwrap();

// Construir parámetros de devolución
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("Failed to serialize");

// Llamar a factory_manager para crear un contrato
self.factory_manager.create_contract(
    self.get_default_code_hash(),
    account_id,
    "nuevo",
    &args.0,
    "on_create", 
    &callback_args,
);

}

Los pasos principales del método create_contract() incluyen:

  1. Cargar el código de plantilla del contrato inteligente DAO
  2. Crear una cuenta de implementación
  3. Fondos iniciales de transferencia
  4. Desplegar el código del contrato
  5. Llamar a la función de inicialización del contrato
  6. Callback on_create() función

3. Actualizar DAO

El contrato de fábrica proporciona el método update() para actualizar el contrato 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 el DAO mismo" ); assert!( self.daos.contains(&account_id), "Debe ser un contrato creado por fábrica" ); self.factory_manager .actualizar_contrato(id_cuenta, hash_codigo, "actualizar"); }

4. Análisis de seguridad

La seguridad del contrato de fábrica Sputnik-DAO se garantiza principalmente desde los siguientes aspectos:

  • Control de permisos: el método view no modifica el estado, las funciones privilegiadas solo pueden ser llamadas por el owner
  • Manejo de errores: implementar un mecanismo de manejo de errores razonable para situaciones excepcionales
  • Verificación de aserción: añadir verificaciones de aserción necesarias a las operaciones clave

El contrato de fábrica tenía una grave vulnerabilidad de seguridad, que podría permitir a cualquier usuario actualizar el contrato DAO. Esta vulnerabilidad ha sido corregida mediante la adición de un mecanismo razonable de verificación de listas blancas.

GET3.49%
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
LayerHoppervip
· Hace14m
Este código es un poco oscuro.
Ver originalesResponder0
BearMarketMonkvip
· 08-03 19:38
Hay un poco de alcista, aprendiendo rust y haciendo contratos.
Ver originalesResponder0
AirdropChaservip
· 08-03 19:28
Otra vez, otra vez, otra vez, llega un análisis de código. Mareado.
Ver originalesResponder0
ProbablyNothingvip
· 08-03 19:24
No entiendo el código del contrato, ¿qué dice esto?
Ver originalesResponder0
fren.ethvip
· 08-03 19:14
Realmente es doloroso de ver xd
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)