Diario de desarrollo de contratos inteligentes en Rust (7) Control de permisos de seguridad del contrato
Este artículo presentará el contenido relacionado con el control de permisos en contratos inteligentes de Rust desde dos perspectivas:
Visibilidad de acceso/llamada a métodos (funciones) de contratos inteligentes
Control de acceso de funciones privilegiadas / División de responsabilidades
1. Visibilidad de las funciones (métodos) del contrato
Al escribir contratos inteligentes, al especificar la visibilidad de las funciones del contrato se puede controlar el acceso a las funciones, protegiendo así las partes clave del contrato de accesos o manipulaciones no autorizadas.
Tomando como ejemplo el intercambio Bancor Network, el 18 de junio de 2020 ocurrió un incidente de seguridad de activos debido a un error en la configuración de los permisos de acceso a funciones clave del contrato. Este contrato fue escrito en lenguaje Solidity, y la visibilidad de las funciones del contrato se divide en dos tipos: public/external y private/internal. El primero permite que las funciones del contrato sean llamadas por llamadores externos.
Al modificar una vulnerabilidad de seguridad, debido a un descuido, se configuraron erróneamente algunas funciones clave de transferencia en el contrato como públicas, lo que permitió que cualquier persona pudiera llamar a estas funciones desde fuera del contrato para realizar operaciones de transferencia, poniendo en grave riesgo los activos de 590,000 dólares de los usuarios.
En los contratos inteligentes de Rust, también se debe prestar atención al control de visibilidad de las funciones del contrato. Las funciones de contratos inteligentes de Rust decoradas con el macro #[near_bindgen] definido por NEAR SDK tienen las siguientes diferentes propiedades de visibilidad:
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 no se puede llamar directamente desde fuera del contrato, solo se puede llamar internamente desde otras funciones dentro del contrato.
pub(crate) fn: equivale a pub(en crate), restringiendo el método para ser llamado solo dentro del ámbito del crate.
Otra forma de establecer el método del contrato como interno es definir un bloque de código impl Contract independiente dentro del contrato, el cual no está decorado con #[near_bindgen].
Para la función de devolución de llamada (Callbacks), su definición debe establecerse como propiedad pública, pero debe asegurarse de que solo pueda ser llamada por el contrato mismo. El SDK de NEAR ofrece el macro #[private] para implementar esta funcionalidad.
Es importante tener en cuenta que, en el lenguaje Rust, todo es privado por defecto, excepto los subelementos en pub Trait y las variables Enum en pub Enum que son públicas por defecto.
2. Control de acceso a funciones privilegiadas(mecanismo de lista blanca)
Además del control de visibilidad de funciones, también es necesario establecer un mecanismo completo de lista blanca de control de acceso desde la perspectiva semántica del contrato. Algunas funciones privilegiadas (, como la inicialización del contrato, activar/pausar, transferencias unificadas, etc., ) solo pueden ser llamadas por el propietario del contrato (owner); estas funciones suelen ser llamadas "funciones solo para el propietario".
Aunque estas funciones clave deben configurarse como propiedades públicas, se pueden definir reglas de control de acceso, y solo se pueden ejecutar completamente si se cumplen las reglas correspondientes. En los contratos inteligentes de Rust, se puede implementar un Trait personalizado similar al modificador onlyOwner en Solidity:
Utilizando este trait se puede implementar el control de acceso a funciones privilegiadas en el contrato, exigiendo que el llamador sea el propietario del contrato. Basado en este principio, se pueden crear modificadores o traits más complejos para establecer múltiples usuarios en una lista blanca, o definir múltiples listas blancas para lograr un control de acceso grupal 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:
Control del momento de invocación del contrato
Mecanismo de llamada multifirma para funciones de contratos
Gobernanza(DAO) de la implementación
Estos contenidos se presentarán en los próximos artículos de esta serie de diarios de desarrollo de contratos inteligentes.
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.
11 me gusta
Recompensa
11
6
Compartir
Comentar
0/400
CompoundPersonality
· hace21h
Otra vez hay que lidiar con la inteligencia y astucia de los permisos.
Ver originalesResponder0
MEVSupportGroup
· hace21h
Error de permisos, me ha arruinado. Estamos agrupándonos para calentarnos.
Ver originalesResponder0
MetaMaximalist
· hace21h
ugh, otro error de novato a nivel bancor... por eso necesitamos verificación formal para todos los despliegues de protocolo, para ser sinceros
Ver originalesResponder0
TokenomicsTherapist
· hace21h
Oye, no digas que me acuerdo de lo de Bancor, en ese momento fue un desastre.
Ver originalesResponder0
TokenEconomist
· hace21h
déjame desglosarlo - el control de acceso es literalmente el abc de la seguridad de contratos smh
Ver originalesResponder0
Layer2Arbitrageur
· hace21h
jaja imagina escribir contratos en rust sin un control de acceso adecuado... ngmi de verdad
Guía completa de seguridad de contratos inteligentes en Rust: control de permisos
Diario de desarrollo de contratos inteligentes en Rust (7) Control de permisos de seguridad del contrato
Este artículo presentará el contenido relacionado con el control de permisos en contratos inteligentes de Rust desde dos perspectivas:
1. Visibilidad de las funciones (métodos) del contrato
Al escribir contratos inteligentes, al especificar la visibilidad de las funciones del contrato se puede controlar el acceso a las funciones, protegiendo así las partes clave del contrato de accesos o manipulaciones no autorizadas.
Tomando como ejemplo el intercambio Bancor Network, el 18 de junio de 2020 ocurrió un incidente de seguridad de activos debido a un error en la configuración de los permisos de acceso a funciones clave del contrato. Este contrato fue escrito en lenguaje Solidity, y la visibilidad de las funciones del contrato se divide en dos tipos: public/external y private/internal. El primero permite que las funciones del contrato sean llamadas por llamadores externos.
Al modificar una vulnerabilidad de seguridad, debido a un descuido, se configuraron erróneamente algunas funciones clave de transferencia en el contrato como públicas, lo que permitió que cualquier persona pudiera llamar a estas funciones desde fuera del contrato para realizar operaciones de transferencia, poniendo en grave riesgo los activos de 590,000 dólares de los usuarios.
En los contratos inteligentes de Rust, también se debe prestar atención al control de visibilidad de las funciones del contrato. Las funciones de contratos inteligentes de Rust decoradas con el macro #[near_bindgen] definido por NEAR SDK tienen las siguientes diferentes propiedades de visibilidad:
Otra forma de establecer el método del contrato como interno es definir un bloque de código impl Contract independiente dentro del contrato, el cual no está decorado con #[near_bindgen].
Para la función de devolución de llamada (Callbacks), su definición debe establecerse como propiedad pública, pero debe asegurarse de que solo pueda ser llamada por el contrato mismo. El SDK de NEAR ofrece el macro #[private] para implementar esta funcionalidad.
Es importante tener en cuenta que, en el lenguaje Rust, todo es privado por defecto, excepto los subelementos en pub Trait y las variables Enum en pub Enum que son públicas por defecto.
2. Control de acceso a funciones privilegiadas(mecanismo de lista blanca)
Además del control de visibilidad de funciones, también es necesario establecer un mecanismo completo de lista blanca de control de acceso desde la perspectiva semántica del contrato. Algunas funciones privilegiadas (, como la inicialización del contrato, activar/pausar, transferencias unificadas, etc., ) solo pueden ser llamadas por el propietario del contrato (owner); estas funciones suelen ser llamadas "funciones solo para el propietario".
Aunque estas funciones clave deben configurarse como propiedades públicas, se pueden definir reglas de control de acceso, y solo se pueden ejecutar completamente si se cumplen las reglas correspondientes. En los contratos inteligentes de Rust, se puede implementar un Trait personalizado similar al modificador onlyOwner en Solidity:
oxidación pub trait Ownable { fn assert_owner(&self) { assert_eq!(env::predecessor_account_id(), self.get_owner()); } AccountId; fn set_owner(&mut self, owner: AccountId); }
Utilizando este trait se puede implementar el control de acceso a funciones privilegiadas en el contrato, exigiendo que el llamador sea el propietario del contrato. Basado en este principio, se pueden crear modificadores o traits más complejos para establecer múltiples usuarios en una lista blanca, o definir múltiples listas blancas para lograr un control de acceso grupal 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 presentarán en los próximos artículos de esta serie de diarios de desarrollo de contratos inteligentes.