Resumen

Almacenar datos simples en un contrato inteligente es solo el primer paso. Cuando necesitas representar información estructurada como un alumno con nombre y documento, o manejar listas de elementos cuyo tamaño puede cambiar, Solidity ofrece dos herramientas fundamentales: los structs y los arrays. Comprender cómo funcionan estas estructuras te permite diseñar contratos más flexibles y cercanos a problemas del mundo real.

¿Qué son los structs y por qué permiten agrupar distintos tipos de datos?

Los structs son tipos de dato complejos que permiten combinar diferentes tipos de información dentro de una sola estructura [0:34]. A diferencia de una variable simple que solo almacena un valor, un struct puede contener simultáneamente un string, un entero, un booleano o una dirección.

Por ejemplo, para representar a un alumno dentro de un contrato que gestiona la asistencia a un curso, se puede crear un struct llamado Alumno que incluya:

  • Nombre: almacenado como string.
  • Número de documento: almacenado como uint (entero sin signo, porque no existen documentos negativos) [4:24].
  • Opcionalmente: nota del curso, cantidad de presencias u otros atributos relevantes.

Toda esta información queda agrupada en un solo elemento reutilizable, lo que facilita la organización del código y la lectura del contrato.

¿Cómo funcionan los arrays estáticos y dinámicos en Solidity?

Los arrays o arreglos son cadenas de elementos del mismo tipo de dato [1:28]. Solidity ofrece dos variantes según las necesidades del contrato.

¿Cuándo usar un array estático?

Un array estático se declara con un tamaño fijo desde el inicio. Si sabes que el curso tendrá exactamente diez alumnos, declaras un arreglo de diez posiciones [1:42]. Cada posición almacena un elemento del mismo tipo.

¿Cuándo conviene un array dinámico?

Cuando no se conoce de antemano cuántos elementos va a contener la colección, se utiliza un arreglo dinámico [1:56]. Al declararlo, no se le asigna tamaño inicial. Los elementos se agregan o remueven durante la ejecución del contrato.

Una recomendación importante: es preferible usar arrays dinámicos siempre que sea posible, ya que una vez que un contrato se sube a la red, su lógica no puede modificarse [3:07]. Dejar flexible el tamaño del arreglo evita quedar atado a un límite que después no se pueda cambiar.

¿Cómo se combinan structs y arrays en un contrato real?

El ejemplo práctico consiste en un contrato llamado Clase que representa un curso con alumnos [2:30]. Primero se define el struct Alumno con los atributos nombre y documento. Luego se crea un array dinámico de tipo Alumno para almacenar el listado completo.

Dentro del constructor del contrato, se utiliza la función push para agregar un nuevo alumno al final del array [3:40]. La sintaxis permite pasar los datos con un formato similar a JSON, indicando la clave del atributo y su valor:

solidity struct Alumno { string nombre; uint documento; }

Alumno[] public alumnos;

constructor() { alumnos.push(Alumno({nombre: "Juan", documento: 12345})); }

Al compilar y hacer deploy en la red de prueba desde Remix [5:00], se puede verificar que la información quedó almacenada correctamente. Para consultar el valor, basta con indicar el índice del array: la posición cero devuelve al alumno Juan con documento 12345 [6:02].

¿Qué papel cumple la visibilidad public en las variables?

Para poder consultar los datos almacenados después del deploy, es necesario declarar la variable alumnos como public [4:52]. Este modificador de visibilidad genera automáticamente una función de lectura que permite acceder al valor desde la interfaz de Remix o desde cualquier llamada externa.

¿Cuál es la limitación principal de los arrays?

Aunque los arrays resuelven el problema de almacenar listas de elementos, tienen una desventaja significativa: para encontrar un valor específico, es necesario recorrer toda la colección [6:40]. Esto puede resultar ineficiente cuando el volumen de datos crece. Las estructuras como los mappings y los enums ofrecen alternativas para acceder directamente a un valor a través de su clave, sin necesidad de iterar.

¿Ya has probado crear tus propios structs con múltiples atributos en Remix? Comparte en los comentarios qué estructuras de datos te resultan más útiles para tus contratos.