Controle de acesso a contratos inteligentes em Rust: visibilidade de funções e gestão de acesso privilegiado

Rust contratos inteligentes养成日记(7)合约安全之权限控制

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

  1. Visibilidade de acesso/chamada de métodos (funções) de contratos
  2. Controle de acesso/funções de privilégio/divisão de responsabilidades

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

Ao escrever contratos inteligentes, a visibilidade das funções do contrato pode ser especificada para controlar os direitos de chamada das funções. Isso é muito importante para proteger partes críticas do contrato contra acessos ou manipulações acidentais.

Tomando a bolsa Bancor Network como exemplo, no dia 18 de junho de 2020 ocorreu um incidente de segurança devido a um erro na configuração das permissões de acesso das funções chave do contrato. O contrato foi escrito na linguagem Solidity, e a visibilidade das funções é dividida em public/external e private/internal.

Durante a correção de uma vulnerabilidade de segurança, o Bancor definiu erroneamente algumas funções de transferência críticas como públicas, permitindo que qualquer pessoa pudesse chamar essas funções externamente do contrato para realizar operações de transferência, colocando os ativos dos usuários em risco sério, no valor de 590 mil dólares.

A visibilidade das funções é igualmente importante nos contratos inteligentes em Rust. As funções de contrato decoradas com o macro #[near_bindgen] definido pelo NEAR SDK têm os seguintes atributos de visibilidade:

  • pub fn: função pública, que faz parte da interface do contrato e pode ser chamada de fora do contrato.
  • fn: Função não pública não especificada, só pode ser chamada dentro do contrato.
  • pub(crate) fn: restringir chamadas dentro do escopo do crate.

Outra maneira de definir o método como internal é defini-lo dentro de um bloco de código impl Contract que não é decorado com #[near_bindgen].

Para as funções de callback, deve ser definido como uma propriedade pública para que possam ser chamadas através de function call. Ao mesmo tempo, é necessário garantir que a função de callback possa ser chamada apenas pelo próprio contrato, o que pode ser implementado usando o macro #[private].

2. Controle de Acesso a Funções Privilegiadas(mecanismo de lista branca)

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

É possível implementar Traits personalizados para controlar o acesso a funções privilegiadas, verificando se o chamador da transação é o proprietário do contrato:

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 neste princípio, é possível definir múltiplos utilizadores ou várias listas brancas através da personalização de traits mais complexos, implementando um controle de acesso agrupado mais refinado.

3. Mais métodos de controle de acesso

Outras metodologias de controle de acesso em contratos inteligentes Rust incluem:

  • Controle do momento de chamada do contrato
  • Mecanismo de chamada de múltiplas assinaturas para funções de contratos
  • Governança(DAO) da implementação

Estes conteúdos serão detalhados na série de diários de criação de contratos inteligentes a seguir.

NEAR-1.19%
Ver original
Esta página pode conter conteúdo de terceiros, que é fornecido apenas para fins informativos (não para representações/garantias) e não deve ser considerada como um endosso de suas opiniões pela Gate nem como aconselhamento financeiro ou profissional. Consulte a Isenção de responsabilidade para obter detalhes.
  • Recompensa
  • 4
  • Compartilhar
Comentário
0/400
not_your_keysvip
· 4h atrás
Ainda não consigo entender claramente a falha do Bancor.
Ver originalResponder0
SigmaBrainvip
· 23h atrás
De fato, a lição amarga da Bancor ficou gravada.
Ver originalResponder0
NewPumpamentalsvip
· 23h atrás
Ainda a falar sobre controlo de permissões, por que não aprendem a lição do Bancor?
Ver originalResponder0
ChainWallflowervip
· 23h atrás
Já percebi bem este problema de permissões~
Ver originalResponder0
  • Marcar
Faça trade de criptomoedas em qualquer lugar e a qualquer hora
qrCode
Escaneie o código para baixar o app da Gate
Comunidade
Português (Brasil)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)