ÍNDICE
Criação e Implantação do Contrato Inteligente NFT
Criação de um Ponto de Extremidade do Optimism no QuickNode
Configurando sua Carteira Web3 com QuickNode
Compilando o Contrato Inteligente
Construir e implantar sua própria coleção NFT pode consumir tempo e dinheiro, especialmente com os preços do gás na Ethereum. Com o surgimento de soluções de camada 2 e RPCs baratos, esse não precisa ser o caso! Este tutorial explicará a construção de uma coleção NFT usando o padrão de token ERC-721. Você armazenará todos os ativos e metadados NFT em IPFS com QuickNode e implantará o contrato inteligente na rede de teste Goerli da Optimism.
Requisitos
- Ter conhecimentos básicos sobre o desenvolvimento em Solidity será útil, mas não é obrigatório.
- Conhecimentos básicos do padrão de token ERC-721 serão úteis, mas não é obrigatório.
- Conhecimentos básicos do IDE (Integrated Development Environment ou ambiente de desenvolvimento integrado) Remix serão úteis, mas não é obrigatório.
- Ativos de imagem e metadados das coleções NFT.
- MetaMask ou qualquer outra carteira e uma pequena quantidade de ETH de teste Goerli.
- Uma conta QuickNode gratuita.
O Que é o QuickNode IPFS?
O serviço IPFS (Interplanetary File System ou sistema de arquivo interplanetário) QuickNode permite armazenar dados descentralizados usando IPFS. Seus arquivos são automaticamente distribuídos e replicados em data centers (centro de dados) globais, garantindo redundância e distribuição por toda a rede.
O Que é Optimism?
O Optimism é uma solução de escalonamento de camada 2 que os desenvolvedores da Ethereum escolhem por sua velocidade e baixos custos de transação, mantendo total compatibilidade com a EVM (Ethereum Virtual Machine ou máquina virtual Ethereum).
Quais São as Etapas?
- Armazenar ativos e metadados NFT no IPFS do QuickNode IPFS.
- Criar e implantar um contrato ERC-721 na rede de teste Goerli da Optimism.
- Interagir com o contrato inteligente para cunhar NFTs.
- Ver seus NFTs no OpenSea.
Armazenando Arquivos em IPFS
Primeiro, você carrega suas imagens e metadados via QuickNode.
Abra o site do QuickNode e navegue até a seção “Storage” (armazenamento). Clique no botão ”Add a file” (adicionar um arquivo) e selecione o arquivo em sua máquina local.
Depois de fazer upload do arquivo, ele aparecerá assim, mostrando o nome do arquivo, CID, status e outras informações sobre o arquivo.
Faça upload de imagens para cada um dos NFTs. Você encontrará todas as imagens no GitHub. O resultado será semelhante a este.
Crie três arquivos de metadados JSON para armazenar informações sobre nossas coleções NFT.
-
0.json
: Coleção Agra -
1.json
: Coleção Delhi -
2.json
: Coleção Goa
O arquivo 0.json
deve ficar parecido com isto:
{
"name": "Agra",
"description": "Agra is a historic city in northern India, renowned for the iconic Taj Mahal, a marble mausoleum. It's a UNESCO World Heritage site and symbolizes love and architectural splendor. Agra also boasts Agra Fort and Fatehpur Sikri, both reflecting the city's Mughal heritage and attracting countless tourists for their cultural significance. (Agra é uma cidade histórica no norte da Índia, conhecida pelo icónico Taj Mahal, um mausoléu de mármore. É Património Mundial da UNESCO e simboliza o amor e o esplendor arquitetónico. Agra também possui o Forte de Agra e Fatehpur Sikri, ambos refletindo a herança Mughal da cidade e atraindo inúmeros turistas pelo seu significado cultural.)",
"image": "ipfs://Qmdr1zPumimEFKRkszo3nfFhGQ3UwofQXMbfDy1wd1gdLQ",
"properties": {
"rarity": "a bit rare (um pouco raro)",
"fanciness": 8
}
}
- name: contém o nome do NFT.
- description: contém a descrição do NFT.
- image: inclui o link para a imagem obtida anteriormente (URL IPFS).
- properties: abrange os vários atributos do NFT.
Crie os arquivos JSON restantes 1.json
e 2.json
, para as coleções de Delhi e Goa. Você encontrará o exemplo de metadados no GitHub.
Da mesma forma, carregue sua pasta de metadados para o QuickNode IPFS. Depois de carregado com sucesso, ele aparecerá conforme mostrado:
Você pode visualizar o arquivo JSON clicando no nome do arquivo no painel do QuickNode IPFS.
Agora clique em “COPY IPFS URL” (COPIAR URL IPFS) para copiar o CID e o link do gateway, permitindo o acesso ao arquivo. Por exemplo, este é o link para o arquivo 0.json
.
quicknode.quicknode-ipfs.com/ipfs/QmQQEjRjh..
Criação e Implantação do Contrato Inteligente NFT
Use a biblioteca de contratos OpenZeppelin para criar um contrato ERC-721 e implantá-lo na rede de teste Goerli da Optimism usando o IDE Remix. Certifique-se de ter algum Ether da Goerli, que você pode obter na torneira do Quicknode Optimism.
Crie um novo arquivo nomeado QuickNft.sol
no IDE Remix e cole o seguinte código:
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
error NFT_NOT_EXIST();
error YOU_ALREADY_MINTED_NFT();
error ALL_NFTS_ARE_MINTED();
contract QuickNft is ERC721Enumerable, Ownable {
uint256 public supplies = 500;
uint256 public minted;
string[] public cid = [
"ipfs://QmQQEjRjhUQPgJ51U2PKkwyRLgktzGWmX95vgUzWfBj5gb",
"ipfs://Qmch5VaqXCc5ZbwKuL2awac1vrBXBBPiB5h7WxtYKDZ7DS",
"ipfs://QmQg5wf1KHLDA1pEg51wK44UqPa6wJztTxppgb92VyPEbR"
];
constructor() ERC721("QuickNft", "QNN") {}
/**
* @notice função para colocar NFT no Opensea
* @param _cidId ID dos metadados do NFT que queríamos cunhar
* @dev tokenURI substitui a implementação do ERC721 da Openzeppelin ERC721 para a função tokenURI
* Essa função devolve o URI de onde podemos extrair os metadados para um determinado tokenId
*/
function tokenURI(
uint256 _cidId
) public view virtual override returns (string memory) {
if (_cidId >= cid.length) revert NFT_NOT_EXIST();
return string(abi.encodePacked(cid[_cidId]));
}
/**
* @notice função para cunhar o NFT
* @param _cidId CID ID para selecionar o metadado de sua escolha
*/
function mint(uint256 _cidId) public {
if (_cidId >= cid.length) revert NFT_NOT_EXIST();
if (minted + 1 > supplies) revert ALL_NFTS_ARE_MINTED();
_safeMint(msg.sender, minted);
unchecked {
++minted;
}
}
/**
* @notice função para obter o número total de NFTs cunhados
*/
function totalNftMinted() public view returns (uint256) {
return minted;
}
}
Vamos analisar o código do contrato inteligente do Solidity acima, linha por linha:
// SPDX-License-Identifier: MIT
Esta linha especifica o identificador de licença do contrato. Neste caso, indica que o contrato está sob licença MIT.
pragma solidity 0.8.17;
Este pragma define a versão do Solidity. Neste caso, o compilador utilizará a versão 0.8.17 do Solidity para a compilação.
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
Essas linhas importam os contratos necessários da biblioteca OpenZeppelin. O contrato ERC721Enumerable
ajuda a criar um token ERC-721 que suporta enumeração (listagem de tokens), o contrato Ownable
fornecerá funcionalidade básica de propriedade e o contrato Strings
será usado para manipular strings.
error NFT_NOT_EXIST();
error YOU_ALREADY_MINTED_NFT();
error ALL_NFTS_ARE_MINTED();
Essas linhas definem mensagens de erro personalizadas que usamos no contrato.
contract QuickNft is ERC721Enumerable, Ownable {
Esta linha define o contrato QuickNft
, que herda de ERC721Enumerable
e Ownable
, portanto o contrato será um token ERC-721 (com recursos de enumeração) e terá funcionalidade de propriedade.
uint256 public supply = 500;
uint256 public minted;
Estas linhas declaram duas variáveis de estado. supply
representa o número total de NFTs disponíveis para cunhagem e minted
monitora quantos NFTs as pessoas cunharam até o momento.
string[] public cid = [
"ipfs://QmQQEjRjhUQPgJ51U2PKkwyRLgktzGWmX95vgUzWfBj5gb",
"ipfs://Qmch5VaqXCc5ZbwKuL2awac1vrBXBBPiB5h7WxtYKDZ7DS",
"ipfs://QmQg5wf1KHLDA1pEg51wK44UqPa6wJztTxppgb92VyPEbR"
];
Um array cid
é definido contendo três URLs IPFS que representam os metadados dos NFTs.
constructor() ERC721("QuickNft", "QNN") {}
O construtor do contrato inicializa o token ERC-721 com “QuickNft” como nome e “QNN” como símbolo.
function tokenURI(uint256 _cidId) public view virtual override returns (string memory) {
if (_cidId >= cid.length) revert NFT_NOT_EXIST();
return string(abi.encodePacked(cid[_cidId]));
}
Esta função, tokenURI
, substitui o comportamento padrão do ERC721 e retorna a URL IPFS (URI de metadados) associada ao arquivo _cidId
.
function mint(uint256 _cidId) public {
if (_cidId >= cid.length) revert NFT_NOT_EXIST();
if (minted + 1 > supplies) revert ALL_NFTS_ARE_MINTED();
_safeMint(msg.sender, minted);
unchecked {
++minted;
}
}
A função mint
permite aos usuários cunhar NFTs. Ele verifica se o _cidId
é válido e se o número total de NFTs cunhados está dentro da oferta disponível. Se for esse o caso, ele cria um novo NFT para o chamador e incrementa a contagem minted
.
function totalNftMinted() public view returns (uint256) {
return minted;
}
A função totalNftMinted
retorna a contagem total de NFTs cunhados.
Caso você não tenha a rede de teste Goerli da Optimism configurada em sua carteira, siga estes passos:
Criando um Ponto de Extremidade Optimism no QuickNode
Para implantar um contrato inteligente na blockchain de teste da Optimism, Goerli, você precisará de um ponto de extremidade de API para se comunicar com a rede. Vá para o painel QuickNode para configurá-lo.
Uma vez logado, clique no botão "Create an endpoint" (criar um ponto de extremidade) e selecione a cadeia "Optimism" e a rede "Goerli".
Depois de criar seu ponto de extremidade, copie o link do provedor HTTP e mantenha-o à mão, pois você precisará dele em seguida.
Configurando sua carteira Web3 com QuickNode
Defina suas configurações de RPC se estiver usando MetaMask para implantar este contrato. Algumas carteiras compatíveis são Coinbase Wallet, Rainbow Wallet e TrustWallet.
Abra a MetaMask e clique no menu suspenso de rede na parte superior. Depois, clique no botão “Add Network” (adicionar rede).
Na parte inferior da página, clique em “Add a network manually” (adicionar uma rede manualmente) e preencha os seguintes dados:
- Nome da rede: Optimism Goerli Testnet
- Novo URL RPC: insira o URL HTTP do QuickNode que você recuperou anteriormente
- ID da cadeia: 420
- Símbolo da moeda: ETH
- URL do Explorador de Blocos: optimism-goerli.blockscout.com
Deve ficar parecido com isto:
Compilando o Contrato Inteligente
Abra o IDE Remix, copie e cole o código acima e navegue até a seção “Deploy” (implantar). Selecione “Injected Web3” como ambiente e implante-o escolhendo o nome correto do contrato. Você precisa selecionar a cadeia em sua carteira MetaMask. No nosso caso, estamos implantando-o na rede de teste Goerli da Optimism com ID de cadeia 420. Clique no botão “Deploy” (implantar).
Aprove a transação na MetaMask clicando no botão “Confirm” (confirmar). Assim que a transação for concluída, seu contrato será implantado.
Agora você pode executar funções como “mint NFT” (cunhar NFT) inserindo o ID CID. Também podemos recuperar o URI do NFT inserindo o ID CID.
Cunhando um NFT
Insira o CID ID do NFT que deseja cunhar e clique no botão “Confirm” (confirmar).
Depois de algum tempo, você poderá ver o NFT no OpenSea.
🎉BOOM🎉
Você concluiu todo o tutorial. Dê a si mesmo um tapinha merecido nas costas. Você aprendeu como:
- Criar uma coleção NFT usando o padrão Token ERC-721.
- Armazenar metadados NFT de maneira descentralizada usando QuickNode IPFS.
- Compilar e implantar um contrato inteligente na rede de teste Goerli da Optimism.
- Interigir com o contrato inteligente usando o Remix.
🎉 Bônus por persistir até o fim: use o código BUILD-AMB-15. Esse cupom oferece 1 mês do plano QuickNode Build ($ 49) gratuitamente 🎉
💥 Simplesmente UAU 💥
Se você achou este tutorial útil e agradável, considere compartilhá-lo com seus amigos. Espero que você tenha obtido novos insights ou até mesmo resolvido um desafio. Obrigado por ler e divirta-se!
Sinta-se à vontade para se conectar comigo no Twitter, GitHub e LinkedIn. Aceito suas sugestões e comentários!
WAGMI 🚀🚀
Este artigo foi escrito por Aayush Gupta e traduzido por Isabela Curado Nehme. Seu original pode ser lido aqui.
Oldest comments (0)