ERC-20 টোকেন স্ট্যান্ডার্ড
পৃষ্ঠাটি সর্বশেষ আপডেট করা হয়েছে: ২৬ ফেব্রুয়ারী, ২০২৬
ভূমিকা
টোকেন কি?
Ethereum-এ টোকেনগুলি কার্যত যেকোনো কিছুর প্রতিনিধিত্ব করতে পারে:
- একটি অনলাইন প্ল্যাটফর্মে খ্যাতি পয়েন্ট
- একটি গেমের কোনো চরিত্রের দক্ষতা
- আর্থিক সম্পদ যেমন একটি কোম্পানির একটি শেয়ার
- USD-এর মতো একটি ফিয়াট মুদ্রা
- এক আউন্স সোনা
- এবং আরও...
Ethereum-এর এমন একটি শক্তিশালী বৈশিষ্ট্য অবশ্যই একটি শক্তিশালী মান দ্বারা পরিচালিত হতে হবে, তাই না? ঠিক এখানেই ERC-20 তার ভূমিকা পালন করে! এই স্ট্যান্ডার্ডটি ডেভেলপারদের এমন টোকেন অ্যাপ্লিকেশন তৈরি করতে দেয় যা অন্যান্য পণ্য এবং পরিষেবাগুলির সাথে আন্তঃকার্যক্ষম। ERC-20 স্ট্যান্ডার্ডটি -কে অতিরিক্ত কার্যকারিতা প্রদান করতেও ব্যবহৃত হয়।
ERC-20 কি?
ERC-20 ফানজিবল টোকেনগুলির জন্য একটি স্ট্যান্ডার্ড চালু করেছে, অন্য কথায়, তাদের একটি বৈশিষ্ট্য রয়েছে যা প্রতিটি টোকেনকে অন্য টোকেনের সাথে হুবহু একই (ধরন এবং মূল্যে) করে তোলে। উদাহরণস্বরূপ, একটি ERC-20 টোকেন ঠিক ETH-এর মতো কাজ করে, যার অর্থ হল 1 টোকেন অন্যান্য সমস্ত টোকেনের সমান এবং সর্বদা সমান থাকবে।
পূর্বশর্ত
বডি
ERC-20 (Ethereum রিক্যুয়েস্ট ফর কমেন্টস 20), যা নভেম্বর 2015-এ ফ্যাবিয়ান ভোগেলস্টেলার দ্বারা প্রস্তাবিত, একটি টোকেন স্ট্যান্ডার্ড যা স্মার্ট কন্ট্র্যাক্টের মধ্যে টোকেনের জন্য একটি API প্রয়োগ করে।
ERC-20 যে উদাহরণমূলক কার্যকারিতাগুলি প্রদান করে:
- এক অ্যাকাউন্ট থেকে অন্য অ্যাকাউন্টে টোকেন স্থানান্তর করা
- একটি অ্যাকাউন্টের বর্তমান টোকেন ব্যালেন্স পান
- নেটওয়ার্কে উপলব্ধ টোকেনের মোট সরবরাহ পান
- একটি অ্যাকাউন্ট থেকে একটি পরিমাণ টোকেন কোনো তৃতীয় পক্ষের অ্যাকাউন্ট দ্বারা ব্যয় করা যাবে কিনা তা অনুমোদন করুন
যদি একটি স্মার্ট কন্ট্র্যাক্ট নিম্নলিখিত পদ্ধতি এবং ইভেন্টগুলি প্রয়োগ করে তবে এটিকে একটি ERC-20 টোকেন কন্ট্র্যাক্ট বলা যেতে পারে এবং, একবার ডিপ্লয় করা হলে, এটি Ethereum-এ তৈরি টোকেনগুলির ট্র্যাক রাখার জন্য দায়ী থাকবে।
EIP-20 (opens in a new tab) থেকে:
মেথড
1function name() public view returns (string)2function symbol() public view returns (string)3function decimals() public view returns (uint8)4function totalSupply() public view returns (uint256)5function balanceOf(address _owner) public view returns (uint256 balance)6function transfer(address _to, uint256 _value) public returns (bool success)7function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)8function approve(address _spender, uint256 _value) public returns (bool success)9function allowance(address _owner, address _spender) public view returns (uint256 remaining)সবকটি দেখুনইভেন্ট
1event Transfer(address indexed _from, address indexed _to, uint256 _value)2event Approval(address indexed _owner, address indexed _spender, uint256 _value)উদাহরণ
আসুন দেখি Ethereum-এর যেকোনো ERC-20 টোকেন চুক্তি পরিদর্শন করার জন্য আমাদের কাজকে সহজ করতে একটি স্ট্যান্ডার্ড কতটা গুরুত্বপূর্ণ। যেকোনো ERC-20 টোকেনের জন্য একটি ইন্টারফেস তৈরি করতে আমাদের শুধু কন্ট্র্যাক্ট অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABI) প্রয়োজন। যেমন আপনি নিচে দেখতে পাচ্ছেন, এটিকে একটি ঝামেলাহীন উদাহরণ তৈরি করতে আমরা একটি সরলীকৃত ABI ব্যবহার করব।
Web3.py উদাহরণ
প্রথমে, নিশ্চিত করুন যে আপনি Web3.py (opens in a new tab) পাইথন লাইব্রেরিটি ইনস্টল করেছেন:
1pip install web31from web3 import Web3234w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))56dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI7weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Wrapped ether (WETH)89acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 21011# This is a simplified Contract Application Binary Interface (ABI) of an ERC-20 Token Contract.12# It will expose only the methods: balanceOf(address), decimals(), symbol() and totalSupply()13simplified_abi = [14 {15 'inputs': [{'internalType': 'address', 'name': 'account', 'type': 'address'}],16 'name': 'balanceOf',17 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],18 'stateMutability': 'view', 'type': 'function', 'constant': True19 },20 {21 'inputs': [],22 'name': 'decimals',23 'outputs': [{'internalType': 'uint8', 'name': '', 'type': 'uint8'}],24 'stateMutability': 'view', 'type': 'function', 'constant': True25 },26 {27 'inputs': [],28 'name': 'symbol',29 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],30 'stateMutability': 'view', 'type': 'function', 'constant': True31 },32 {33 'inputs': [],34 'name': 'totalSupply',35 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],36 'stateMutability': 'view', 'type': 'function', 'constant': True37 }38]3940dai_contract = w3.eth.contract(address=w3.to_checksum_address(dai_token_addr), abi=simplified_abi)41symbol = dai_contract.functions.symbol().call()42decimals = dai_contract.functions.decimals().call()43totalSupply = dai_contract.functions.totalSupply().call() / 10**decimals44addr_balance = dai_contract.functions.balanceOf(acc_address).call() / 10**decimals4546# DAI47print("===== %s =====" % symbol)48print("Total Supply:", totalSupply)49print("Addr Balance:", addr_balance)5051weth_contract = w3.eth.contract(address=w3.to_checksum_address(weth_token_addr), abi=simplified_abi)52symbol = weth_contract.functions.symbol().call()53decimals = weth_contract.functions.decimals().call()54totalSupply = weth_contract.functions.totalSupply().call() / 10**decimals55addr_balance = weth_contract.functions.balanceOf(acc_address).call() / 10**decimals5657# WETH58print("===== %s =====" % symbol)59print("Total Supply:", totalSupply)60print("Addr Balance:", addr_balance)সবকটি দেখুনজ্ঞাত সমস্যা
ERC-20 টোকেন গ্রহণ সমস্যা
06/20/2024 অনুযায়ী এই সমস্যার কারণে কমপক্ষে $83,656,418 মূল্যের ERC-20 টোকেন হারিয়ে গেছে। মনে রাখবেন যে একটি বিশুদ্ধ ERC-20 ইমপ্লিমেন্টেশন এই সমস্যার জন্য ঝুঁকিপূর্ণ, যদি না আপনি নীচে তালিকাভুক্ত স্ট্যান্ডার্ডের উপরে অতিরিক্ত বিধিনিষেধের একটি সেট প্রয়োগ করেন।
যখন ERC-20 টোকেন এমন একটি স্মার্ট কন্ট্রাক্টে পাঠানো হয় যা ERC-20 টোকেন পরিচালনা করার জন্য ডিজাইন করা হয়নি, তখন সেই টোকেনগুলি স্থায়ীভাবে হারিয়ে যেতে পারে। এটি ঘটে কারণ গ্রহণকারী কন্ট্র্যাক্টের আগত টোকেনগুলিকে চিনতে বা তার প্রতিক্রিয়া জানানোর কার্যকারিতা নেই এবং ERC-20 স্ট্যান্ডার্ডে গ্রহণকারী কন্ট্র্যাক্টকে আগত টোকেন সম্পর্কে অবহিত করার কোনো ব্যবস্থা নেই। এই সমস্যাটি যে প্রধান উপায়ে রূপ নেয় তা হল:
- টোকেন স্থানান্তর পদ্ধতি
- ERC-20 টোকেনগুলি
transferবাtransferFromফাংশন ব্যবহার করে স্থানান্তরিত হয়- যখন একজন ব্যবহারকারী এই ফাংশনগুলি ব্যবহার করে একটি কন্ট্র্যাক্ট ঠিকানায় টোকেন পাঠায়, তখন গ্রহণকারী কন্ট্র্যাক্টটি সেগুলি পরিচালনা করার জন্য ডিজাইন করা হয়েছে কিনা তা নির্বিশেষে টোকেনগুলি স্থানান্তরিত হয়
- বিজ্ঞপ্তির অভাব
- গ্রহণকারী কন্ট্র্যাক্ট কোনো বিজ্ঞপ্তি বা কলব্যাক পায় না যে টোকেনগুলি এতে পাঠানো হয়েছে।
- যদি গ্রহণকারী কন্ট্র্যাক্টে টোকেন পরিচালনা করার কোনো ব্যবস্থার অভাব থাকে (যেমন, একটি ফলব্যাক ফাংশন বা টোকেন গ্রহণ পরিচালনা করার জন্য একটি নিবেদিত ফাংশন), তাহলে টোকেনগুলি কার্যকরভাবে কন্ট্র্যাক্টের ঠিকানায় আটকে যায়।
- কোনো বিল্ট-ইন হ্যান্ডলিং নেই
- ERC-20 স্ট্যান্ডার্ডে গ্রহণকারী কন্ট্র্যাক্টগুলি প্রয়োগ করার জন্য কোনো বাধ্যতামূলক ফাংশন অন্তর্ভুক্ত নেই, যার ফলে এমন একটি পরিস্থিতি তৈরি হয় যেখানে অনেক কন্ট্র্যাক্ট আগত টোকেনগুলি সঠিকভাবে পরিচালনা করতে অক্ষম।
সম্ভাব্য সমাধান
যদিও ERC-20 এর সাথে এই সমস্যাটি সম্পূর্ণরূপে প্রতিরোধ করা সম্ভব নয়, তবে এমন কিছু পদ্ধতি রয়েছে যা শেষ ব্যবহারকারীর জন্য টোকেন হারানোর সম্ভাবনা উল্লেখযোগ্যভাবে হ্রাস করতে পারে:
- সবচেয়ে সাধারণ সমস্যা হলো যখন একজন ব্যবহারকারী টোকেন কন্ট্র্যাক্টের ঠিকানাতেই টোকেন পাঠায় (যেমন, USDT টোকেন কন্ট্র্যাক্টের ঠিকানায় USDT জমা দেওয়া)।
transfer(..)ফাংশনটিকে এই ধরনের স্থানান্তর প্রচেষ্টাগুলি প্রত্যাবর্তন করার জন্য সীমাবদ্ধ করার সুপারিশ করা হয়।transfer(..)ফাংশনের প্রয়োগের মধ্যেrequire(_to != address(this));চেক যোগ করার কথা বিবেচনা করুন। transfer(..)ফাংশনটি সাধারণত কন্ট্র্যাক্টে টোকেন জমা করার জন্য ডিজাইন করা হয়নি।approve(..) এবংtransferFrom(..)প্যাটার্ন এর পরিবর্তে কন্ট্র্যাক্টে ERC-20 টোকেন জমা করতে ব্যবহৃত হয়। ট্রান্সফার ফাংশনটিকে সীমাবদ্ধ করে যেকোনো কন্ট্রাক্টে টোকেন জমা দেওয়া নিষিদ্ধ করা সম্ভব, তবে এটি এমন কন্ট্রাক্টগুলোর সাথে সামঞ্জস্যতা ভঙ্গ করতে পারে যেগুলো ধরে নেয় যেtrasnfer(..)` ফাংশন ব্যবহার করে কন্ট্রাক্টে টোকেন জমা করা যায় (যেমন, Uniswap লিকুইডিটি পুল)।- সর্বদা ধরে নিন যে ERC-20 টোকেনগুলি আপনার কন্ট্রাক্টে এসে জমা হতে পারে, এমনকি যদি আপনার কন্ট্রাক্টের কোনো টোকেন গ্রহণ করার কথা না থাকে। প্রাপকের পক্ষ থেকে দুর্ঘটনাজনিত জমা প্রতিরোধ বা প্রত্যাখ্যান করার কোনো উপায় নেই। এমন একটি ফাংশন প্রয়োগ করার পরামর্শ দেওয়া হয় যা দুর্ঘটনাক্রমে জমা হওয়া ERC-20 টোকেনগুলি বের করার অনুমতি দেবে।
- বিকল্প টোকেন স্ট্যান্ডার্ড ব্যবহার করার কথা বিবেচনা করুন।
এই সমস্যা থেকে কিছু বিকল্প স্ট্যান্ডার্ড বেরিয়ে এসেছে যেমন ERC-223 বা ERC-1363।
আরও পড়ুন
- EIP-20: ERC-20 টোকেন স্ট্যান্ডার্ড (opens in a new tab)
- OpenZeppelin - টোকেন (opens in a new tab)
- OpenZeppelin - ERC-20 ইমপ্লিমেন্টেশন (opens in a new tab)
- Alchemy - সলিডিটি ERC20 টোকেনের জন্য গাইড (opens in a new tab)