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:
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:
Cargar el código de plantilla del contrato inteligente DAO
Crear una cuenta de implementación
Fondos iniciales de transferencia
Desplegar el código del contrato
Llamar a la función de inicialización del contrato
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.
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.
16 me gusta
Recompensa
16
5
Compartir
Comentar
0/400
LayerHopper
· Hace14m
Este código es un poco oscuro.
Ver originalesResponder0
BearMarketMonk
· 08-03 19:38
Hay un poco de alcista, aprendiendo rust y haciendo contratos.
Ver originalesResponder0
AirdropChaser
· 08-03 19:28
Otra vez, otra vez, otra vez, llega un análisis de código. Mareado.
Ver originalesResponder0
ProbablyNothing
· 08-03 19:24
No entiendo el código del contrato, ¿qué dice esto?
Análisis del código del contrato de la fábrica Sputnik DAO: lógica central para crear y actualizar DAO
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, }
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();
}
Los pasos principales del método create_contract() incluyen:
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:
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.