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