Ajută la actualizarea acestei pagini

🌏

Există o nouă versiune a acestei pagini, dar acum este doar în engleză. Ajută-ne să traducem cea mai recentă versiune.

Această pagină este incompletă. Dacă ești expert în acest subiect, te rugăm să editezi această pagină și s-o presari cu înțelepciune.

ERC-721 Token standard nefungibil

Ultima editare: , Invalid DateTime
Edit page

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);
10
Afișează tot
📋 Copiere

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);
4
📋 Copiere

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 web3
2
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" # Contract CryptoKitties
8
9acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # Licitație de vânzări de CryptoKitties
10
11# 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': 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.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}")
66
67pregnant_kitties = ck_contract.functions.pregnantKitties().call()
68print(f"{name} [{symbol}] NFTs Pregnants: {pregnant_kitties}")
69
70# 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}
80
81# Avem nevoie de semnătura evenimentului pentru a filtra jurnalele
82event_signature = w3.sha3(text="Transfer(address,address,uint256)").hex()
83
84logs = w3.eth.getLogs({
85 "fromBlock": w3.eth.blockNumber - 120,
86 "address": w3.toChecksumAddress(ck_token_addr),
87 "topics": [event_signature]
88})
89
90# Note:
91# - 120 de blocuri este intervalul maxim pentru furnizorul CloudFlare
92# - 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#events
94# 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]
96
97kitty_id = recent_tx[0]['tokenId'] # Inserează "tokenId" aici din linkul de mai sus
98is_pregnant = ck_contract.functions.isPregnant(kitty_id).call()
99print(f"{name} [{symbol}] NFTs {kitty_id} este gestantă: {is_pregnant}")
100
Afișează tot
📋 Copiere

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 }]
24
25# Avem nevoie de semnătura evenimentului pentru a filtra jurnalele
26ck_event_signatures = [
27 w3.sha3(text="Pregnant(address,uint256,uint256,uint256)").hex(),
28 w3.sha3(text="Birth(address,uint256,uint256,uint256,uint256)").hex(),
29]
30
31# Iată un eveniment Pregnant:
32# - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog
33pregnant_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})
38
39recent_pregnants = [get_event_data(ck_extra_events_abi[0], log)["args"] for log in pregnant_logs]
40
41# Iată un eveniment Birth:
42# - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a
43birth_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})
48
49recent_births = [get_event_data(ck_extra_events_abi[1], log)["args"] for log in birth_logs]
50
Afișează tot
📋 Copiere
  • 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