Seguridad de contratos inteligentes en Rust: mejores prácticas de visibilidad de funciones y control de permisos

robot
Generación de resúmenes en curso

Diario de desarrollo de contratos inteligentes en Rust (7) Control de acceso en la seguridad de contratos

Este artículo abordará el control de permisos en los contratos inteligentes de Rust desde dos aspectos diferentes:

  1. Visibilidad de acceso/llamada a métodos (funciones) de contratos
  2. Control de acceso a funciones privilegiadas / Distribución de responsabilidades

1. Visibilidad de funciones (métodos) de contratos

Al escribir contratos inteligentes, se puede controlar el acceso a las funciones especificando la visibilidad de las funciones del contrato, protegiendo así las partes clave del contrato de accesos o manipulaciones accidentales.

Tomando como ejemplo el intercambio Bancor Network, el 18 de junio de 2020 ocurrió un incidente de seguridad debido a un error en la configuración de los permisos de acceso de las funciones clave del contrato. Este contrato fue escrito en el 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, y se puede considerar como parte de la interfaz del contrato.

Bancor Network, al modificar una vulnerabilidad de seguridad, configuró 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. Esta vulnerabilidad expuso los activos de 590,000 dólares de los usuarios a un riesgo grave.

En los contratos inteligentes de Rust, también se debe prestar atención al control de visibilidad de las funciones del contrato. El macro #[near_bindgen] definido por NEAR SDK se puede utilizar para modificar las funciones de los contratos inteligentes de Rust, y existen los siguientes diferentes atributos de visibilidad:

  • pub fn: indica que este método del contrato es público, forma parte de la interfaz del contrato y cualquier persona puede llamarlo desde fuera del contrato.
  • fn: Si no se indica explícitamente pub, significa que no se puede llamar a esta función directamente desde fuera del contrato, solo se puede llamar internamente desde otras funciones dentro del contrato.
  • pub(crate) fn: equivalente a pub(en crate), similar a fn, restringiendo los métodos del contrato para ser llamados 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, que no está decorado con #[near_bindgen].

Para las funciones de callback, su definición debe establecerse como propiedad pública, pero al mismo tiempo debe asegurarse de que solo puedan ser llamadas por el propio contrato. El SDK de NEAR proporciona el macro #[private] para implementar esta funcionalidad.

Cabe destacar que en el lenguaje Rust, por defecto, todo es privado, excepto los subproyectos 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 de la visibilidad de las funciones, es necesario establecer un mecanismo completo de lista blanca de control de acceso desde el nivel semántico del contrato. Algunas funciones privilegiadas, como la inicialización del contrato, activar/pausar, transferencias unificadas, etc., generalmente solo pueden ser llamadas por el propietario del contrato (owner).

Estas funciones privilegiadas deben establecerse como propiedades públicas para poder ser llamadas externamente, pero al mismo tiempo es necesario definir reglas de control de acceso para garantizar que solo los usuarios que cumplan con las condiciones puedan ejecutarlas completamente.

En los contratos inteligentes de Rust, se puede implementar una funcionalidad similar a los modificadores de Solidity, mediante la personalización de Traits para controlar el acceso a funciones privilegiadas:

ó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); }

Usar este trait puede lograr el control de acceso a funciones privilegiadas en el contrato, exigiendo que el llamador de la transacción sea el propietario del contrato. Basado en este principio, se pueden establecer modificadores o traits más complejos personalizados para configurar múltiples usuarios o múltiples listas blancas, logrando un control de acceso por grupos más detallado.

3. Más métodos de control de acceso

Además de los métodos mencionados, en los contratos inteligentes de Rust también existen otros métodos de control de acceso, como el control del momento de la llamada al contrato, el mecanismo de llamada multifirma de las funciones del contrato, la implementación de la gobernanza (DAO), entre otros. Estos contenidos se detallarán en los próximos artículos de este diario de formación de contratos inteligentes.

BNT-0.17%
GET2.67%
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
  • 3
  • Compartir
Comentar
0/400
Rugpull幸存者vip
· hace12h
Esta ola es otra nueva Lista de permitidos Lavado de ojos, ¿verdad?
Ver originalesResponder0
RektHuntervip
· hace12h
¡Novato en rust, imprescindible! Confiable~
Ver originalesResponder0
MetaLord420vip
· hace12h
Hola, ¿la lista de permitidos también puede ser hackeada?~
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)