En Solidity, los arrays son una estructura de datos fundamental que permite almacenar colecciones de elementos del mismo tipo. Pueden ser utilizados para gestionar listas dinámicas o estáticas de datos en contratos inteligentes, como listas de usuarios, balances o cualquier otra colección.
Existen dos tipos principales de arrays en Solidity:
1. Arrays estáticos: Su tamaño se define al momento de la declaración y no puede cambiar.
2. Arrays dinámicos: No tienen un tamaño fijo y pueden crecer o reducirse durante la ejecución.
0
).
uint[5] public arrayEstatico; // Array de tamaño fijo con 5 elementos
uint[] public arrayDinamico; // Array de tamaño variable
uint[] public arrayInicializado = [1, 2, 3, 4];
pragma solidity ^0.8.0;
contract EjemploArrays {
uint[] public numeros;
// Añadir un número al array
function agregarNumero(uint _numero) public {
numeros.push(_numero);
}
// Eliminar el último número del array
function eliminarUltimo() public {
require(numeros.length > 0, "El array está vacío");
numeros.pop();
}
// Consultar el tamaño del array
function obtenerLongitud() public view returns (uint) {
return numeros.length;
}
}
contract ListaDirecciones {
address[] public direcciones;
// Añadir una dirección a la lista
function agregarDireccion(address _direccion) public {
direcciones.push(_direccion);
}
// Consultar una dirección por índice
function obtenerDireccion(uint _indice) public view returns (address) {
require(_indice < direcciones.length, "Índice fuera de rango");
return direcciones[_indice];
}
// Obtener la cantidad total de direcciones
function totalDirecciones() public view returns (uint) {
return direcciones.length;
}
}
Los arrays también pueden ser multidimensionales para almacenar datos más complejos.
contract ArraysMultidimensionales {
uint[][] public matriz;
// Añadir una fila a la matriz
function agregarFila(uint[] memory _fila) public {
matriz.push(_fila);
}
// Consultar un elemento específico
function obtenerElemento(uint _fila, uint _columna) public view returns (uint) {
require(_fila < matriz.length, "Fila fuera de rango");
require(_columna < matriz[_fila].length, "Columna fuera de rango");
return matriz[_fila][_columna];
}
}
Eliminar un elemento de un array manteniendo el orden requiere desplazar los elementos.
contract EliminacionArray {
uint[] public numeros;
// Agregar un número al array
function agregarNumero(uint _numero) public {
numeros.push(_numero);
}
// Eliminar un elemento por índice
function eliminarElemento(uint _indice) public {
require(_indice < numeros.length, "Índice fuera de rango");
for (uint i = _indice; i < numeros.length - 1; i++) {
numeros[i] = numeros[i + 1];
}
numeros.pop(); // Eliminar el último elemento
}
// Obtener el array completo
function obtenerArray() public view returns (uint[] memory) {
return numeros;
}
}
1. Versatilidad: Adecuados para almacenar listas dinámicas o colecciones de datos relacionados.
2. Acceso directo: Permiten acceder a elementos específicos mediante su índice.
3. Interoperabilidad: Útiles junto con otras estructuras como mappings y structs.
1. Costo en gas: Operaciones como iteraciones y eliminaciones pueden ser costosas.
2. Iteración manual: No hay funciones nativas para recorrer arrays; se debe implementar manualmente.
3. Falta de soporte para valores no inicializados: Los valores predeterminados pueden causar problemas si no se manejan correctamente.
Para más detalles sobre arrays en Solidity, consulta la documentación oficial de Solidity.
Jorge García
Fullstack developer