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
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
10 gostos
Recompensa
10
4
Partilhar
Comentar
0/400
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.