Standardul de tokenuri nefungibile ERC-721
Ultima modificare: @nicklcanada(opens in a new tab), 19 noiembrie 2023
Introducere
Ce este un token nefungibil?
Tokenurile nefungibile (NFT) sunt folosite pentru a identifica ceva sau pe cineva într-un mod unic. Acest tip de token este perfect pentru a fi utilizat pe platforme care oferă articole de colecții, chei de acces, bilete la loterie, locuri numerotate pentru concerte și meciuri sportive etc. Acest tip special de Token are posibilități uimitoare, așa că merită un Standard adecvat, iar ERC-721 a apărut ca soluţie!
Ce este ERC-721?
ERC-721 introduce un standard pentru NFT-uri, cu alte cuvinte, acest tip de Token este unic și poate avea o valoare diferită de un alt Token din același Contract inteligent, poate din cauza vârstei, a rarității sau chiar din alt motiv, cum ar fi reprezentarea sa vizuală. Ia staţi, vizuală?
Da! Toate NFT-urile au o variabilă uint256
numită tokenId
, astfel încât pentru orice contract ERC-721, perechea contract address, uint256 tokenId
trebuie să fie unică la nivel global. Acestea fiind spuse, o aplicaţie dApp poate avea un „convertor” care folosește tokenId
ca date de intrare și produce la ieşire ceva grozav, cum ar fi o imagine cu zombi, arme, abilități sau pisicuțe uimitoare!
Condiții prealabile
Conținut
ERC-721 (Cerere de comentarii Ethereum), propus de William Entriken, Dieter Shirley, Jacob Evans, Nastassia Sachs în ianuarie 2018, este un Standard de tokenuri nefungibile care implementează un API pentru tokenuri în cadrul Contractelor inteligente.
Acesta oferă funcționalități cum ar fi transferul de tokenuri dintr-un cont în altul, obținerea soldului actual al tokenurilor unui cont, obținerea proprietarului unui token specific și de asemenea a totalului de tokenuri disponibile în rețea. Pe lângă acestea, are și alte funcționalități, cum ar fi aceea de a aproba ca o cantitate de tokenuri dintr-un cont să poată fi mutată de către un cont terț.
În cazul în care un Contract inteligent implementează următoarele metode și evenimente, acesta poate fi numit un contract de tokenuri nefungibile ERC-721 și, odată implementat, va avea responsabilitatea de a ține evidența tokenurilor create pe Ethereum.
De la EIP-721(opens in a new tab):
Metode
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);Afișează totCopiați
Evenimente
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);Copiați
Exemple
Să vedem cât de important este un standard pentru a ne simplifica lucrurile când inspectăm orice contract de tokenuri ERC-721 pe Ethereum. Avem nevoie doar de interfața binară cu aplicația (ABI) a contractului pentru a crea o interfață pentru orice token ERC-721. După cum puteţi vedea mai jos, vom folosi un ABI simplificat, pentru a facilita înţelegerea exemplului.
Exemplu Web3.py
În primul rând aveţi grijă să instalaţi librăria Python Web3.py(opens in a new tab):
1pip install web3
1from web3 import Web32from web3._utils.events import get_event_data345w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))67ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # CryptoKitties Contract89acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # CryptoKitties Sales Auction1011# This is a simplified Contract Application Binary Interface (ABI) of an ERC-721 NFT Contract.12# Va expune numai metodele: 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.toChecksumAddress(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}")6667pregnant_kitties = ck_contract.functions.pregnantKitties().call()68print(f"{name} [{symbol}] NFTs Pregnants: {pregnant_kitties}")6970# Folosind evenimentul ABI „transfer” pentru a obține informații despre „Pisicile” transferate.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# We need the event's signature to filter the logs82event_signature = w3.sha3(text="Transfer(address,address,uint256)").hex()8384logs = w3.eth.getLogs({85 "fromBlock": w3.eth.blockNumber - 120,86 "address": w3.toChecksumAddress(ck_token_addr),87 "topics": [event_signature]88})8990# Notes:91# - 120 blocks is the max range for CloudFlare Provider92# - If you didn't find any Transfer event you can also try to get a tokenId at:93# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events94# Click to expand the event's logs and copy its "tokenId" argument9596recent_tx = [get_event_data(w3.codec, tx_event_abi, log)["args"] for log in logs]9798kitty_id = recent_tx[0]['tokenId'] # Paste the "tokenId" here from the link above99is_pregnant = ck_contract.functions.isPregnant(kitty_id).call()100print(f"{name} [{symbol}] NFTs {kitty_id} is pregnant: {is_pregnant}")Afișează totCopiați
Contractul CryptoKitties are câteva Evenimente interesante, altele decât cele standard.
Să verificăm două dintre ele, Pregnant
și Birth
.
1# Utilizarea evenimentelor ABI „Pregnant” și „Birth” pentru a obține informații despre noile pisici.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# We need the event's signature to filter the logs26ck_event_signatures = [27 w3.sha3(text="Pregnant(address,uint256,uint256,uint256)").hex(),28 w3.sha3(text="Birth(address,uint256,uint256,uint256,uint256)").hex(),29]3031# Here is a Pregnant Event:32# - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog33pregnant_logs = w3.eth.getLogs({34 "fromBlock": w3.eth.blockNumber - 120,35 "address": w3.toChecksumAddress(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# Here is a Birth Event:42# - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a43birth_logs = w3.eth.getLogs({44 "fromBlock": w3.eth.blockNumber - 120,45 "address": w3.toChecksumAddress(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]Afișează totCopiați
NFT-uri populare
- Etherscan NFT Tracker(opens in a new tab) listează NFT-urile de top pe Ethereum după volumul transferurilor.
- CryptoKitties(opens in a new tab) este un joc centrat pe creaturile care pot fi crescute, colecționate și sunt atât de adorabile pe care le numim CryptoKitties.
- Sorare(opens in a new tab) este un joc global de fotbal fantezie unde puteţi colecta obiecte de colecţie de ediție limitată, vă puteţi gestiona echipele și puteţi concura pentru a câștiga premii.
- Serviciul de nume Ethereum (ENS)(opens in a new tab) oferă o modalitate securizată & și descentralizată de a aborda resursele, atât în cadrul blockchain-ului, cât și în afara acestuia, folosind nume simple, care pot fi citite de oameni.
- Unstoppable Domains(opens in a new tab) este o companie din San Francisco care construiește domenii pe blockchain-uri. Domeniile blockchain înlocuiesc adresele criptomonedei cu nume care pot fi citite de oameni și pot fi folosite pentru activarea de site-uri web rezistente la cenzură.
- Gods Unchained Cards(opens in a new tab) este un TCG (joc de cărți de tranzacționare) pe blockchain-ul Ethereum care folosește NFT-uri pentru a aduce proprietate reală activelor din joc.
- Bored Ape Yacht Club(opens in a new tab) este o colecție de 10.000 de NFT-uri unice, care, în afară de a fi o piesă artistică cu adevărat rară, funcționează ca token de membru al clubului, oferind membrilor avantaje și beneficii care cresc în timp, ca rezultat al eforturilor comunității.