SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
14.11.2024

Lição: 020: Especificadores de Visibilidade de Funções em Solidity

Em Solidity, os especificadores de visibilidade de funções determinam como as funções podem ser acessadas. Compreender esses especificadores é crucial para escrever contratos inteligentes seguros e eficientes. Nesta aula, vamos explorar os quatro principais especificadores de visibilidade: public, external, internal e private. Também forneceremos exemplos para ilustrar seu uso.

1. Public

Uma função public pode ser chamada tanto internamente (dentro do mesmo contrato ou contratos derivados) quanto externamente (por meio de transações). Por padrão, as variáveis de estado marcadas como public terão uma função getter gerada automaticamente.

Exemplo de uma Função Pública

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

contract ExemploPublico {
    uint256 public valor;

    constructor(uint256 _valor) {
        valor = _valor;
    }

    // Função pública que pode ser chamada externamente e internamente
    function setValor(uint256 _valor) public {
        valor = _valor;
    }

    // Função interna chamando a função pública
    function dobrarValor() public {
        setValor(valor * 2);
    }
}

Neste exemplo, a função setValor pode ser chamada de fora do contrato, bem como de dentro do próprio contrato.

2. External

Uma função external só pode ser chamada de fora do contrato ou de outro contrato. Ela não pode ser chamada internamente. Funções externas podem ser mais eficientes em termos de gás quando lidam com grandes quantidades de dados.

Exemplo de uma Função Externa

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

contract ExemploExterno {
    uint256 public valor;

    constructor(uint256 _valor) {
        valor = _valor;
    }

    // Função externa
    function setValor(uint256 _valor) external {
        valor = _valor;
    }

    // Isso não funcionará, pois funções externas não podem ser chamadas internamente
    /*
    function chamarSetValor() public {
        setValor(10); // Esta linha causará um erro de compilação
    }
    */
}

Neste caso, a função setValor só pode ser chamada por transações ou outros contratos. Tentar chamá-la internamente resultará em um erro de compilação.

3. Internal

Uma função internal só pode ser chamada pelo próprio contrato e por contratos derivados. Isso é útil para restringir o acesso a uma função, mas permitindo que ainda seja usada internamente.

Exemplo de uma Função Interna

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

contract ExemploInterno {
    uint256 public valor;

    constructor(uint256 _valor) {
        valor = _valor;
    }

    // Função interna
    function incrementar() internal {
        valor += 1;
    }

    // Função pública acessando a função interna
    function incrementarValor() public {
        incrementar();
    }
}

Aqui, a função incrementar é marcada como interna e só pode ser invocada por funções dentro do contrato ou por contratos derivados.

4. Private

Uma função private é o especificador de visibilidade mais restritivo. Ela só pode ser chamada de dentro do contrato onde está definida e não por contratos derivados. Isso é útil para métodos que não devem ser expostos além de seu próprio contrato.

Exemplo de uma Função Privada

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

contract ExemploPrivado {
    uint256 public valor;

    constructor(uint256 _valor) {
        valor = _valor;
    }

    // Função privada
    function decrementar() private {
        valor -= 1;
    }

    // Função pública acessando a função privada
    function decrementarValor() public {
        decrementar();
    }
}

Neste exemplo, a função decrementar é privada e só pode ser chamada dentro do contrato ExemploPrivado. Contratos derivados não podem acessá-la.

Conclusão

Compreender os especificadores de visibilidade de funções em Solidity é essencial para controlar o acesso às funções e dados do seu contrato. Aqui está um rápido resumo:

  • Public: Acessível de qualquer lugar (internamente e externamente).
  • External: Acessível apenas de fora do contrato; não pode ser chamada internamente.
  • Internal: Acessível apenas pelo próprio contrato e contratos derivados.
  • Private: Acessível apenas pelo próprio contrato, não por contratos derivados.

Ao escolher o especificador de visibilidade apropriado, você pode aumentar a segurança e a manutenibilidade dos seus contratos inteligentes.

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

Thank you for voting!