ERC-721 نان فنجیبل ٹوکن اسٹینڈرڈ
صفحہ کی آخری اپ ڈیٹ: 25 فروری، 2026
تعارف
نان فنجیبل ٹوکن کیا ہے؟
ایک نان فنجیبل ٹوکن (NFT) کسی چیز یا شخص کو منفرد انداز میں پہچاننے کے لیے استعمال ہوتا ہے۔ اس قسم کا ٹوکن ان پلیٹ فارمز پر استعمال کے لیے بہترین ہے جو جمع کرنے والی اشیاء (collectible items)، رسائی کی چابیاں (access keys)، لاٹری ٹکٹ، کنسرٹس اور کھیلوں کے میچوں کے لیے نمبر والی نشستیں وغیرہ پیش کرتے ہیں۔ اس خاص قسم کے ٹوکن میں حیرت انگیز امکانات ہیں اس لیے یہ ایک مناسب معیار (Standard) کا حقدار ہے، ERC-721 اسی مسئلے کو حل کرنے کے لیے آیا ہے!
ERC-721 کیا ہے؟
ERC-721 NFT کے لیے ایک معیار متعارف کراتا ہے، دوسرے الفاظ میں، اس قسم کا ٹوکن منفرد ہوتا ہے اور ایک ہی اسمارٹ کانٹریکٹ کے دوسرے ٹوکن سے مختلف قدر رکھ سکتا ہے، شاید اس کی عمر، نایاب ہونے یا اس کی ظاہری شکل (visual) جیسی کسی اور چیز کی وجہ سے۔ رکیے، ظاہری شکل؟
جی ہاں! تمام NFTs میں ایک uint256 متغیر (variable) ہوتا ہے جسے tokenId کہا جاتا ہے، لہذا کسی بھی ERC-721 کانٹریکٹ کے لیے، جوڑا contract address, uint256 tokenId عالمی سطح پر منفرد ہونا چاہیے۔ اس کے ساتھ، ایک dapp میں ایک "کنورٹر" ہو سکتا ہے جو tokenId کو ان پٹ کے طور پر استعمال کرتا ہے اور کسی زبردست چیز کی تصویر آؤٹ پٹ کرتا ہے، جیسے زومبی، ہتھیار، مہارتیں یا حیرت انگیز بلیاں!
پیشگی شرائط
باڈی
ERC-721 (Ethereum Request for Comments 721)، جسے ولیم اینٹریکن (William Entriken)، ڈیٹر شرلی (Dieter Shirley)، جیکب ایونز (Jacob Evans)، اور نسٹاسیا سیکس (Nastassia Sachs) نے جنوری 2018 میں تجویز کیا تھا، ایک نان فنجیبل ٹوکن اسٹینڈرڈ ہے جو اسمارٹ کانٹریکٹس کے اندر ٹوکنز کے لیے ایک API نافذ کرتا ہے۔
یہ ایک اکاؤنٹ سے دوسرے اکاؤنٹ میں ٹوکن منتقل کرنے، کسی اکاؤنٹ کا موجودہ ٹوکن بیلنس حاصل کرنے، کسی مخصوص ٹوکن کے مالک کو جاننے اور نیٹ ورک پر دستیاب ٹوکن کی کل سپلائی حاصل کرنے جیسی خصوصیات فراہم کرتا ہے۔ ان کے علاوہ اس میں کچھ اور خصوصیات بھی ہیں جیسے یہ منظور کرنا کہ کسی اکاؤنٹ سے ٹوکن کی ایک مقدار کو کسی تیسرے فریق (third party) کے اکاؤنٹ کے ذریعے منتقل کیا جا سکتا ہے۔
اگر کوئی اسمارٹ کانٹریکٹ درج ذیل طریقوں (methods) اور ایونٹس (events) کو نافذ کرتا ہے تو اسے ERC-721 نان فنجیبل ٹوکن کانٹریکٹ کہا جا سکتا ہے اور، ایک بار ڈیپلائے ہونے کے بعد، یہ Ethereum پر بنائے گئے ٹوکنز کا ریکارڈ رکھنے کا ذمہ دار ہوگا۔
EIP-721 (opens in a new tab) سے:
طریقے (Methods)
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);سب دکھائیںایونٹس (Events)
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 ٹوکن کانٹریکٹ کا معائنہ کرنے کے لیے چیزوں کو آسان بنانے میں ایک معیار (Standard) کتنا اہم ہے۔ ہمیں کسی بھی 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" # کرپٹو کٹیز کانٹریکٹ89acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # کرپٹو کٹیز سیلز آکشن1011# یہ ایک ERC-721 NFT کانٹریکٹ کا سادہ کانٹریکٹ ایپلیکیشن بائنری انٹرفیس (ABI) ہے۔12# یہ صرف ان میتھڈز کو ظاہر کرے گا: 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# منتقل شدہ کٹیز کے بارے میں معلومات حاصل کرنے کے لیے ٹرانسفر ایونٹ ABI کا استعمال کیا جا رہا ہے۔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# ہمیں لاگز کو فلٹر کرنے کے لیے ایونٹ کے دستخط (signature) کی ضرورت ہے۔82event_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# نوٹس:91# - اگر کوئی ٹرانسفر ایونٹ واپس نہیں آتا ہے تو بلاکس کی تعداد 120 سے بڑھا دیں۔92# - اگر آپ کو کوئی ٹرانسفر ایونٹ نہیں ملا تو آپ یہاں سے بھی tokenId حاصل کرنے کی کوشش کر سکتے ہیں:93# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events94# ایونٹ کے لاگز کو پھیلانے کے لیے کلک کریں اور اس کا "tokenId" آرگومنٹ کاپی کریں۔95recent_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'] # اوپر دیے گئے لنک سے "tokenId" یہاں پیسٹ کریں۔99 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# نئی کٹیز کے بارے میں معلومات حاصل کرنے کے لیے پریگننٹ (Pregnant) اور برتھ (Birth) ایونٹس ABI کا استعمال کیا جا رہا ہے۔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# ہمیں لاگز کو فلٹر کرنے کے لیے ایونٹ کے دستخط (signature) کی ضرورت ہے۔26ck_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# یہاں ایک پریگننٹ (Pregnant) ایونٹ ہے: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# یہاں ایک برتھ (Birth) ایونٹ ہے: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 ہے جو ان گیم اثاثوں کی حقیقی ملکیت لانے کے لیے NFTs کا استعمال کرتا ہے۔
- Bored Ape Yacht Club (opens in a new tab) 10,000 منفرد NFTs کا مجموعہ ہے، جو کہ آرٹ کا ایک ثابت شدہ نایاب نمونہ ہونے کے ساتھ ساتھ، کلب کے ممبرشپ ٹوکن کے طور پر بھی کام کرتا ہے، جو ممبران کو مراعات اور فوائد فراہم کرتا ہے جو کمیونٹی کی کوششوں کے نتیجے میں وقت کے ساتھ بڑھتے ہیں۔
مزید مطالعہ
- EIP-721: ERC-721 نان فنجیبل ٹوکن اسٹینڈرڈ (opens in a new tab)
- OpenZeppelin - ERC-721 دستاویزات (opens in a new tab)
- OpenZeppelin - ERC-721 کا نفاذ (opens in a new tab)
- Alchemy NFT API (opens in a new tab)
ٹیوٹوریلز: Ethereum پر نان فنجیبل ٹوکنز (ERC-721) کے ساتھ تعمیر کریں
- Vyper ERC-721 کانٹریکٹ واک تھرو – Vyper میں لکھے گئے مکمل ERC-721 NFT کانٹریکٹ کا ایک تشریحی واک تھرو۔
- NFT کیسے لکھیں اور ڈیپلائے کریں (حصہ 1/3) – اپنا پہلا ERC-721 اسمارٹ کانٹریکٹ لکھنے اور ڈیپلائے کرنے کے لیے مرحلہ وار گائیڈ۔
- NFT کو منٹ (Mint) کیسے کریں (حصہ 2/3) – اپنے ڈیپلائے کیے گئے اسمارٹ کانٹریکٹ اور Web3 کا استعمال کرتے ہوئے ERC-721 NFT کو منٹ کرنے کا طریقہ۔
- اپنے والیٹ میں اپنا NFT کیسے دیکھیں (حصہ 3/3) – ڈیپلائمنٹ کے بعد MetaMask میں اپنے منٹ کیے گئے NFT کو دکھانے کا طریقہ۔
- NFT منٹر ٹیوٹوریل – React فرنٹ اینڈ، MetaMask، اور Alchemy کے ساتھ ایک فل اسٹیک NFT منٹنگ dapp بنائیں۔