SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
18.11.2024

Lição: 066: Contratos Ownable

Nesta aula, iremos explorar o conceito de contratos Ownable em Solidity. Um contrato Ownable é um padrão de design comum usado em contratos inteligentes Ethereum para gerenciar a propriedade e o controle de acesso. Ele garante que apenas o proprietário do contrato tenha a capacidade de executar certas funções, tornando-se uma característica chave em muitas aplicações descentralizadas.

Compreendendo o Padrão Ownable

O padrão Ownable é geralmente implementado utilizando uma estrutura simples onde um endereço específico (o proprietário) possui privilégios especiais para realizar operações críticas dentro do contrato. Esse proprietário pode transferir a propriedade, o que é particularmente útil em casos onde o controle do contrato precisa mudar.

Estrutura Básica de um Contrato Ownable

Aqui está uma implementação básica de um contrato Ownable:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Ownable {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() {
        _owner = msg.sender;  // O endereço que gera o contrato se torna o proprietário
    }

    modifier onlyOwner() {
        require(msg.sender == _owner, "O chamador não é o proprietário");
        _;
    }

    function owner() public view returns (address) {
        return _owner;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "Novo proprietário é o endereço nulo");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

Explicação do Código

  1. Variáveis de Estado:

    • _owner: Armazena o endereço do proprietário atual do contrato.
  2. Eventos:

    • OwnershipTransferred: Um evento que registra a transferência de propriedade.
  3. Construtor:

    • O construtor define o responsável pela implantação do contrato como o proprietário inicial.
  4. Modificadores:

    • onlyOwner: Um modificador que restringe a execução de certas funções apenas ao proprietário.
  5. Funções:

    • owner(): Retorna o endereço do proprietário atual.
    • transferOwnership(address newOwner): Permite que o proprietário atual transfira a propriedade para um novo endereço.

Usando o Contrato Ownable

Agora que temos nosso contrato Ownable, vamos ver como estendê-lo para um exemplo simples que inclui uma função que apenas o proprietário pode chamar.

contract MySecureContract is Ownable {
    string private secretData;

    function setSecretData(string memory _data) public onlyOwner {
        secretData = _data;
    }

    function getSecretData() public view returns (string memory) {
        return secretData;
    }
}

Explicação do MySecureContract

  1. Este contrato herda do contrato Ownable, o que significa que possui todas as funcionalidades do padrão Ownable.
  2. A função setSecretData só pode ser chamada pelo proprietário. Isso é garantido pelo modificador onlyOwner.
  3. A função getSecretData permite que qualquer um leia os dados secretos, demonstrando como um contrato Ownable pode restringir o acesso a funções sensíveis.

Testando o Contrato

Implante o MySecureContract e siga os passos a seguir:

  1. Chame a função setSecretData. Apenas o proprietário deve ser capaz de definir os dados secretos.
  2. Tente chamar setSecretData de uma conta que não seja o proprietário. Deve ocorrer um erro com a mensagem "O chamador não é o proprietário."
  3. Chame getSecretData de qualquer conta para garantir que todos possam ler os dados armazenados.

Conclusão

Nesta aula, aprendemos como criar um contrato Ownable em Solidity, gerenciar a propriedade e restringir o acesso a funções críticas. Esse padrão de design é fundamental para muitos projetos em Ethereum, garantindo segurança e controle sobre operações importantes. Compreender a propriedade e o controle de acesso é crucial para qualquer desenvolvedor de contratos inteligentes, e o padrão Ownable é uma das maneiras mais simples e eficazes de implementar esses conceitos.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!