ERC-721 Nem Felcserélhető Token Szabvány
Bevezetés
Mi az a nem felcserélhető token?
Egy nem felcserélhető tokent (NFT) valaki vagy valami egyedi beazonosítására lehet használni. Ezt a token típust tökéletesen lehet használni olyan platformokon, melyek gyűjthető tárgyakat, hozzáférési kulcsokat, lottó szelvényeket, sorszámozott koncert jegyeket vagy sportesemény jegyeket stb. árulnak. Ez a speciális token típus csodás lehetőségeket rejt magában, így megérdemel egy rendes szabványt, az ERC-721 szolgál megoldásul!
Mi az az ERC-721?
Az ERC-721 bevezeti az NFT szabványt, vagyis ez a token típus egyedi és különböző értékekkel rendelkezhet, mint egy másik token ugyanabból az okosszerződésből, ami esetleg a korából, ritkaságából vagy a kinézetéből származik. Egy pillanat, kinézet?
Igen! Minden NFT-nek van egy uint256
változója tokenId
néven, így minden ERC-721 szerződéshez tartozó contract address-nek és a uint256 tokenId-nek
globálisan egyedinek kell lennie. Mondjuk egy dappnak lehet egy "konvertere", mely a tokenId
változót használja bemenetre és kimenetként valami menő dolog képét adja vissza például zombikat, fegyvereket, képességeket vagy csodálatos kiscicákat!
Előfeltételek
Törzs
Az ERC-721 (Ethereum Request for Comments 721), melyet William Entriken, Dieter Shirley, Jacob Evans és Nastassia Sachs javasolt 2018 januárjában, egy nem felcserélhető token szabványt vezet be, mely egy token API-t implementál az okosszerződéseken belül.
Olyan funkcionalitásokat tartalmaz, mint a token átutalás egyik számláról a másikra, a token jelenlegi egyenlege az adott számlán, az adott token jelenlegi tulajdonosa valamint a teljes elérhető tokenmennyiség a hálózaton. Emellett vannak más más funkciók is, mint például annak jóváhagyása, hogy egy harmadik fél számlája átmozgasson egy bizonyos mennyiségű tokent az adott számláról.
Ha egy okosszerződés implementálja a következő metódusokat és eseményeket, akkor egy ERC-721 nem felcserélhető token szerződésnek lehet nevezni, és a telepítés után a létrejött tokenek számontartásáért lesz felelős az Ethereumon.
Az EIP-721-ből:
Metódusok
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Összes megjelenítéseMásolás
Események
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);4Másolás
Példák
Nézzük meg, miért olyan fontos egy szabvány, hogy egyszerűbbé tegye számunkra azt, hogy bármely ERC-721 token szerződést megtekinthessük az Ethereumon. Csak a szerződés Application Binary Interface-ére (ABI) lesz szükség, hogy egy felületet készítsünk bármely ERC-721 tokennek. Ahogy lentebb látni fogod, egy egyszerűsített ABI-t használunk, hogy egy egyszerűbb példával éljünk.
Web3.py példa
Először győződj meg arról, hogy a Web3.py Python könyvtár telepítve van:
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" # CryptoKitties Szerződés89acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # CryptoKitties Aukció1011# Ez az ERC-721 NFT szerződésnek az egyszerűsített Contract Application Binary Interface-e (ABI).12# Csak a következő metódusokat tartalmazza: 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# Using the Transfer Event ABI to get info about transferred 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# Szükségünk van az esemény szignójára, hogy kiszűrjük a logokat82event_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# Megjegyzések:91# - a Cloudflare szolgáltatónak 120 blokk a maximum hatótávja92# - Ha nem találtál semmilyen Transfer eseményt, akkor a tokenId-t megkapthatod itt is:93# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events94# Kattints az esemény logok kiterjesztésére és másold ki a "tokenId" paraméterét9596recent_tx = [get_event_data(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}")101Összes megjelenítéseMásolás
A CryptoKitties szerződésnek van egy pár érdekes eseménye, ami nem standard.
Nézzünk meg kettőt közülük, Pregnant
és Birth
.
1# A Pregnant és a Birth esemény ABI-ok használata, hogy infókat kapjunk meg az új cicákról.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# Szükségünk van az esemény szignójára, hogy kiszűrjük a logokat26ck_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# Itt 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_extra_events_abi[0]]37})3839recent_pregnants = [get_event_data(ck_extra_events_abi[0], log)["args"] for log in pregnant_logs]4041# Itt 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_extra_events_abi[1]]47})4849recent_births = [get_event_data(ck_extra_events_abi[1], log)["args"] for log in birth_logs]50Összes megjelenítéseMásolás
Népszerű NFT-k
- Etherscan NFT Tracker legnagyobb forgalommal rendelkező NFT-k listája az Ethereumon.
- CryptoKitties egy játék, mely pároztatható, gyűjthető és imádnivaló lényekről szól, melyeket CryptoKittinek nevezünk.
- Sorare egy globális fantáziafutball-játék, ahol korlátozott példányszámú gyűjtögetni valót gyűjthetsz, irányíthatod a csapataidat, és versenyezhetsz, hogy díjakat szerezz.
- Az Ethereum Name Service (ENS) egy biztonságos & decentralizált módját kínálja az erőforrások kezelésére a blokkláncon vagy azon kívül egyszerű, emberek számára is olvasható nevek használatával.
- Unstoppable Domains egy San Francisco székhelyű vállalat, mely domain neveket fejleszt a blokkláncra. A blokklánc domainek a kriptovaluta-címeket ember által is olvasható nevekre cserélik, és használhatók cenzúra-ellenálló weboldalakhoz is.
- Gods Unchained Cards egy TCG az Ethereum blokkláncon, mely NFT-ket használ, hogy valódi tulajdonjogot biztosítson a játékon belüli eszközökre.
További olvasnivaló
- ERC-721: Nem Felcserélhető Token Szabvány
- OpenZeppelin - ERC-721 Dokumentáció
- OpenZeppelin - ERC-721 Implementáció