---
title: "¿Qué es la visibilidad de funciones en Solidity?"
description: "Aprende las diferencias entre la visibilidad de funciones Public, External, Internal y Private"
---

# ¿Qué es la visibilidad de funciones en Solidity?

En la programación de contratos inteligentes con [Solidity](https://www.alchemy.com/overviews/solidity), existe una disposición que permite a los desarrolladores decidir quién o qué otros contratos inteligentes pueden llamar a sus funciones según restricciones específicas. La capacidad de definir cómo se puede interactuar con las [funciones de un smart contract](https://www.alchemy.com/overviews/solidity-functions) se conoce como **visibilidad de función**.

## **¿Qué es la visibilidad de función?**

La función de visibilidad en los contratos inteligentes de Solidity se usa para garantizar que, al especificar las funciones, su nivel de accesibilidad —público, externo, interno y privado— se mantenga tal como los desarrolladores lo pretendían.

Si un desarrollador no usa el tipo de visibilidad de función correcto, o si no se especifica ningún modelo de visibilidad en su código, la visibilidad pública por defecto del contrato queda expuesta a posibles vulnerabilidades de seguridad explotables. Además de las implicancias de seguridad de no tener la visibilidad de función especificada, los contratos inteligentes podrían no funcionar como se pretende, ya que las funciones estarían operando sin las instrucciones adecuadas.

### **¿Quién puede llamar a una función de un smart contract?**

**Hay tres tipos de contratos que pueden llamar a una función: el contrato principal en sí, un contrato heredado del contrato principal (DerivedContract), y un contrato de terceros (OutsideContract).**

[**‍**Llamar a un smart contract](https://www.alchemy.com/overviews/solidity-call) significa acceder al código interno que contiene un contrato inteligente y a los datos incluidos en él. Esta es una forma de obtener datos del contrato.

#### **1. El contrato principal (MainContract)**

Esta es la sintaxis del MainContract llamando a su función:

#### **2. Un contrato heredado del contrato principal (DerivedContract)**

Esta es la sintaxis de un DerivedContract que usa una función derivada del MainContract:

#### **3. Un contrato de terceros (OutsideContract)**

Esta es la sintaxis de un OutsideContract que llama al contrato principal desde una función externa.

## **¿Cómo funcionan juntos los modificadores de visibilidad de función y la herencia?**

**La herencia ocurre cuando el contenido de un contrato se copia a otro contrato (un "contrato derivado") mediante la palabra clave "is", y la visibilidad del modificador de función funciona con un contrato hijo derivado según el tipo de visibilidad asignado a un contrato.**

La relación entre los modificadores de visibilidad de función y la herencia se explica a continuación:

- Si el modificador de la función del _ParentContract_ es **public**, un _ChildContract_ puede acceder a ella.
- Si el modificador de la función del _ParentContract_ es **internal**, el _ChildContract_ puede acceder a ella.
- Si el modificador de la función del _ParentContract_ es **private**, el _ChildContract_ que hereda no puede acceder a ella.
- Si el modificador de la función del _ParentContract_ es **external**, el _ChildContract_ que hereda no puede acceder a ella.

## **¿Cómo pueden los modificadores de visibilidad de función ayudar a optimizar el gas?**

Debido a que los parámetros del modificador de visibilidad de función external no se guardan en memoria, sino que se leen directamente desde calldata, [**los smart contracts consumen menos gas**](https://www.alchemy.com/overviews/solidity-gas-optimization). En cambio, las funciones public usan parámetros de entrada que se guardan en memoria, lo que cuesta más gas al desplegar un smart contract.

## **¿Qué son los modificadores de visibilidad de función?**

Hay cuatro tipos diferentes de modificadores de visibilidad de función, que van de más accesible a menos accesible: public, external, internal y private. Los desarrolladores deberían [modificar las funciones](https://www.alchemy.com/overviews/solidity-modifier) con la visibilidad correcta según quién quieran que pueda ver y llamar a la función.

### **1. Public**

**Una función public puede ser accedida por cualquiera de los tres tipos de contratos que llaman: el contrato principal, un contrato derivado y un contrato de terceros. Una función es public por defecto.**

Como se muestra en el ejemplo de código anterior, cualquier contrato en la base de código puede acceder a la función "`functionPublic`" debido a la visibilidad "public".

### **2. External**

**Una función external es una función que solo puede ser llamada por un tercero.** Con la visibilidad de función external, el contrato que puede llamar a la función debe ser independiente del contrato principal y no puede ser un contrato derivado.

Arriba hay un contrato aleatorio (`RandomContract`) que realiza alguna tarea. El siguiente fragmento de código es un contrato externo que llama a la función external en el `RandomContract`.

### **3. Internal**

**Una función internal puede ser llamada por el contrato principal y por cualquiera de sus contratos derivados.** Las funciones internal son accesibles desde el contrato principal en el que fueron declaradas inicialmente y por los contratos que extienden este contrato principal mediante herencia.

### **4. Private**

**Una función private solo puede ser llamada por el contrato principal en el que fue especificada.** Las funciones private se usan inicialmente según la práctica común, pero si el alcance es más amplio que este tipo de modificador, debería usarse cualquier otro modificador plausible.

### **¿Cuál es la visibilidad de función por defecto en Solidity?**

Si el modificador de visibilidad de una función no se declara explícitamente en el código, la función se establece con visibilidad public por defecto. Dejar la visibilidad de función en blanco y depender de que el compilador de Solidity use la visibilidad por defecto no es una práctica recomendada; establecer intencionalmente la visibilidad de función hace que el código sea más legible y fácil de entender durante las revisiones de código.

## **¿Cuál es la diferencia entre los modificadores de visibilidad de función y los de variable de estado?**

**La diferencia entre los modificadores de visibilidad de función y los modificadores de visibilidad de variable de estado es que las variables de estado no tienen la opción de modificador de visibilidad external.**

Las variables de estado son variables cuyos valores se almacenan de forma permanente en el storage del contrato, el cual conserva los datos de manera persistente entre llamadas a funciones. Al igual que los modificadores de visibilidad de función, las variables de estado también tienen modificadores de visibilidad, que son Public, Private e Internal.

### **Modificadores de visibilidad de variable de estado**

Las variables de estado se declaran en la sección de contrato del programa. Se especifica el tipo de dato de la variable y, después de eso, se asigna el modificador de visibilidad a la variable.

#### **1. Public**

Una variable de estado con el modificador _public_ puede ser accedida por cualquier contrato en la aplicación. Si una variable se declara como _public_, los datos almacenados en ella pueden ser leídos por el contrato principal, un contrato derivado o un contrato externo.

#### **2. Internal**

Las variables de estado declaradas con el modificador _internal_ solo pueden ser accedidas dentro del contrato en el que fueron definidas y por un contrato derivado. Un tercero u otro contrato externo no puede acceder al storage de los datos definidos como una variable _internal_.

#### **3. Private**

Si una variable de estado es _private_, solo el contrato principal en el que fue declarada puede llamarla. El modificador de visibilidad _private_ restringe el acceso a otras partes fuera del contrato principal, de modo que los datos que contiene queden protegidos.

### **¿Cuál es la visibilidad de variable por defecto en Solidity?**

Cuando no se define la visibilidad de la variable, el valor por defecto es internal. Es una buena práctica declarar una variable como private hasta que el alcance se amplíe.

## **Sigue aprendiendo sobre Solidity**

Este artículo te introduce a la visibilidad de función en Solidity y te ofrece explicaciones y recursos para usar en tu próximo proyecto.

Si eres nuevo en el lenguaje Solidity y estás por comenzar a construir tu primer smart contract, asegura tu lugar en el [curso gratuito de programación en Solidity en línea](https://alchemy.com/university/courses/solidity?a=d7f2788ae5) de Alchemy University.
