Caminho da segurança dos contratos inteligentes Rust: Detalhes sobre controle de permissões e visibilidade de funções

robot
Geração do resumo em andamento

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

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

  1. Visibilidade de acesso/chamada de métodos de contratos
  2. Controlo de acesso das funções privilegiadas/divisão de responsabilidades

1. Visibilidade da função do contrato

A configuração de visibilidade das funções de contratos é crucial para proteger partes críticas contra acessos ou manipulações acidentais. Tomando como exemplo o incidente de segurança da Bancor Network em junho de 2020, o fato de ter definido erroneamente a função de transferência crítica como public expôs os ativos dos usuários a riscos.

Em contratos inteligentes Rust, a visibilidade das funções é principalmente das seguintes formas:

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

Outra forma de definir o método internal é definir um bloco de código impl Contract independente, sem usar o modificador #[near_bindgen].

Para a função de retorno de chamada, deve ser definida como pública, mas ao mesmo tempo garantir que só pode ser chamada pelo próprio contrato. Pode-se usar o macro #[private] para implementar essa funcionalidade.

Deve-se notar que, por padrão, tudo em Rust é privado, exceto os itens em pub Trait e pub Enum.

2. Controle de acesso das funções privilegiadas

Além da visibilidade das funções, é necessário estabelecer um mecanismo completo de lista de permissões de acesso a partir da perspectiva semântica. Semelhante à função "onlyOwner" no Solidity, certas funções-chave só podem ser chamadas pelo proprietário do contrato.

Em contratos Rust, é possível implementar um Trait personalizado semelhante:

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

Dessa forma, é possível implementar o controle de acesso a funções privilegiadas, garantindo que apenas o proprietário do contrato possa chamá-las. Com base nesse princípio, também é possível configurar listas brancas mais complexas com múltiplos usuários ou várias listas brancas, permitindo um controle de acesso em grupos mais detalhado.

3. Outros métodos de controlo de acesso

Há também alguns outros métodos de controle de acesso, como:

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

Esses conteúdos serão introduzidos no diário de desenvolvimento de contratos inteligentes.

PUBLIC-2.68%
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
  • 5
  • Repostar
  • Compartilhar
Comentário
0/400
TheMemefathervip
· 08-18 14:36
Ah, este evento da Bancor é tão absurdo.
Ver originalResponder0
PancakeFlippavip
· 08-18 11:42
Jogou Bancor? Rekt...
Ver originalResponder0
ReverseFOMOguyvip
· 08-16 02:20
o bug do bancor realmente não aguenta mais
Ver originalResponder0
BoredApeResistancevip
· 08-16 02:05
Ah, isso não é o bug que o Bancor teve problemas no passado?
Ver originalResponder0
rekt_but_not_brokevip
· 08-16 02:01
O caso de ataque é bastante novo, me fez suar frio.
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)