মূল কন্টেন্টে যান
Change page

ERC-721 নন-ফান্জেবল টোকেন স্ট্যান্ডার্ড

পেজ সর্বশেষ আপডেট: ২৫ ফেব্রুয়ারী, ২০২৬

ভূমিকা

নন-ফান্জেবল টোকেন কী?

একটি নন-ফান্জেবল টোকেন (NFT) কোনো কিছু বা কাউকে অনন্য উপায়ে শনাক্ত করতে ব্যবহৃত হয়। এই ধরনের টোকেন এমন প্ল্যাটফর্মগুলোতে ব্যবহারের জন্য উপযুক্ত যা সংগ্রহযোগ্য আইটেম, অ্যাক্সেস কী, লটারির টিকিট, কনসার্ট এবং স্পোর্টস ম্যাচের জন্য নম্বরযুক্ত আসন ইত্যাদি অফার করে। এই বিশেষ ধরনের টোকেনের আশ্চর্যজনক সম্ভাবনা রয়েছে, তাই এর একটি সঠিক স্ট্যান্ডার্ড থাকা প্রাপ্য, আর ERC-721 সেই সমস্যার সমাধান নিয়ে এসেছে!

ERC-721 কী?

ERC-721 NFT-এর জন্য একটি স্ট্যান্ডার্ড প্রবর্তন করে, অন্য কথায়, এই ধরনের টোকেন অনন্য এবং একই স্মার্ট কন্ট্রাক্ট থেকে আসা অন্য টোকেনের চেয়ে এর মান ভিন্ন হতে পারে, হতে পারে এর বয়স, বিরলতা বা এমনকি এর ভিজ্যুয়ালের মতো অন্য কিছুর কারণে। একটু দাঁড়ান, ভিজ্যুয়াল?

হ্যাঁ! সমস্ত NFT-তে tokenId নামক একটি uint256 ভেরিয়েবল থাকে, তাই যেকোনো ERC-721 কন্ট্রাক্টের জন্য, contract address, uint256 tokenId জোড়াটি বিশ্বব্যাপী অনন্য হতে হবে। বলা যায়, একটি ডিএ্যাপ-এ এমন একটি "কনভার্টার" থাকতে পারে যা tokenId-কে ইনপুট হিসেবে ব্যবহার করে এবং জম্বি, অস্ত্র, দক্ষতা বা চমৎকার বিড়ালছানার মতো দারুণ কিছুর ছবি আউটপুট হিসেবে দেয়!

পূর্বশর্ত

মূল অংশ

ERC-721 (Ethereum Request for Comments 721), যা 2018 সালের জানুয়ারিতে উইলিয়াম এন্ট্রিকেন, ডিটার শার্লি, জ্যাকব ইভান্স এবং নাস্তাসিয়া শ্যাক্স দ্বারা প্রস্তাবিত হয়েছিল, এটি একটি নন-ফান্জেবল টোকেন স্ট্যান্ডার্ড যা স্মার্ট কন্ট্রাক্ট-এর মধ্যে টোকেনগুলোর জন্য একটি API বাস্তবায়ন করে।

এটি এক একাউন্ট থেকে অন্য একাউন্টে টোকেন স্থানান্তর করা, একটি একাউন্টের বর্তমান টোকেন ব্যালেন্স জানা, একটি নির্দিষ্ট টোকেনের মালিককে খুঁজে বের করা এবং নেটওয়ার্ক-এ উপলব্ধ টোকেনের মোট সরবরাহ জানার মতো কার্যকারিতা প্রদান করে। এগুলোর পাশাপাশি এর আরও কিছু কার্যকারিতা রয়েছে, যেমন একটি একাউন্ট থেকে নির্দিষ্ট পরিমাণ টোকেন তৃতীয় পক্ষের একাউন্ট দ্বারা সরানো যেতে পারে তা অনুমোদন করা।

যদি একটি স্মার্ট কন্ট্রাক্ট নিচের মেথড এবং ইভেন্টগুলো বাস্তবায়ন করে, তবে এটিকে একটি ERC-721 নন-ফান্জেবল টোকেন কন্ট্রাক্ট বলা যেতে পারে এবং একবার ডিপ্লয় করা হলে, এটি ইথিরিয়ামে তৈরি করা টোকেনগুলোর ট্র্যাক রাখার জন্য দায়ী থাকবে।

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);

উদাহরণ

আসুন দেখি ইথিরিয়ামে যেকোনো ERC-721 টোকেন কন্ট্রাক্ট পরিদর্শন করা আমাদের জন্য সহজ করতে একটি স্ট্যান্ডার্ড কতটা গুরুত্বপূর্ণ। যেকোনো ERC-721 টোকেনের জন্য একটি ইন্টারফেস তৈরি করতে আমাদের শুধু কন্ট্রাক্ট অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABI) প্রয়োজন। নিচে দেখতে পাবেন যে আমরা একটি সরলীকৃত ABI ব্যবহার করব, যাতে এটি সহজে বোঝা যায় এমন একটি উদাহরণ হয়।

Web3.py উদাহরণ

প্রথমে, নিশ্চিত করুন যে আপনি Web3.py (opens in a new tab) পাইথন লাইব্রেরি ইনস্টল করেছেন:

1pip install web3
1from web3 import Web3
2from web3._utils.events import get_event_data
3
4
5w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))
6
7ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # ক্রিপ্টোকিটিজ কন্ট্রাক্ট
8
9acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # ক্রিপ্টোকিটিজ বিক্রির নিলাম
10
11# এটি একটি 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': True
19 },
20 {
21 'inputs': [],
22 'name': 'name',
23 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
24 'stateMutability': 'view', 'type': 'function', 'constant': True
25 },
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': True
31 },
32 {
33 'inputs': [],
34 'name': 'symbol',
35 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
36 'stateMutability': 'view', 'type': 'function', 'constant': True
37 },
38 {
39 'inputs': [],
40 'name': 'totalSupply',
41 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
42 'stateMutability': 'view', 'type': 'function', 'constant': True
43 },
44]
45
46ck_extra_abi = [
47 {
48 'inputs': [],
49 'name': 'pregnantKitties',
50 'outputs': [{'name': '', 'type': 'uint256'}],
51 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
52 },
53 {
54 'inputs': [{'name': '_kittyId', 'type': 'uint256'}],
55 'name': 'isPregnant',
56 'outputs': [{'name': '', 'type': 'bool'}],
57 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
58 }
59]
60
61ck_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}")
66
67pregnant_kitties = ck_contract.functions.pregnantKitties().call()
68print(f"{name} [{symbol}] NFTs Pregnants: {pregnant_kitties}")
69
70# ট্রান্সফার হওয়া কিটিজ সম্পর্কে তথ্য পেতে ট্রান্সফার ইভেন্ট 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}
80
81# লগগুলো ফিল্টার করার জন্য আমাদের ইভেন্টের সিগনেচার প্রয়োজন
82event_signature = w3.keccak(text="Transfer(address,address,uint256)").hex()
83
84logs = 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})
89
90# দ্রষ্টব্য:
91# - যদি কোনো ট্রান্সফার ইভেন্ট না পাওয়া যায়, তবে ব্লকের সংখ্যা ১২০ থেকে বাড়িয়ে দিন।
92# - যদি আপনি কোনো ট্রান্সফার ইভেন্ট খুঁজে না পান, তবে আপনি এখান থেকেও একটি tokenId পাওয়ার চেষ্টা করতে পারেন:
93# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events
94# ইভেন্টের লগগুলো প্রসারিত করতে ক্লিক করুন এবং এর "tokenId" আর্গুমেন্টটি কপি করুন
95recent_tx = [get_event_data(w3.codec, tx_event_abi, log)["args"] for log in logs]
96
97if 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# নতুন কিটিজ সম্পর্কে তথ্য পেতে প্রেগন্যান্ট এবং বার্থ ইভেন্ট 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 }]
24
25# লগগুলো ফিল্টার করার জন্য আমাদের ইভেন্টের সিগনেচার প্রয়োজন
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]
30
31# এখানে একটি প্রেগন্যান্ট ইভেন্ট দেওয়া হলো:
32# - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog
33pregnant_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})
38
39recent_pregnants = [get_event_data(w3.codec, ck_extra_events_abi[0], log)["args"] for log in pregnant_logs]
40
41# এখানে একটি বার্থ ইভেন্ট দেওয়া হলো:
42# - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a
43birth_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})
48
49recent_births = [get_event_data(w3.codec, ck_extra_events_abi[1], log)["args"] for log in birth_logs]
সব দেখান
  • Etherscan NFT Tracker (opens in a new tab) ট্রান্সফার ভলিউম অনুযায়ী ইথিরিয়ামের শীর্ষ 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) ইভেন্টে অংশগ্রহণকারী বা নির্দিষ্ট কাজ সম্পন্নকারী ব্যক্তিদের বিনামূল্যে NFT প্রদান করে। POAP তৈরি এবং বিতরণ করা সম্পূর্ণ বিনামূল্যে।
  • Unstoppable Domains (opens in a new tab) হলো সান ফ্রান্সিসকো-ভিত্তিক একটি কোম্পানি যা ব্লকচেইন-এ ডোমেইন তৈরি করে। ব্লকচেইন ডোমেইনগুলো ক্রিপটোকারেন্সি এডড্রেস-কে মানুষের পাঠযোগ্য নাম দিয়ে প্রতিস্থাপন করে এবং সেন্সরশিপ-প্রতিরোধী ওয়েবসাইটগুলো সক্ষম করতে ব্যবহার করা যেতে পারে।
  • Gods Unchained Cards (opens in a new tab) হলো ইথিরিয়াম ব্লকচেইন-এর ওপর একটি TCG যা ইন-গেম অ্যাসেটগুলোতে প্রকৃত মালিকানা আনতে NFT ব্যবহার করে।
  • Bored Ape Yacht Club (opens in a new tab) হলো 10,000টি অনন্য NFT-এর একটি সংগ্রহ, যা একটি প্রমাণিত-বিরল শিল্পকর্ম হওয়ার পাশাপাশি ক্লাবের সদস্যপদ টোকেন হিসেবে কাজ করে, যা সদস্যদের এমন সব সুবিধা প্রদান করে যা সময়ের সাথে সাথে কমিউনিটির প্রচেষ্টার ফলে বৃদ্ধি পায়।

আরও পড়ুন

টিউটোরিয়াল: ইথিরিয়ামে নন-ফান্জেবল টোকেন (ERC-721) দিয়ে তৈরি করুন

এই আর্টিকেলটি কি সহায়ক ছিল?