Segurança de contratos inteligentes Rust: Melhores práticas para visibilidade de funções e controle de permissões

robot
Geração de resumo em curso

Diário de Desenvolvimento de Contratos Inteligentes em Rust (7) Segurança do Contrato: Controle de Permissões

Este artigo apresentará o controle de permissões em contratos inteligentes Rust sob dois aspectos:

  1. A visibilidade do acesso/chamada a métodos (funções) do contrato
  2. Controle de acesso/funções de privilégio/divisão de responsabilidades

1. Visibilidade das funções (métodos) do contrato

Ao escrever contratos inteligentes, a visibilidade das funções do contrato pode ser especificada para controlar os direitos de chamada da função, protegendo assim as partes críticas do contrato de acessos ou manipulações acidentais.

Tomando como exemplo a bolsa de negociação Bancor Network, em 18 de junho de 2020, ocorreu um incidente de segurança devido a um erro na configuração das permissões de controle de acesso das funções chave do contrato. O contrato foi escrito na linguagem Solidity, e a visibilidade das funções do contrato é dividida em public/external e private/internal. A primeira permite que as funções do contrato sejam chamadas por chamadores externos, podendo ser vistas como parte da interface do contrato.

A Bancor Network, ao corrigir uma determinada vulnerabilidade de segurança, definiu incorretamente algumas funções de transferência chave do contrato como atributos public, permitindo que qualquer pessoa pudesse chamar essas funções externamente para realizar operações de transferência. Essa vulnerabilidade expôs os ativos de 590 mil dólares dos usuários a um risco sério.

Na Rust, a visibilidade das funções do contrato inteligente também deve ser considerada. O macro #[near_bindgen] definido pelo NEAR SDK pode ser usado para modificar as funções do contrato inteligente Rust, e existem os seguintes diferentes atributos de visibilidade:

  • pub fn: indica que este método do contrato é público, faz parte da interface do contrato e pode ser chamado por qualquer pessoa de fora do contrato.
  • fn: Se pub não for explicitamente indicado, significa que essa função não pode ser chamada diretamente de fora do contrato, podendo ser chamada apenas dentro do contrato por outras funções.
  • pub(crate) fn: equivalente a pub(in crate), semelhante a fn, limita a chamada de métodos de contrato ao escopo interno do crate.

Outra maneira de definir o método do contrato como interno é definir um bloco de código impl Contract independente dentro do contrato, que não é modificado por #[near_bindgen].

Para funções de callback, a definição deve ser configurada como um atributo público, mas é necessário garantir que só possa ser chamada pelo próprio contrato. O NEAR SDK fornece o macro #[private] para implementar essa funcionalidade.

Vale a pena notar que na linguagem Rust, tudo é privado por padrão, exceto os subitens em pub Trait e as variáveis Enum em pub Enum que são públicas por padrão.

2. Controle de Acesso a Funções Privilegiadas (Mecanismo de Lista Branca)

Além da visibilidade da função, é necessário estabelecer um mecanismo completo de lista de permissões de controle de acesso a partir da camada semântica do contrato. Certas funções privilegiadas, como a inicialização do contrato, ativação/desativação e transferências unificadas, geralmente só podem ser chamadas pelo proprietário do contrato (owner).

Essas funções privilegiadas devem ser definidas como propriedades públicas para serem chamadas externamente, mas ao mesmo tempo precisam definir regras de controle de acesso, garantindo que apenas os usuários que atendem às condições possam executá-las completamente.

Nos contratos inteligentes em Rust, é possível implementar uma funcionalidade semelhante ao modifier do Solidity, através da personalização de Traits para controlar o acesso a funções privilegiadas:

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

Usar este trait permite implementar o controle de acesso às funções privilegiadas no contrato, exigindo que o chamador da transação seja o proprietário do contrato. Com base neste princípio, é possível definir modificadores ou traits mais complexos para configurar múltiplos usuários ou várias listas brancas, realizando um controle de acesso em grupos mais refinado.

3. Mais métodos de controle de acesso

Além dos métodos mencionados, existem outros métodos de controle de acesso em contratos inteligentes Rust, como controle do momento da chamada do contrato, mecanismo de chamadas multifirma para funções do contrato, implementação de governança (DAO) e outros. Esses conteúdos serão detalhados nos próximos artigos do diário de desenvolvimento de contratos inteligentes desta série.

BNT-0.17%
GET2.67%
Ver original
Esta página pode conter conteúdos de terceiros, que são fornecidos apenas para fins informativos (sem representações/garantias) e não devem ser considerados como uma aprovação dos seus pontos de vista pela Gate, nem como aconselhamento financeiro ou profissional. Consulte a Declaração de exoneração de responsabilidade para obter mais informações.
  • Recompensa
  • 3
  • Partilhar
Comentar
0/400
Rugpull幸存者vip
· 12h atrás
Esta onda é mais uma nova lista de permissões lavar os olhos, certo?
Ver originalResponder0
RektHuntervip
· 12h atrás
Novato em rust, obrigatória leitura! Confiável~
Ver originalResponder0
MetaLord420vip
· 12h atrás
Oi, a lista de permissões também pode ser hackeada, certo~
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)