No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de Introducción a OpenZeppelin

Curso de Introducción a OpenZeppelin

Sebastián Leonardo Perez

Sebastián Leonardo Perez

Estructuras de datos

15/19
Recursos

Manipular grandes cantidades de datos en un contrato inteligente puede volverse un problema si debemos realizar operaciones complejas con los mismos. Tanto los Array como los Mapping de Solidity nos serán muy útiles, pero sus funcionalidades pueden quedar algo limitadas en casos de uso complejos.

Extención de Arrays y Mappings

OpenZeppelin nos ofrece dos utilidades para extender el funcionamiento de los Array y de los Mappings.

Se trata de dos contratos inteligentes que nos permitirán recorrer estas estructuras de datos con más rapidez, localizar datos de forma más eficiente, borrarlos o incluso obtener la cantidad de los mismos.

Estos son EnumerableSet.sol y EnumerableMap.sol, tanto para Arrays como para Mappings respectivamente.

Ambos se declaran de forma muy sencilla haciendo la importación correspondiente de la librería.

 contract ExampleEnumerableSet {
     // Importamos la librería
     using EnumerableSet for EnumerableSet.AddressSet;
     
     // Declaramos un Set de datos
     EnumerableSet.AddressSet private mySet;
 }
 contract ExampleEnumerableMap {
     // Importamos la librería
     using EnumerableMap for EnumerableMap.UintToAddressMap;
     
     // Declaramos un Map de datos
     EnumerableMap.UintToAddressMap private myMap;
 }

Al implementar estas librerías, ya no necesitaremos utilizar Array y Mapping. En su lugar, implementaremos estas estructuras de datos que nos aportan grandes funcionalidades adicionales para resolver casos de uso complejos.

Tal vez no sea recomendable utilizar este tipo de librerías si tenemos que resolver casos de uso sencillos como llevar el balance de una cuenta en un Mapping o guardar datos de los usuarios del contrato.

Si al momento de estar desarrollando el contrato detectas que necesitarás realizar operaciones complejas con este tipo de estructuras de datos, es momento de que entre en juego estas utilidades para simplificar nuestro trabajo.


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

Aportes 3

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

EnumerableSet y EnumerableMap extienden la funcionalidad de los Arrays y Mapping en Solidity, ya que estos son algo limitados para obtener la longitud, verificar si un valor existe, etc.
Deben utilizar cuando el funcionamiento de los Arrays o Mapping no satisface nuestro caso de uso y requerimos de más funcionalidad.
Son librerías con funciones estáticas, como en la POO, donde no se requiere instanciar una clase para utilizar sus métodos.

EnumerableSet crea un tipo de “Array dinamico” al que se le llama Set, a este tipo de “Array” se le ha agregado las siguientes propiedades:

  • Los inputs se pueden agregar (al final de la cadena), eliminar (no importa la posición del elemento) o verificar (si existen) a traves de funciones de la librería EnumerableSet.
  • A los elementos que ingresan (inputs) se les asigna una nueva numeración (aparte de la numeración que tiene por ser un tipo de Array).

💡 IMPORTANTE!!! Al remover un elemento, el último valor del Set pasa a ocupar la posición del elemento eliminado P.E.

values()  
//Retorna el Set (array) almacenado [10,20,30,40,50]
at(50)
//Retorna 4, ya que es la posicion de 50

remove(20)
//Elimino el elemento 20

values()
//Retorna un nuevo Set (array) [10,50,30,40]
at(50)  
//Retorna 2, la posicion de 50 cambio

EnumerableSet esta definida para trabajar con 3 tipos de variables:

  • bytes32 → bytes32Set
  • uint → uintSet
  • address → addressSet

Las funciones que agrega EnumerableSet son:

Para usar EnumerableSet con using_for_ a parte de importar la librería, se debe declarar la un tipo de variable Set de la siguiente forma:

contract Example {
    // Add the library methods
    using EnumerableSet for EnumerableSet.AddressSet;

    // Declare a set state variable
    EnumerableSet.AddressSet private mySet;
}

Ejemplos basicos para usar EnumerableSet y EnumerableMAp AQUI

Habría que ver el consumo de gas al implementar esto. Creería que la diferencia es mucha.