Přejít na hlavní obsah

Jak napsat a nasadit NFT (Část 1/3 ze série tutoriálů o NFT)

ERC-721
Alchemy
Solidity
chytré kontrakty
Začátečník
Sumi Mudgil
22. dubna 2021
13 minut čtení

Vzhledem k tomu, že NFT dostávají blockchain do povědomí veřejnosti, je nyní vynikající příležitost pochopit tento humbuk na vlastní kůži tím, že publikujete svůj vlastní NFT kontrakt (token ERC-721) na blockchainu Ethereum!

Alchemy je nesmírně hrdá na to, že pohání ta největší jména v prostoru NFT, včetně Makersplace (nedávno stanovili rekordní prodej digitálního uměleckého díla v Christie’s za 69 milionů dolarů), Dapper Labs (tvůrci NBA Top Shot a Crypto Kitties), OpenSea (největší světové tržiště s NFT), Zora, Super Rare, NFTfi, Foundation, Enjin, Origin Protocol, Immutable a dalších.

V tomto tutoriálu si projdeme vytvoření a nasazení chytrého kontraktu ERC-721 na testnetu Sepolia pomocí MetaMasku (opens in a new tab), Solidity (opens in a new tab), Hardhatu (opens in a new tab), Pinaty (opens in a new tab) a Alchemy (opens in a new tab) (nebojte se, pokud ještě nerozumíte tomu, co to všechno znamená – vysvětlíme si to!).

Ve 2. části tohoto tutoriálu si projdeme, jak můžeme náš chytrý kontrakt použít k ražení NFT, a ve 3. části si vysvětlíme, jak si své NFT zobrazit v MetaMasku.

A samozřejmě, pokud budete mít kdykoli nějaké dotazy, neváhejte se ozvat na Discordu Alchemy (opens in a new tab) nebo navštivte dokumentaci k NFT API od Alchemy (opens in a new tab)!

Krok 1: Připojení k síti Ethereum

Existuje spousta způsobů, jak zadávat požadavky na blockchain Ethereum, ale abychom si to usnadnili, použijeme bezplatný účet na Alchemy (opens in a new tab), vývojářské platformě a API pro blockchain, která nám umožňuje komunikovat s řetězcem Ethereum, aniž bychom museli provozovat vlastní uzly.

V tomto tutoriálu také využijeme vývojářské nástroje Alchemy pro monitorování a analytiku, abychom pochopili, co se děje pod pokličkou při nasazení našeho chytrého kontraktu. Pokud ještě nemáte účet na Alchemy, můžete se zdarma zaregistrovat zde (opens in a new tab).

Krok 2: Vytvoření aplikace (a API klíče)

Jakmile si vytvoříte účet na Alchemy, můžete si vygenerovat API klíč vytvořením aplikace. To nám umožní zadávat požadavky na testnet Sepolia. Pokud se chcete o testnetech dozvědět více, podívejte se na tento průvodce (opens in a new tab).

  1. Přejděte na stránku „Create App“ (Vytvořit aplikaci) na svém panelu Alchemy tak, že najedete myší na „Apps“ (Aplikace) v navigačním panelu a kliknete na „Create App“.

Create your app

  1. Pojmenujte svou aplikaci (my jsme zvolili „My First NFT!“), přidejte krátký popis, jako Chain (Řetězec) vyberte „Ethereum“ a jako síť zvolte „Sepolia“. Od Merge byly ostatní testnety ukončeny.

Configure and publish your app

  1. Klikněte na „Create app“ a je to! Vaše aplikace by se měla objevit v tabulce níže.

Krok 3: Vytvoření účtu (adresy) na Ethereu

K odesílání a přijímání transakcí potřebujeme účet na Ethereu. Pro tento tutoriál použijeme MetaMask, virtuální peněženku v prohlížeči, která se používá ke správě adresy vašeho účtu na Ethereu. Pokud chcete lépe porozumět tomu, jak fungují transakce na Ethereu, podívejte se na tuto stránku od Nadace Ethereum.

Účet na MetaMasku si můžete zdarma stáhnout a vytvořit zde (opens in a new tab). Při vytváření účtu, nebo pokud již účet máte, se ujistěte, že jste vpravo nahoře přepnuli na „Sepolia Test Network“ (abychom nepracovali se skutečnými penězi).

Set Sepolia as your network

Krok 4: Přidání etheru z faucetu

Abychom mohli nasadit náš chytrý kontrakt na testnet, budeme potřebovat nějaké falešné ETH. Chcete-li získat ETH, můžete přejít na faucet Sepolia (opens in a new tab) hostovaný společností Alchemy, přihlásit se, zadat adresu svého účtu a kliknout na „Send Me ETH“ (Pošlete mi ETH). Brzy poté byste měli vidět ETH na svém účtu v MetaMasku!

Krok 5: Kontrola zůstatku

Abychom si ověřili, že tam náš zůstatek je, vytvořme požadavek eth_getBalance (opens in a new tab) pomocí nástroje composer od Alchemy (opens in a new tab). Ten nám vrátí množství ETH v naší peněžence. Po zadání adresy vašeho účtu v MetaMasku a kliknutí na „Send Request“ (Odeslat požadavek) byste měli vidět podobnou odpověď:

{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"}

Poznámka Tento výsledek je ve Wei, nikoli v ETH. Wei se používá jako nejmenší nominální hodnota etheru. Převod z Wei na ETH je 1 eth = 1018 Wei. Pokud tedy převedeme 0xde0b6b3a7640000 do desítkové soustavy, dostaneme 1*1018 Wei, což se rovná 1 ETH.

Uf! Naše falešné peníze jsou všechny tam.

Krok 6: Inicializace našeho projektu

Nejprve budeme muset vytvořit složku pro náš projekt. Přejděte do příkazového řádku a zadejte:

mkdir my-nft cd my-nft

Nyní, když jsme ve složce našeho projektu, použijeme npm init k inicializaci projektu. Pokud ještě nemáte nainstalované npm, postupujte podle těchto pokynů (opens in a new tab) (budeme také potřebovat Node.js (opens in a new tab), takže si ho stáhněte také!).

npm init

Nezáleží na tom, jak odpovíte na instalační otázky; zde je pro referenci ukázka, jak jsme to udělali my:

Schvalte soubor package.json a můžeme jít na to!

Krok 7: Instalace Hardhatu (opens in a new tab)

Hardhat je vývojové prostředí pro kompilaci, nasazení, testování a ladění vašeho softwaru pro Ethereum. Pomáhá vývojářům při lokálním vytváření chytrých kontraktů a decentralizovaných aplikací (dapp) před jejich nasazením do živého řetězce.

Uvnitř našeho projektu my-nft spusťte:

npm install --save-dev hardhat

Další podrobnosti o pokynech k instalaci (opens in a new tab) najdete na této stránce.

Krok 8: Vytvoření projektu v Hardhatu

Uvnitř složky našeho projektu spusťte:

npx hardhat

Poté byste měli vidět uvítací zprávu a možnost vybrat si, co chcete udělat. Vyberte „create an empty hardhat.config.js“:

888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888 888 888 "88b 888P" d88" 888 888 "88b "88b 888 888 888 .d888888 888 888 888 888 888 .d888888 888 888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. 888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 👷 Welcome to Hardhat v2.0.11 👷‍ ? What do you want to do? … Create a sample project ❯ Create an empty hardhat.config.js Quit

Tím se nám vygeneruje soubor hardhat.config.js, ve kterém specifikujeme veškeré nastavení pro náš projekt (v kroku 13).

Krok 9: Přidání složek projektu

Abychom udrželi náš projekt organizovaný, vytvoříme dvě nové složky. Přejděte do kořenového adresáře vašeho projektu v příkazovém řádku a zadejte:

mkdir contracts mkdir scripts

  • contracts/ je místo, kde budeme uchovávat kód našeho chytrého kontraktu pro NFT

  • scripts/ je místo, kde budeme uchovávat skripty pro nasazení a interakci s naším chytrým kontraktem

Krok 10: Napsání našeho kontraktu

Nyní, když je naše prostředí nastaveno, přejdeme k zajímavějším věcem: psaní kódu našeho chytrého kontraktu!

Otevřete projekt my-nft ve svém oblíbeném editoru (my máme rádi VSCode (opens in a new tab)). Chytré kontrakty se píší v jazyce zvaném Solidity, který použijeme k napsání našeho chytrého kontraktu MyNFT.sol.‌

  1. Přejděte do složky contracts a vytvořte nový soubor s názvem MyNFT.sol

  2. Níže je kód našeho chytrého kontraktu pro NFT, který jsme založili na implementaci ERC-721 z knihovny OpenZeppelin (opens in a new tab). Zkopírujte a vložte níže uvedený obsah do svého souboru MyNFT.sol.

  3. Protože dědíme třídy z knihovny kontraktů OpenZeppelin, spusťte ve svém příkazovém řádku npm install @openzeppelin/contracts^4.0.0, abyste knihovnu nainstalovali do naší složky.

Takže, co tento kód přesně dělá? Pojďme si to rozebrat řádek po řádku.

Na začátku našeho chytrého kontraktu importujeme tři třídy chytrých kontraktů z OpenZeppelin (opens in a new tab):

  • @openzeppelin/contracts/token/ERC721/ERC721.sol obsahuje implementaci standardu ERC-721, kterou náš chytrý kontrakt pro NFT zdědí. (Aby byl váš chytrý kontrakt platným NFT, musí implementovat všechny metody standardu ERC-721.) Chcete-li se dozvědět více o zděděných funkcích ERC-721, podívejte se na definici rozhraní zde (opens in a new tab).

  • @openzeppelin/contracts/utils/Counters.sol poskytuje počítadla, která lze pouze inkrementovat nebo dekrementovat o jedničku. Náš chytrý kontrakt používá počítadlo ke sledování celkového počtu vyražených NFT a k nastavení jedinečného ID pro naše nové NFT. (Každému NFT vyraženému pomocí chytrého kontraktu musí být přiřazeno jedinečné ID – zde je naše jedinečné ID určeno jednoduše celkovým počtem existujících NFT. Například první NFT, které vyrazíme naším chytrým kontraktem, má ID „1“, naše druhé NFT má ID „2“ atd.)

  • @openzeppelin/contracts/access/Ownable.sol nastavuje řízení přístupu (opens in a new tab) k našemu chytrému kontraktu, takže NFT může razit pouze vlastník chytrého kontraktu (vy). (Poznámka: zahrnutí řízení přístupu je čistě na vašich preferencích. Pokud byste chtěli, aby kdokoli mohl razit NFT pomocí vašeho chytrého kontraktu, odstraňte slovo Ownable na řádku 10 a onlyOwner na řádku 17.)

Po našich příkazech importu následuje náš vlastní chytrý kontrakt pro NFT, který je překvapivě krátký – obsahuje pouze počítadlo, konstruktor a jedinou funkci! Je to díky našim zděděným kontraktům z OpenZeppelin, které implementují většinu metod, které potřebujeme k vytvoření NFT, jako je ownerOf, která vrací vlastníka NFT, a transferFrom, která převádí vlastnictví NFT z jednoho účtu na druhý.

V našem konstruktoru ERC-721 si všimnete, že předáváme 2 řetězce, „MyNFT“ a „NFT“. První proměnná je název chytrého kontraktu a druhá je jeho symbol. Každou z těchto proměnných si můžete pojmenovat, jak chcete!

Nakonec tu máme naši funkci mintNFT(address recipient, string memory tokenURI), která nám umožňuje razit NFT! Všimnete si, že tato funkce přijímá dvě proměnné:

  • address recipient specifikuje adresu, která obdrží vaše čerstvě vyražené NFT

  • string memory tokenURI je řetězec, který by měl odkazovat na dokument JSON popisující metadata NFT. Metadata NFT jsou tím, co mu skutečně vdechuje život a umožňuje mu mít konfigurovatelné vlastnosti, jako je název, popis, obrázek a další atributy. Ve 2. části tohoto tutoriálu popíšeme, jak tato metadata nakonfigurovat.

mintNFT volá některé metody ze zděděné knihovny ERC-721 a nakonec vrací číslo, které představuje ID čerstvě vyraženého NFT.

Krok 11: Připojení MetaMasku a Alchemy k vašemu projektu

Nyní, když jsme si vytvořili peněženku MetaMask, účet na Alchemy a napsali náš chytrý kontrakt, je čas tyto tři věci propojit.

Každá transakce odeslaná z vaší virtuální peněženky vyžaduje podpis pomocí vašeho jedinečného soukromého klíče. Abychom našemu programu toto oprávnění poskytli, můžeme náš soukromý klíč (a API klíč Alchemy) bezpečně uložit do souboru prostředí.

Chcete-li se dozvědět více o odesílání transakcí, podívejte se na tento tutoriál o odesílání transakcí pomocí Web3.

Nejprve nainstalujte balíček dotenv v adresáři vašeho projektu:

npm install dotenv --save

Poté vytvořte soubor .env v kořenovém adresáři našeho projektu a přidejte do něj svůj soukromý klíč z MetaMasku a HTTP URL pro API Alchemy.

  • Postupujte podle těchto pokynů (opens in a new tab) pro export vašeho soukromého klíče z MetaMasku

  • Níže se podívejte, jak získat HTTP URL pro API Alchemy, a zkopírujte si ho do schránky

Copy your Alchemy API URL

Váš soubor .env by nyní měl vypadat takto:

API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key (opens in a new tab)" PRIVATE_KEY="your-metamask-private-key"

Abychom je skutečně propojili s naším kódem, odkážeme se na tyto proměnné v našem souboru hardhat.config.js v kroku 13.

Necommitujte .env! Ujistěte se, že svůj soubor .env s nikým nesdílíte ani ho nevystavujete, protože tím ohrožujete své tajné údaje. Pokud používáte správu verzí, přidejte svůj .env do souboru gitignore (opens in a new tab).

Krok 12: Instalace Ethers.js

Ethers.js je knihovna, která usnadňuje interakci a zadávání požadavků na Ethereum tím, že obaluje standardní metody JSON-RPC uživatelsky přívětivějšími metodami.

Hardhat velmi usnadňuje integraci pluginů (opens in a new tab) pro další nástroje a rozšířenou funkcionalitu. Využijeme plugin Ethers (opens in a new tab) pro nasazení kontraktu (Ethers.js (opens in a new tab) má několik velmi čistých metod pro nasazení kontraktu).

V adresáři vašeho projektu zadejte:

npm install --save-dev @nomiclabs/hardhat-ethers ethers@^5.0.0

V dalším kroku budeme také vyžadovat ethers v našem souboru hardhat.config.js.

Krok 13: Aktualizace hardhat.config.js

Zatím jsme přidali několik závislostí a pluginů, nyní musíme aktualizovat hardhat.config.js, aby o nich náš projekt věděl.

Aktualizujte svůj hardhat.config.js tak, aby vypadal takto:

Krok 14: Kompilace našeho kontraktu

Abychom se ujistili, že zatím vše funguje, zkompilujme náš kontrakt. Úloha kompilace je jednou z vestavěných úloh Hardhatu.

Z příkazového řádku spusťte:

npx hardhat compile

Možná se vám zobrazí varování o tom, že ve zdrojovém souboru není uveden identifikátor licence SPDX (SPDX license identifier not provided in source file), ale s tím si nemusíte dělat starosti – doufejme, že vše ostatní vypadá dobře! Pokud ne, vždy můžete napsat na Discord Alchemy (opens in a new tab).

Krok 15: Napsání našeho skriptu pro nasazení

Nyní, když je náš kontrakt napsán a náš konfigurační soubor je připraven, je čas napsat náš skript pro nasazení kontraktu.

Přejděte do složky scripts/ a vytvořte nový soubor s názvem deploy.js, do kterého přidejte následující obsah:

Hardhat odvádí úžasnou práci při vysvětlování toho, co každý z těchto řádků kódu dělá, ve svém tutoriálu o kontraktech (opens in a new tab), jejich vysvětlení jsme převzali i sem.

const MyNFT = await ethers.getContractFactory("MyNFT");

ContractFactory v Ethers.js je abstrakce používaná k nasazení nových chytrých kontraktů, takže MyNFT je zde továrnou pro instance našeho kontraktu pro NFT. Při použití pluginu hardhat-ethers jsou instance ContractFactory a Contract ve výchozím nastavení připojeny k prvnímu podepisujícímu (signer).

const myNFT = await MyNFT.deploy();

Zavoláním deploy() na ContractFactory se zahájí nasazení a vrátí se Promise, který se vyhodnotí jako Contract. Toto je objekt, který má metodu pro každou z funkcí našeho chytrého kontraktu.

Krok 16: Nasazení našeho kontraktu

Konečně jsme připraveni nasadit náš chytrý kontrakt! Přejděte zpět do kořenového adresáře vašeho projektu a v příkazovém řádku spusťte:

npx hardhat --network sepolia run scripts/deploy.js

Poté byste měli vidět něco jako:

Contract deployed to address: 0x4C5266cCc4b3F426965d2f51b6D910325a0E7650

Pokud přejdeme na Etherscan pro Sepolii (opens in a new tab) a vyhledáme adresu našeho kontraktu, měli bychom vidět, že byl úspěšně nasazen. Pokud to nevidíte okamžitě, chvíli počkejte, protože to může nějakou dobu trvat. Transakce bude vypadat nějak takto:

View your transaction address on Etherscan

Adresa From (Od) by se měla shodovat s adresou vašeho účtu v MetaMasku a adresa To (Komu) bude uvádět „Contract Creation“ (Vytvoření kontraktu). Pokud klikneme na transakci, uvidíme adresu našeho kontraktu v poli To:

View your contract address on Etherscan

Jupííí! Právě jste nasadili svůj chytrý kontrakt pro NFT do řetězce Ethereum (testnet)!

Abychom pochopili, co se děje pod pokličkou, přejděme na kartu Explorer (Průzkumník) na našem panelu Alchemy (opens in a new tab). Pokud máte více aplikací Alchemy, nezapomeňte filtrovat podle aplikace a vybrat „MyNFT“.

View calls made “under the hood” with Alchemy’s Explorer Dashboard

Zde uvidíte hrstku volání JSON-RPC, která pro nás Hardhat/Ethers provedly pod pokličkou, když jsme zavolali funkci .deploy(). Dvě důležitá volání, která zde stojí za zmínku, jsou eth_sendRawTransaction, což je požadavek na skutečný zápis našeho chytrého kontraktu do řetězce Sepolia, a eth_getTransactionByHash, což je požadavek na přečtení informací o naší transakci na základě hashe (typický vzor při odesílání transakcí). Chcete-li se dozvědět více o odesílání transakcí, podívejte se na tento tutoriál o odesílání transakcí pomocí Web3.

To je pro 1. část tohoto tutoriálu vše. Ve 2. části budeme s naším chytrým kontraktem skutečně interagovat tím, že vyrazíme NFT, a ve 3. části vám ukážeme, jak si své NFT zobrazit ve vaší peněžence na Ethereu!