Implementación de NFTs en Contratos de Tic-Tac-Toe con Solidity
Clase 7 de 15 • Curso de Programación de Smart Contracts con Solidity
Resumen
¿Cómo mejoramos la lógica del contrato?
En la clase anterior, exploramos la lógica del contrato y ahora queremos añadir un elemento emocionante: un "achievement" o logro. Sin embargo, antes de avanzar, probaremos la lógica del contrato actual. ¿Lograste ejecutar el código? Si has hecho esto, probablemente hayas notado que se necesitan algunos ajustes. Específicamente, debemos afinar la comprobación del ganador y asegurar que las versiones en memoria estén actualizadas con las últimas jugadas.
¿Cuáles son los ajustes importantes en el contrato?
- Comprobación del ganador: Inicialmente, la lógica seguía buscando un ganador incluso después de encontrarlo. La condición debe ser de igualdad (no de diferencia) con respecto al número, que en este caso es cero para una casilla vacía.
- Actualización de datos en memoria: Usábamos una copia alojada en memoria sin actualizar al guardar un movimiento. Es crucial buscar una versión actualizada del almacenamiento para mantener la integridad de la partida.
Para realizar las pruebas, usaremos dos usuarios de Remix con saldo. Creamos una partida y ejecutamos las transacciones pertinentes para verificar que la lógica funciona como se espera. Si deseas mayor visibilidad de la partida y asegurarte que todo esté en orden, puedes hacer un "debug" del código y visualizar el valor de las variables.
¿Cómo implementamos un Achievement con NFTs?
Ahora, incorporaremos la capacidad de obtener achievements mediante tokens no fungibles (NFTs), usando el estándar ERC721 de OpenZeppelin.
¿Qué es el estándar ERC721?
El estándar ERC721 define una interfaz para NFTs, lo que significa que actúa como un molde sin implementación específica. En lugar de crear esto desde cero, usaremos la implementación de Open Zeppelin, ofreciendo una integración rápida y confiable:
- Interfaz: Actúa como un esqueleto para definir NFTs.
- Tiempo y confianza: Nos ahorra tiempo y asegura que estamos adoptando las mejores prácticas.
¿Qué pasos seguimos para integrar NFTs en el juego?
-
Importación: Usamos la herramienta de importación de Remix para traer las implementaciones necesarias de Open Zeppelin de forma sencilla.
import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/access/Ownable.sol";
-
Herencia: Definimos la herencia con el estándar ERC721 y el control de acceso (Ownable).
contract MyToken is ERC721, Ownable { constructor() ERC721("Token Achievement", "TA") {} }
-
Función para emitir tokens: Añadimos una función para emitir un NFT a una dirección específica.
function emitirToken(address to) public onlyOwner returns (uint256) { uint256 tokenId = ++_lastTokenId; _mint(to, tokenId); return tokenId; }
-
Manejo de IDs: Implementamos un sistema autoincremental para los IDs de los NFTs.
Para la implementación y gestión de estos achievements, generaremos un NFT al lograr cinco victorias. A cada ganador se le aumentará el contador en el mapping partidasGanadas
.
¿Cómo se ajusta la lógica del juego de Tic-Tac-Toe?
Al integrar el sistema de achievements, añadimos verificaciones y lógica para gestionar las partidas ganadas y emitir NFTs:
-
Al ganar una partida: Incrementamos el contador para el jugador y, si alcanza cinco victorias, emitimos un NFT.
mapping(address => uint) _partidasGanadas; if (_partidasGanadas[ganador] == 5) { achievement.emitirToken(ganador); }
Ahora es momento de poner en práctica lo aprendido. ¡Te animo a que tomes este código, lo explores y consideres añadir una lógica de logro adicional! Por ejemplo, creando un achievement para partidas ganadas sin completar la grilla. Si te atreves con este desafío, comparte tu solución. ¡A seguir aprendiendo y experimentando con Solidity!