Diario de desarrollo de contratos inteligentes en Rust (7) Seguridad del contrato: control de acceso
Este artículo introducirá el control de permisos en los contratos inteligentes de Rust desde dos perspectivas:
La visibilidad de acceso/llamada a los métodos (funciones) del contrato
Control de acceso de funciones privilegiadas / División de responsabilidades
1. Visibilidad de las funciones (métodos) del contrato
El control de la visibilidad de las funciones del contrato es crucial para proteger las partes clave de accesos o manipulaciones accidentales. Tomando como ejemplo el incidente de seguridad del intercambio Bancor Network del 18 de junio de 2020, este incidente ocurrió debido a un error en la configuración de los permisos de acceso a funciones clave del contrato.
En los contratos inteligentes de Rust, hay las siguientes visibilidades de funciones:
pub fn: indica que este método es público, forma parte de la interfaz del contrato y puede ser llamado desde fuera del contrato.
fn: Si no se indica explícitamente pub, significa que esta función no se puede llamar directamente desde fuera del contrato, solo se puede llamar desde dentro del contrato.
pub(crate) fn: Restringir el método a ser llamado dentro del alcance interno del crate.
Otra forma de establecer el método como interno es definirlo en un bloque de código impl Contract que no esté decorado con #[near_bindgen].
Para las funciones de retorno, deben establecerse como propiedades públicas, pero es necesario asegurarse de que solo puedan ser llamadas por el propio contrato. Se puede utilizar el macro #[private] para lograr esto.
2. Control de acceso a funciones privilegiadas(mecanismo de lista blanca)
Además de la visibilidad de las funciones, también es necesario establecer un mecanismo completo de lista blanca de control de acceso desde un nivel semántico. Ciertas funciones privilegiadas (, como la inicialización del contrato, activar/pausar, etc., ) solo pueden ser llamadas por el propietario del contrato.
Se pueden implementar Traits personalizados para el control de acceso, verificando si el llamador es el propietario del contrato:
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.
13 me gusta
Recompensa
13
2
Republicar
Compartir
Comentar
0/400
PumpBeforeRug
· 08-09 06:44
La caída de Bancor también fue por no tener bien establecidos los permisos, ¿verdad?
Ver originalesResponder0
OffchainOracle
· 08-09 06:32
El incidente de Bancor debe ser utilizado como una advertencia de libro de texto.
Seguridad de contratos inteligentes en Rust: comprensión profunda del control de acceso y la gestión de permisos
Diario de desarrollo de contratos inteligentes en Rust (7) Seguridad del contrato: control de acceso
Este artículo introducirá el control de permisos en los contratos inteligentes de Rust desde dos perspectivas:
1. Visibilidad de las funciones (métodos) del contrato
El control de la visibilidad de las funciones del contrato es crucial para proteger las partes clave de accesos o manipulaciones accidentales. Tomando como ejemplo el incidente de seguridad del intercambio Bancor Network del 18 de junio de 2020, este incidente ocurrió debido a un error en la configuración de los permisos de acceso a funciones clave del contrato.
En los contratos inteligentes de Rust, hay las siguientes visibilidades de funciones:
Otra forma de establecer el método como interno es definirlo en un bloque de código impl Contract que no esté decorado con #[near_bindgen].
Para las funciones de retorno, deben establecerse como propiedades públicas, pero es necesario asegurarse de que solo puedan ser llamadas por el propio contrato. Se puede utilizar el macro #[private] para lograr esto.
2. Control de acceso a funciones privilegiadas(mecanismo de lista blanca)
Además de la visibilidad de las funciones, también es necesario establecer un mecanismo completo de lista blanca de control de acceso desde un nivel semántico. Ciertas funciones privilegiadas (, como la inicialización del contrato, activar/pausar, etc., ) solo pueden ser llamadas por el propietario del contrato.
Se pueden implementar Traits personalizados para el control de acceso, verificando si el llamador es el propietario del contrato:
óxido pub trait Ownable { fn assert_owner(&self) { assert_eq!(env::predecessor_account_id(), self.get_owner()); } AccountId; fn set_owner(&mut self, owner: AccountId); }
Basado en este principio, se pueden establecer múltiples usuarios o varias listas blancas para lograr un control de acceso por grupos más detallado.
3. Más métodos de control de acceso
Otros métodos de control de acceso en contratos inteligentes de Rust incluyen:
Estos contenidos se detallarán en artículos posteriores.