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.