Přeskočit na hlavní obsah
Change page

Standard nezaměnitelného tokenu ERC-721

Stránka naposledy aktualizována: 25. února 2026

Úvod

Co je to nezaměnitelný token?

Nezaměnitelný token (Non-Fungible Token - NFT) je používán k identifikaci něčeho nebo někoho jedinečným způsobem. Tento typ tokenu je ideální pro použití na platformách, které nabízejí sběratelské předměty, přístupové klíče, loterijní lístky, číslovaná místa na koncertech a sportovních zápasech atd. Tento speciální typ tokenu má úžasné možnosti, a proto si zaslouží odpovídající standard, kterým je ERC-721!

Co je ERC-721?

ERC-721 zavádí standard pro NFT, jinými slovy, tento typ tokenu je jedinečný a může mít jinou hodnotu než jiný token ze stejného smart kontraktu, například z důvodu jeho stáří, vzácnosti nebo něčeho jinému, například jeho vzhledu. Počkat, vzhledu?

Ano! Všechny NFT mají proměnnou uint256 s názvem tokenId, takže pro každý kontrakt ERC-721 musí být dvojice adresa kontraktu, uint256 tokenId globálně jedinečná. Nicméně dapp může mít „konvertor“, který používá tokenId jako vstup a na výstupu vrací obrázek něčeho skvělého, jako jsou zombie, zbraně, dovednosti nebo úžasné kočičky!

Předpoklady

Tělo

ERC-721 (Ethereum Request for Comments 721), navržený Williamem Entrikenem, Dieterem Shirleym, Jacobem Evansem a Nastassií Sachs v lednu 2018, je standard pro nezaměnitelné tokeny, který implementuje API pro tokeny v rámci smart kontraktů.

Obsahuje funkce, jako je převod tokenů z jednoho účtu na druhý, zjištění aktuálního zůstatku tokenů na účtu, zjištění ethereovské adresy vlastníka konkrétního tokenu a také celkového množství tokenů dostupných v síti. Kromě toho má i další funkce, jako je schválení, že určité množství tokenů z účtu může být přesunuto třetí stranou.

Pokud smart kontrakt implementuje následující metody a události, může být nazván ERC-721 Non-Fungible Token Contract, a jakmile je spuštěn, bude zodpovědný za sledování vytvořených tokenů na Ethereu.

Z EIP-721 (opens in a new tab):

Metody

1 function balanceOf(address _owner) external view returns (uint256);
2 function ownerOf(uint256 _tokenId) external view returns (address);
3 function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
4 function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
5 function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
6 function approve(address _approved, uint256 _tokenId) external payable;
7 function setApprovalForAll(address _operator, bool _approved) external;
8 function getApproved(uint256 _tokenId) external view returns (address);
9 function isApprovedForAll(address _owner, address _operator) external view returns (bool);
Zobrazit vše

Události

1 event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
2 event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
3 event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

Příklady

Podívejme se, proč je tento standard tak důležitý pro zjednodušení prohlížení jakéhokoliv kontraktu ERC-721 tokenu na Ethereu. Abychom mohli vytvořit rozhraní pro jakýkoliv ERC-721 token, stačí nám Contract Application Binary Interface (ABI). Jak můžete vidět níže, použijeme zjednodušené ABI, abychom vám to ukázali na jednoduchém příkladu.

Příklad Web3.py

Nejprve se ujistěte, že máte nainstalovanou knihovnu Python Web3.py (opens in a new tab):

1pip install web3
1from web3 import Web3
2from web3._utils.events import get_event_data
3
4
5w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))
6
7ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # Kontrakt CryptoKitties
8
9acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # Prodejní aukce CryptoKitties
10
11# Toto je zjednodušené binární rozhraní aplikace (ABI) kontraktu NFT ERC-721.
12# Zpřístupní pouze metody: balanceOf(address), name(), ownerOf(tokenId), symbol(), totalSupply()
13simplified_abi = [
14 {
15 'inputs': [{'internalType': 'address', 'name': 'owner', 'type': 'address'}],
16 'name': 'balanceOf',
17 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
18 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
19 },
20 {
21 'inputs': [],
22 'name': 'name',
23 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
24 'stateMutability': 'view', 'type': 'function', 'constant': True
25 },
26 {
27 'inputs': [{'internalType': 'uint256', 'name': 'tokenId', 'type': 'uint256'}],
28 'name': 'ownerOf',
29 'outputs': [{'internalType': 'address', 'name': '', 'type': 'address'}],
30 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
31 },
32 {
33 'inputs': [],
34 'name': 'symbol',
35 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
36 'stateMutability': 'view', 'type': 'function', 'constant': True
37 },
38 {
39 'inputs': [],
40 'name': 'totalSupply',
41 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
42 'stateMutability': 'view', 'type': 'function', 'constant': True
43 },
44]
45
46ck_extra_abi = [
47 {
48 'inputs': [],
49 'name': 'pregnantKitties',
50 'outputs': [{'name': '', 'type': 'uint256'}],
51 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
52 },
53 {
54 'inputs': [{'name': '_kittyId', 'type': 'uint256'}],
55 'name': 'isPregnant',
56 'outputs': [{'name': '', 'type': 'bool'}],
57 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
58 }
59]
60
61ck_contract = w3.eth.contract(address=w3.to_checksum_address(ck_token_addr), abi=simplified_abi+ck_extra_abi)
62name = ck_contract.functions.name().call()
63symbol = ck_contract.functions.symbol().call()
64kitties_auctions = ck_contract.functions.balanceOf(acc_address).call()
65print(f"{name} [{symbol}] NFTs in Auctions: {kitties_auctions}")
66
67pregnant_kitties = ck_contract.functions.pregnantKitties().call()
68print(f"{name} [{symbol}] NFTs Pregnants: {pregnant_kitties}")
69
70# Použití ABI události Převod k získání informací o převedených kočičkách.
71tx_event_abi = {
72 'anonymous': False,
73 'inputs': [
74 {'indexed': False, 'name': 'from', 'type': 'address'},
75 {'indexed': False, 'name': 'to', 'type': 'address'},
76 {'indexed': False, 'name': 'tokenId', 'type': 'uint256'}],
77 'name': 'Transfer',
78 'type': 'event'
79}
80
81# K filtrování protokolů potřebujeme podpis události
82event_signature = w3.keccak(text="Transfer(address,address,uint256)").hex()
83
84logs = w3.eth.get_logs({
85 "fromBlock": w3.eth.block_number - 120,
86 "address": w3.to_checksum_address(ck_token_addr),
87 "topics": [event_signature]
88})
89
90# Poznámky:
91# - Pokud se nevrátí žádná událost Převod, zvyšte počet bloků z hodnoty 120.
92# - Pokud jste nenašli žádnou událost Převod, můžete také zkusit získat tokenId na adrese:
93# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events
94# Kliknutím rozbalte protokoly události a zkopírujte její argument „tokenId“
95recent_tx = [get_event_data(w3.codec, tx_event_abi, log)["args"] for log in logs]
96
97if recent_tx:
98 kitty_id = recent_tx[0]['tokenId'] # Sem vložte „tokenId“ z výše uvedeného odkazu
99 is_pregnant = ck_contract.functions.isPregnant(kitty_id).call()
100 print(f"{name} [{symbol}] NFTs {kitty_id} is pregnant: {is_pregnant}")
Zobrazit vše

Kontrakt CryptoKitties má několik zajímavých událostí, kromě těch standardních.

Podívejme se na dvě z nich, Pregnant a Birth.

1# Použití ABI událostí Pregnant a Birth k získání informací o nových kočičkách.
2ck_extra_events_abi = [
3 {
4 'anonymous': False,
5 'inputs': [
6 {'indexed': False, 'name': 'owner', 'type': 'address'},
7 {'indexed': False, 'name': 'matronId', 'type': 'uint256'},
8 {'indexed': False, 'name': 'sireId', 'type': 'uint256'},
9 {'indexed': False, 'name': 'cooldownEndBlock', 'type': 'uint256'}],
10 'name': 'Pregnant',
11 'type': 'event'
12 },
13 {
14 'anonymous': False,
15 'inputs': [
16 {'indexed': False, 'name': 'owner', 'type': 'address'},
17 {'indexed': False, 'name': 'kittyId', 'type': 'uint256'},
18 {'indexed': False, 'name': 'matronId', 'type': 'uint256'},
19 {'indexed': False, 'name': 'sireId', 'type': 'uint256'},
20 {'indexed': False, 'name': 'genes', 'type': 'uint256'}],
21 'name': 'Birth',
22 'type': 'event'
23 }]
24
25# K filtrování protokolů potřebujeme podpis události
26ck_event_signatures = [
27 w3.keccak(text="Pregnant(address,uint256,uint256,uint256)").hex(),
28 w3.keccak(text="Birth(address,uint256,uint256,uint256,uint256)").hex(),
29]
30
31# Zde je událost Pregnant:
32# - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog
33pregnant_logs = w3.eth.get_logs({
34 "fromBlock": w3.eth.block_number - 120,
35 "address": w3.to_checksum_address(ck_token_addr),
36 "topics": [ck_event_signatures[0]]
37})
38
39recent_pregnants = [get_event_data(w3.codec, ck_extra_events_abi[0], log)["args"] for log in pregnant_logs]
40
41# Zde je událost Birth:
42# - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a
43birth_logs = w3.eth.get_logs({
44 "fromBlock": w3.eth.block_number - 120,
45 "address": w3.to_checksum_address(ck_token_addr),
46 "topics": [ck_event_signatures[1]]
47})
48
49recent_births = [get_event_data(w3.codec, ck_extra_events_abi[1], log)["args"] for log in birth_logs]
Zobrazit vše
  • Etherscan NFT Tracker (opens in a new tab) uvádí nejlepší NFT na Ethereu podle objemu převodů.
  • CryptoKitties (opens in a new tab) je hra zaměřená na chovná, sběratelská a neodolatelně roztomilá stvoření, která nazýváme CryptoKitties.
  • Sorare (opens in a new tab) je globální fantasy fotbalová hra, kde můžete sbírat sběratelské předměty z limitovaných edicí, spravovat své týmy a soutěžit o ceny.
  • Služba názvů Etherea (ENS) (opens in a new tab) nabízí bezpečný a decentralizovaný způsob adresování zdrojů na blockchainu i mimo něj pomocí jednoduchých, lidsky čitelných jmen.
  • POAP (opens in a new tab) doručuje bezplatné NFT lidem, kteří se účastní událostí nebo dokončí určité akce. POAPy můžete vytvořit i distribuovat zdarma.
  • Unstoppable Domains (opens in a new tab) je společnost se sídlem v San Franciscu, která vytváří domény na blockchainech. Blockchainové domény nahrazují kryptoměnové adresy lidsky čitelnými jmény a mohou být použity k vytváření webů odolných vůči cenzuře.
  • Gods Unchained Cards (opens in a new tab) je sběratelská karetní hra (TCG) na blockchainu Ethereum, která využívá NFT k tomu, aby přinesla skutečné vlastnictví herních aktiv.
  • Bored Ape Yacht Club (opens in a new tab) je sbírka 10 000 jedinečných NFT, která kromě toho, že je prokazatelně vzácným uměleckým dílem, funguje také jako členský token do klubu, který poskytuje členské výhody a benefity, jež se v čase zvyšují díky úsilí komunity.

Další čtení

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