12 minutos de leitura
Visão geral
Os colecionáveis digitais compatíveis com a norma ERC-721 tornaram-se muito populares desde o lançamento dos Cryptokitties e têm vindo a avançar no sentido de uma adoção em massa nos últimos meses. Este guia irá explicar como criar e implementar um NFT (ERC-721) utilizando a norma OpenZeppelin.
Prefere um tutorial em vídeo? Acompanhe o Radek e aprenda a criar e implementar um ERC-721 (NFT) em 20 minutos.
O que irá fazer
- Saiba mais sobre os tokens não fungíveis (NFTs) e os seus casos de utilização
- Crie metadados para o token ERC-721 que vai criar
- Carregue os seus ficheiros para um sistema de armazenamento descentralizado (IPFS)
- Criar e implementar um token ERC-721 utilizando o Remix.IDE
O que vai precisar
- Um ponto de extremidade Quicknode (pode criar um gratuitamente aqui)
- Uma carteira Web3 (por exemplo, MetaMask, Coinbase Wallet, Phantom ou uma carteira compatível com WalletConnect) com ETH de teste (pode obter algum no Multi-Chain Quicknode Faucet)
- IPFS CLI instalado
- Um navegador da Web moderno (por exemplo, o Chrome)
O que é um token não fungível?
Fungível significa ser idêntico ou intercambiável. Por exemplo, os tokens da Ethereum, todos os membros de uma determinada classe de tokens, têm o mesmo valor. O mesmo se pode dizer dos tokens da Cardano. Os tokens fungíveis são intercambiáveis na proporção de 1:1.
Tendo isto em conta, os NFTs são únicos; cada um é diferente. Cada token possui características e valores únicos. Os tipos de objetos que podem ser NFTs incluem cartões colecionáveis, obras de arte, bilhetes de avião, etc. São todos claramente distinguíveis uns dos outros e não são intercambiáveis. Pense nos Tokens Não Fungíveis (NFTs) como objetos de coleção raros; cada um tem características únicas, atributos invulgares e, na maioria das vezes, os seus metadados.
O que é o ERC-721?
ERC significa «Ethereum Request for Comment» (Pedido de Comentário da Ethereum) e 721 é o número de identificação da proposta. Os ERC são normas ao nível das aplicações no ecossistema Ethereum; podem ser, por exemplo, uma norma de contrato inteligente para tokens, como o ERC-20. O autor de um ERC é responsável por alcançar um consenso com a comunidade Ethereum e, assim que a proposta for analisada e aprovada pela comunidade, torna-se uma norma. Pode acompanhar as propostas ERC mais recentes aqui. O ERC-721 foi criado para propor a funcionalidade de rastrear e transferir NFTs no âmbito dos contratos inteligentes.
O ERC-721 é um padrão aberto que descreve como criar tokens não fungíveis em blockchains compatíveis com a EVM (Máquina Virtual Ethereum); trata-se de uma interface padrão para tokens não fungíveis; possui um conjunto de regras que facilitam o trabalho com NFTs. Os NFTs não são apenas do tipo ERC-721; também podem ser tokens ERC-1155.
Segue-se o conjunto de funções e eventos definidos na norma ERC-721:
Funções do ERC-721
balanceOf: Esta função é utilizada para devolver o número de NFTs (Non-Fungible Tokens) detidos por um endereço específico.
ownerOf: Esta função devolve o endereço do proprietário de um token específico. Cada token ERC721 é único e é representado por um ID. Esta função permite que os utilizadores ou as aplicações determinem o proprietário do token com base no seu ID único.
safeTransferFrom (sem dados): Esta função transfere de forma segura a propriedade de um token específico de um endereço para outro. Esta função verifica se o destinatário é um contrato inteligente. Se for, este deve implementar uma função específica (onERC721Received) para aceitar a transferência.
transferFrom: Esta função é utilizada para transferir a propriedade de um token de um endereço para outro. É geralmente utilizada quando o remetente foi autorizado a transferir o token.
aprovar: Esta função é utilizada para autorizar um endereço a transferir um token específico. Isto permite transferências delegadas, em que um proprietário pode autorizar outra parte a transferir um token em seu nome.
getApproved: Esta função é utilizada para obter o endereço aprovado para um token específico. Se não existir nenhum endereço aprovado para o token, esta função devolverá um endereço nulo.
setApprovalForAll: Esta função permite que o proprietário de um ou mais tokens aprove ou revogue a autorização concedida a um operador para gerir todos os seus tokens.
isApprovedForAll: Esta função é utilizada para verificar se um operador está autorizado a gerir todos os tokens de um proprietário.
safeTransferFrom (com dados): Esta função é semelhante à safeTransferFrom (sem dados), mas inclui um parâmetro de dados adicional. Estes dados adicionais podem ser utilizados para transmitir informações suplementares durante a transferência, caso o destinatário seja um contrato inteligente. Esta função verifica também se o destinatário é um contrato inteligente e se este implementa a função onERC721Received.
Eventos ERC-721
Transferência: Este evento é emitido quando a propriedade de um token muda de um endereço para outro. O evento inclui detalhes sobre o remetente (de), o destinatário (para) e o token específico (pelo ID) que foi transferido. Este evento permite que ouvintes externos, como interfaces de utilizador ou outros contratos, reajam à transferência.
Aprovação: Este evento é acionado quando um endereço é aprovado para transferir um token específico. Inclui o atual proprietário do token (proprietário), o endereço aprovado que agora pode transferir o token (aprovado) e o token específico (por ID) cuja transferência foi aprovada. Este evento permite que as aplicações acompanhem as aprovações de tokens e reajam em conformidade.
ApprovalForAll: Este evento é emitido quando um proprietário aprova ou revoga a autorização concedida a um operador para gerir todos os seus tokens. Inclui o endereço do proprietário (owner), o endereço do operador (operator) e um valor booleano que indica se o operador foi aprovado ou não (approved). Este evento permite que as aplicações acompanhem quais os endereços a quem foram concedidos direitos para gerir todos os tokens de um determinado proprietário.
Casos de utilização dos tokens não fungíveis (NFTs)
-
Arte digital (ou arte física): As obras de arte são os casos de utilização mais populares dos NFTs. Os leilões de arte digital foram a primeira aplicação dos NFTs e continuam a crescer.
-
Jogos: Oferecer compras no jogo e itens colecionáveis de jogos.
-
Imobiliário: tokenização de imóveis e contratos inteligentes, bem como compra e venda.
-
Finanças: Instrumentos financeiros, como empréstimos, contratos de futuros e outras responsabilidades.
-
Títulos de software: Licenças de software para garantir a luta contra a pirataria e a proteção da privacidade.
-
Bilhetes para concertos/bilhetes para jogos desportivos: Para garantir que não ocorram fraudes na venda de bilhetes e que os fãs tenham um único local onde possam consultar experiências anteriores.
-
Conformidade com o KYC: Criação de um token para o KYC de um utilizador específico.
Obter ETH de teste
Agora que já sabemos o que são os tokens ERC-721 e como funcionam, vamos ver como podemos criar e implementar os nossos próprios tokens.
Vamos implementar o nosso contrato na rede de teste Ethereum Sepolia. Para começar, vais precisar da extensão do navegador MetaMask (ou de outra carteira web3 compatível; Phantom, compatível com WalletConnect) e de algum ETH de teste, que podes obter acedendo ao Quicknode Multi-Chain Faucet. Basta ligares a tua carteira ou colares o endereço e clicar em «Continuar». Ser-lhe-á pedido que partilhe um tweet para receber um bónus (recomendamos que o faça!); caso contrário, basta clicar em «Não, obrigado, envie-me apenas 0,05 ETH». Tenha em atenção que existe um requisito de saldo mínimo de 0,001 ETH na rede principal do Ethereum para utilizar as faucets EVM.

Adicionar ficheiros ao IPFS
Antes de escrever o nosso contrato NFT, precisamos de alojar a nossa obra de arte para o NFT e criar um ficheiro de metadados; para isso, vamos utilizar o IPFS — um sistema distribuído de armazenamento e partilha de ficheiros ponto a ponto. Existem vários métodos para interagir com o protocolo IPFS. Pode configurar e operar o IPFS no seu próprio sistema ou optar pelo Quicknode como uma solução mais simples. O Quicknode simplifica o seu acesso ao IPFS, gerindo a infraestrutura subjacente. Esta abordagem permite-lhe concentrar-se no seu conteúdo, libertando-o das responsabilidades de manter um nó IPFS local para a fixação de dados. Com o Quicknode, as complexidades técnicas são tratadas por si.
Abordamos as duas formas de carregar os seus ficheiros para o IPFS: utilizando a CLI padrão do IPFS ou o serviço simplificado do Quicknode IPFS.
Método padrão: Utilização da CLI do IPFS
Descarregue e instale a CLI do IPFS de acordo com o seu sistema operativo, seguindo o guia de instalação disponível na documentação do IPFS.
Seguem-se os passos para alojar a imagem e o ficheiro de metadados.
Passo 1: Criar um repositório IPFS
Inicie o repositório IPFS digitando o seguinte numa janela de terminal/cmd.
ipfs init
Passo 2: Iniciar o daemon do IPFS
Inicie o daemon do IPFS, abra uma janela separada do terminal/cmd e escreva o seguinte.
daemon IPFS
Passo 3: Adicionar uma imagem ao IPFS
Vá para a primeira janela do terminal e adicione a imagem ao IPFS (neste caso, art.png).
ipfs add art.png

Copie o hash que começa por Qm e adicione-lhe o prefixo«https://ipfs.io/ipfs/»; deve ficar mais ou menos assim : https://ipfs.io/ipfs/QmQEVVLJUR1WLN15S49rzDJsSP7za9DxeqpUzWuG4aondg
Passo 4: Adicionar o ficheiro JSON ao IPFS
Crie um ficheiro JSON, chamado nft.json, e guarde-o no mesmo diretório que a imagem.
Formato de ficheiro JSON:
{
"name": "NFT Art",
"description": "This image shows the true nature of NFT.",
"image": "https://ipfs.io/ipfs/QmZzBdKF7sQX1Q49CQGmreuZHxt9sVB3hTc3TTXYcVZ7jC"
}
Agora, adicione o ficheiro JSON.
ipfs add nft.json
Pegue no hash que começa por Qm e acrescente-lhe o prefixo«https://ipfs.io/ipfs/»; deve ficar mais ou menos assim: https://ipfs.io/ipfs/QmUFbUjAifv9GwJo7ufTB5sccnrNqELhDMafoEmZdPPng7
Guarda este URL. Vamos precisar dele para criar o nosso NFT.
Solução Quicknode IPFS: Uma alternativa mais simples
Para saber mais sobre os preços do Quicknode IPFS, consulte os nossos planos de preços aqui.
Se procura uma abordagem mais simples, o serviço IPFS da Quicknode oferece uma solução fácil de utilizar e eficiente para carregar os seus ativos NFT. Com a Quicknode, a complexidade da gestão da infraestrutura fica a cargo deles, permitindo-lhe concentrar-se no seu conteúdo, em vez de ter de se ocupar da manutenção de um nó IPFS local.
Para começar a utilizar o Quicknode para o IPFS, siga estes passos:
Passo 1: Iniciar sessão no Quicknode
Inicie sessão no Quicknode e selecione a opção IPFS na barra lateral à esquerda:

Passo 2: Adicionar uma imagem ao IPFS com o Quicknode
Carregue rapidamente o seu ficheiro de imagem arrastando-o e largando-o ou clicando para selecionar ficheiros na janela do Finder/Explorador de Ficheiros. Neste guia, utilizamos a imagem abaixo.

Após o upload, clique no nome do ficheiro no separador «Ficheiros » e clique no botão «Copiar URL IPFS ». Tal como se pode ver na imagem abaixo.
https://qn-shared.quicknode-ipfs.com/ipfs/QmQEVVLJUR1WLN15S49rzDJsSP7za9DxeqpUzWuG4aondg

Passo 3: Adicionar um ficheiro JSON ao IPFS com o Quicknode
Crie um ficheiro JSON chamado nft.json, substitua o seu URL do IPFS no imagem campo e guarde-o. Depois de guardar, carregue o seu ficheiro JSON para o IPFS, tal como no passo anterior.
{
"name": "NFT Art",
"description": "This image shows the true nature of NFT.",
"image": "https://qn-shared.quicknode-ipfs.com/ipfs/QmQEVVLJUR1WLN15S49rzDJsSP7za9DxeqpUzWuG4aondg"
}
Após o carregamento, clique no nome do ficheiro no separador «Ficheiros» e copie o URL do IPFS. Deve ser semelhante ao que se segue.
https://qn-shared.quicknode-ipfs.com/ipfs/QmeVHZzKGEDbEbG5MVz4hUucNf4qZTRfW18AgdJNTrv22m
Guarda este URL. Vamos precisar dele para criar o nosso NFT.
Criar o nosso próprio token
Por uma questão de facilidade e segurança, vamos utilizar o contrato ERC-721 da OpenZeppelin para criar o nosso NFT. Com a OpenZeppelin, não precisamos de escrever toda a interface ERC-721. Em vez disso, podemos importar o contrato da biblioteca e utilizar as suas funções.
Aceda ao Ethereum Remix IDE e crie um novo ficheiro Solidity, por exemplo, «MyToken.sol»
Cole o código seguinte no seu novo script Solidity:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts@5.0.0/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts@5.0.0/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts@5.0.0/token/ERC721/extensions/ERC721Burnable.sol";
import "@openzeppelin/contracts@5.0.0/access/Ownable.sol";
contract MyToken is ERC721, ERC721URIStorage, ERC721Burnable, Ownable {
constructor(address initialOwner)
ERC721("MyToken", "MTK")
Ownable(initialOwner)
{}
function safeMint(address to, uint256 tokenId, string memory uri)
public
onlyOwner
{
_safeMint(to, tokenId);
_setTokenURI(tokenId, uri);
}
// The following functions are overrides required by Solidity.
function tokenURI(uint256 tokenId)
public
view
override(ERC721, ERC721URIStorage)
returns (string memory)
{
return super.tokenURI(tokenId);
}
function supportsInterface(bytes4 interfaceId)
public
view
override(ERC721, ERC721URIStorage)
returns (bool)
{
return super.supportsInterface(interfaceId);
}
}
Explicação do código acima:
Linha 1: Especificação do tipo de licença SPDX como MIT. Isto indica que o código está licenciado ao abrigo da Licença MIT, que é uma licença de código aberto permissiva que permite que o código seja utilizado, modificado e distribuído com muito poucas restrições.
Linha 2: Declaração da versão do Solidity como ^0.8.20. Isto indica que o código foi escrito utilizando a versão 0.8.20 do Solidity ou uma versão compatível.
Linhas 4-7: Importação dos contratos necessários da biblioteca OpenZeppelin.
-
ERC721.sol: Este contrato é importado da biblioteca OpenZeppelin e representa a implementação básica da norma ERC721. A ERC721 é a norma para os tokens não fungíveis (NFTs).
-
ERC721URIStorage.sol: Este contrato estende o ERC721 e adiciona funcionalidades para armazenar e gerir URIs de metadados associados a NFTs. As URIs de metadados remetem normalmente para informações adicionais sobre o NFT.
-
ERC721Burnable.sol: Este contrato também amplia o ERC721 e adiciona a capacidade de queimar (destruir) NFTs. Oferece uma função para remover permanentemente NFTs de circulação, e apenas o proprietário pode invocá-la.
-
Ownable.sol: Este contrato é utilizado para controlo de acesso. Permite-lhe designar um proprietário com privilégios especiais no âmbito do contrato. O proprietário pode realizar determinadas ações que outros utilizadores não podem.
Linha 9: Iniciar o contrato denominado MyToken e referindo que estende os contratos ERC721, ERC721URIStorage e Ownable. Isto significa que o MyToken O contrato herda as funcionalidades e propriedades definidas nesses contratos.
Linha 10: A função construtora começa aqui. Os construtores são funções especiais em Solidity que são executadas apenas uma vez durante a implementação do contrato. Este construtor recebe um argumento, proprietário inicial, que é um endereço Ethereum.
Linha 11: Esta linha chama o construtor do contrato ERC721 com os argumentos «MyToken» e «MTK». Inicializa o contrato NFT com o nome «MyToken» e o símbolo «MTK».
Linha 12: Esta linha chama o construtor do contrato Ownable, definindo o proprietário inicial do contrato MyToken como o endereço fornecido como initialOwner.
Linha 15: Declaração da função safeMint com três argumentos: to (o endereço do destinatário do token NFT), tokenId (o identificador único do token) e uri (o URI do ficheiro JSON associado ao token). Esta função só pode ser chamada pelo proprietário do contrato (especificado pelo único proprietário modificador).
Linha 19: Criação de um novo token através da chamada à função _safeMint função herdada do contrato ERC721. Cria um novo token e atribui-o ao endereço do destinatário especificado.
Linha 20: Definir o URI do token (URI dos metadados) associado ao token utilizando o _setTokenURI função herdada da ERC721URIStorage contrato. O URI é definido com base no tokenId e no uri fornecidos.
Linhas 25-32: Implementação das substituições exigidas pelo Solidity para o ERC721 e ERC721URIStorage contratos. tokenURI é uma função que recupera o URI de metadados associado a um determinado tokenId. Está marcada como «public» e «view», o que indica que é uma função apenas de leitura e que pode ser chamada por qualquer pessoa.
Linhas 34-41: Implementação da função `supportsInterface`, que é exigida pela ERC721 e ERC721URIStorage contratos. Esta função verifica se um determinado «interfaceId» é suportado pelo contrato e devolve um valor booleano em conformidade.
Ao combinar estas funcionalidades e contratos, o código cria um contrato de token ERC721 personalizado denominado MyToken. Este contrato permite ao titular do contrato criar novos tokens de forma segura, associar-lhes URIs de metadados e suporta as interfaces necessárias definidas pela norma ERC721.
Agora, reserve um minuto para personalizar o contrato inteligente com os seus próprios dados, se assim o desejar. Pode atualizar o nome e o símbolo do token alterando a seguinte linha - ERC721("MyToken", "MTK").
Quando terminar, compile o contrato inteligente e implemente-o utilizando Provedor injetado (certifique-se de que seleciona a rede de teste Sepolia no Metamask antes de compilar o contrato). Em seguida, cole o endereço da sua carteira na caixa que se encontra junto ao Implementar botão para definir o proprietário inicial parâmetro da função construtora. Por fim, clique em Implementar no Remix.IDE.

Se receber uma mensagem de erro antes da implementação — «Este contrato pode ser abstrato» — certifique-se de que seleciona o contrato adequado no separador «Contrato».
Confirme a transação no Metamask:

Agora vai à secção «Contratos implementados» no Remix e expande o contrato implementado. Vais ver várias funções/métodos. Expande o safeMint função e adicione os seguintes detalhes:
- Introduza o endereço da sua carteira no campo _to.
- Introduza qualquer valor de número grande no campo _tokenId. Sugerimos que utilize «1», uma vez que representa o primeiro token a ser cunhado.
- Para o _uri No campo, introduza o URI do ficheiro JSON que corresponde ao método que utilizou nos passos anteriores:
- Se utilizou o método padrão da CLI do IPFS: utilize o URI que obteve após carregar o seu ficheiro no IPFS, conforme descrito na secção «Método padrão: Utilização da CLI do IPFS ». Este será o link do IPFS com o prefixo https://ipfs.io/ipfs/, seguido do hash do seu ficheiro.
- Se tiver escolhido o serviço IPFS da Quicknode: utilize o URI fornecido pela Quicknode após ter carregado o seu ficheiro na secção «Solução IPFS da Quicknode: uma alternativa mais fácil ». A Quicknode gera um URI único para o seu ficheiro, que deverá inserir aqui.

Clique em «transact» e confirme a transação no MetaMask. O processo pode demorar alguns minutos, mas pode sempre verificar se a transação foi executada através de um explorador de blocos, como o Etherscan. Agora já tem o NFT na cadeia Sepolia.
Pode consultar outros detalhes, como nome, símbolo, proprietário de, ou tokenURI introduzindo o ID do token que mencionámos anteriormente.

Conclusão
Parabéns por teres criado o teu próprio NFT! Ajuda os teus amigos artistas a colocarem os seus trabalhos artísticos na blockchain Ethereum, ou torna-te tu próprio um artista. Consulta o Wizard da OpenZeppelin para veres mais exemplos.
Subscreve a nossa newsletter para receberes mais artigos e guias sobre o Ethereum. Se tiveres algum comentário, não hesites em contactar-nos através do Twitter. Podes sempre conversar connosco no nosso servidor da comunidade Discord, onde encontrarás alguns dos programadores mais fantásticos que alguma vez conhecerás :)
Adoramos ❤️ os vossos comentários!
Diz-nos se tiveres algum comentário ou sugestão de novos temas. Adoraríamos saber a tua opinião.
