Volver a la página principal
lunes 9 diciembre 2024
27

Cómo usar estructuras (structs) en Solidity para definir tipos de datos personalizados

Un struct es una colección de variables de diferentes tipos agrupadas bajo un único nombre. Es útil para modelar entidades complejas como usuarios, productos, registros, entre otros, proporcionando claridad y reutilización del código.

Características principales:

  • Personalización: Permiten definir tipos de datos que reflejen entidades del mundo real.
  • Flexibilidad: Se pueden utilizar dentro de mappings, arrays y funciones.
  • Limitaciones: No se pueden anidar directamente dentro de otras estructuras en Solidity (aunque se pueden referenciar).

Sintaxis básica de un struct

Declaración de un struct

struct NombreEstructura {
    tipo nombreCampo1;
    tipo nombreCampo2;
    ...
}

Uso de un struct

pragma solidity ^0.8.0;

contract EjemploStruct {
    // Definición de un struct
    struct Usuario {
        uint id;
        string nombre;
        uint edad;
    }

    // Variable de tipo Usuario
    Usuario public usuario;
    
    // Asignación de valores al struct
    function setUsuario(uint _id, string memory _nombre, uint _edad) public {
        usuario = Usuario(_id, _nombre, _edad);
    }
}

Ejemplos prácticos de structs

1. Gestión de usuarios

contract GestionUsuarios {
    struct Usuario {
        uint id;
        string nombre;
        address wallet;
    }

    mapping(uint => Usuario) public usuarios;
    uint public totalUsuarios;

    // Crear un nuevo usuario
    function agregarUsuario(string memory _nombre) public {
        totalUsuarios++;
        usuarios[totalUsuarios] = Usuario(totalUsuarios, _nombre, msg.sender);
    }

    // Consultar un usuario
    function consultarUsuario(uint _id) public view returns (Usuario memory) {
        return usuarios[_id];
    }
}

2. Registro de productos en un marketplace

contract Marketplace {
    struct Producto {
        uint id;
        string nombre;
        uint precio;
        address propietario;
    }

    mapping(uint => Producto) public productos;
    uint public totalProductos;

    // Registrar un producto
    function registrarProducto(string memory _nombre, uint _precio) public {
        totalProductos++;
        productos[totalProductos] = Producto(totalProductos, _nombre, _precio, msg.sender);
    }

    // Consultar un producto
    function consultarProducto(uint _id) public view returns (Producto memory) {
        return productos[_id];
    }
}

3. Gestión de votos en un sistema de gobernanza

contract SistemaVotacion {
    struct Voto {
        address votante;
        bool opcion;
        uint tiempo;
    }

    Voto[] public votos;

    // Registrar un voto
    function votar(bool _opcion) public {
        votos.push(Voto(msg.sender, _opcion, block.timestamp));
    }

    // Consultar el total de votos
    function totalVotos() public view returns (uint) {
        return votos.length;
    }
}

Combinación de structs con arrays y mappings

Uso con arrays

Los structs se pueden almacenar en arrays para mantener una colección ordenada.

Usuario[] public listaUsuarios;

function agregarUsuario(uint _id, string memory _nombre, uint _edad) public {
    listaUsuarios.push(Usuario(_id, _nombre, _edad));
}

Uso con mappings

Los structs se utilizan comúnmente en mappings para asignar entidades a claves específicas.

mapping(address => Usuario) public usuarios;

function registrarUsuario(string memory _nombre, uint _edad) public {
    usuarios[msg.sender] = Usuario(block.timestamp, _nombre, _edad);
}

Ventajas de usar structs

1. Organización: Facilitan la agrupación de datos relacionados.

2. Legibilidad: Hacen que el código sea más claro y fácil de entender.

3. Reutilización: Se pueden usar en múltiples partes del contrato y en funciones.

Consideraciones importantes

  • Los structs no pueden incluir referencias circulares (por ejemplo, un struct que contenga una instancia de sí mismo).
  • Para evitar altos costos de gas, evita structs excesivamente grandes o con demasiados campos.
  • Usa structs en lugar de variables independientes para agrupar datos relacionados, lo que mejora la escalabilidad y mantenibilidad.

Referencias oficiales

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

Etiquetas:
solidity
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer