Ir diretamente para o conteúdo principal

Como criar e implementar um ERC-721 (NFT)

Atualizado em
26 de novembro de 2025

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.
Subscreve o nosso canal do YouTube para veres mais vídeos!

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.

Cadeia Multi-Faucet da Quicknode

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

Metadados de obras de arte NFT

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

informações

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:

Visão geral do IPFS no Quicknode

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.

Metadados de obras de arte NFT

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

Imagem no painel do Quicknode IPFS

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.

Separador «Implantação» do 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:

Janela do MetaMask a apresentar os detalhes da transação

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:


  1. Introduza o endereço da sua carteira no campo _to.
  2. Introduza qualquer valor de número grande no campo _tokenId. Sugerimos que utilize «1», uma vez que representa o primeiro token a ser cunhado.
  3. Para o _uri No campo, introduza o URI do ficheiro JSON que corresponde ao método que utilizou nos passos anteriores:

Captura de ecrã da função safeMint

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.

Interações com o contrato MyToken no Remix.IDE

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.

Partilhe este guia