ERC-721 नॉन-फंजिबल टोकन मानक
पृष्ठ अखेरचे अद्यतन: २५ फेब्रुवारी, २०२६
प्रस्तावना
नॉन-फंजिबल टोकन म्हणजे काय?
नॉन-फंजिबल टोकन (NFT) हे काहीतरी किंवा कोणालातरी अद्वितीय पद्धतीने ओळखण्यासाठी वापरले जाते. हे टोकन संग्रहणीय वस्तू, ॲक्सेस की, लॉटरीची तिकिटे, कॉन्सर्ट आणि क्रीडा सामन्यांसाठी क्रमांकित जागा इत्यादी देणाऱ्या प्लॅटफॉर्मवर वापरण्यासाठी योग्य आहे. या विशेष प्रकारच्या टोकनमध्ये अद्भूत शक्यता आहेत, त्यामुळे ते एका योग्य मानकास पात्र आहे, आणि ERC-721 हेच निराकरण करण्यासाठी आले आहे!
ERC-721 म्हणजे काय?
ERC-721 हे NFT साठी एक मानक सादर करते, दुसऱ्या शब्दांत, या प्रकारचे टोकन अद्वितीय असते आणि त्याचे मूल्य त्याच स्मार्ट कॉन्ट्रॅक्टमधील दुसऱ्या टोकनपेक्षा वेगळे असू शकते, kदाचित त्याचे वय, दुर्मिळता किंवा अगदी त्याच्या व्हिज्युअलसारख्या इतर गोष्टींमुळे. थांबा, व्हिज्युअल?
होय! सर्व NFTs मध्ये tokenId नावाचे uint256 व्हेरिएबल असते, म्हणून कोणत्याही ERC-721 कॉन्ट्रॅक्टसाठी, contract address, uint256 tokenId ही जोडी
जागतिक स्तरावर अद्वितीय असणे आवश्यक आहे. असे असले तरी, एका dApp मध्ये एक "कन्व्हर्टर" असू शकतो जो
tokenId इनपुट म्हणून वापरतो आणि झोम्बी, शस्त्रे, कौशल्ये किंवा आश्चर्यकारक किटीजसारख्या छान गोष्टीची इमेज आउटपुट करतो!
पूर्वतयारी
मुख्य भाग
जानेवारी 2018 मध्ये विल्यम एंट्रिंकन, डायटर शिर्ले, जेकब इव्हान्स, नास्तासिया सॅक्स यांनी प्रस्तावित केलेले ERC-721 (Ethereum रिक्वेस्ट फॉर कमेंट्स 721), हे एक नॉन-फंजिबल टोकन मानक आहे जे स्मार्ट कॉन्ट्रॅक्ट्समधील टोकन्ससाठी API लागू करते.
हे एका खात्यातून दुसऱ्या खात्यात टोकन हस्तांतरित करणे, खात्यातील सध्याची टोकन शिल्लक मिळवणे, एका विशिष्ट टोकनचा मालक मिळवणे आणि नेटवर्कवर उपलब्ध असलेल्या टोकनचा एकूण पुरवठा मिळवणे यासारख्या कार्यक्षमता प्रदान करते. या व्यतिरिक्त, यात इतर काही कार्यक्षमता आहेत, जसे की एखाद्या खात्यातून टोकनची रक्कम तृतीय-पक्ष खात्याद्वारे हलवली जाऊ शकते याला मान्यता देणे.
जर एखादा स्मार्ट कॉन्ट्रॅक्ट खालील पद्धती आणि इव्हेंट्स लागू करत असेल तर त्याला ERC-721 नॉन-फंजिबल टोकन कॉन्ट्रॅक्ट म्हटले जाऊ शकते आणि, एकदा तैनात केल्यावर, ते Ethereum वर तयार केलेल्या टोकनचा मागोवा ठेवण्यासाठी जबाबदार असेल.
EIP-721 (opens in a new tab) मधून:
मेथड्स
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);सर्व दाखवाइव्हेंट्स
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);उदाहरणे
Ethereum वरील कोणत्याही ERC-721 टोकन कॉन्ट्रॅक्टची तपासणी करणे आपल्यासाठी सोपे करण्यासाठी एक मानक किती महत्त्वाचे आहे ते पाहूया. कोणत्याही ERC-721 टोकनसाठी इंटरफेस तयार करण्यासाठी आपल्याला फक्त कॉन्ट्रॅक्ट ॲप्लिकेशन बायनरी इंटरफेस (ABI) ची आवश्यकता आहे. तुम्ही खाली पाहू शकता की आम्ही एक सरलीकृत ABI वापरणार आहोत, जेणेकरून हे एक कमी घर्षणाचे उदाहरण बनेल.
Web3.py उदाहरण
प्रथम, आपण Web3.py (opens in a new tab) Python लायब्ररी स्थापित केली असल्याची खात्री करा:
1pip install web31from 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}")सर्व दाखवाCryptoKitties कॉन्ट्रॅक्टमध्ये मानक इव्हेंट्स व्यतिरिक्त काही मनोरंजक इव्हेंट्स आहेत.
चला त्यापैकी Pregnant आणि Birth हे दोन तपासूया.
1# Using the Pregnant and Birth Events ABI to get info about new Kitties.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]सर्व दाखवालोकप्रिय NFTs
- Etherscan NFT Tracker (opens in a new tab) हस्तांतरण व्हॉल्यूमनुसार Ethereum वरील शीर्ष NFT ची यादी करते.
- CryptoKitties (opens in a new tab) हा प्रजननक्षम, संग्रहणीय आणि अत्यंत मोहक प्राण्यांभोवती केंद्रित असलेला एक खेळ आहे, ज्यांना आपण CryptoKitties म्हणतो.
- Sorare (opens in a new tab) हा एक जागतिक फँटसी फुटबॉल खेळ आहे जिथे तुम्ही मर्यादित आवृत्तीचे संग्रहणीय वस्तू गोळा करू शकता, तुमच्या संघांचे व्यवस्थापन करू शकता आणि बक्षिसे मिळवण्यासाठी स्पर्धा करू शकता.
- The Ethereum Name Service (ENS) (opens in a new tab) सोप्या, मानवी-वाचनीय नावांचा वापर करून ब्लॉकचेनवर आणि ब्लॉकचेनबाहेर संसाधनांना संबोधित करण्याचा एक सुरक्षित आणि विकेंद्रित मार्ग प्रदान करते.
- POAP (opens in a new tab) जे लोक कार्यक्रमांना उपस्थित राहतात किंवा विशिष्ट क्रिया पूर्ण करतात त्यांना मोफत NFTs वितरीत करते. POAPs तयार करणे आणि वितरित करणे विनामूल्य आहे.
- Unstoppable Domains (opens in a new tab) ही सॅन फ्रान्सिस्को-स्थित कंपनी आहे जी ब्लॉकचेनवर डोमेन तयार करत आहे. ब्लॉकचेन डोमेन मानवी-वाचनीय नावांनी क्रिप्टोकरन्सी पत्त्यांची जागा घेतात आणि सेन्सॉरशिप-प्रतिरोधक वेबसाइट्स सक्षम करण्यासाठी वापरल्या जाऊ शकतात.
- Gods Unchained Cards (opens in a new tab) हा Ethereum ब्लॉकचेनवरील एक TCG आहे जो इन-गेम मालमत्तेला खरी मालकी देण्यासाठी NFT's चा वापर करतो.
- Bored Ape Yacht Club (opens in a new tab) हा 10,000 युनिक NFTs चा संग्रह आहे, जो, एक सिद्ध-दुर्मिळ कलाकृती असण्यासोबतच, क्लबसाठी सदस्यत्व टोकन म्हणून काम करतो, आणि सदस्यांना फायदे आणि लाभ प्रदान करतो जे सामुदायिक प्रयत्नांच्या परिणामी कालांतराने वाढतात.