Segurança de contratos inteligentes em Rust: compreensão profunda do controle de acesso e gestão de permissões

robot
Geração do resumo em andamento

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

Este artigo apresentará o controle de permissões em contratos inteligentes Rust a partir de duas perspetivas:

  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

O controle de visibilidade das funções de contrato é crucial para proteger partes críticas contra acessos ou manipulações acidentais. Tomando como exemplo o incidente de segurança da Bancor Network em 18 de junho de 2020, o evento ocorreu devido a uma configuração incorreta dos direitos de acesso às funções críticas do contrato.

Na Rust, a visibilidade das funções em contratos inteligentes tem as seguintes categorias:

  • pub fn: indica que este método é público, faz parte da interface do contrato e pode ser chamado a partir de fora do contrato.
  • fn: Se pub não for explicitamente especificado, isso significa que a função não pode ser chamada diretamente de fora do contrato, apenas pode ser chamada internamente no contrato.
  • pub(crate) fn: Restringir o método para ser chamado dentro do escopo interno do crate.

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

Para a função de callback, deve ser definida como uma propriedade pública, mas é necessário garantir que só possa ser chamada pelo próprio contrato. Pode usar o macro #[private] para implementar isso.

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

Além da visibilidade das funções, é necessário estabelecer um mecanismo completo de lista branca de controle de acesso do ponto de vista semântico. Algumas funções privilegiadas (, como a inicialização do contrato, ativação/desativação, etc., ) só podem ser chamadas pelo proprietário do contrato.

É possível implementar um Trait personalizado para controle de acesso, verificando se o chamador é 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, pode-se configurar vários utilizadores ou várias listas brancas, para implementar um controlo de acesso em grupos mais refinado.

3. Mais métodos de controlo de acesso

Outros métodos de controle de acesso em contratos inteligentes Rust incluem:

  • Controle do momento da chamada do contrato
  • Mecanismo de chamada multi-assinatura de funções de contratos
  • Governança(DAO) da implementação

Este conteúdo será detalhado em artigos posteriores.

GET7%
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
  • 2
  • Repostar
  • Compartilhar
Comentário
0/400
PumpBeforeRugvip
· 10h atrás
A falha do Bancor naquela vez também foi por não ter configurado bem as permissões, certo?
Ver originalResponder0
OffchainOraclevip
· 10h atrás
O incidente Bancor deve ser usado como um aviso em livros didáticos.
Ver originalResponder0
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)