Перейти до основного контенту
Change page

ERC-721 Звичайний маркер

Останні оновлення сторінки: 14 лютого 2026 р.

Вступ

Що таке невзаємозамінний токен?

Невзаємозамінний токен використовується для визначення чогось або когось унікальним способом. Цей тип токену ідеальний для використання на платформах, які пропонують зібрані елементи, ключі доступу, лотерейні квитки, нумеровані місця для концертів і спортивних матчів тощо. Цей особливий тип токену має дивовижні можливості, тож заслуговує належного стандарту ERC-721, що вирішує це!

Що таке ERC-721?

ERC-721 представляє стандарт NFT, інакше кажучи, цей тип токену унікальний і може мати різні значення інший токен з того ж Смарт-контракту, можливо через його вік, рідкість або ж навіть через дещо інше, як візуал. Зачекайте, візуал?

Так! Усі NFT мають змінну uint256 під назвою tokenId, тому для будь-якого контракту ERC-721 пара адреса контракту, uint256 tokenId має бути глобально унікальною. При цьому децентралізований застосунок (dapp) може мати «конвертер», який використовує tokenId як вхідні дані та виводить зображення чогось крутого, наприклад, зомбі, зброї, навичок або дивовижних кошенят!

Передумови

Основна частина

ERC-721, запропонований Вільямом Ентрікеном, Дітером Ширлі, Джейкобом Евансом, Анастасією Сачс в січні 2018, стандарт невзаємозамінного токену, що реалізує API для токенів в рамках Смарт контракту.

Він надає функції передавати токени з одного облікового запису в інший, щоб отримати поточний баланс токену з аккаунту, щоб отримати власника конкретного токену, а також загальний запас токену, доступного в мережі. Крім цього він також має деякі інші функції, як стверджувати, що сума токенів може бути переміщена на інший обліковий запис.

Якщо Смарт-контракт реалізує наступні методи та події, він може називатися ERC-721 невзаємозамінним токеном і після розгортання, він несе відповідальність за відстеження створених токенів на Ethereum.

З EIP-721opens in a new tab:

Методи

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);
Показати все

Події

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);

Приклади

Давайте подивимося наскільки стандарт важливий для того, щоб зробити речі простішими для нас, щоб оглянути будь-який контракт токену ERC-721, на Ethereum. Нам потрібен лише контракт двійкового програмного інтерфейсу для того щоб створити для будь-яких токенів ERC-721. Як ви можете побачити нижче, ми використовуємо спрощений ABI, щоб зробити чіткий приклад.

Приклад Web3.py

Спочатку переконайтеся, що ви встановили бібліотеку Python Web3.pyopens 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" # Контракт CryptoKitties
8
9acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # Аукціон продажів CryptoKitties
10
11# Це спрощений двійковий інтерфейс програми (ABI) контракту NFT ERC-721.
12# Він надасть доступ лише до методів: 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}] NFT на аукціонах: {kitties_auctions}")
66
67pregnant_kitties = ck_contract.functions.pregnantKitties().call()
68print(f"{name} [{symbol}] Вагітних NFT: {pregnant_kitties}")
69
70# Використання ABI події Transfer для отримання інформації про переказаних кошенят.
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# Нам потрібен підпис події для фільтрації логів
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# Примітки:
91# - Збільште кількість блоків понад 120, якщо подія Transfer не повертається.
92# - Якщо ви не знайшли жодної події Transfer, ви також можете спробувати отримати tokenId за адресою:
93# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events
94# Клацніть, щоб розгорнути логи події, і скопіюйте її аргумент "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'] # Вставте "tokenId" сюди за посиланням вище
99 is_pregnant = ck_contract.functions.isPregnant(kitty_id).call()
100 print(f"{name} [{symbol}] NFT {kitty_id} вагітний: {is_pregnant}")
Показати все

Контракт CryptoKitties має деякі цікаві події, відмінні від стандартних.

Давайте перевіримо два з них: Pregnant і Birth.

1# Використання ABI подій Pregnant та Birth для отримання інформації про нових кошенят.
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# Нам потрібен підпис події для фільтрації логів
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# Ось подія 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# Ось подія 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]
Показати все
  • Etherscan NFT Trackeropens in a new tab містить список найпопулярніших NFT на Ethereum за обсягом переказів.
  • CryptoKittiesopens in a new tab — це гра, в основі якої лежить розведення, колекціонування та надзвичайно чарівних істот, яких ми називаємо CryptoKitties.
  • Sorareopens in a new tab — це глобальна фентезі-гра у футбол, де ви можете збирати колекційні предмети обмеженого випуску, керувати своїми командами та змагатися за призи.
  • Служба імен Ethereum (ENS)opens in a new tab пропонує безпечний і децентралізований спосіб адресувати ресурси як у блокчейні, так і поза ним, використовуючи прості, зрозумілі для людини імена.
  • POAPopens in a new tab надає безкоштовні NFT людям, які відвідують заходи або виконують певні дії. POAPи можна створювати та поширювати безплатно.
  • Unstoppable Domainsopens in a new tab — це компанія із Сан-Франциско, що створює домени на блокчейнах. Блокчейн-домени замінюють криптовалютні адреси на зрозумілі для людини імена та можуть використовуватися для створення стійких до цензури вебсайтів.
  • Gods Unchained Cardsopens in a new tab — це TCG (колекційна карткова гра) на блокчейні Ethereum, яка використовує NFT, щоб забезпечити реальне право власності на внутрішньоігрові активи.
  • Bored Ape Yacht Clubopens in a new tab — це колекція з 10 000 унікальних NFT, яка, окрім того, що є витвором мистецтва, рідкість якого можна довести, діє як членський токен клубу, надаючи учасникам привілеї та переваги, які з часом зростають у результаті зусиль спільноти.

Для подальшого читання

Чи була ця стаття корисною?