Jak razit NFT (Část 2/3 ze série tutoriálů o NFT)
„Ražení nezaměnitelného tokenu (NFT)“ je akt publikování jedinečné instance vašeho tokenu ERC-721 na blockchainu. Pomocí našeho chytrého kontraktu z 1. části této série tutoriálů o NFT procvičíme naše dovednosti v oblasti Web3 a vyrazíme NFT. Na konci tohoto tutoriálu budete schopni razit tolik NFT, kolik si jen vaše srdce (a peněženka) bude přát!
Začněme!
Krok 1: Instalace Web3
Pokud jste postupovali podle prvního tutoriálu o vytváření vašeho chytrého kontraktu pro nezaměnitelný token (NFT), už máte vše, co potřebujete: projekt Hardhat 3 s pluginem Ethers (otevře se v nové záložce) a ethers.js (otevře se v nové záložce), což je knihovna, která usnadňuje vytváření požadavků na blockchain Etherea. Náš kód pro ražení napíšeme jako skript pro Hardhat, takže znovu použije nastavení sítě Sepolia a hodnoty API_URL a PRIVATE_KEY z 1. části — není třeba instalovat nic nového.
Krok 2: Vytvoření souboru mint-nft.js
Ve svém adresáři scripts vytvořte soubor mint-nft.js a přidejte následující řádky kódu:
import { network } from "hardhat"
const { ethers } = await network.create()
Stejně jako v našem skriptu pro nasazení se network.create() připojí k síti, kterou zvolíte pomocí --network při spuštění skriptu, a poskytne nám pro ni objekt ethers.
Krok 3: Získání ABI vašeho kontraktu
Naše aplikační binární rozhraní (ABI) kontraktu je rozhraní pro interakci s naším chytrým kontraktem. Více se o můžete dozvědět v glosáři. Hardhat pro nás automaticky vygeneruje ABI při kompilaci kontraktu a uloží jej do souboru artifacts/contracts/MyNFT.sol/MyNFT.json. Plugin Hardhat Ethers jej odtud pro nás přečte, když v kroku 5 vytvoříme instanci našeho kontraktu, takže jej nemusíme načítat sami.
Pokud chcete ABI vidět, můžete si jej vypsat do konzole. Z kořenového adresáře vašeho projektu spusťte:
node -p "JSON.stringify(require('./artifacts/contracts/MyNFT.sol/MyNFT.json').abi)"
Krok 4: Konfigurace metadat pro vaše NFT pomocí IPFS
Pokud si pamatujete z našeho tutoriálu v 1. části, funkce našeho chytrého kontraktu mintNFT přijímá parametr tokenURI, který by měl odkazovat na dokument JSON popisující metadata nezaměnitelného tokenu (NFT) — což je to, co NFT skutečně oživuje a umožňuje mu mít konfigurovatelné vlastnosti, jako je název, popis, obrázek a další atributy.
Interplanetary File System (IPFS) je decentralizovaný protokol a peer-to-peer síť pro ukládání a sdílení dat v distribuovaném souborovém systému.
K uložení našeho aktiva NFT a metadat použijeme Pinata, pohodlné rozhraní pro programování aplikací (API) a sadu nástrojů pro IPFS, abychom zajistili, že naše NFT bude skutečně decentralizované. Pokud nemáte účet na Pinata, zaregistrujte si bezplatný účet zde (otevře se v nové záložce) a dokončete kroky k ověření vašeho e-mailu.
Jakmile si vytvoříte účet:
-
Přejděte na stránku Files (otevře se v nové záložce) a klikněte na tlačítko „Add“ v pravém horním rohu stránky.
-
Nahrajte obrázek na Pinata — to bude obrazové aktivum pro vaše NFT. Aktivum si můžete pojmenovat, jak chcete. Ujistěte se, že jej nahráváte na veřejné IPFS: soubory na Private IPFS (otevře se v nové záložce) nemohou být načteny peněženkami a tržišti, která vaše NFT zobrazují.
-
Po nahrání uvidíte soubor v seznamu na stránce Files spolu s jeho CID (identifikátor obsahu). Zkopírujte si CID. Své nahrané soubory si můžete prohlédnout na adrese:
https://gateway.pinata.cloud/ipfs/<CID>, nebo prostřednictvím vyhrazené brány uvedené v postranním panelu Pinata pod „Gateways“. Obrázek, který jsme použili na IPFS, najdete například zde (otevře se v nové záložce).
Nyní budeme chtít na Pinata nahrát ještě jeden dokument. Ale než to uděláme, musíme ho vytvořit!
Ve svém kořenovém adresáři vytvořte nový soubor s názvem nft-metadata.json a přidejte následující kód ve formátu JSON:
{
"attributes": [
{
"trait_type": "Breed",
"value": "Maltipoo"
},
{
"trait_type": "Eye color",
"value": "Mocha"
}
],
"description": "The world's most adorable and sensitive pup.",
"image": "ipfs://QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb",
"name": "Ramses"
}
Data v JSON můžete libovolně měnit. Můžete odebírat nebo přidávat položky do sekce atributů. Nejdůležitější je ujistit se, že pole image ukazuje na umístění vašeho obrázku na IPFS ve formátu ipfs://<image-CID> — jinak bude vaše NFT obsahovat fotku (velmi roztomilého!) psa.
Jakmile dokončíte úpravy souboru JSON, uložte jej a nahrajte na Pinata podle stejných kroků, jaké jsme udělali při nahrávání obrázku. Zkopírujte si také CID souboru nft-metadata.json; budeme ho potřebovat v kroku 9.
Krok 5: Vytvoření instance vašeho kontraktu
Nyní, abychom mohli s naším kontraktem interagovat, musíme v našem kódu vytvořit jeho instanci. K tomu budeme potřebovat adresu našeho kontraktu, kterou náš skript pro nasazení vypsal v 1. části. Můžete ji také najít na Etherscan (otevře se v nové záložce) nebo Blockscout (otevře se v nové záložce) vyhledáním adresy, kterou jste použili k nasazení kontraktu.
Ve výše uvedeném příkladu je adresa našeho kontraktu 0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778.
Dále použijeme metodu getContractAt z pluginu Hardhat Ethers k vytvoření našeho kontraktu pomocí jeho názvu (což mu řekne, které aplikační binární rozhraní (ABI) má použít) a jeho adresy. Do souboru mint-nft.js přidejte následující kód a nahraďte adresu svou vlastní:
const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
const nftContract = await ethers.getContractAt("MyNFT", contractAddress)
Krok 6: Aktualizace souboru .env
Každá transakce, kterou odešleme, musí být podepsána soukromým klíčem vašeho účtu. Pokud jste dokončili 1. část tutoriálu, náš soubor .env by už měl vypadat takto:
API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY="your-metamask-private-key"
Není třeba přidávat vaši veřejnou adresu: ethers ji zjistí ze soukromého klíče.
Krok 7: Vytvoření vaší transakce
Nejprve definujme funkci s názvem mintNFT(tokenURI) a vytvořme naši transakci provedením následujícího:
-
Získejte účet, ze kterého transakci odesíláme.
ethers.getSigners()vrací účty nakonfigurované pro síť, což je na síti Sepolia účet, jehož soukromý klíč je v.env. Vzhledem k tomu, žemintNFTjeonlyOwner, musí to být stejný účet, který kontrakt nasadil. -
Zavolejte funkci
mintNFTna instanci našeho kontraktu s naší vlastní adresou jako příjemcem a URI metadat. Toto je výpočet, který chceme v této transakci provést — což je v tomto případě ražení nezaměnitelného tokenu (NFT).
Nemusíte sami zjišťovat nonce (počet transakcí odeslaných z vaší adresy, což zabraňuje útokům typu replay), limit gasu ani poplatky: ethers je před odesláním transakce načte nebo odhadne.
Váš soubor mint-nft.js by nyní měl vypadat takto:
import { network } from "hardhat"
const { ethers } = await network.create()
const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
const nftContract = await ethers.getContractAt("MyNFT", contractAddress)
async function mintNFT(tokenURI) {
const [signer] = await ethers.getSigners()
// Odeslat transakci. ethers za nás vyplní nonce, limit gasu a poplatky.
const tx = await nftContract.mintNFT(signer.address, tokenURI)
}
Krok 8: Podepsání transakce
Protože je síť nakonfigurována s naším soukromým klíčem, ethers jím transakci před odesláním automaticky podepíše.
Volání mintNFT se vrátí, jakmile je transakce odeslána, a poskytne nám hash transakce, který můžeme použít k ověření, že naše transakce byla vytěžena a nebyla sítí zahozena. tx.wait() pak čeká, dokud není transakce zahrnuta do bloku. Přidali jsme také určitou kontrolu chyb, abychom věděli, zda naše transakce úspěšně prošla.
import { network } from "hardhat"
const { ethers } = await network.create()
const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
const nftContract = await ethers.getContractAt("MyNFT", contractAddress)
async function mintNFT(tokenURI) {
const [signer] = await ethers.getSigners()
try {
// Odeslat transakci. ethers za nás vyplní nonce, limit gasu a poplatky.
const tx = await nftContract.mintNFT(signer.address, tokenURI)
console.log("The hash of your transaction is:", tx.hash)
// Počkat, až bude transakce zahrnuta do bloku
const receipt = await tx.wait()
console.log("Your NFT was minted in block", receipt.blockNumber)
} catch (err) {
console.log("Something went wrong when submitting your transaction:", err)
}
}
Krok 9: Zavolání mintNFT a spuštění node mint-nft.js
Pamatujete si na soubor nft-metadata.json, který jste nahráli na Pinata? Získejte jeho CID z Pinata a předejte ipfs://<metadata-CID> jako parametr funkci mintNFT. Peněženky a tržiště překládají URI ipfs:// prostřednictvím brány IPFS podle vlastního výběru, takže váš nezaměnitelný token (NFT) nezávisí na žádné jediné bráně.
Dvakrát zkontrolujte, že zkopírované CID odkazuje na váš nft-metadata.json, načtením
https://gateway.pinata.cloud/ipfs/<metadata-CID>do samostatného okna. Stránka by měla vypadat podobně jako na snímku obrazovky níže:
Vaše stránka by měla zobrazovat metadata ve formátu json
Celkově by váš kód měl vypadat nějak takto:
import { network } from "hardhat"
const { ethers } = await network.create()
const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
const nftContract = await ethers.getContractAt("MyNFT", contractAddress)
async function mintNFT(tokenURI) {
const [signer] = await ethers.getSigners()
try {
// Odeslat transakci. ethers za nás vyplní nonce, limit gasu a poplatky.
const tx = await nftContract.mintNFT(signer.address, tokenURI)
console.log("The hash of your transaction is:", tx.hash)
// Počkat, až bude transakce zahrnuta do bloku
const receipt = await tx.wait()
console.log("Your NFT was minted in block", receipt.blockNumber)
} catch (err) {
console.log("Something went wrong when submitting your transaction:", err)
}
}
await mintNFT("ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP")
Nyní spusťte skript proti síti Sepolia, abyste vyrazili své NFT:
npx hardhat run scripts/mint-nft.js --network sepolia
Po několika sekundách byste měli ve svém terminálu vidět odpověď podobnou této:
The hash of your transaction is: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8
Your NFT was minted in block <block number>
Chcete-li zobrazit podrobnosti o vaší transakci, vyhledejte její hash na Etherscan (otevře se v nové záložce) nebo Blockscout (otevře se v nové záložce).
Zobrazení hashe vaší transakce NFT na Etherscan
A to je vše! Nyní jste nasadili A vyrazili NFT na blockchainu Etherea
Pomocí mint-nft.js můžete razit tolik NFT, kolik si jen vaše srdce (a peněženka) bude přát! Jen se ujistěte, že předáváte nové tokenURI popisující metadata NFT (jinak nakonec vytvoříte spoustu identických s různými ID).
Pravděpodobně byste se chtěli svým NFT pochlubit ve své peněžence — takže se určitě podívejte na 3. část: Jak zobrazit své NFT ve vaší peněžence!
