En Solidity, los modificadores de acceso (public, private, internal, external) controlan la visibilidad de funciones y variables. Estos modificadores definen desde dónde se pueden acceder y utilizar los elementos del contrato, lo que permite implementar principios de encapsulación y seguridad.
| Modificador | Accesible desde el contrato actual | Accesible desde contratos derivados | Accesible desde fuera del contrato |
|---|---|---|---|
public
|
Sí | Sí | Sí |
private
|
Sí | No | No |
internal
|
Sí | Sí | No |
external
|
No | No | Sí |
public
public son accesibles desde:
pragma solidity ^0.8.0;
contract EjemploPublic {
uint public numero; // Variable pública, Solidity genera automáticamente un getter
// Función pública
function establecerNumero(uint _numero) public {
numero = _numero;
}
}
En este ejemplo:
numero puede ser leída directamente fuera del contrato gracias al getter generado automáticamente.
establecerNumero es accesible desde cualquier lugar.
private
private solo son accesibles dentro del contrato donde se declaran.
contract EjemploPrivate {
uint private datoPrivado;
function establecerDato(uint _dato) public {
datoPrivado = _dato;
}
function obtenerDato() public view returns (uint) {
return datoPrivado; // Acceso permitido dentro del contrato
}
}
En este caso:
datoPrivado no puede ser accedido directamente desde fuera del contrato.
internal
internal son accesibles dentro del contrato y en contratos derivados.
contract Base {
uint internal valorInterno = 42;
function obtenerValor() public view returns (uint) {
return valorInterno;
}
}
contract Derivado is Base {
function incrementarValor() public {
valorInterno += 1; // Acceso permitido porque es `internal`
}
}
En este ejemplo:
valorInterno es accesible desde el contrato base y el contrato derivado.
external
external solo pueden ser llamadas desde fuera del contrato.
this.
contract EjemploExternal {
function funcionExterna() external pure returns (string memory) {
return "Esta es una función externa";
}
function llamarExterna() public view returns (string memory) {
return this.funcionExterna(); // Llamada a la función externa desde dentro
}
}
En este caso:
funcionExterna no puede ser llamada directamente dentro del contrato sin usar this.
contract Visibilidad {
uint public publica = 1;
uint private privada = 2;
uint internal interna = 3;
function publicaFuncion() public view returns (uint) {
return publica;
}
function privadaFuncion() private view returns (uint) {
return privada;
}
function internaFuncion() internal view returns (uint) {
return interna;
}
function usarPrivada() public view returns (uint) {
return privadaFuncion(); // Llamada permitida dentro del contrato
}
}
contract Heredado is Visibilidad {
function usarInterna() public view returns (uint) {
return internaFuncion(); // Acceso permitido a `internal`
}
}
1. Seguridad: Utiliza private o internal para proteger datos y lógica sensibles.
2. Encapsulación: Usa funciones públicas como interfaces para interactuar con datos privados.
3. Optimización de gas: Las llamadas internas a funciones públicas consumen más gas que las funciones internal.
1. Usa public para funciones que serán llamadas externamente de manera frecuente.
2. Usa private para variables o funciones que no deben ser accesibles fuera del contrato.
3. Usa internal cuando desees compartir lógica con contratos derivados.
4. Usa external para funciones que solo serán invocadas desde fuera del contrato, optimizando gas.
Para más detalles sobre modificadores de acceso, consulta la documentación oficial de Solidity.
Jorge García
Fullstack developer