Стандарт невзаимозаменяемых токенов ERC-721
Последнее обновление страницы: 25 февраля 2026 г.
Введение
Что такое невзаимозаменяемый токен?
Невзаимозаменяемые токены (NFT) используются для уникальной идентификации чего-то или кого-то. Этот тип токена идеально подходит для использования на платформах, предлагающих коллекционные предметы, ключи доступа, лотерейные билеты, пронумерованные места на концерты, спортивные матчи и т.д. Этот особый тип токена имеет удивительные возможности, поэтому он заслуживает надлежащего стандарта, ERC-721 призван решить эту проблему!
Что такое ERC-721?
ERC-721 вводит стандарт для NFT, другими словами, этот тип токена уникален и может иметь значение, отличное от другого токена из того же смарт-контракта, возможно, из-за его возраста, редкости или даже из-за чего-то другого, например его внешнего вида. Подожди, визуально?
Да! У всех NFT есть переменная uint256 под названием tokenId, поэтому для любого контракта ERC-721 пара
contract address, uint256 tokenId должна быть глобально уникальной. При этом у децентрализованного приложения может быть "конвертер", который
использует tokenId в качестве входных данных и выводит изображение чего-то классного, например: зомби, оружия, навыков или удивительных котят!
Предварительные условия
Тело
ERC-721 (Ethereum Request for Comments 721), предложенный Уильямом Энтрикеном, Дитером Ширли, Якобом Эвансом и Настасьей Сакс в январе 2018 года, является стандартом невзаимозаменяемых токенов, который реализует API для токенов в смарт-контрактах.
Он предоставляет такие функции, как: перенос токенов из одной учетной записи в другую, получение текущего баланса токенов учетной записи, узнать кто владелец определенного токена, а также узнать общее количество токенов, доступных в сети. Помимо этого, он также имеет некоторые другие функции, такие как подтверждение того, что количество токенов из учетной записи может быть перемещено сторонней учетной записью.
Если в смарт-контракте реализованы следующие методы и события, его можно назвать контрактом невзаимозаменяемых токенов ERC-721, и после развертывания он будет нести ответственность за отслеживание созданных токенов в Ethereum.
Из EIP-721 (opens 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. Нам просто нужен двоичный интерфейс приложения контракта (ABI) для создания интерфейса к любому токену ERC-721. Как вы можете увидеть ниже, мы будем использовать упрощенный ABI, чтобы сделать пример простым.
Пример Web3.py
Во-первых, убедитесь, что вы установили библиотеку Python Web3.py (opens in a new tab):
1pip install web31from web3 import Web32from web3._utils.events import get_event_data345w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))67ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # Контракт CryptoKitties89acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # Аукцион по продаже CryptoKitties1011# Это упрощенный двоичный интерфейс приложения (ABI) для контракта ERC-721 NFT.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': True19 },20 {21 'inputs': [],22 'name': 'name',23 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],24 'stateMutability': 'view', 'type': 'function', 'constant': True25 },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': True31 },32 {33 'inputs': [],34 'name': 'symbol',35 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],36 'stateMutability': 'view', 'type': 'function', 'constant': True37 },38 {39 'inputs': [],40 'name': 'totalSupply',41 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],42 'stateMutability': 'view', 'type': 'function', 'constant': True43 },44]4546ck_extra_abi = [47 {48 'inputs': [],49 'name': 'pregnantKitties',50 'outputs': [{'name': '', 'type': 'uint256'}],51 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True52 },53 {54 'inputs': [{'name': '_kittyId', 'type': 'uint256'}],55 'name': 'isPregnant',56 'outputs': [{'name': '', 'type': 'bool'}],57 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True58 }59]6061ck_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}")6667pregnant_kitties = ck_contract.functions.pregnantKitties().call()68print(f"{name} [{symbol}] беременных NFT: {pregnant_kitties}")6970# Используем ABI события Transfer для получения информации о переданных Kitties.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}8081# Нам нужна подпись события для фильтрации журналов82event_signature = w3.keccak(text="Transfer(address,address,uint256)").hex()8384logs = 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})8990# Примечания:91# - Увеличьте количество блоков с 120, если событие Transfer не будет возвращено.92# - Если вы не нашли событие Transfer, вы можете попытаться получить tokenId по адресу:93# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events94# Нажмите, чтобы развернуть журналы события и скопировать его аргумент "tokenId"95recent_tx = [get_event_data(w3.codec, tx_event_abi, log)["args"] for log in logs]9697if 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 для получения информации о новых Kitties.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 }]2425# Нам нужна подпись события для фильтрации журналов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]3031# Вот событие Pregnant:32# - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog33pregnant_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})3839recent_pregnants = [get_event_data(w3.codec, ck_extra_events_abi[0], log)["args"] for log in pregnant_logs]4041# Вот событие Birth:42# - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a43birth_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})4849recent_births = [get_event_data(w3.codec, ck_extra_events_abi[1], log)["args"] for log in birth_logs]Показать всеПопулярные NFT
- Etherscan NFT Tracker (opens in a new tab) перечисляет лучшие NFT на Ethereum по объему переводов.
- CryptoKitties (opens in a new tab) — это игра, основанная на разведении и коллекционировании очаровательных существ, которых мы называем CryptoKitties.
- Sorare (opens in a new tab) — это глобальный фэнтези-футбол, в котором вы можете коллекционировать предметы ограниченного выпуска, управлять своими командами и соревноваться за призы.
- Служба имён Ethereum (ENS) (opens in a new tab) предлагает безопасный и децентрализованный способ адресации ресурсов как в блокчейне, так и за его пределами, используя простые, удобочитаемые имена.
- POAP (opens in a new tab) предоставляет бесплатные NFT людям, которые посещают мероприятия или выполняют определенные действия. POAP-ы бесплатные для создания и распространения.
- Unstoppable Domains (opens in a new tab) — это компания из Сан-Франциско, которая создает домены на блокчейнах. Домены на блокчейне заменяют адреса криптовалют на удобочитаемые имена и могут использоваться для создания устойчивых к цензуре веб-сайтов.
- Gods Unchained Cards (opens in a new tab) — это ККИ (коллекционная карточная игра) в блокчейне Ethereum, которая использует NFT для обеспечения реального права собственности на внутриигровые активы.
- Bored Ape Yacht Club (opens in a new tab) — это коллекция из 10 000 уникальных NFT, которые, помимо того, что являются доказуемо редкими произведениями искусства, действуют как членский токен клуба, предоставляя участникам льготы и преимущества, которые со временем увеличиваются в результате усилий сообщества.