Control de permisos en contratos inteligentes de Rust
Este artículo abordará el problema del control de permisos en los contratos inteligentes de Rust desde dos aspectos: la visibilidad de los métodos del contrato y el control de acceso a las funciones privilegiadas.
1. Visibilidad de las funciones de contratos inteligentes
Al escribir contratos inteligentes, se puede controlar quién puede llamar a funciones específicas al especificar la visibilidad de la función, protegiendo así las partes clave del contrato.
Tomando como ejemplo el incidente de seguridad ocurrido en un intercambio el 18 de junio de 2020. Debido a una configuración incorrecta de los permisos de acceso a funciones clave del contrato, los activos de los usuarios se vieron en riesgo. Este caso resalta la importancia de configurar correctamente la visibilidad de las funciones del contrato.
En los contratos inteligentes de Rust, la visibilidad de las funciones se clasifica principalmente en las siguientes categorías:
pub fn: indica que este método es público, forma parte de la interfaz del contrato y cualquiera puede invocarlo desde el exterior.
fn: Si no se indica explícitamente pub, significa que esta función solo puede ser llamada dentro del contrato por otras funciones.
pub(crate) fn: Limitar el método para que se llame dentro del ámbito de crate.
Otra forma de establecer el método como interno es definirlo en un bloque de código impl Contract que no esté modificado por #[near_bindgen].
Para la función de devolución de llamada, debe configurarse como una propiedad pública para poder ser llamada a través de function call. Al mismo tiempo, es necesario asegurarse de que la función de devolución de llamada no pueda ser llamada arbitrariamente; se puede utilizar el macro #[private] para lograr esto.
Es importante notar que en Rust, por defecto, todo es privado, excepto los subproyectos en pub Trait y las variables en pub Enum que son públicas por defecto.
2. Control de acceso a funciones privilegiadas
Además de la visibilidad de funciones, también es necesario establecer un mecanismo completo de lista blanca de control de acceso desde un nivel semántico. Algunas funciones privilegiadas (como la inicialización del contrato, activar/pausear, etc.) solo pueden ser llamadas por el propietario del contrato.
En los contratos inteligentes de Rust, se puede implementar una funcionalidad similar al modificador onlyOwner en Solidity:
El uso de este método permite el control de acceso a funciones privilegiadas, asegurando que solo el propietario del contrato pueda ejecutar completamente estas funciones. Basado en este principio, se puede establecer un mecanismo de lista blanca más complejo para lograr un control de acceso granular por grupos.
3. Otros métodos de control de acceso
Además de los métodos mencionados, en los contratos inteligentes de Rust también hay otras formas de control de acceso, como el control del momento de la llamada al contrato, el mecanismo de llamadas múltiples y la implementación de la gobernanza (DAO), etc. Estos temas se discutirán en detalle en artículos posteriores.
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.
10 me gusta
Recompensa
10
4
Compartir
Comentar
0/400
ProxyCollector
· hace5h
Una vez más, es una trampa de configuración de permisos. Quien caiga, será desafortunado.
Ver originalesResponder0
SelfRugger
· hace18h
Otra vez el problema de permisos me está fastidiando.
Ver originalesResponder0
AllTalkLongTrader
· hace18h
Jeje, otra vez veo ese agujero del intercambio del año pasado.
Ver originalesResponder0
PermabullPete
· hace18h
No control sobre los permisos casi me hace fallar.
Control de acceso de permisos en contratos inteligentes Rust: visibilidad de funciones y prácticas de acceso privilegiado
Control de permisos en contratos inteligentes de Rust
Este artículo abordará el problema del control de permisos en los contratos inteligentes de Rust desde dos aspectos: la visibilidad de los métodos del contrato y el control de acceso a las funciones privilegiadas.
1. Visibilidad de las funciones de contratos inteligentes
Al escribir contratos inteligentes, se puede controlar quién puede llamar a funciones específicas al especificar la visibilidad de la función, protegiendo así las partes clave del contrato.
Tomando como ejemplo el incidente de seguridad ocurrido en un intercambio el 18 de junio de 2020. Debido a una configuración incorrecta de los permisos de acceso a funciones clave del contrato, los activos de los usuarios se vieron en riesgo. Este caso resalta la importancia de configurar correctamente la visibilidad de las funciones del contrato.
En los contratos inteligentes de Rust, la visibilidad de las funciones se clasifica principalmente en las siguientes categorías:
Otra forma de establecer el método como interno es definirlo en un bloque de código impl Contract que no esté modificado por #[near_bindgen].
Para la función de devolución de llamada, debe configurarse como una propiedad pública para poder ser llamada a través de function call. Al mismo tiempo, es necesario asegurarse de que la función de devolución de llamada no pueda ser llamada arbitrariamente; se puede utilizar el macro #[private] para lograr esto.
Es importante notar que en Rust, por defecto, todo es privado, excepto los subproyectos en pub Trait y las variables en pub Enum que son públicas por defecto.
2. Control de acceso a funciones privilegiadas
Además de la visibilidad de funciones, también es necesario establecer un mecanismo completo de lista blanca de control de acceso desde un nivel semántico. Algunas funciones privilegiadas (como la inicialización del contrato, activar/pausear, etc.) solo pueden ser llamadas por el propietario del contrato.
En los contratos inteligentes de Rust, se puede implementar una funcionalidad similar al modificador onlyOwner en Solidity:
óxido pub trait Propietario { fn assert_owner(&self) { assert_eq!(env::predecessor_account_id(), self.get_owner()); } AccountId; fn set_owner(&mut self, owner: AccountId); }
El uso de este método permite el control de acceso a funciones privilegiadas, asegurando que solo el propietario del contrato pueda ejecutar completamente estas funciones. Basado en este principio, se puede establecer un mecanismo de lista blanca más complejo para lograr un control de acceso granular por grupos.
3. Otros métodos de control de acceso
Además de los métodos mencionados, en los contratos inteligentes de Rust también hay otras formas de control de acceso, como el control del momento de la llamada al contrato, el mecanismo de llamadas múltiples y la implementación de la gobernanza (DAO), etc. Estos temas se discutirán en detalle en artículos posteriores.