¿Cómo se asigna ADN único a los Platsipongs utilizando un contrato inteligente en Solidity?
En el fascinante mundo de los NFT y los contratos inteligentes, asignar un ADN único a cada token es crucial para garantizar su individualidad y autenticidad. En esta clase, aprenderemos cómo asignar ADN a los Platsipongs usando Solidity y un generador determinista, añadiendo pseudorandomness muy valorado en NFTs.
¿Cómo estructuramos la asignación de ADN en el contrato?
Cada token de Platsipongs se le asignará un ADN único utilizando el token ID como índice. Para lograr esto:
Añadimos una nueva variable, un mapping, dentro del contrato que asociará cada token ID con su correspondiente ADN:
mapping(uint256=>uint256)public tokenDNA;
Durante el proceso de minting, utilizamos una función determinista para añadir un nivel de pseudoaleatoriedad al proceso. La función utiliza el token ID y otros parámetros, como el msg.sender, para dificultar la predicción del ADN generado.
¿Cómo construimos la URL de imagen a partir del ADN?
Una vez que el ADN se ha generado, el próximo paso es calcular la URL y desplegar la imagen correspondiente:
Base URI y su función de override: Creamos una función override de baseURI del contrato ERC721, que devuelve la dirección base de la API que genera las imágenes:
Función paramsURI: Esta función se encarga de construir y concatenar los parámetros que se añadirán a la URL base para definir la imagen específica del Platsipong. Los parámetros se calculan en base al ADN proporcionado.
Función imageByDNA: Finalmente, se implementa una función para componer la URL completa usando el ADN del Platsipong, generando así la imagen final:
functionimageByDNA(uint256 _dna)publicviewreturns(stringmemory){stringmemory base =_baseURI();stringmemory params =paramsURI(_dna);returnstring(abi.encodePacked(base,"?", params));}
¿Qué errores pueden surgir y cómo solucionarlos?
Trabajando con Solidity, es común enfrentar errores de stack overflow al declarar múltiples variables. Para evitar esto, se puede:
Agrupar declaraciones de variables en bloques {} separados para limitar el uso de memoria y evitar sobrecarga de stack.
Asegurarse de que el compilador de Solidity es compatible con las características y funciones usadas en el código.
¿Qué retos adicionales podemos plantear?
Después de completar la funcionalidad básica de los Platsipongs, se puede trabajar en las pruebas unitarias para los contratos y verificar su funcionamiento con Etherscan. Además, entender profundamente cómo Solidity maneja la memoria puede ser un ejercicio revelador y educativo. Te animamos a investigar más sobre esto y compartir tus hallazgos en la comunidad de aprendizaje.
Con este conocimiento, estás preparado para seguir desarrollando tus habilidades en el mundo de los contratos inteligentes y recibir con entusiasmo las innovaciones en el espacio de los NFTs. ¡Sigue explorando y aprendiendo!
++Reto++
La razón es una limitación sobre cómo se pueden hacer referencia a las variables en la pila de EVM. Si bien puede tener más de 16 variables, una vez que intente hacer referencia a una variable en la ranura 16 o superior, fallará.
Algunas soluciones:
Utilice menos variables
Utilización de funciones
Bloquear el alcance
Utilizando estructuras
🤣
Jjajajajjaja buenísimo
Documentación de Solidity:
La Maquina Virtual de Ethereum (EVM) tiene 3 areas donde puede guardar el almacenamiento:
El primero es "storage", donde residen todas las variables de estado del contrato. Cada contrato tiene su propio almacenamiento y es persistente entre llamadas de función y bastante costoso de usar.
El segundo es "memory", se utiliza para almacenar valores temporales. Se borra entre llamadas de funciones (externas) y es más barato de usar.
El tercero es stack, que se utiliza para contener pequeñas variables locales. Es de uso casi gratuito, pero solo puede contener una cantidad limitada de valores.
Buenas, después de asegurarme de tener el código correctamente escrito obtengo un error inesperado.
Al compilar aparece el error "Undeclared identifier". ¿Cómo puedo solucionarlo?
Hey ! Podrias compartir un screenshot del error para tener contexto y poderte ayudar :3
Buenas, como lo solucionaste?
🤣🤣🤣Pequeñas dificultades técnicas..!
en donde podria conseguir mas atributos prediseñados que no sean solo para avatares me gustaria saber si hay APIS con atributos para crear animales, objetos y en que paginas podria hallarlos
me marca el error: "Derived contract must override function "_beforeTokenTransfer". Two or more base classes define function with same name and parameter types.", seguí paso a paso lo que hizo el profe y no entiendo que ocurrió. Alguien sabe que pasa?
Buenas, cuando hago llamada a deterministicPseudoRandomDNA desde el archivo Platzipunks.sol. me aparece subrayado en rojo con el error:
"Undeclared identifier."
Aclaro que ya tengo importado el archivo DNA dentro de este mismo archivo, que puede ser?
Verifica si el Contrato PlatziPunks está heredando PlatziPunksDNA en la definición del contrato.
contract PlatziPunks is ERC721,ERC721Enumerable,PlatziPunksDNA{
Por lo que entendí, en caso de no este mas disponible la api de avataaars y por ejemplo este disponible en avataaars2, solo debería escribir un contrato que interactúe con platzipunks.sol enviándole un parámetro con el string la nueva url de avataaars2 a la función _baseURI() y las imágenes serian nuevamente renderizables. ¿entendí bien?