10. Mappings (Diccionarios)

No es incorrecto decir que los mapping son como diccionarios de otros idiomas, ya que los datos también se almacenan mediante una estructura clave-valor. Me verás usar ambas palabras en este tutorial.

# Creando un diccionario

Como con todas las otras variables en solidity primero definimos el tipo de diccionario y luego su nombre. En nuestro ejemplo, tenemos un diccionario en el que las claves son direcciones y los valores son números enteros que representan saldos y el mapping se llama balances.

mapping(address => uint) balances; //Address = llave, uint = tipo, balances = nombre.

# Agregando datos

A diferencia de las listas donde indicamos el nombre y la posición, con los diccionarios indicamos el nombre y la clave. En este caso, los saldos del diccionario en la dirección de quien llama a la transacción (msg.sender) tendrán el valor 100 almacenado.

balances[msg.sender] = 100;

# Leyendo datos

También muy similar a las listas pero en lugar de pasar la posición de la lista donde están los datos, pasamos la clave que en este caso también es la que llama a la transacción.

balances[msg.sender];

# Actualizando datos

Prácticamente lo mismo que agregar un nuevo dato, si en el diccionario no hay nada en la dirección de la clave pasada, se agregará primero, si algo ya existe, se reemplazará.

balances[msg.sender] = 200;

# Eliminando datos

Este es exactamente como en las listas, simplemente pase la clave del diccionario después de la instrucción delete.

delete balances[msg.sender];

# Valor estándar

Las listas y diccionarios tienen un valor por defecto si intentan acceder a una clave o posición de lista que no existe: este valor es 0.

balances[0xFF332...] => 0; //Una vez que el valor estándar de vacío es 0.

# Diccionario de diccionarios

Es posible almacenar otros diccionarios dentro de un diccionario. Imagine que usted crea un contrato en el que es posible que otras personas guarden dinero y lo pongan a disposición de otras personas además de ellos mismos. Esta situación se manifiesta en nuestro ejemplo a continuación, donde tenemos un diccionario de direcciones (claves) principales (que guardan dinero en el contrato) y los valores dentro de estas direcciones. Hay otra lista de direcciones que son claves y dentro de estas claves hay valores booleanos, que pueden ser positivos o negativos.

Resumiendo: tenemos una lista de direcciones que almacena otras direcciones y valores verdadero o falso para indicar si estas mismas pueden o no realizar una determinada acción.

mapping(address => mapping(address => bool)) aprobado; //Diccionario dentro de diccionario.

//Agregar Datos
aprobado[msg.sender][otra_direccion] = true;

//Leer Datos
aprobado[msg.sender][otra_direccion];

//Actualizar Datos
aprobado[msg.sender][otra_direccion] = false;

//Eliminar Datos
delete aprobado[msg.sender][otra_direccion] = true;

# Listas dentro de diccionarios

Ejemplo: Estamos construyendo un juego donde cada jugador puede jugar varios juegos y almacenar su puntaje de cada juego para realizar un cálculo al final.

En este caso, puede haber un diccionario que almacene direcciones como una clave y dentro de cada dirección hay una lista de valores.

mapping(address => uint[]) scores;

//Agregar Datos
scores[msg.sender].push(1);
scores[msg.sender].push(2);

//Leer Datos
scores[msg.sender][1];

//Actualizar Datos
scores[msg.sender][1] = 3;

//Eliminar Datos
delete scores[msg.sender][1];
Last Updated: 9/10/2022, 4:27:54