WEB3DEV

Cover image for Criando NFTs Dinâmicos na Tezos
Paulo Gio
Paulo Gio

Posted on

Criando NFTs Dinâmicos na Tezos

No último ano e meio, os tokens não fungíveis (NFTs) ganharam muita tração, mas a próxima geração de NFTs será dinâmica. NFTs dinâmicos nos dão a oportunidade de explorar um novo nível de interpretabilidade para NFTs e outros tokens, pois nos permite alterar os metadados de nosso NFT. A 'dinâmica' do NFT geralmente depende de algum evento online ou da vida real, como uma obra de arte ou atualização de personagem com base em dados meteorológicos, pontuações esportivas da vida real ou até mesmo atividades simples do usuário. Neste artigo, veremos um exemplo simples de um NFT dinâmico, combinando cartões colecionáveis e seus atributos com atualizações com base em dados esportivos de simulação.

Tezos e NFTs

Criar e gerenciar NFTs na Tezos é sustentável e prático, devido ao baixo consumo de energia e as baixas taxas da blockchain da Tezos. Além disso, o grande ecossistema existente na Tezos e os desenvolvedores, artistas e colecionadores a tornam uma ótima opção para NFTs. A maioria dos NFTs da Tezos podem ser encontrados em um mercado de NFTs da Tezos (hospedado/compatível), como Objkt, Kalamint e Rarible.

Comece implantando um contrato inteligente NFT na Tezos

Vamos usar o SmartPy para construir o contrato inteligente NFT no exemplo abaixo.

Um bom lugar para começar é o IDE Online SmartPy. Ele é executado diretamente no seu navegador e permite a você criar e testar seus contratos SmartPy.

Vamos construir o NFT usando o padrão FA2 da Tezos.

Aqui está um link (clique aqui) para o contrato inteligente completo que você pode usar para criar o NFT. Vamos orientá-lo em algumas das partes importantes do contrato inteligente abaixo.

Começamos importando o smartpy para o nosso projeto.

import smartpy as sp
Enter fullscreen mode Exit fullscreen mode

No código abaixo, estamos definindo a estrutura para os metadados do nosso token. Esses metadados nos ajudam a adicionar mídias e atributos ao nosso NFT.

class Token_meta_data:
    def __init__(self, config):
        self.config = config

    def get_type(self):
        return sp.TRecord(token_id = sp.TNat, token_info = sp.TMap(sp.TString, sp.TBytes))

    def set_type_and_layout(self, expr):
        sp.set_type(expr, self.get_type())
Enter fullscreen mode Exit fullscreen mode

O código a seguir nos permite interagir com o contrato inteligente do NFT para gerar o URI de metadados do token. Mercados de NFTs e carteiras usarão esses dados para renderizar o NFT corretamente.

class FA2_token_metadata(FA2_core):
    def set_token_metadata_view(self):
        def token_metadata(self, tok):
            """
            Retorne o URI de metadados do token para o token fornecido.

            Para uma implementação de referência, visualizações     
            dinâmicas parecem ser a escolha mais flexível.
            """
            sp.set_type(tok, sp.TNat)
            sp.result(self.data.token_metadata[tok])

        self.token_metadata = sp.offchain_view(pure = True, doc = "Obter os metadados de token")(token_metadata)
Enter fullscreen mode Exit fullscreen mode

O restante do código no contrato inteligente vinculado acima é um modelo pronto para permitir as interações com o NFT. Alguns exemplos são mencionados abaixo:

def count_tokens(self):
def does_token_exist(self, tok):
def all_tokens(self):
def total_supply(self, tok):
def is_operator(self, query):
Enter fullscreen mode Exit fullscreen mode

Agora vamos dar uma olhada em como podemos implantar nosso contrato inteligente na Tezos. Antes de podermos implantar qualquer coisa, vamos primeiro obter alguns ꜩ de teste da torneira (faucet) da Tezos. Depois de concluir a verificação CAPTCHA na página da torneira, você receberá uma chave. Mantenha este arquivo em um local seguro, pois ele contém a chave secreta e o mnemônico. Essas informações serão usadas na implantação do contrato inteligente que acabamos de criar.

Abra sua carteira Temple e importe a conta que obtivemos da torneira.

https://res.cloudinary.com/practicaldev/image/fetch/s--Ik9ZDa_2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fcyq5v2wsumaleskc5q2.png

Agora vamos realmente implantar o contrato. Clique em “Run” no IDE online do SmartPy. Ele executará seu contrato e produzirá algumas simulações no painel adjacente. Lá você encontrará a opção “Deploy Michelson Contract”:

https://res.cloudinary.com/practicaldev/image/fetch/s--KhXzmalc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/flwkw73l3ffy4uq75t88.png

Siga as etapas subsequentes e você poderá concluir a implantação do contrato.

Agora vamos aprender sobre o Revise e como ele capacita você e seus NFTs.

Introdução ao Revise

Revise é uma plataforma que permite criar NFTs dinâmicos. Os NFTs atuais são bem estáticos. Depois de comprá-los, eles não mudam. O que você vê é o que você recebe. NFTs dinâmicos são capazes de reagir ao mundo exterior, aos dados, às interações do usuário, etc. Eles são capazes de mudar e evoluir ao longo do tempo.

Vamos usar o Revise para criar suas próprias coleções de NFTs de times de futebol, para então adicionar NFTs nestas coleções e permitir que eles mudem dinamicamente.

Criar um repositório

Vamos clonar este repositório do GitHub para começar. O repositório é um projeto Javascript vazio com o revise-sdk adicionado ao gerenciador de pacotes. Depois de fazer o cd na pasta do projeto, você pode executar npm install para instalar todas as dependências. Vamos criar um arquivo index.js. Escreveremos todo o nosso código neste arquivo, usaremos node index.js para executar o programa.

Copie e cole o seguinte código no arquivo index.js.

const { Revise } = require("revise-sdk");
const AUTH_TOKEN = "...COLE SEU TOKEN DE AUTENTICAÇÃO AQUI...";
const revise = new Revise({auth: AUTH_TOKEN});

async function run() {

    // escreva seu código aqui

}
run()
Enter fullscreen mode Exit fullscreen mode

Nas primeiras linhas, estamos importando o Revise-sdk e adicionando nosso token de autenticação (mais sobre como obter este token abaixo). Na terceira linha, estamos instanciando o objeto revise. Agora podemos usar este objeto para chamar todas as funções necessárias para completar o exercício. As funções do Revise são principalmente assíncronas, então criamos uma função run que é assíncrona e pode chamar as funções do Revise usando a palavra-chave await. Isso tornará nosso código mais legível e fácil de manter.

💡 Você pode gerar o token de autenticação em https://app.revise.network. Para obter mais detalhes, consulte a próxima seção deste artigo.

Gerar Chave de API (token de autenticação)

Antes de continuarmos a escrever o restante do código, vamos pegar uma chave de autenticação. Visite Revise e clique em “Get Started” (Iniciar). Depois de criar uma conta e fazer login, você verá o link "Generate API Key" no cabeçalho. Clique nele, agora você poderá gerar a chave de API (token de autenticação). Copie a chave que é mostrada na tela e guarde-a em um lugar seguro. Esta chave não é armazenada nos servidores da Revise por motivos de segurança. Se você perder a chave, ela será perdida permanentemente. Você sempre pode voltar e gerar uma nova chave.

https://res.cloudinary.com/practicaldev/image/fetch/s--SBXJFnhS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0qejgpvs4px3345d7giq.png

Vamos substituir o AUTH_TOKEN no código acima pela chave que acabamos de gerar. Agora estamos prontos para começar a escrever o NFT dinâmico de jogador.

Adicionar uma Coleção

Para começar, vamos criar uma coleção chamada “Meu Time de Futebol Dinâmico”. Esta coleção pode ter vários NFTs. Cada NFT é um cartão de negociação do jogador. Para fazer a coleção, vamos chamar a função addCollection. Teremos que passar dois parâmetros: o nome da coleção e o URI da coleção. O collectionURI é um nome de projeto exclusivo que pode ser usado para gerar links para o NFT (o motivo pelo qual precisamos desses links é descrito posteriormente). Temos que garantir que o URI seja único e uma única palavra. Por ex. "meutimedefutebol" é um URI de coleção válido, "meu time de futebol" não. Adicione o seguinte código ao seu index.js dentro da função run.

const collection = await revise.addCollection({name: "Meu Time de Futebol Dinâmico", uri: "..CRIE SEU URI ÚNICO"})

// Nome da coleção: use qualquer nome que desejar para sua coleção (isso é mostrado no mercado)
// Collection_URI  : Use um nome exclusivo (sem espaços ou caracteres especiais)
//              isso irá gerar um link exclusivo para sua coleção
//              por exemplo se você escolher "meujogadordinamico12345"
//              sua baseURI será "meujogadordinamico12345.revise.link"
Enter fullscreen mode Exit fullscreen mode

Adicionar um NFT

Agora vamos adicionar nosso primeiro NFT de jogador. Usaremos a função addNFT para criar nosso jogador. Adicione o código a seguir à sua função de execução abaixo da chamada de função addCollection.

const nft = await revise.addNFT({
    image: 'https://revise-testing.fra1.cdn.digitaloceanspaces.com/players/bronze.png',
    name: 'Kylian Mbappe',
    tokenId: '1',
    description: 'Atacante com habilidades excepcionais. Uma lenda para ter no seu time!'
  }, [
    {team: "PSG"}, {position: "Forward"}, {level: "Bronze"}, {offense: "75"}, {defense: "45"}, {stamina: "76"}, {skill: "71"}
  ], collection.id)

console.log(nft)
Enter fullscreen mode Exit fullscreen mode

Estamos passando parâmetros para a imagem do nosso jogador, como nome, descrição, tokenId e algumas propriedades. Também estamos passando o collectionId que recebemos depois de criar nossa coleção para o código anterior. tokenId é o ID exclusivo do seu NFT na blockchain. Isso ajuda a blockchain e os mercados a distinguir entre os NFTs que fazem parte da mesma coleção. Dois NFTs não devem ter o mesmo tokenId. Podemos adicionar qualquer quantidade de dados personalizados aos nossos NFTs por meio de seus atributos. Como você pode ver no trecho acima, adicionamos "equipe", "posição", ataque", "defesa", "resistência" etc. Você pode adicionar qualquer número de atributos aqui.

Executar

O estado final do nosso arquivo index.js deve ficar assim agora.

const { Revise } = require("revise-sdk");
const AUTH_TOKEN = "...COLE SEU TOKEN DE AUTENTICAÇÃO AQUI...";
const revise = new Revise({auth: AUTH_TOKEN});

async function run() {

    const collection = await revise.addCollection({name: "Meu Time de Futebol Dinâmico", uri: "..CRIE SEU URI ÚNICO"})

    const nft = await revise.addNFT({
    image: 'https://revise-testing.fra1.cdn.digitaloceanspaces.com/players/bronze.png',
    name: 'Kylian Mbappe',
    tokenId: '1',
    description: 'Atacante com habilidades excepcionais. Uma lenda para ter no seu time!'
  }, [
    {team: "PSG"}, {position: "Forward"}, {level: "Bronze"}, {offense: "75"}, {defense: "45"}, {stamina: "76"}, {skill: "71"}
  ], collection.id)

console.log(nft)

}
run()
Enter fullscreen mode Exit fullscreen mode

Vamos executar este arquivo para criar uma coleção e adicionar nosso primeiro NFT. Execute node index.js em seu terminal. A saída esperada é um id conforme mostrado abaixo.

https://res.cloudinary.com/practicaldev/image/fetch/s--nddDjmOB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/colp44rtlzrgpkbtnw0g.png

O comando que você executou anteriormente deve gerar o id para o NFT que acabamos de criar. O ID é o identificador único para este NFT, usaremos este nftId para buscar e atualizar nosso jogador. Vamos armazenar esse ID cuidadosamente.

💡 Observação: o tokenId e o nftId são diferentes. tokenId é usado por mercados e carteiras para identificar seu NFT. nftId é usado pela Revise para identificar e controlar o NFT.

Visite o painel do Revise para ver seu NFT de jogador em ação.

https://res.cloudinary.com/practicaldev/image/fetch/s--CN3xpSv7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dxrgsdou6e9s2lkkauq2.png

Clique no botão “View” para ver seu NFT e ele deve aparecer com a imagem em Bronze.

https://res.cloudinary.com/practicaldev/image/fetch/s--NKscgbBs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0lprdax1ldwkasxcjfk2.png

Adicionando recursos dinâmicos ao seu NFT

Agora que criamos nosso primeiro NFT de jogador, vamos dinamizá-lo mudando seus aspectos.

Crie um novo arquivo chamado levels.js. Cole o seguinte código no arquivo.

const { Revise } = require("revise-sdk");
const AUTH_TOKEN = "...AUTH_TOKEN...";
const revise = new Revise({auth: AUTH_TOKEN});

const API = async function() {
  const options = [
    {level: 'Silver', offense: '82', defense: '51', stamina: '82', skill: '79', image: "https://revise-testing.fra1.cdn.digitaloceanspaces.com/players/silver.png"},
    {level: 'Gold', offense: '98', defense: '64', stamina: '92', skill: '87', image: "https://revise-testing.fra1.cdn.digitaloceanspaces.com/players/gold.png"}
  ]
  const randomIndex =  Math.floor(Math.random() * 2)
  return options[randomIndex];
}

async function run() {

  revise.every('2m').listenTo(API).start(async (data) => {
    const player = await revise.fetchNFT("0d6cee67-d3c1-41d5-bd57-ebbe4d34ebd3") //Altere o ID do NFT para o seu
    revise.nft(player)
      .setProperty("level", data.level)
      .setProperty("offense", data.offense)
      .setProperty("defense", data.defense)
      .setProperty("stamina", data.stamina)
      .setProperty("skill", data.skill)
      .setImage(data.image)
      .save()

            console.log(`O jogador ${player.name} está agora no nível ${data.level}`)
  })

}
run()
Enter fullscreen mode Exit fullscreen mode

No código acima, estamos configurando a automação que buscará um nível a cada 2 minutos e atualizará os atributos e imagem do nosso jogador. Execute o arquivo acima executando node levels.js. O programa será executado automaticamente e evoluirá nosso NFT de jogador em segundo plano. Você deve ser capaz de ver o jogador mudar seu nível para Silver ou Gold e os atributos subseqüentes e todas as versões antigas (revisões) do NFT também.

https://res.cloudinary.com/practicaldev/image/fetch/s--t0wFso4R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/egalsek0h092gqan8k4z.png

Parabéns por criar sua coleção e NFT dinâmicos de futebol!

Se você quiser saber mais ou explorar oportunidades de criação com o Revise, agende uma ligação conosco aqui ou entre em nosso Discord ou envie-nos uma mensagem no Twitter.

Artigo original publicado por Jelly Woman. Traduzido por Paulinho Giovannini.

Top comments (0)