Cómo crear un NFT dinámico utilizando 3 servicios de Chainlink [<de 1 hora]

Traducido del original How To Create a Dynamic NFT Using 3 Chainlink Services por la comunidad habla hispana de Chainlink.

Comunidad de Chainlink en español
Chainlink Community
12 min readJul 13, 2023

--

Descripción general

Nivel de dificultad : Principiante/Intermedio

Tiempo estimado para completar : 60 minutos

En este tutorial, aprenderá a desplegar un contrato inteligente en la red de prueba de Polygon Mumbai usando Remix. El contrato inteligente crea un NFT que se actualiza dinámicamente en función del precio de ETH en términos de USD.

A continuación, encontrará instrucciones paso a paso sobre cómo:

  1. Crear una billetera MetaMask
  2. Obtenga fondos en la red de prueba de Polygon Mumbai
  3. Crear una suscripción VRF de Chainlink
  4. Desplegar el contrato inteligente Dynamic NFT (dNFT) usando Remix
  5. Agregue el contrato inteligente dNFT como consumidor VRF
  6. Automatice el NFT usando Chainlink Automation
  7. Vea e interactúe con su NFT en OpenSea

Paso 1: crea una billetera MetaMask

Nota: si ya tiene una billetera MetaMask (o cualquier otra billetera), no dude en omitir este paso.

Para crear una billetera MetaMask, vaya a https://metamask.io/ y siga las instrucciones para crear su billetera.

Paso 2: Obtenga fondos de Polygon Mumbai Testnet

A) Vaya a https://faucets.chain.link/mumbai

B) Haga clic en “Connect wallet” en la esquina superior derecha.

C) Si es la primera vez que interactúa con Polygon Mumbai, haga clic en “Approve” en el indicador de MetaMask con el mensaje “Allow this site to add a network?”

D) Haga clic en “Switch network”.

E) Marque la casilla de verificación “I am human” y complete el CAPTCHA.

F) Haga clic en “Send request”.

G) Esperar a que se complete la transacción.

¡Felicidades! Ha solicitado y recibido con éxito testnet Polygon Mumbai MATIC y testnet LINK.

Nota: Si el Faucet de Chainlink se quedó sin testnet MATIC, utilice Polygon Mumbai Faucet para recibir testnet MATIC. Aún tendrá que usar el Faucet de Chainlink para recibir testnet LINK.

Paso 3: Cree una suscripción VRF

Antes de implementar el contrato inteligente dNFT, primero crearemos una suscripción VRF. Piense en esto como un cubo de fondos para que su contrato lo use al generar números aleatorios. Necesitaremos el ID de suscripción para implementar el contrato inteligente.

A) Vaya a https://vrf.chain.link/mumbai

B) Haga clic en “Connect wallet” en la esquina superior derecha.

C) Haga clic en “Create subscription”.

D) Haga clic en “Create subscription” nuevamente.

E) Debería aparecer un aviso de MetaMask. Haga clic en “Sign”.

F) Haga clic en “Confirm” en MetaMask y espere a que se confirme la transacción.

G) Una vez confirmada la transacción y creada la suscripción, haga clic en “Agregar fondos” o “Add funds”.

H) En el cuadro de entrada “Add funds” (LINK)”, agregue 2 LINK y haga clic en “Add funds”.

I) Confirmar la transacción en MetaMask.

¡Felicidades! Ha creado con éxito su suscripción VRF y ha obtenido algunos LINK de testnet. Volveremos a la suscripción VRF en el siguiente paso.

Paso 4: Deployar el contrato inteligente Dynamic NFT en Remix

Remix es un entorno de desarrollo integrado (IDE) en línea diseñado específicamente para desarrollar y probar contratos inteligentes en la cadena de bloques de Ethereum. Proporciona una interfaz fácil de usar y un conjunto de herramientas poderosas para escribir, compilar, implementar y depurar contratos inteligentes de Ethereum.

En este paso, aprenderá a crear un nuevo espacio de trabajo de Remix y a implementar un contrato inteligente. No se preocupe: el contrato inteligente ya está escrito, por lo que todo lo que necesita hacer es copiar y pegar .

A) Vaya a https://remix.ethereum.org/

B) Haga clic en el icono “+” en la esquina superior izquierda de su pantalla para crear un nuevo espacio de trabajo.

C) Introduzca un nombre para su nuevo espacio de trabajo y haga clic en “OK”.

D) Haga clic derecho en “contracts” en la barra lateral izquierda y haga clic en “New file”.

E) Nombre el archivo “demo.sol” o cualquier otro nombre que desee y presione enter.

F) Copie este código.

// SPDX-License-Identifier: MIT
// This is for DEMO purposes only and should not be used in production!
pragma solidity ^0.8.10;
// Importing other contracts
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/Base64.sol";
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
import "@chainlink/contracts/src/v0.8/interfaces/VRFCoordinatorV2Interface.sol";
import "@chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol";
// Define SuperDynamicNFT contract which inherits from ERC721, ERC721URIStorage and VRFConsumerBaseV2
contract SuperDynamicNFT is ERC721, ERC721URIStorage, VRFConsumerBaseV2 {
// State variables for tracking ETH price and the corresponding emoji
int256 previousEthPrice = 0;
string ethIndicatorUp = unicode"😀";
string ethIndicatorDown = unicode"😔";
string ethIndicatorFlat = unicode"😑";
string ethIndicator;
// State variables for creating SVGs
string[] public hexDigits = [
"0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b",
"c", "d", "e", "f"
];
string public fillColor = "#000000";
// Interfaces for getting price data and random numbers from Chainlink
AggregatorV3Interface internal priceFeed;
VRFCoordinatorV2Interface COORDINATOR;
// VRF-related state variables
uint64 private s_subscriptionId;
uint32 private callbackGasLimit = 2500000;
uint16 private requestConfirmations = 3;
uint32 private numWords = 6;
uint256[] public s_randomWords;
// Contract owner's address
address private s_owner;
// VRF settings specific to Mumbai testnet
address private vrfCoordinator = 0x7a1BaC17Ccc5b313516C5E16fb24f7659aA5ebed;
bytes32 private keyHash = 0x4b09e658ed251bcafeebbc69400383d49f344ace09b9576fe248bb02c003fe9f;
// Constructor takes subscription ID and sets up the contract
constructor(uint64 subscriptionId)
ERC721("ETH Watch SVG", "ewSVG")
VRFConsumerBaseV2(vrfCoordinator)
{
priceFeed = AggregatorV3Interface(0x0715A7794a1dc8e42615F059dD6e406A6594651A);
s_owner = msg.sender;
COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator);
s_subscriptionId = subscriptionId;
_safeMint(s_owner, 0);
}
// Function to request random Numbers from the VRF
function requestRandomWords() public {
// Will revert if subscription is not set and funded.
COORDINATOR.requestRandomWords(
keyHash,
s_subscriptionId,
requestConfirmations,
callbackGasLimit,
numWords
);
}
// Callback function used by VRF Coordinator
function fulfillRandomWords(
uint256, /* requestId */
uint256[] memory randomWords
) internal override {
s_randomWords = randomWords;
//Get new fill color
updateFillColor();
// Update NFT SVG
updateETHPrice();
}
// Function to update fill color of SVG based on VRF-provided random numbers
function updateFillColor() internal {
fillColor = string(
abi.encodePacked(
"#",
randomHexDigit(s_randomWords[0]),
randomHexDigit(s_randomWords[1]),
randomHexDigit(s_randomWords[2]),
randomHexDigit(s_randomWords[3]),
randomHexDigit(s_randomWords[4]),
randomHexDigit(s_randomWords[5])
)
);
}
// Function to update ETH price and corresponding emoji
function updateETHPrice() internal returns (string memory) {
int256 currentEthPrice = getETHPrice();
if (currentEthPrice > previousEthPrice) {
ethIndicator = ethIndicatorUp;
} else if (currentEthPrice < previousEthPrice) {
ethIndicator = ethIndicatorDown;
} else {
ethIndicator = ethIndicatorFlat;
}
previousEthPrice = currentEthPrice;
return ethIndicator;
}
// Helper function to generate a random hex digit
function randomHexDigit(uint256 _randomNum)
internal
view
returns (string memory)
{
uint256 randomIndex = _randomNum % hexDigits.length;
return hexDigits[randomIndex];
}
// Function to get the current price of ETH from Chainlink
function getETHPrice() internal view returns (int256) {
(, int256 price, , , ) = priceFeed.latestRoundData();
return price;
}
// Overridden tokenURI function to produce SVG images as NFTs
function tokenURI(uint256) public view override(ERC721, ERC721URIStorage)
returns (string memory)
{
// Create SVG rectangle with color
string memory imgSVG = string(
abi.encodePacked(
"<svg xmlns='http://www.w3.org/2000/svg' version='1.1' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:svgjs='http://svgjs.com/svgjs' width='500' height='500' preserveAspectRatio='none' viewBox='0 0 500 500'> <rect width='100%' height='100%' fill='",
fillColor,
"' />",
"<text x='50%' y='50%' font-size='128' dominant-baseline='middle' text-anchor='middle'>",
ethIndicator,
"</text>",
"</svg>"));
string memory json = Base64.encode(
bytes(
string(
abi.encodePacked(
'{"name": "ETH Watching SVG",',
'"description": "An Automated ETH tracking SVG",',
'"image": "data:image/svg+xml;base64,',
Base64.encode(bytes(imgSVG)),
'"}'
)
)
)
);
// Create token URI
string memory finalTokenURI = string(
abi.encodePacked("data:application/json;base64,", json)
);
return finalTokenURI;
}
// Overridden burn function to ensure ERC721 and ERC721URIStorage compatibility
function _burn(uint256 tokenId)
internal
override(ERC721, ERC721URIStorage)
{
super._burn(tokenId);
}
// Modifier to restrict certain functions to contract owner
modifier onlyOwner() {
require(msg.sender == s_owner);
_;
}
function supportsInterface(bytes4 interfaceId)
public
view
override(ERC721, ERC721URIStorage)
returns (bool)
{
return super.supportsInterface(interfaceId);
}
}

G) Vuelva a Remix y pegue el código en su archivo demo.sol recién creado.

Nota: Es posible que reciba una advertencia emergente de que está pegando una gran parte del código. Haga clic en “OK”.

H) Haga clic en el icono “Solidity Compiler” en la barra lateral izquierda.

I) Haga clic en “Compile demo.sol”.

J) Haga clic en el icono “Deploy & run transactions” en la barra lateral izquierda.

K) Haga clic en el menú desplegable “Environment” y cámbielo de “Remix VM (Shanghai)” a “Injected Provider — MetaMask” y siga las indicaciones en MetaMask para conectar su billetera.

L) Antes de desplegar el contrato inteligente en la Blockchain de Polygon Mumbai, necesitamos el ID de suscripción de la suscripción VRF que creamos en el paso anterior. Vuelva a https://vrf.chain.link/mumbai y tome nota del ID de la suscripción VRF que acabamos de crear. Su identificación será diferente a la del ejemplo. Primero debe informar al contrato sobre la suscripción. En un paso futuro, informará a la suscripción sobre el contrato.

M) En Remix, ingrese el ID de suscripción en el cuadro de entrada junto al botón naranja “Deploy”.

N) Haga clic en “Deploy” y luego confirme la transacción en MetaMask.

O) Si ve una marca de verificación verde en la consola en la parte inferior de su pantalla, ¡felicidades! ¡Ha implementado con éxito el contrato en la Blockchain de Polygon Mumbai!

Paso 5: agregue un Consumer a su suscripción VRF

¡Felicidades! Ha implementado con éxito su contrato inteligente. Ahora es el momento de agregar el contrato inteligente como consumidor a la suscripción VRF que creó en el paso 3.

A) En Remix, copie la dirección de su contrato.

B) Vaya a https://vrf.chain.link/mumbai y conecte su billetera haciendo clic en “Connect wallet” en la esquina superior derecha. Si su billetera ya está conectada, puede omitir este paso.

C) Haga clic en el ID de la suscripción que creó en el paso 3. Puede encontrar su suscripción en “My Subscriptions”.

D) Haga clic en “Add consumer”.

E) Pegue la dirección del contrato en el cuadro de entrada “Consumer address”. Esto le informará a la suscripción sobre el contrato desplegado.

F) Haga clic en “Add consumer” y siga las indicaciones en MetaMask.

G) Haga clic en “Close” una vez que se confirme la transacción y actualice la página. Ha completado con éxito este paso si ve un consumer agregado a su suscripción como en la imagen a continuación.

Paso 6: automatice su NFT con Chainlink Automation

En este paso, creará un time-based upkeep usando Chainlink Automation para actualizar dinámicamente el color de fondo y el emoji de su NFT.

A) Vaya a https://automation.chain.link/mumbai y conecte su billetera haciendo clic en “Connect wallet” en la esquina superior derecha. Si su billetera ya está conectada, puede omitir este paso.

B) Haga clic en “Register new Upkeep”.

C) Seleccione “Time-based”.

D) Pegue la dirección de su contrato y haga clic en “Next” (consulte el paso 5A si necesita ayuda para encontrar la dirección de su contrato).

E) Recibirá una alerta con el siguiente texto: “Couldn’t fetch ABI.” En una pestaña separada, regresa a Remix y selecciona la pestaña “Solidity compiler” en la barra lateral izquierda.

F) Asegúrese de que su contrato esté seleccionado en el menú desplegable “Contract” y haga clic en el botón “Copy ABI”.

G) Regrese a su upkeep registration y pegue el ABI en el cuadro de entrada y haga clic en “Next”.

H) En “Target function”, seleccione “requestRandomWords” y haga clic en “Next”.

I) En “Specify your time schedule”, ingrese la siguiente expresión CRON para generar un nuevo color de fondo para su NFT cada 2 minutos: */2 * * * * .

J) Haga clic en “Next”.

K) Asigne un nombre a su upkeep (p. ej., demostración de NFT dinámico) e ingrese un saldo inicial de 2 LINK.

L) Haga clic en “Register Upkeep” y apruebe la transacción para implementar el contrato de trabajo CRON en MetaMask.

M) Una vez que se aprueba la transacción, MetaMask le pedirá que confirme una segunda transacción para “Request time-based upkeep registration”.

N) Espere a que se confirme la transacción y haga clic en “View Upkeep”.

O) Ha completado con éxito este paso si ve “Active” en el estado de su mantenimiento recién creado. ¡Felicidades!

Paso 7: vea su NFT en OpenSea

A) Vaya a https://testnets.opensea.io/ y seleccione “Perfil” en el menú desplegable en la esquina superior derecha.

B) Conecte su billetera como se muestra a continuación. Es posible que deba firmar una transacción de OpenSea.

C) En su perfil, haga clic en el NFT etiquetado como “ETH Watching SVG”.

D) Haga clic en los tres puntos en la esquina superior derecha y seleccione “Refresh metadata”.

E) ¡Espere 30 segundos y luego actualice la página y debería ver su dNFT recién creado!

¡Felicidades! Has completado el tutorial. Cada dos minutos, hasta que sus suscripciones se queden sin fondos, su NFT verificará el precio de ETH y solicitará un nuevo color de fondo. La próxima vez que actualice los metadatos, debería ver algo un poco diferente.

Conclusión

Si has llegado hasta aquí, ¡felicidades! Deployó con éxito un NFT de actualización dinámica en Polygon Mumbai Testnet que usa Chainlink Price Feeds para rastrear el precio de Ethereum, Chainlink VRF para elegir un color de fondo aleatorio y Chainlink Automation para actualizar la imagen cada dos minutos.

--

--

Comunidad de Chainlink en español
Chainlink Community

Unofficial Chainlink Medium in Spanish. This account is not managed by the official team. Lowering the language barrier to entry to becoming part of Chainlink.