Přeskočit na hlavní obsah

Jak napsat a nasadit NFT (část 1/3 ze série výukových programů o NFT)

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

Jelikož NFT přibližují blockchain široké veřejnosti, je to skvělá příležitost, abyste pochopili ten humbuk kolem a sami si publikovali svůj vlastní NFT kontrakt (token ERC-721) na ethereovém blockchainu!

Společnost Alchemy je nesmírně hrdá na to, že pohání největší jména v oblasti NFT, včetně Makersplace (nedávno stanovila rekord v prodeji digitálních uměleckých děl v aukční síni Christie's za 69 milionů dolarů), Dapper Labs (tvůrci NBA Top Shot a Crypto Kitties), OpenSea (největší světové NFT tržiště), Zora, Super Rare, NFTfi, Foundation, Enjin, Origin Protocol, Immutable a dalších.

V tomto výukovém programu si projdeme vytvoření a nasazení chytrého kontraktu ERC-721 v testovací síti Sepolia pomocí MetaMask (opens in a new tab), Solidity (opens in a new tab), Hardhat (opens in a new tab), Pinata (opens in a new tab) a Alchemy (opens in a new tab) (nebojte se, pokud zatím nechápete, co z toho co znamená – všechno vám vysvětlíme!).

Ve 2. části tohoto výukového programu si projdeme, jak můžeme pomocí našeho chytrého kontraktu razit NFT, a ve 3. části si vysvětlíme, jak si své NFT zobrazit v MetaMask.

A samozřejmě, pokud budete mít v kterémkoli bodě dotazy, neváhejte se ozvat na Alchemy Discord (opens in a new tab) nebo navštivte dokumentaci NFT API od Alchemy (opens in a new tab)!

Krok 1: Připojte se k síti Ethereum

Existuje spousta způsobů, jak posílat požadavky na ethereový blockchain, ale abychom si to zjednodušili, použijeme bezplatný účet na Alchemy (opens in a new tab), což je blockchainová vývojářská platforma a API, která nám umožňuje komunikovat s řetězcem Etherea, aniž bychom museli provozovat vlastní uzly.

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

Krok 2: Vytvořte si aplikaci (a klíč API)

Jakmile si vytvoříte účet na Alchemy, můžete si vygenerovat klíč API vytvořením aplikace. To nám umožní posílat požadavky do testovací sítě Sepolia. Pokud se chcete o testovacích sítích dozvědět více, podívejte se na tuto příručku (opens in a new tab).

  1. Přejděte na stránku „Create App“ ve svém ovládacím panelu Alchemy tak, že v navigační liště najedete na „Apps“ a kliknete na „Create App“

Vytvořte si svou aplikaci

  1. Pojmenujte svou aplikaci (my jsme zvolili „Moje první NFT!“), nabídněte krátký popis, pro řetězec vyberte „Ethereum“ a pro síť zvolte „Sepolia“. Od Sloučení jsou ostatní testovací sítě zastaralé.

Nakonfigurujte a publikujte svou aplikaci

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

Krok 3: Vytvořte si ethereový účet (adresu)

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

Účet MetaMask 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 se vpravo nahoře přepnuli na „Sepolia Test Network“ (abychom nepracovali se skutečnými penězi).

Nastavte Sepolia jako vaši síť

Krok 4: Přidejte ether z Faucetu

Abychom mohli náš chytrý kontrakt nasadit do testovací sítě, budeme potřebovat nějaké falešné ETH. Pro získání ETH můžete jít na Sepolia Faucet (opens in a new tab) hostovaný společností Alchemy, přihlásit se, zadat adresu svého účtu a kliknout na „Send Me ETH“. Krátce poté byste měli vidět ETH ve svém účtu MetaMask!

Krok 5: Zkontrolujte svůj zůstatek

Abychom si dvakrát zkontrolovali, že tam náš zůstatek je, udělejme požadavek eth_getBalance (opens in a new tab) pomocí nástroje pro sestavování od Alchemy (opens in a new tab). Tím se vrátí množství ETH v naší peněžence. Po zadání adresy vašeho účtu MetaMask a kliknutí na „Send Request“ byste měli vidět takovouto odpověď:

1```json
2{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"}
3```

Poznámka Tento výsledek je ve wei, ne v ETH. Wei se používá jako nejmenší denominace etheru. Převod z wei na ETH je 1 eth = 1018 wei. Pokud tedy převedeme 0xde0b6b3a7640000 na desetinné číslo, dostaneme 1*1018 wei, což se rovná 1 ETH.

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

Krok 6: Inicializujte náš projekt

Nejprve budeme muset vytvořit složku pro náš projekt. Přejděte na příkazový řádek a zadejte:

1mkdir my-nft
2cd my-nft

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

1npm init

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

1 název balíčku: (my-nft)
2 verze: (1.0.0)
3 popis: Moje první NFT!
4 vstupní bod: (index.js)
5 testovací příkaz:
6 repozitář git:
7 klíčová slova:
8 autor:
9 licence: (ISC)
10 Chystáte se zapsat do /Users/thesuperb1/Desktop/my-nft/package.json:
11
12 {
13 "name": "my-nft",
14 "version": "1.0.0",
15 "description": "Moje první NFT!",
16 "main": "index.js",
17 "scripts": {
18 "test": "echo \"Error: no test specified\" && exit 1"
19 },
20 "author": "",
21 "license": "ISC"
22 }
Zobrazit vše

Schvalte soubor package.json a můžeme pokračovat!

Krok 7: Instalace Hardhat (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 budování chytrých kontraktů a dapps před jejich nasazením na živý řetězec.

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

1npm install --save-dev hardhat

Další podrobnosti o instalačních pokynech (opens in a new tab) naleznete na této stránce.

Krok 8: Vytvoření projektu Hardhat

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

1npx hardhat

Poté by se vám měla zobrazit uvítací zpráva a možnost vybrat si, co chcete dělat. Vyberte „create an empty hardhat.config.js“:

1888 888 888 888 888
2888 888 888 888 888
3888 888 888 888 888
48888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888
5888 888 "88b 888P" d88" 888 888 "88b "88b 888
6888 888 .d888888 888 888 888 888 888 .d888888 888
7888 888 888 888 888 Y88b 888 888 888 888 888 Y88b.
8888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888
9👷 Vítejte v Hardhat v2.0.11 👷‍
10? Co chcete dělat? …
11Vytvořit vzorový projekt
12❯ Vytvořit prázdný hardhat.config.js
13Ukončit
Zobrazit vše

Tím se nám vygeneruje soubor hardhat.config.js, kde v kroku 13 specifikujeme všechna nastavení našeho projektu.

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

Abychom měli v projektu pořádek, vytvoříme si dvě nové složky. Přejděte do kořenového adresáře projektu v příkazovém řádku a zadejte:

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

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

Krok 10: Napište náš kontrakt

Nyní, když máme nastavené prostředí, přejděme 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 NFT chytrého kontraktu, 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 souboru MyNFT.sol.

    1//Kontrakt založený na [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)
    2// SPDX-License-Identifier: MIT
    3pragma solidity ^0.8.0;
    4
    5import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
    6import "@openzeppelin/contracts/utils/Counters.sol";
    7import "@openzeppelin/contracts/access/Ownable.sol";
    8import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
    9
    10contract MyNFT is ERC721URIStorage, Ownable {
    11 using Counters for Counters.Counter;
    12 Counters.Counter private _tokenIds;
    13
    14 constructor() ERC721("MyNFT", "NFT") {}
    15
    16 function mintNFT(address recipient, string memory tokenURI)
    17 public onlyOwner
    18 returns (uint256)
    19 {
    20 _tokenIds.increment();
    21
    22 uint256 newItemId = _tokenIds.current();
    23 _mint(recipient, newItemId);
    24 _setTokenURI(newItemId, tokenURI);
    25
    26 return newItemId;
    27 }
    28}
    Zobrazit vše
  3. Protože dědíme třídy z knihovny kontraktů OpenZeppelin, spusťte v příkazovém řádku npm install @openzeppelin/contracts^4.0.0, abyste knihovnu nainstalovali do naší složky.

Co přesně tedy tento kód dělá? Pojďme si to rozebrat, řádek po řádku.

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

  • @openzeppelin/contracts/token/ERC721/ERC721.sol obsahuje implementaci standardu ERC-721, kterou bude náš NFT chytrý kontrakt dědit. (Aby byl 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 čítače, které lze zvýšit nebo snížit pouze o jedna. Náš chytrý kontrakt používá čítač ke sledování celkového počtu ražených NFT a k nastavení jedinečného ID na našem novém NFT. (Každému NFT raženému pomocí chytrého kontraktu musí být přiděleno jedinečné ID – zde je naše jedinečné ID určeno pouze celkovým počtem existujících NFT. Například první NFT, které razíme s 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 zcela na preferencích. Pokud chcete, 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 pro import máme náš vlastní NFT chytrý kontrakt, který je překvapivě krátký – obsahuje pouze čítač, konstruktor a jednu funkci! Je to díky našim zděděným kontraktům 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 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řebírá dvě proměnné:

  • address recipient určuje adresu, která obdrží vaše čerstvě ražené NFT

  • string memory tokenURI je řetězec, který by se měl přeložit na dokument JSON, který popisuje metadata NFT. Metadata NFT jsou to, co ho skutečně oživuje a umožňuje mu mít konfigurovatelné vlastnosti, jako je název, popis, obrázek a další atributy. Ve 2. části tohoto výukového programu si 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ě raženého NFT.

Krok 11: Připojte MetaMask a Alchemy ke svému projektu

Nyní, když jsme vytvořili peněženku MetaMask, účet 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 privátního klíče. Abychom našemu programu poskytli toto oprávnění, můžeme bezpečně uložit náš privátní klíč (a klíč API od Alchemy) do souboru prostředí.

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

Nejprve nainstalujte balíček dotenv do adresáře vašeho projektu:

1npm 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 privátní klíč MetaMask a adresu URL rozhraní HTTP API od Alchemy.

  • Postupujte podle těchto pokynů (opens in a new tab) pro export vašeho privátního klíče z MetaMask

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

Zkopírujte URL vašeho API od Alchemy

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

1API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key"
2PRIVATE_KEY="your-metamask-private-key"

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

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 funkčnost. Pro nasazení kontraktu využijeme plugin Ethers (opens in a new tab) (Ethers.js (opens in a new tab) má několik velmi čistých metod pro nasazení kontraktu).

V adresáři projektu zadejte:

1npm 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 souboru hardhat.config.js

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

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

1 /**
2 * @type import('hardhat/config').HardhatUserConfig
3 */
4 require('dotenv').config();
5 require("@nomiclabs/hardhat-ethers");
6 const { API_URL, PRIVATE_KEY } = process.env;
7 module.exports = {
8 solidity: "0.8.1",
9 defaultNetwork: "sepolia",
10 networks: {
11 hardhat: {},
12 sepolia: {
13 url: API_URL,
14 accounts: [`0x${PRIVATE_KEY}`]
15 }
16 },
17 }
Zobrazit vše

Krok 14: Zkompilujte náš kontrakt

Abychom se ujistili, že zatím vše funguje, zkompilujeme si náš kontrakt. Úkol kompilace je jedním z vestavěných úkolů Hardhat.

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

1npx hardhat compile

Můžete dostat varování o tom, že v zdrojovém souboru není uveden identifikátor licence SPDX, 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 zprávu na discordu Alchemy (opens in a new tab).

Krok 15: Napište náš skript 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 a přidejte do něj následující obsah:

1async function main() {
2 const MyNFT = await ethers.getContractFactory("MyNFT")
3
4 // Spusťte nasazení, vrátí se promise, která se vyřeší na objekt kontraktu
5 const myNFT = await MyNFT.deploy()
6 await myNFT.deployed()
7 console.log("Contract deployed to address:", myNFT.address)
8}
9
10main()
11 .then(() => process.exit(0))
12 .catch((error) => {
13 console.error(error)
14 process.exit(1)
15 })
Zobrazit vše

Hardhat skvěle vysvětluje, co každý z těchto řádků kódu dělá ve svém výukovém programu Kontrakty (opens in a new tab), a my jsme zde jejich vysvětlení převzali.

1const 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 NFT kontraktu. 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.

1const myNFT = await MyNFT.deploy();

Volání deploy() na ContractFactory spustí nasazení a vrátí Promise, která se vyřeší na Contract. Toto je objekt, který má metodu pro každou z funkcí našeho chytrého kontraktu.

Krok 16: Nasaďte náš kontrakt

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

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

Měli byste pak vidět něco takového:

1Contract deployed to address: 0x4C5266cCc4b3F426965d2f51b6D910325a0E7650

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

Zobrazení adresy transakce na Etherscanu

Adresa „Od“ by měla odpovídat adrese vašeho účtu MetaMask a adresa „Pro“ bude říkat „Contract Creation“. Pokud klikneme na transakci, uvidíme adresu našeho kontraktu v poli „Pro“:

Zobrazte adresu svého kontraktu na Etherscanu

Paráda! Právě jste nasadili svůj NFT chytrý kontrakt na řetězec Ethereum (testnet)!

Abychom pochopili, co se děje „pod pokličkou“, přejděme na kartu Explorer v našem ovládacím panelu Alchemy (opens in a new tab). Pokud máte více aplikací Alchemy, ujistěte se, že filtrujete podle aplikace a vyberete „MyNFT“.

Zobrazení volání provedených „pod pokličkou“ pomocí ovládacího panelu Explorer od Alchemy

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

To je vše k 1. části tohoto výukového programu. V části 2 budeme skutečně interagovat s naším chytrým kontraktem ražbou NFT a v části 3 si ukážeme, jak si své NFT zobrazit ve své ethereové peněžence!

Stránka naposledy aktualizována: 5. prosince 2025

Byl tento tutoriál užitečný?