Volver a la página principal
martes 10 diciembre 2024
5

Uso de modificadores de acceso en Solidity para controlar la visibilidad de funciones y variables

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.

Tipos de modificadores de acceso

Modificador Accesible desde el contrato actual Accesible desde contratos derivados Accesible desde fuera del contrato
public
private No No
internal No
external No No

Descripción de los modificadores

1. public

  • Las funciones y variables declaradas como public son accesibles desde:
  • Dentro del contrato.
  • Contratos que lo hereden.
  • Llamadas externas, como una transacción o llamada desde otro contrato.

Ejemplo

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:

  • La variable numero puede ser leída directamente fuera del contrato gracias al getter generado automáticamente.
  • La función establecerNumero es accesible desde cualquier lugar.

2. private

  • Los elementos declarados como private solo son accesibles dentro del contrato donde se declaran.
  • No pueden ser heredados ni accedidos por contratos derivados.

Ejemplo

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.
  • Las funciones públicas permiten interactuar indirectamente con el dato privado.

3. internal

  • Los elementos declarados como internal son accesibles dentro del contrato y en contratos derivados.
  • Es el modificador predeterminado si no se especifica uno explícitamente.

Ejemplo

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.

4. external

  • Las funciones declaradas como external solo pueden ser llamadas desde fuera del contrato.
  • No pueden ser llamadas internamente a menos que se utilice this.

Ejemplo

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.
  • Es accesible desde otros contratos o mediante llamadas externas.

Comparación práctica

Funciones con diferentes niveles de visibilidad

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`
    }
}

Consideraciones importantes

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.

Reglas de uso común

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.

Referencias oficiales

Para más detalles sobre modificadores de acceso, consulta la documentación oficial de Solidity.

Etiquetas:
solidity
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer