---
title: "O que é visibilidade de função em Solidity?"
description: "Aprenda as Diferenças Entre Visibilidade de Função Public, External, Internal e Private"
---

# O que é visibilidade de função em Solidity?

Na programação de smart contracts em [Solidity](https://www.alchemy.com/overviews/solidity), existe um mecanismo que permite aos desenvolvedores decidir quem, ou quais outros smart contracts, podem chamar suas funções, com base em restrições especificadas. A capacidade de definir como as[ funções de smart contracts](https://www.alchemy.com/overviews/solidity-functions) podem ser acessadas é conhecida como **visibilidade de função**.

## **O que é visibilidade de função?**

O recurso de visibilidade de função em smart contracts Solidity é usado para garantir que, ao especificar funções, seu nível de acessibilidade, incluindo public, external, internal e private, seja mantido conforme pretendido pelos desenvolvedores.

Se um desenvolvedor não usar o tipo correto de visibilidade de função, ou se nenhum modelo de visibilidade for especificado no código, a visibilidade pública padrão do contrato fica exposta a vulnerabilidades de segurança potencialmente exploráveis. Além das implicações de segurança de não ter a visibilidade de função especificada, os smart contracts podem não funcionar como pretendido, já que as funções operarão sem as instruções adequadas.

### **Quem pode chamar uma função de smart contract?**

**Existem três tipos de contratos que podem chamar uma função: o próprio contrato principal, um contrato herdado do contrato principal \(DerivedContract\) e um contrato de terceiros \(OutsideContract\).**

[**‍**Chamar um smart contract](https://www.alchemy.com/overviews/solidity-call) significa acessar o código interno presente em um smart contract e os dados nele incluídos. Essa é uma forma de recuperar dados do contrato.

#### **1. O contrato principal \(MainContract\)**

Esta é a sintaxe do MainContract chamando sua própria função:

#### **2. Um contrato herdado do contrato principal \(DerivedContract\)**

Esta é a sintaxe de um DerivedContract usando uma função derivada do MainContract:

#### **3. Um contrato de terceiros \(OutsideContract\)**

Esta é a sintaxe de um OutsideContract chamando o contrato principal a partir de uma função externa.

## **Como os modificadores de visibilidade de função e a herança funcionam juntos?**

**Herança é quando o conteúdo de um contrato é copiado para outro contrato \(um "contrato derivado"\) usando a palavra-chave "is", e a visibilidade do modificador de função funciona com um contrato filho derivado de acordo com o tipo de visibilidade atribuído a um contrato.**

A relação entre modificadores de visibilidade de função e herança é explicada abaixo:

- Se o modificador da função do _ParentContract_ for **public**, um _ChildContract_ pode acessá-la.
- Se o modificador da função do _ParentContract_ for **internal**, o _ChildContract_ pode acessá-la.
- Se o modificador da função do _ParentContract_ for **private**, o _ChildContract_ que herda não pode acessá-la.
- Se o modificador da função do _ParentContract_ for **external**, o _ChildContract_ que herda não pode acessá-la.

## **Como os modificadores de visibilidade de função podem ajudar na otimização de gas?**

Como os parâmetros do modificador de visibilidade external não são salvos na memória, mas lidos diretamente do calldata, [**os smart contracts consomem menos gas**](https://www.alchemy.com/overviews/solidity-gas-optimization). Em contraste, as funções public usam parâmetros de entrada salvos na memória, o que custa mais gas para implantar um smart contract.

## **O que são modificadores de visibilidade de função?**

Existem quatro tipos diferentes de modificadores de visibilidade de função, do mais acessível ao menos acessível: public, external, internal e private. Os desenvolvedores devem [modificar as funções](https://www.alchemy.com/overviews/solidity-modifier) com a visibilidade correta com base em quem eles querem que consiga ver e chamar a função.

### **1. Public**

**Uma função public pode ser acessada por qualquer um dos três tipos de contratos que fazem a chamada: contrato principal, contrato derivado e contrato de terceiros. Uma função é public por padrão.**

Como mostrado no exemplo de código acima, qualquer contrato na base de código pode acessar a função "`functionPublic`" por causa da visibilidade "public".

### **2. External**

**Uma função external é uma função que só pode ser chamada por terceiros.** Com a visibilidade external, o contrato que pode chamar a função precisa ser independente do contrato principal e não pode ser um contrato derivado.

Acima está um contrato aleatório \(`RandomContract`\) que está executando alguma tarefa. O trecho de código abaixo é um contrato externo chamando a função external no `RandomContract`.

### **3. Internal**

**Uma função internal pode ser chamada pelo contrato principal e por qualquer um de seus contratos derivados.** As funções internal são acessíveis a partir do contrato principal no qual foram inicialmente declaradas e pelos contratos que se estendem desse contrato principal por meio de herança.

### **4. Private**

**Uma função private só pode ser chamada pelo contrato principal no qual foi especificada.** As funções private são usadas inicialmente conforme a prática comum, mas se o escopo for mais amplo que esse tipo de modificador, qualquer outro modificador plausível deve ser usado.

### **Qual é a visibilidade de função padrão no Solidity?**

Se o modificador de visibilidade de uma função não for declarado explicitamente no código, a função é definida como public por padrão. Deixar a visibilidade de função em branco e depender do compilador Solidity para usar a visibilidade padrão não é uma boa prática recomendada; definir intencionalmente a visibilidade de função torna o código mais legível e mais fácil de entender durante revisões de código.

## **Qual é a diferença entre modificadores de visibilidade de função e de variável de estado?**

**A diferença entre modificadores de visibilidade de função e modificadores de visibilidade de variável de estado é que as variáveis de estado não têm a opção de modificador de visibilidade external.**

Variáveis de estado são variáveis cujos valores são armazenados permanentemente no storage do contrato, que mantém os dados de forma persistente entre chamadas de função. Assim como os modificadores de visibilidade de função, as variáveis de estado também têm modificadores de visibilidade, que são Public, Private e Internal.

### **Modificadores de visibilidade de variável de estado**

As variáveis de estado são declaradas na seção do contrato do programa. O tipo de dado da variável é especificado e, em seguida, o modificador de visibilidade é atribuído à variável.

#### **1. Public**

Uma variável de estado com o modificador _public_ pode ser acessada por qualquer contrato na aplicação. Se uma variável for declarada como _public_, os dados armazenados nela podem ser lidos pelo contrato principal, por um contrato derivado ou por um contrato externo.

#### **2. Internal**

Variáveis de estado declaradas com o modificador _internal_ só podem ser acessadas dentro do contrato no qual foram definidas e por um contrato derivado. Um terceiro ou outro contrato externo não pode acessar o storage dos dados definidos como uma variável _internal_.

#### **3. Private**

Se uma variável de estado for _private_, apenas o contrato principal no qual foi declarada pode chamá-la. O modificador de visibilidade _private_ restringe o acesso de outras partes além do contrato principal, de modo que os dados que ela contém fiquem protegidos.

### **Qual é a visibilidade de variável padrão no Solidity?**

Quando a visibilidade da variável não é definida, o valor padrão é internal. É uma boa prática declarar uma variável como private até que o escopo seja ampliado.

## **Continue aprendendo sobre Solidity**

Este artigo apresenta a visibilidade de função em Solidity e traz explicações e recursos para você usar no seu próximo projeto.

Se você é novo na linguagem Solidity e está ansioso para construir seu primeiro smart contract, garanta sua vaga no [curso gratuito de programação em Solidity](https://alchemy.com/university/courses/solidity?a=d7f2788ae5) da Alchemy University.
