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
.
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.
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:
Estado
con tres valores: Inactivo
, Activo
y Pausado
.
Estado
llamada estadoActual
para rastrear el estado actual del contrato.
Estado public estado;
constructor() {
estado = Estado.Inactivo; // Valor inicial
}
estado = Estado.Activo;
if (estado == Estado.Activo) {
// Hacer algo
}
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:
Completado
o Cancelado
.
resetear
permite reiniciar el estado a Pendiente
.
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:
Rol
para definir roles de usuario.
roles
asocia una dirección con un rol específico.
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:
avanzarFase
utiliza la conversión de la enumeración a entero para cambiar al siguiente valor.
1. Claridad y legibilidad:
2. Restricción de valores:
3. Optimización del almacenamiento:
1. Enumeraciones limitadas:
2. Conversión explícita:
3. Uso de enteros:
1. Nombres descriptivos:
2. Validaciones:
require
.
3. Usar enumeraciones en lugar de enteros mágicos:
Para más información sobre enumeraciones, consulta la documentación oficial de Solidity.
Jorge García
Fullstack developer