Controle de acesso de contratos inteligentes Rust: visibilidade de função e gerenciamento de acesso privilegiado

robot
Geração de resumo em curso

Diário de Desenvolvimento de Contratos Inteligentes em Rust (7) Segurança de Contratos e Controle de Acesso

Este artigo abordará o controle de permissões em contratos inteligentes Rust de duas maneiras:

  1. A visibilidade do acesso/chamada dos métodos do contrato
  2. Controle de acesso/funções privilegiadas/divisão de responsabilidades

1. Visibilidade das funções de contrato

Definir corretamente a visibilidade das funções do contrato é crucial para proteger partes críticas. Tomando como exemplo o incidente de segurança da Bancor Network em junho de 2020, a definição incorreta da função de transferência crítica como public resultou em riscos para os ativos dos usuários.

Na Rust contratos inteligentes, a visibilidade das funções é igualmente importante. O SDK NEAR define os seguintes atributos de visibilidade com a macro #[near_bindgen]:

  • pub fn: função pública, pode ser chamada de fora do contrato
  • fn: apenas pode ser chamado dentro do contrato
  • pub(crate) fn: restringir chamadas dentro do crate

Ainda é possível definir métodos internos através de blocos impl Contract que não são decorados com #[near_bindgen].

Para a função de callback, deve ser definida como pública, mas apenas permitida a chamada pelo próprio contrato. Pode-se usar o macro #[private] para implementar esta funcionalidade.

Deve-se notar que a visibilidade padrão em Rust é privada, mas os itens dentro de trait e enum são uma exceção.

2. Controle de Acesso a Funções Privilegiadas

Além da visibilidade das funções, é necessário estabelecer um mecanismo completo de lista branca de controle de acesso. Semelhante ao contrato Ownable do Solidity, algumas funções privilegiadas só podem ser chamadas pelo owner.

No contrato Rust, pode-se implementar o seguinte trait Ownable:

ferrugem pub trait Ownable { fn assert_owner(&self) { assert_eq!(env::predecessor_account_id(), self.get_owner()); } AccountId; fn set_owner(&mut self, owner: AccountId); }

Com base nisso, pode-se implementar uma lista branca para o owner. Também é possível definir listas brancas de múltiplos utilizadores ou controle de acesso em grupos através de configurações de trait mais complexas personalizadas.

Ver original
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
  • Partilhar
Comentar
0/400
WhaleWatchervip
· 07-13 07:29
Primeiro, vamos falar sobre Ownable.
Ver originalResponder0
GateUser-e51e87c7vip
· 07-13 07:23
Ter mãos é suficiente, tão simples assim.
Ver originalResponder0
DecentralizeMevip
· 07-13 07:22
Uuuh lógica de base
Ver originalResponder0
ChainSpyvip
· 07-13 07:21
O controle de acesso é tão complexo que é melhor ser totalmente público.
Ver originalResponder0
  • Pino
Negocie cripto em qualquer lugar e a qualquer hora
qrCode
Digitalizar para transferir a aplicação Gate
Novidades
Português (Portugal)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)