Resumen

Un contrato inteligente puede almacenar cientos o miles de datos a lo largo de su vida útil. En estos casos debemos implementar estructuras de datos que nos permitan manipular gran cantidad de datos de forma fácil y organizada.

Qué son los array o vectores de datos

La primera estructura de datos, típica de cualquier lenguaje de programación, son los Arrays. Los arrays almacenan de forma secuencial datos de un mismo tipo y los mismos pueden ser accedidos a través de su índice o posición dentro del mismo. Pueden ser de una longitud determinada o de longitud dinámica dependiendo la necesidad.

// Array de números de hasta 3 posiciones
uint[3] numbers = [1, 2, 3];

// Array de números de longitud variable
uint[] numbers;

En cualquier tipo de array, puedes agregar o quitar elementos utilizando los métodos push(x) y pop().

push(x) agrega un nuevo elemento pasado como argumento al final del array, mientras que pop() remueve el último elemento.

El acceso a estos datos debe realizarse a través del índice del elemento comenzando por cero. Si tenemos el array string words = ["Bienvenido", "a", "Platzi"], el elemento 2 corresponde al string “Platzi” y accedes a este con la sintaxis words[2].

Finalmente, puedes conocer la longitud de un array a través de su método myArr.length. El mismo devolverá un número entero que representa el tamaño del mismo.

Qué son los mappings o asignaciones de datos

Los arrays tiene sus limitaciones. Si tenemos un array con miles de datos, acceder a un valor en el medio de este puede ser costoso. Tener que recorrer todo el mismo para encontrar un valor requiere procesamiento y, por ende, consumo de gas. Los Mappings solucionan este problema permitiendo asignar valores a una clave única para acceder al dato.

Similar a un objeto donde acceder a sus propiedades a través de un nombre específico. Los mappings permiten utilizar cualquier tipo de clave para acceder a un valor y el mismo puede crecer y guardar tantos valores como necesitemos.

La declaración de un mapping requiere de especificar el tipo de dato de la clave, y el tipo de dato del valor que esta guardará.

mapping(string => uint) public myMapping;

Uno de los usos más habituales de los mappings es para guardar el balance económico de una cuenta en el contrato. Cada clave guarda una address y el valor es el valor en ETH que esta posee.

mapping(address => uint) public balances;

El contenido del mapping puedes imaginarlo de la siguiente manera.

balances = {
    "direccion123": 1000,
    "direccion456": 2000,
    "direccion789": 5000
}

A través de direccion123, direccion456 y direccion789 puedes acceder rápidamente al balance de cada cuenta y su llamado se realiza de la forma balances["direccion123"].

Los mappings son completamente dinámicos, pudiendo almacenar un mapping dentro de otro.

mapping(address => mapping(uint => bool)) public nested;

Aumentando así su complejidad y las posibilidades de guardar información.

Una desventaja de los mapping es que no permiten ser recorridos como un array u obtener su longitud. Para esto puedes hacer uso de extensiones y utilidades para darle más funcionalidad a esta estructura de datos si necesitas resolver casos de uso complejos.

Conclusión

Tanto los Arrays como los Mappings tienen sus ventajas y desventajas y pueden ser implementados para almacenar información. Comprender estas diferentes estructuras de datos que Solidity implementa nos permitirá tener más herramientas para el desarrollo contratos inteligentes, organizar la información y el acceso a estos.


Contribución creada por: Kevin Fiorentino (Platzi Contributor).