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

Cómo usar enumeraciones (enum) en Solidity para declarar tipos de datos predefinidos

Una enumeración es una lista de valores constantes que están relacionados conceptualmente. En Solidity, cada valor de una enumeración se asigna automáticamente a un entero subyacente, comenzando desde 0.

Características principales:

1. Legibilidad: Ayudan a mejorar la legibilidad del contrato, ya que reemplazan números mágicos con nombres descriptivos.

2. Eficiencia: Internamente, los valores se almacenan como enteros, lo que las hace ligeras en términos de almacenamiento.

3. Restricción de valores: Solo se pueden usar los valores definidos en la enumeración.

Declaración básica de una enumeración

Ejemplo simple

pragma solidity ^0.8.0;

contract EjemploEnum {
    enum Estado { Inactivo, Activo, Pausado }

    Estado public estadoActual;

    // Establece el estado inicial en el constructor
    constructor() {
        estadoActual = Estado.Inactivo;
    }

    // Cambiar el estado
    function activar() public {
        estadoActual = Estado.Activo;
    }

    function pausar() public {
        estadoActual = Estado.Pausado;
    }

    // Consultar si el contrato está activo
    function esActivo() public view returns (bool) {
        return estadoActual == Estado.Activo;
    }
}

En este ejemplo:

  • Se define una enumeración Estado con tres valores: Inactivo, Activo y Pausado.
  • Se utiliza una variable de tipo Estado llamada estadoActual para rastrear el estado actual del contrato.

Operaciones comunes con enumeraciones

1. Declarar una variable de tipo enum

Estado public estado;

2. Asignar un valor inicial

constructor() {
    estado = Estado.Inactivo; // Valor inicial
}

3. Cambiar el valor de una enumeración

estado = Estado.Activo;

4. Comparar valores

if (estado == Estado.Activo) {
    // Hacer algo
}

Ejemplos prácticos de uso

1. Gestión de estados en un contrato

contract EstadosContrato {
    enum Estado { Pendiente, Completado, Cancelado }

    Estado public estadoActual;

    function completar() public {
        require(estadoActual == Estado.Pendiente, "No se puede completar");
        estadoActual = Estado.Completado;
    }

    function cancelar() public {
        require(estadoActual == Estado.Pendiente, "No se puede cancelar");
        estadoActual = Estado.Cancelado;
    }

    function resetear() public {
        estadoActual = Estado.Pendiente;
    }
}

En este contrato:

  • Se asegura que solo los estados válidos puedan cambiar a Completado o Cancelado.
  • La función resetear permite reiniciar el estado a Pendiente.

2. Roles de usuario

contract Roles {
    enum Rol { Admin, Usuario, Invitado }

    mapping(address => Rol) public roles;

    function asignarRol(address _usuario, Rol _rol) public {
        roles[_usuario] = _rol;
    }

    function esAdmin(address _usuario) public view returns (bool) {
        return roles[_usuario] == Rol.Admin;
    }
}

En este caso:

  • Se usa la enumeración Rol para definir roles de usuario.
  • El mapeo roles asocia una dirección con un rol específico.

3. Seguimiento de fases en un proyecto

contract FasesProyecto {
    enum Fase { Inicio, Desarrollo, Finalizado }

    Fase public faseActual;

    function avanzarFase() public {
        require(faseActual != Fase.Finalizado, "El proyecto ya está finalizado");
        faseActual = Fase(uint(faseActual) + 1); // Cambiar a la siguiente fase
    }
}

En este ejemplo:

  • La función avanzarFase utiliza la conversión de la enumeración a entero para cambiar al siguiente valor.

Ventajas de las enumeraciones

1. Claridad y legibilidad:

  • Reemplazan valores numéricos arbitrarios con nombres descriptivos, lo que hace el contrato más fácil de entender.

2. Restricción de valores:

  • Garantizan que solo los valores definidos en la enumeración sean válidos.

3. Optimización del almacenamiento:

  • Internamente, las enumeraciones se representan como enteros, lo que minimiza el uso de espacio.

Consideraciones importantes

1. Enumeraciones limitadas:

  • No son dinámicas, por lo que los valores deben definirse en el momento de la declaración.

2. Conversión explícita:

  • Para convertir entre enumeraciones y enteros, debes hacerlo de manera explícita, lo que puede llevar a errores si no se gestiona correctamente.

3. Uso de enteros:

  • Aunque las enumeraciones se almacenan como enteros, no se deben usar directamente para operaciones aritméticas sin precaución.

Buenas prácticas

1. Nombres descriptivos:

  • Usa nombres claros y significativos para los valores de las enumeraciones.

2. Validaciones:

  • Asegúrate de validar correctamente los cambios de estado utilizando funciones de control como require.

3. Usar enumeraciones en lugar de enteros mágicos:

  • Reemplaza valores numéricos con enumeraciones para mayor claridad.

Referencias oficiales

Para más información sobre enumeraciones, consulta la documentación oficial de Solidity.

Etiquetas:
solidity
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer