7.3 Mapeos (Mappings)





Punto del Curso de Solidity: 7.3 Mapeos (Mappings)

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.


AnteriorSiguiente

[mwai_chat]

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *