Punto del Curso de Solidity: 7.3 Mapeos (Mappings)
En Solidity, los mapeos (o mappings) son estructuras de datos fundamentales que se utilizan para almacenar y recuperar datos de manera eficiente. A diferencia de las estructuras de datos como arrays o listas, los mapeos permiten una asociación directa entre claves y valores. Esto los hace particularmente útiles cuando se necesita acceso rápido y directo a los datos asociados a una clave específica.
Definición y Sintaxis
Un mapeo se define utilizando la siguiente sintaxis:
mapping(_KeyType => _ValueType) nombreDelMapping
A continuación, se desglosa la sintaxis:
- _KeyType: El tipo de la clave, puede ser cualquier tipo de dato excepto otro mapping, contrato, array dinámico o enumeración.
- _ValueType: El tipo de los valores almacenados, puede ser cualquier tipo de dato.
- nombreDelMapping: El nombre del mapeo.
Ejemplo de Uso Básico
Consideremos un ejemplo donde almacenamos y recuperamos la edad de una persona utilizando su dirección (address) como clave.
pragma solidity ^0.8.0 contract EjemploMapeo { // Declaración del mapeo mapping(address => uint) public edad // Función para establecer la edad function establecerEdad(address _persona, uint _edad) public { edad[_persona] = _edad } // Función para obtener la edad function obtenerEdad(address _persona) public view returns (uint) { return edad[_persona] } }
En este ejemplo:
- El mapeo
edad
asocia una dirección (address
) con un número entero sin signo (uint
). - La función
establecerEdad
permite asignar una edad a una dirección específica. - La función
obtenerEdad
permite recuperar la edad asociada a una dirección específica.
Mapeos Anidados
Solidity también permite crear mapeos anidados, lo que puede ser útil para estructurar datos más complejos. Un mapeo anidado es esencialmente un mapeo cuya estructura de valor es otro mapeo. Veamos un ejemplo:
pragma solidity ^0.8.0 contract EjemploMapeoAnidado { // Declaración del mapeo anidado mapping(address => mapping(uint => bool)) public permisos // Función para establecer permisos function establecerPermiso(address _usuario, uint _recurso, bool _permiso) public { permisos[_usuario][_recurso] = _permiso } // Función para verificar permisos function verificarPermiso(address _usuario, uint _recurso) public view returns (bool) { return permisos[_usuario][_recurso] } }
En este ejemplo:
- El mapeo
permisos
asocia una dirección (address
) con otro mapeo que vincula un número entero (uint
) con un booleano (bool
). - La función
establecerPermiso
permite asignar permisos a un usuario en relación a un recurso específico. - La función
verificarPermiso
permite verificar si un usuario tiene permiso para acceder a un recurso específico.
Consideraciones al Usar Mapeos
Es importante tener en cuenta algunas consideraciones al utilizar mapeos en Solidity:
- Los mapeos no pueden ser iterados directamente no existe una forma directa de obtener todas las claves almacenadas en un mapeo.
- Los datos en un mapeo permanecen incluso después de ser eliminados. Es decir, si estableces un valor a cero, la clave aún existirá aunque su valor sea cero.
- Los mapeos no pueden ser devueltos en sus formas completas desde funciones públicas o externas. Sin embargo, pueden ser manipulados mediante funciones individuales de establecimiento y obtención de datos.
Conclusión
Los mapeos son una herramienta poderosa en Solidity para la gestión eficiente de datos, especialmente en casos en los que se requieren asociaciones directas entre claves y valores. Sin embargo, debido a sus limitaciones y características específicas, es esencial usarlos con cuidado y comprender sus restricciones para evitar problemas en el desarrollo de contratos inteligentes.
Deja una respuesta