ERC-721 Nem helyettesíthető tokenekről szóló szabvány
Utolsó módosítás: @robertdosa(opens in a new tab), 2023. november 19.
Bevezetés
Mi az a nem helyettesíthető token?
Egy nem helyettesíthető tokent (NFT) valami vagy valaki egyedi beazonosítására lehet használni. Ezt a tokentípust tökéletesen lehet használni olyan platformokon, melyek gyűjthető tárgyakat, hozzáférési kulcsokat, lottószelvényeket, sorszámozott koncertjegyeket vagy sporteseményjegyeket stb. árulnak. Ez a speciális tokentípus csodás lehetőségeket rejt magában, így megérdemel egy megfelelő szabványt, így az ERC-721 szolgál megoldásul!
Mi az az ERC-721?
Az ERC-721 bevezeti az NFT-szabványt, vagyis ez a tokentí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, uint256 tokenId
globálisan egyedi. Tehát egy dappnak lehet egy „konvertere”, amely a tokenId
változót használja bemenetre, kimenetként pedig valami menő dolog képét adja vissza, például zombikat, fegyvereket, képességeket vagy csodás 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 helyettesíthető tokenre vonatkozó 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 egyenlegének lekérdezése 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 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 helyettesíthető tokenszerző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(opens in a new tab):
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);Ö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);Má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 tokenszerződést megtekinthessük az Ethereumon. Csak a szerződés Alkalmazás bináris interfészé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(opens in a new tab) Python könyvtár telepítve van:
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# It will expose only the methods: 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}] 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# We need the event's signature to filter the logs82event_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# Notes:91# - Increase the number of blocks up from 120 if no Transfer event is returned.92# - 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" argument95recent_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'] # Paste the "tokenId" here from the link above99 is_pregnant = ck_contract.functions.isPregnant(kitty_id).call()100 print(f"{name} [{symbol}] NFTs {kitty_id} is pregnant: {is_pregnant}")Összes megjelenítéseMásolás
A CryptoKitties szerződésnek van egy pár érdekes eseménye, ami nem sztenderd.
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# We need the event's signature to filter the logs26ck_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# Here is a Pregnant Event: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# Here is a Birth Event: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]Összes megjelenítéseMásolás
Népszerű NFT-k
- Etherscan NFT Tracker(opens in a new tab) legnagyobb forgalommal rendelkező NFT-k listája az Ethereumon.
- CryptoKitties(opens in a new tab) egy játék, mely tenyészthető, gyűjthető és imádnivaló lényekről szól, melyeket CryptoKittiknek nevezünk.
- Sorare(opens in a new tab) egy globális fantáziafutball-játék, ahol korlátozott példányszámú gyűjthető dolgot lehet összeszedni, Ön irányíthatja a csapatait, és versenyezhet díjakért.
- Az Ethereum Name Service (ENS)(opens in a new tab) 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.
- A POAP(opens in a new tab) ingyenes NFT-ket biztosít azoknak, akik részt vesznek eseményeken vagy meghatározott akciókat hajtanak végre. A POAP-ok létrehozása és terjesztése ingyenes.
- Az Unstoppable Domains(opens in a new tab) egy San Francisco székhelyű vállalat, amely domainneveket fejleszt a blokkláncra. A blokklánc-domainek a kriptovalutacímeket ember által is olvasható nevekre cserélik, és cenzúraellenálló weboldalakhoz is használhatók.
- A Gods Unchained Cards(opens in a new tab) egy TCG (Trading Card Game) az Ethereum-blokkláncon, amely NFT-ket használ, hogy valódi tulajdonjogot biztosítson a játékon belüli eszközökre.
- A Bored Ape Yacht Club(opens in a new tab) egy 10 000 egyedi NFT-ből álló gyűjtemény, amely amellett, hogy bizonyíthatóan ritka műalkotás, a klub tagsági zálogaként is szolgál, és a közösségi erőfeszítések eredményeként idővel növekvő tagsági kedvezményeket és előnyöket biztosít.