Patrick Collins .- Generar números aleatorios en un token no fungible ( NFT ) siguiendo el estándar ERC721 siempre ha sido un problema para los desarrolladores de contratos inteligentes. 

Ahora que Chainlink VRF está disponible en la red principal, los contratos inteligentes basados ​​en Solidity pueden generar sin problemas números aleatorios en cadena a prueba de manipulaciones que son demostrablemente justos y están respaldados por una prueba criptográfica. 

Con Chainlink VRF, crear NFT dinámicas que necesitan una fuente segura de aleatoriedad es ahora lo más fácil y seguro que jamás haya sido. Si bien Chainlink también habilita atributos dinámicos de cualquier tipo para una NFT utilizando fuentes de datos fuera de la cadena, nos centraremos en números aleatorios con ERC721 o NFT.

En este tutorial, veremos cómo construir un personaje de Dungeons & Dragons en la cadena de bloques Ethereum. D&D (Dungeons and Dragons) es un popular juego de rol (RPG) en el que las personas crean personajes y emprenden aventuras. 

Una de las piezas importantes de la creación de personajes es darles atributos o estadísticas para mostrar su fuerza, destreza, inteligencia, etc. 

Para crear números verdaderamente aleatorios para sus estadísticas en la cadena de bloques, mostraremos cómo darles a tus personajes atributos aleatorios usando Chainlink VRF. ¡La generación de números aleatorios en blockchain es fácil con Chainlink VRF!

¿Qué es un NFT?

Los NFT (siguiendo el estándar ERC721) definen un marco para hacer tokens que son únicos y diferentes entre sí (de ahí el término no fungible), mientras que el popular estándar ERC20 define tokens que son «fungibles», lo que significa que todos los tokens son intercambiables y garantizado para tener el mismo valor. 

Ejemplos de monedas «fungibles» son el dólar estadounidense, el euro y el yen, mientras que los ejemplos de tokens de blockchain fungibles son AAVE, SNX e YFI. 

En estos casos, 1 ficha fungible es igual a 1 de otra del mismo tipo, al igual que un dólar equivale a un dólar y 1 LINK equivale a 1 LINK. Sin embargo, los NFT / ERC721 son diferentes en que cada token es único y no representa el mismo valor o elemento intercambiable.

Dado que todas las NFT son únicas, pueden representar reclamos de propiedad tokenizados sobre activos del mundo real, como un terreno específico, o la propiedad real de activos digitales, como en una rara tarjeta de comercio digital. Y están ganando popularidad. Puede leer aún más haciendo referencia a la Biblia NFT de OpenSea.

Construyendo tu personaje aleatorio

Vamos a ver cómo crear un personaje que tenga los seis atributos principales de un personaje de D&D, a saber:

uint256 strength;
       uint256 dexterity;
       uint256 constitution;
       uint256 intelligence;
       uint256 wisdom;
       uint256 charisma;

También les daremos:

uint256 experience;
       string name;

Para que podamos subir de nivel y ponerles un nombre divertido.

Nos tomamos algunas libertades aquí, y no seguimos la guía de Dungeons & Dragons al 100%, pero esto se puede modificar fácilmente si desea una representación más precisa del juego.

Este contrato debe establecer lo siguiente:

  1. Le permite transferir la propiedad de NFT y todos los demás estándares de NFT.
  2. Dale a este personaje un nombre y atributos aleatorios.

No entraremos en la dinámica del contrato todavía, ¡pero estad atentos para un artículo futuro que se basará en lo que aprendemos aquí!

Ya hemos creado el repositorio para usted, ¡pero veremos cómo trabajar con el repositorio!

Clonar el repositorio

git clone https://github.com/PatrickAlphaC/dungeons-and-dragons-nft
cd dungeons-and-dragons-nft
npm install

Configure sus variables de entorno

Necesitará una variable de entorno MNEMONIC y una rinkeby RINKEBY_RPC_URL. Tu MNEMONIC es tu frase semilla de tu billetera. Puede encontrar un RINKEBY_RPC_URL de un proveedor de servicios de nodo como Infura .

Luego, configúrelos en un bash_profile archivo o expórtelos a su terminal como:

export MNEMONIC='cat dog frog....'
export RINKEBY_RPC_URL='www.infura.io/YOUR_PROJECT_ID_HERE'

¿Qué hay en esta carpeta?

Esto obtendrá toda nuestra configuración de código repetitivo, pero la verdadera magia está en el archivo DungeonsAndDragonsCharacter.sol

Podemos ver que comienza como un archivo Solidity normal, pero tenemos varias importaciones en la parte superior:

pragma solidity ^0.6.6;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@chainlink/contracts/src/v0.6/VRFConsumerBase.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

contract DungeonsAndDragonsCharacter is ERC721, VRFConsumerBase, Ownable {

OpenZepplin es una colección de paquetes que facilita la vida de Solidity y de los ingenieros de contratos inteligentes. Si no lo ha usado antes, ¡prepárese para usarlo mucho más! Dado que ERC721 es solo un estándar de token y cada ERC721 debería ser más o menos igual, sabemos que podemos usar una plantilla. El ERC721.solarchivo que importamos define todos los estándares para una NFT. Simplemente lo heredamos en nuestro contrato definiendo contract DungeonsAndDragonsCharacter is ERC721

Necesitamos VRFConsumerBase.sol interactuar con Chainlink VRF y obtener nuestros números aleatorios. Las dos últimas importaciones solo nos ayudan con los permisos y funcionan con Strings.

La estructura y el constructor de caracteres

Definimos qué atributos va a tener nuestro personaje en la estructura Character, y hacemos una lista de personajes para poder realizar un seguimiento de todos los personajes creados. Dado que estamos utilizando una matriz para almacenar la lista de caracteres, sabemos que cada carácter tendrá una identificación única en esa matriz que lo definirá. Esto se conoce como el tokenId, y lo haremos más referencia.

struct Character {
       uint256 strength;
       uint256 dexterity;
       uint256 constitution;
       uint256 intelligence;
       uint256 wisdom;
       uint256 charisma;
       uint256 experience;
       string name;
   }

   Character[] public characters;

Una vez que tengamos esa configuración, ahora podemos crear nuestro constructor.

   constructor()
       public
       VRFConsumerBase(VRFCoordinator, LinkToken)
       ERC721("DungeonsAndDragonsCharacter", "D&D")
   {
       keyHash = 0x2ed0feb3e7fd2022120aa84fab1945545a9f2ffc9076fd6156fa96eaff4c1311;
       fee = 0.1 * 10**18; // 0.1 LINK
   }

Los VRFConsumerBase ERC721 cada uno toman los parámetros que necesitamos para configurarlos. 

Chainlink VRF necesita la dirección del coordinador de VRF y la dirección de LinkToken. Hemos codificado esto para la red Rinkeby. Hay algunas otras variables definidas para Chainlink VRF como keyHash y fee. 

Puede leer más sobre lo que hacen en la documentación de Chainlink VRF . 

La línea ERC721("DungeonsAndDragonsCharacter", "D&D") define el nombre de la NFT y luego su símbolo. 

El "D&D" será lo que se muestra en MetaMask y NFT mercados.

Genera tu personaje aleatorio

Queremos que cada uno de nuestros seis atributos tenga estadísticas aleatorias, ¡pero queremos poder nombrar a nuestro personaje! Una simple llamada a un Chainlink VRF nos permite generar números aleatorios en este NFT / ERC721. 

No necesitamos hacer mucho en nuestra función de solicitud, solo necesitamos darle a nuestro nuevo personaje un nombre y un userProvidedSeed

La semilla que le damos es cómo el coordinador de VRF va a verificar si el número proporcionado es realmente aleatorio o no. Puede elegir cualquier semilla que desee y puede leer más sobre cómo elegir una semilla aleatoria para obtener más información.

   function requestNewRandomCharacter(
       uint256 userProvidedSeed,
       string memory name
   ) public returns (bytes32) {
       require(
           LINK.balanceOf(address(this)) >= fee,
           "Not enough LINK - fill contract with faucet"
       );
       bytes32 requestId = requestRandomness(keyHash, fee, userProvidedSeed);
       requestToCharacterName[requestId] = name;
       requestToSender[requestId] = msg.sender;
       return requestId;
   }

Queremos realizar un seguimiento del requestIdpara que cuando se cumpla el número aleatorio podamos asignarlo al personaje que estamos creando. 

¡Esto iniciará el trabajo de Chainlink y solo tenemos que esperar a que el nodo Chainlink vuelva a llamar a nuestro contrato! 

Puede leer más sobre el modelo de solicitud en la documentación de Chainlink para obtener más información sobre cómo funciona el envío de solicitudes de Chainlink.

Una vez que el nodo Chainlink ha terminado de procesar la solicitud, responde llamando a la función fulfillRandomness

Esta función tiene todas las matemáticas detrás de dar los atributos, agregar el carácter a la lista y acuñar el NFT.

function fulfillRandomness(bytes32 requestId, uint256 randomNumber)
       internal
       override
   {
       uint256 newId = characters.length;
       uint256 strength = ((randomNumber % 100) % 18);
       uint256 dexterity = (((randomNumber % 10000) / 100) % 18);
       uint256 constitution = (((randomNumber % 1000000) / 10000) % 18);
       uint256 intelligence = (((randomNumber % 100000000) / 1000000) % 18);
       uint256 wisdom = (((randomNumber % 10000000000) / 100000000) % 18);
       uint256 charisma = (((randomNumber % 1000000000000) / 10000000000) %
           18);
       uint256 experience = 0;

       characters.push(
           Character(
               strength,
               dexterity,
               constitution,
               intelligence,
               wisdom,
               charisma,
               experience,
               requestToCharacterName[requestId]
           )
       );
       _safeMint(requestToSender[requestId], newId);
   }

Podemos ver que solo estamos usando el número aleatorio una vez para crear los seis atributos. Usamos la función modular para tomar un subconjunto del número aleatorio masivo devuelto. Si no quisiéramos hacer eso, también podríamos llamar a Chainlink VRF seis veces, pero de esta manera funciona igual. Los dos últimos dígitos del número aleatorio devuelto se utilizan para la fuerza, los dos dígitos anteriores se utilizan para la destreza, y así sucesivamente. 

Esto es similar a cómo CryptoKitties usa genes para asignar valores a sus gatos.

Solo una nota: hacer manipulación bit a bit sería más eficiente que la forma en que lo estamos haciendo aquí, pero esto es más fácil de entender, por lo que no tenemos que entrar en cómo funciona la manipulación bit.

_safeMint es la función heredada de la ERC721.solque nos permite realizar un seguimiento fácil de los propietarios de ERC721s. Esto es importante especialmente cuando desea que su NFT realice alguna acción, pero no desea que nadie más pueda realizar esa acción. Aprenderemos más sobre esto en el próximo artículo de NFT.

Trabajaremos con Truffle y Chainlink, por lo que si no está familiarizado con Truffle, esta publicación de blog sobre cómo usar Chainlink con Truffle le dará un repaso, ¡pero también repasaremos todos los comandos en este blog!

Implementación e inicio rápido

Ahora que sabemos lo que está pasando, ¡implementemos nuestro NFT aleatorio! Necesitará Rinkeby LINK y Rinkeby ETH para ejecutar estos scripts.

truffle migrate --reset --network rinkeby
truffle exec scripts/fund-contract.js --network rinkeby
truffle exec scripts/generate-character.js --network rinkeby
truffle exec scripts/get-character.js --network rinkeby

Esto va a hacer algunas cosas:

  1. Implemente su contrato NFT
  2. Financia el contrato para que pueda realizar llamadas de Chainlink VRF
  3. Genera un personaje con una llamada a Chainlink VRF
  4. ¡Devuelve el valor de tu NFT!

Una vez implementado, también puede verificar el contrato e incluso leer el contrato en Etherscan utilizando el complemento etherscan. Deberá obtener una clave de API de Etherscan y establecer la variable de entorno. ETHERSCAN_API_KEY.Pero una vez que lo haga, puede ejecutar:

truffle run verify DungeonsAndDragonsCharacter --network rinkeby --license MIT

Y le dará un enlace a su NFT en Etherscan. Una vez allí, puede ir a la sección de contrato y presionar Leer contrato.

chainlink

Esto lo llevará a la página donde puede interactuar con el contrato. Si vas a la sección de personajes, puedes ingresar el tokenId que acabamos de generar, 0, ¡y ver las estadísticas de tu nuevo personaje de D&D!

Puede consultar el ejemplo de este contrato en Rinkeby aquí . ¡Algunos de los personajes tienen nombres interesantes!

Resumen

Los números aleatorios en NFT son fáciles con Chainlink VRF, y hay un mundo completamente diferente para explorar cuando se trata de alojarlos y usarlos. Aquí solo hemos arañado la superficie, así que busque el próximo blog sobre cómo venderlos en el mercado, renderizar imágenes y trabajar con metadatos. Nos encantaría ver algunos personajes y juegos increíbles creados con Chainlink VRF para que sean verdaderamente justos. Si creas un NFT #PoweredByChainlink genial, ¡asegúrate de enviarnos un tweet!

Si es un desarrollador y desea conectar su contrato inteligente a datos y sistemas fuera de la cadena, visite la documentación del desarrollador y únase a la discusión técnica sobre Discord . Si desea programar una llamada para discutir la integración más a fondo, comuníquese aquí .

Los desarrolladores de contratos inteligentes están lanzando un mundo completamente nuevo con atributos aleatorios en las NFT. ¿Serás uno de los pioneros que liderará la carga?

Ver articulo original de Patrick Collins aqui

Sitio web | Twitter | Reddit | YouTube | Telegram | Eventos | GitHub | Feeds de precios | DeFi

MAS SOBRE CHAINLINK