ERC-721 নন-ফাঞ্জিবল টোকেন স্ট্যান্ডার্ড
পৃষ্ঠাটি সর্বশেষ আপডেট করা হয়েছে: ২৫ ফেব্রুয়ারী, ২০২৬
ভূমিকা
নন-ফাঞ্জিবল টোকেন কী?
একটি নন-ফাঞ্জিবল টোকেন (NFT) কোনো কিছু বা কাউকে একটি অনন্য উপায়ে শনাক্ত করতে ব্যবহৃত হয়। এই ধরনের টোকেন এমন প্ল্যাটফর্মে ব্যবহারের জন্য উপযুক্ত যা সংগ্রহযোগ্য আইটেম, অ্যাক্সেস কী, লটারির টিকিট, কনসার্ট এবং খেলার ম্যাচের জন্য সংখ্যাযুক্ত আসন ইত্যাদি অফার করে। এই বিশেষ ধরনের টোকেনের অসাধারণ সম্ভাবনা রয়েছে তাই এর জন্য একটি সঠিক স্ট্যান্ডার্ড প্রয়োজন, ERC-721 সেই সমাধান নিয়ে এসেছে!
ERC-721 কী?
ERC-721, NFT-এর জন্য একটি স্ট্যান্ডার্ড চালু করে, অন্য কথায়, এই ধরনের টোকেন অনন্য এবং একই স্মার্ট কন্ট্র্যাক্ট থেকে অন্য টোকেনের চেয়ে ভিন্ন মান থাকতে পারে, সম্ভবত এর বয়স, বিরলতা বা এমনকি এর ভিজ্যুয়ালের মতো অন্য কিছুর কারণে। অপেক্ষা করুন, ভিজ্যুয়াল?
হ্যাঁ! সমস্ত NFT-এর tokenId নামক একটি uint256 ভেরিয়েবল আছে, তাই যেকোনো ERC-721 কন্ট্র্যাক্টের জন্য, contract address, uint256 tokenId জোড়াটি
বিশ্বব্যাপী অনন্য হতে হবে। বলা বাহুল্য, একটি dapp-এর একটি "কনভার্টার" থাকতে পারে যা
ইনপুট হিসাবে tokenId ব্যবহার করে এবং জম্বি, অস্ত্র, দক্ষতা বা আশ্চর্যজনক কিটিদের মতো দুর্দান্ত কিছুর একটি চিত্র আউটপুট করে!
পূর্বশর্ত
বডি
ERC-721 (Ethereum Request for Comments 721), যা উইলিয়াম এন্টিকেন, ডিটার শার্লি, জ্যাকব ইভান্স, নাস্টাসিয়া শ্যাক্স দ্বারা জানুয়ারী 2018-এ প্রস্তাবিত, এটি একটি নন-ফাঞ্জিবল টোকেন স্ট্যান্ডার্ড যা স্মার্ট কন্ট্র্যাক্টের মধ্যে টোকেনগুলির জন্য একটি API প্রয়োগ করে।
এটি একটি অ্যাকাউন্ট থেকে অন্য অ্যাকাউন্টে টোকেন স্থানান্তর করা, একটি অ্যাকাউন্টের বর্তমান টোকেন ব্যালেন্স পাওয়া, একটি নির্দিষ্ট টোকেনের মালিক কে তা জানা এবং নেটওয়ার্কে উপলব্ধ টোকেনের মোট সরবরাহ জানার মতো কার্যকারিতা প্রদান করে। এগুলি ছাড়াও, এটিতে আরও কিছু কার্যকারিতা রয়েছে, যেমন কোনও অ্যাকাউন্ট থেকে একটি নির্দিষ্ট পরিমাণ টোকেন একটি তৃতীয় পক্ষের অ্যাকাউন্টের দ্বারা স্থানান্তর করার অনুমোদন দেওয়া।
যদি একটি স্মার্ট কন্ট্র্যাক্ট নিম্নলিখিত পদ্ধতি এবং ইভেন্টগুলি প্রয়োগ করে তবে এটিকে একটি ERC-721 নন-ফাঞ্জিবল টোকেন কন্ট্র্যাক্ট বলা যেতে পারে এবং, একবার ডিপ্লয় করা হলে, এটি ইথেরিয়ামে তৈরি টোকেনগুলির ট্র্যাক রাখার জন্য দায়ী থাকবে।
EIP-721opens 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);উদাহরণ
আসুন দেখি কীভাবে একটি স্ট্যান্ডার্ড ইথেরিয়ামের যেকোনো ERC-721 টোকেন কন্ট্র্যাক্ট পরীক্ষা করার জন্য আমাদের জন্য জিনিসগুলিকে সহজ করে তোলে। যেকোনো ERC-721 টোকেনের একটি ইন্টারফেস তৈরি করতে আমাদের শুধুমাত্র কন্ট্র্যাক্ট অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABI) প্রয়োজন। যেমন আপনি নিচে দেখতে পাচ্ছেন, এটিকে একটি ঝামেলাহীন উদাহরণ তৈরি করতে আমরা একটি সরলীকৃত ABI ব্যবহার করব।
Web3.py উদাহরণ
প্রথমে, নিশ্চিত করুন যে আপনি Web3.pyopens in a new tab পাইথন লাইব্রেরিটি ইনস্টল করেছেন:
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]সবকটি দেখুনজনপ্রিয় NFT
- Etherscan NFT Trackeropens in a new tab স্থানান্তরের ভলিউম অনুসারে ইথেরিয়ামের শীর্ষস্থানীয় NFT-এর তালিকা করে।
- CryptoKittiesopens in a new tab হল প্রজননযোগ্য, সংগ্রহযোগ্য এবং অত্যন্ত আরাধ্য প্রাণীদের কেন্দ্র করে একটি গেম, যাদের আমরা CryptoKitties বলি।
- Sorareopens in a new tab একটি বিশ্বব্যাপী ফ্যান্টাসি ফুটবল খেলা যেখানে আপনি সীমিত সংস্করণের সংগ্রহযোগ্য জিনিস সংগ্রহ করতে পারেন, আপনার দল পরিচালনা করতে পারেন এবং পুরস্কার অর্জনের জন্য প্রতিযোগিতা করতে পারেন।
- The Ethereum Name Service (ENS)opens in a new tab সহজ, মানুষের পাঠযোগ্য নাম ব্যবহার করে ব্লকচেইনের ভিতরে এবং বাইরে উভয় রিসোর্স অ্যাড্রেস করার জন্য একটি নিরাপদ ও বিকেন্দ্রীভূত উপায় অফার করে।
- POAPopens in a new tab যারা ইভেন্টে যোগ দেয় বা নির্দিষ্ট কাজ সম্পন্ন করে তাদের বিনামূল্যে NFT সরবরাহ করে। POAP তৈরি এবং বিতরণ করা বিনামূল্যে।
- Unstoppable Domainsopens in a new tab হল একটি সান ফ্রান্সিসকো-ভিত্তিক কোম্পানি যা ব্লকচেইনে ডোমেইন তৈরি করে। ব্লকচেইন ডোমেইনগুলি ক্রিপ্টোকারেন্সি অ্যাড্রেসগুলিকে মানুষের পাঠযোগ্য নাম দিয়ে প্রতিস্থাপন করে এবং সেন্সরশিপ-প্রতিরোধী ওয়েবসাইটগুলিকে সক্ষম করতে ব্যবহার করা যেতে পারে।
- Gods Unchained Cardsopens in a new tab হল Ethereum ব্লকচেইনের একটি TCG যা ইন-গেম অ্যাসেটগুলিতে প্রকৃত মালিকানা আনতে NFT ব্যবহার করে।
- Bored Ape Yacht Clubopens in a new tab হলো ১০,০০০টি অনন্য NFT-এর একটি সংগ্রহ, যা একটি প্রমাণযোগ্য-বিরল শিল্পকর্ম হওয়ার পাশাপাশি ক্লাবের সদস্যপদ টোকেন হিসেবে কাজ করে, যা সদস্যদের জন্য বিভিন্ন সুযোগ-সুবিধা প্রদান করে এবং সম্প্রদায়ের প্রচেষ্টার ফলে সময়ের সাথে সাথে এর সুবিধা বাড়তে থাকে।