ERC-721 Token standard nefungibil
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, ERC-721 vine ca să rezolve aceasta!
Ce este ERC-721?
ERC-721 introduce un standard pentru NFT, cu alte cuvinte, acest tip de token este unic și poate avea o valoare diferită decât un alt token din același contract inteligent, poate din cauza vârstei, rarității sau chiar altui motiv, cum ar fi reprezentarea sa vizuală. Stai, 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. Să spunem că o aplicație dapp poate avea un „convertor” care folosește tokenId
ca intrare, iar ca ieșire, afișarea unei imagini a ceva interesant, cum ar fi un zombi, arme, abilități sau pisici 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 proprietarul unui token specific și de asemenea, furnizarea 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 un cont terț.
În cazul în care un contract inteligent implementează următoarele metode și evenimente, acesta poate fi numit contract token ERC-721 nefungibil și, odată implementat, va fi responsabil cu ținerea în evidență a tokenurilor create pe Ethereum.
De la EIP-721:
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);10Afișează totCopiere
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);4Copiere
Exemple
Să vedem cum un standard este atât de important pentru noi, simplificând procedura de verificare a oricărui contract token ERC-721 pe Ethereum. Avem nevoie doar de interfața binară aplicație (ABI) a contractului pentru a crea o interfață pentru orice token ERC-721. După cum poți să vezi mai jos, vom folosi un ABI simplificat, pentru a face exemplul ușor de înțeles.
Exemplu Web3.py
În primul rând, asigură-te că ai instalat librăria Python Web3.py:
1$ pip install web32
1from web3 import Web32from web3.utils.events import get_event_data345w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))67ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # Contract CryptoKitties89acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # Licitație de vânzări de CryptoKitties1011# Acesta este un contract simplificat de interfață binară de aplicație (ABI) pentru un contract ERC-721 NFT.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# Avem nevoie de semnătura evenimentului pentru a filtra jurnalele82event_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# Note:91# - 120 de blocuri este intervalul maxim pentru furnizorul CloudFlare92# - Dacă nu ai găsit niciun eveniment de transfer, poți încerca, de asemenea, să obții un tokenId la:93# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events94# Fă clic pentru a extinde jurnalele evenimentului și copiază argumentul „tokenId”95recent_tx = [get_event_data(tx_event_abi, log)["args"] for log in logs]9697kitty_id = recent_tx[0]['tokenId'] # Inserează "tokenId" aici din linkul de mai sus98is_pregnant = ck_contract.functions.isPregnant(kitty_id).call()99print(f"{name} [{symbol}] NFTs {kitty_id} este gestantă: {is_pregnant}")100Afișează totCopiere
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# Avem nevoie de semnătura evenimentului pentru a filtra jurnalele26ck_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# Iată un eveniment Pregnant: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_extra_events_abi[0]]37})3839recent_pregnants = [get_event_data(ck_extra_events_abi[0], log)["args"] for log in pregnant_logs]4041# Iată un eveniment Birth: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_extra_events_abi[1]]47})4849recent_births = [get_event_data(ck_extra_events_abi[1], log)["args"] for log in birth_logs]50Afișează totCopiere
NFT-uri populare
- Etherscan NFT Tracker listează NFT de top pe Ethereum după volumul transferurilor.
- CryptoKitties este un joc centrat în jurul creaturilor care pot fi crescute, colecționate și atât de adorabile pe care le numim CryptoKitties.
- Sorare este un joc global de fotbal fantezie unde poți colecta colecții de ediție limitată, îți poți gestiona echipele și poți concura pentru a câștiga premii.
- Serviciul de nume Ethereum (ENS) oferă o modalitate sigură ș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 o persoană.
- Unstoppable Domains 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 om și pot fi folosite pentru activarea de site-uri web rezistente la cenzură.
- Gods Unchained Cards 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ă la activele din joc.
Referințe suplimentare
- EIP-721: Token standard nefungibil ERC-721
- OpenZeppelin - Documentație ERC-721
- OpenZeppelin - Implementare ERC-721