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?

o inicia sesi贸n.

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 鈥淎rray dinamico鈥 al que se le llama Set, a este tipo de 鈥淎rray鈥 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.