Control de acceso a contratos inteligentes en Rust: visibilidad de funciones y gestión de acceso privilegiado

robot
Generación de resúmenes en curso

Diario de desarrollo de contratos inteligentes en Rust (7) Seguridad del contrato y control de permisos

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

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

1. Visibilidad de las funciones de contratos inteligentes

Configurar adecuadamente la visibilidad de las funciones del contrato es crucial para proteger las partes clave. Tomando como ejemplo el incidente de seguridad de la bolsa Bancor Network en junio de 2020, debido a que se configuró erróneamente la función de transferencia clave como pública, lo que expuso los activos de los usuarios a riesgos.

En los contratos inteligentes de Rust, la visibilidad de las funciones también es importante. El macro #[near_bindgen] en NEAR SDK define los siguientes atributos de visibilidad:

  • pub fn: función pública, se puede llamar desde fuera del contrato
  • fn: solo se puede llamar dentro del contrato
  • pub(crate) fn: restringir la llamada dentro de crate

También se pueden definir métodos internos a través de bloques impl Contract que no están decorados con #[near_bindgen].

Para las funciones de callback, deben ser públicas pero solo permitir que el contrato las llame. Se puede implementar esta funcionalidad con el macro #[private].

Es importante notar que la visibilidad predeterminada en Rust es privada, pero los elementos dentro de traits y enums son una excepción.

2. Control de acceso a funciones privilegiadas

Además de la visibilidad de la función, también es necesario establecer un mecanismo completo de lista blanca de control de acceso. Al igual que el contrato Ownable de Solidity, ciertas funciones privilegiadas solo pueden ser llamadas por el owner.

En el contrato Rust, se puede implementar el siguiente trait Ownable:

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

Con base en esto, se puede implementar una lista blanca para el owner. También se pueden establecer listas blancas de múltiples usuarios o controles de acceso por grupos mediante la configuración de traits más complejos personalizados.

Ver originales
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Recompensa
  • 4
  • Compartir
Comentar
0/400
WhaleWatchervip
· 07-13 07:29
Primero hablemos de Ownable.
Ver originalesResponder0
GateUser-e51e87c7vip
· 07-13 07:23
Con tener manos es suficiente, tan simple.
Ver originalesResponder0
DecentralizeMevip
· 07-13 07:22
Lógica subyacente de Wu Wu
Ver originalesResponder0
ChainSpyvip
· 07-13 07:21
El control de acceso es tan complicado que es mejor hacerlo todo público.
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)