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:
A visibilidade do acesso/chamada dos métodos do contrato
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:
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
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.
14 Curtidas
Recompensa
14
6
Compartilhar
Comentário
0/400
CryptoTarotReader
· 07-16 04:56
Consegue prendê-lo?
Ver originalResponder0
FloorSweeper
· 07-15 01:10
Não pode ser, temos que aprender tanto assim?
Ver originalResponder0
WhaleWatcher
· 07-13 07:29
Primeiro, vamos falar sobre Ownable.
Ver originalResponder0
GateUser-e51e87c7
· 07-13 07:23
Ter mãos é suficiente, tão simples assim.
Ver originalResponder0
DecentralizeMe
· 07-13 07:22
Uuuh lógica de base
Ver originalResponder0
ChainSpy
· 07-13 07:21
O controle de acesso é tão complexo que é melhor ser totalmente público.
Controle de acesso de contratos inteligentes Rust: visibilidade de função e gerenciamento de acesso privilegiado
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. 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]:
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.