Obtener metadatos del token dentro del contrato inteligente para las funciones del juego.
Contexto
Estoy trabajando en mi primer juego utilizando un contrato inteligente y tengo algunas preguntas.
En mi juego tengo personajes y cartas, y ambos jugadores se enfrentarán en un duelo utilizando un personaje y 10 cartas cada uno.
Para eso, no hay problema: todos los metadatos de los jugadores y las cartas se almacenan en un depósito IPFS, y algunos metadatos adicionales (como las experiencias) se almacenan en el contrato inteligente para ser actualizados por el juego.
El problema
Ahora quiero poder crear una función de duelo en mi contrato inteligente. Pero no sé cómo acceder a los metadatos de los jugadores y las cartas para poder determinar quién ganará.
“Soluciones” que tengo en mente
- #1: Nunca vi un buscador de IPFS para obtener los metadatos, ni un analizador JSON… Así que probablemente no sea la forma correcta de hacerlo.
- #2: ¿Debo implementar un
mapping(uint => Players) private playersMetadata;
en mi contrato y cargar todos los metadatos en él para poder usarlo en la función de duelo?- Pero #2.1: ¡Esto aumentará mucho el almacenamiento necesario!
- Y #2.2: ¿Cómo puedo cargarlo incluso? ¿Creando una función
setPlayer(uint idx, Players playerMetadata)
y llamándola más de 10k veces? ¡Me costará mucho!
- #3: No implementar esta función en el contrato inteligente y hacerlo en mi servidor web… Pero no me gusta eso porque quiero que el usuario pueda leer el código del contrato inteligente y confiar en él (pero no en mí). Así que si lo hago en el lado del servidor, no podrán confiar en la función.
¡Gracias por ayudarme! Que tengan un buen día todos.
davy.ai
Como experto en TI especializado en metadatos, solidez e IPFS, me gustaría sugerir la siguiente solución para tu problema:
En lugar de almacenar todos los metadatos en cubos de IPFS, puedes almacenar solo los hashes de los metadatos en el contrato inteligente. De esta manera, el contrato tendrá acceso a los metadatos sin almacenarlos directamente, lo que resuelve el problema de aumentar el almacenamiento requerido en el enfoque #2.
Puedes crear una estructura en Solidity que almacene los datos necesarios para una tarjeta o un jugador, incluido el hash de IPFS para los metadatos. Luego, crea un mapeo que asocie a cada jugador y tarjeta con su estructura correspondiente.
Cuando se trata de la función de duelo, puedes recuperar la información necesaria pasando los índices de los jugadores y las cartas al mapeo y obteniendo sus estructuras asociadas. A partir de ahí, puedes acceder a los metadatos recuperando el hash de IPFS de la estructura y obteniendo los datos reales de IPFS.
Esto evita la necesidad de implementar la función en el servidor web y aún permite a los usuarios leer y confiar en el código del contrato inteligente. También evita la necesidad de crear más de 10.000 funciones en el enfoque #2.