مرکزی مواد پر جائیں
Change page

⁦ERC-20⁩ ٹوکن سٹینڈرڈ

تعارف

ٹوکن کیا ہے؟

ٹوکنز ایتھیریم میں عملی طور پر کسی بھی چیز کی نمائندگی کر سکتے ہیں:

  • ایک آن لائن پلیٹ فارم میں ساکھ کے پوائنٹس
  • کسی گیم میں کردار کی مہارتیں
  • مالیاتی اثاثے جیسے کسی کمپنی میں حصہ
  • فیاٹ کرنسی جیسے USD
  • ایک اونس سونا
  • اور بہت کچھ...

ایتھیریم کی اتنی طاقتور خصوصیت کو ایک مضبوط سٹینڈرڈ کے ذریعے سنبھالا جانا چاہیے، ہے نا؟ بالکل یہیں ERC-20 اپنا کردار ادا کرتا ہے! یہ سٹینڈرڈ ڈیولپرز کو ایسی ٹوکن ایپلی کیشنز بنانے کی اجازت دیتا ہے جو دیگر پروڈکٹس اور سروسز کے ساتھ قابلِ باہمی عمل ہوں۔ ERC-20 سٹینڈرڈ کا استعمال کو اضافی فعالیت فراہم کرنے کے لیے بھی کیا جاتا ہے۔

ERC-20 کیا ہے؟

ERC-20 قابل تبادلہ ٹوکنز (Fungible Tokens) کے لیے ایک سٹینڈرڈ متعارف کراتا ہے، دوسرے الفاظ میں، ان میں ایک ایسی خصوصیت ہوتی ہے جو ہر ٹوکن کو بالکل دوسرے ٹوکن کے (قسم اور قدر میں) یکساں بناتی ہے۔ مثال کے طور پر، ایک ERC-20 ٹوکن بالکل ETH کی طرح کام کرتا ہے، جس کا مطلب ہے کہ 1 ٹوکن ہمیشہ دیگر تمام ٹوکنز کے برابر ہوتا ہے اور رہے گا۔

پیشگی شرائط

باڈی

ERC-20 (Ethereum Request for Comments 20)، جسے نومبر 2015 میں Fabian Vogelsteller نے تجویز کیا تھا، ایک ٹوکن سٹینڈرڈ ہے جو سمارٹ کنٹریکٹس کے اندر ٹوکنز کے لیے ایک API نافذ کرتا ہے۔

ERC-20 کی فراہم کردہ افعال کی مثالیں:

  • ایک اکاؤنٹ سے دوسرے اکاؤنٹ میں ٹوکنز کی منتقلی
  • کسی اکاؤنٹ کا موجودہ ٹوکن بیلنس حاصل کرنا
  • نیٹ ورک پر دستیاب ٹوکن کی کل سپلائی حاصل کرنا
  • یہ منظور کرنا کہ آیا کسی اکاؤنٹ سے ٹوکن کی ایک مخصوص رقم کسی تیسرے فریق کے اکاؤنٹ کے ذریعے خرچ کی جا سکتی ہے

اگر کوئی سمارٹ کنٹریکٹ درج ذیل طریقوں اور ایونٹس کو نافذ کرتا ہے تو اسے ERC-20 ٹوکن کنٹریکٹ کہا جا سکتا ہے اور، ایک بار تعینات ہونے کے بعد، یہ ایتھیریم پر بنائے گئے ٹوکنز کا ریکارڈ رکھنے کا ذمہ دار ہوگا۔

EIP-20 (opens in a new tab) سے:

طریقے

ایونٹس

event Transfer(address indexed _from, address indexed _to, uint256 _value)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)

مثالیں

آئیے دیکھتے ہیں کہ ایتھیریم پر کسی بھی ERC-20 ٹوکن کنٹریکٹ کا معائنہ کرنے کے لیے چیزوں کو آسان بنانے میں ایک سٹینڈرڈ کتنا اہم ہے۔ ہمیں کسی بھی ERC-20 ٹوکن کا انٹرفیس بنانے کے لیے صرف کنٹریکٹ ایپلیکیشن بائنری انٹرفیس (ABI) کی ضرورت ہوتی ہے۔ جیسا کہ آپ نیچے دیکھ سکتے ہیں، ہم اسے ایک آسان مثال بنانے کے لیے ایک سادہ ABI استعمال کریں گے۔

Web3.py کی مثال

سب سے پہلے، یقینی بنائیں کہ آپ نے Web3.py (opens in a new tab) Python لائبریری انسٹال کر لی ہے:

pip install web3

معلوم مسائل

ERC-20 ٹوکن وصولی کا مسئلہ

06/20/2024 تک اس مسئلے کی وجہ سے کم از کم $83,656,418 مالیت کے ERC-20 ٹوکنز ضائع ہو چکے ہیں۔ نوٹ کریں کہ ایک خالص ERC-20 عمل درآمد اس مسئلے کا شکار ہو سکتا ہے جب تک کہ آپ ذیل میں درج سٹینڈرڈ کے اوپر اضافی پابندیوں کا ایک سیٹ نافذ نہ کریں۔

جب ERC-20 ٹوکنز کسی ایسے سمارٹ کنٹریکٹ کو بھیجے جاتے ہیں جو ERC-20 ٹوکنز کو سنبھالنے کے لیے ڈیزائن نہیں کیا گیا ہے، تو وہ ٹوکنز مستقل طور پر ضائع ہو سکتے ہیں۔ ایسا اس لیے ہوتا ہے کیونکہ وصول کرنے والے کنٹریکٹ میں آنے والے ٹوکنز کو پہچاننے یا ان کا جواب دینے کی فعالیت نہیں ہوتی، اور ERC-20 سٹینڈرڈ میں وصول کرنے والے کنٹریکٹ کو آنے والے ٹوکنز کے بارے میں مطلع کرنے کا کوئی طریقہ کار نہیں ہے۔ یہ مسئلہ بنیادی طور پر درج ذیل طریقوں سے سامنے آتا ہے:

  1. ٹوکن کی منتقلی کا طریقہ کار
  • ERC-20 ٹوکنز کو transfer یا transferFrom فنکشنز کا استعمال کرتے ہوئے منتقل کیا جاتا ہے
    • جب کوئی صارف ان فنکشنز کا استعمال کرتے ہوئے کسی کنٹریکٹ کے پتے پر ٹوکنز بھیجتا ہے، تو ٹوکنز منتقل ہو جاتے ہیں قطع نظر اس کے کہ وصول کرنے والا کنٹریکٹ انہیں سنبھالنے کے لیے ڈیزائن کیا گیا ہے یا نہیں
  1. اطلاع کی کمی
    • وصول کرنے والے کنٹریکٹ کو کوئی اطلاع یا کال بیک موصول نہیں ہوتا کہ اسے ٹوکنز بھیجے گئے ہیں
    • اگر وصول کرنے والے کنٹریکٹ میں ٹوکنز کو سنبھالنے کے طریقہ کار کی کمی ہے (مثلاً، ایک فال بیک فنکشن یا ٹوکن کی وصولی کو منظم کرنے کے لیے ایک مخصوص فنکشن)، تو ٹوکنز مؤثر طریقے سے کنٹریکٹ کے پتے میں پھنس جاتے ہیں
  2. کوئی بلٹ ان ہینڈلنگ نہیں
    • ERC-20 سٹینڈرڈ میں وصول کرنے والے کنٹریکٹس کے لیے نافذ کرنے کے لیے کوئی لازمی فنکشن شامل نہیں ہے، جس کی وجہ سے ایسی صورتحال پیدا ہوتی ہے جہاں بہت سے کنٹریکٹس آنے والے ٹوکنز کو مناسب طریقے سے منظم کرنے سے قاصر ہوتے ہیں

ممکنہ حل

اگرچہ ERC-20 کے ساتھ اس مسئلے کو مکمل طور پر روکنا ممکن نہیں ہے، لیکن ایسے طریقے موجود ہیں جو آخری صارف کے لیے ٹوکنز کے ضائع ہونے کے امکان کو نمایاں طور پر کم کرنے کی اجازت دیں گے:

  • سب سے عام مسئلہ تب ہوتا ہے جب کوئی صارف ٹوکنز کو خود ٹوکن کنٹریکٹ کے پتے پر بھیجتا ہے (مثلاً، USDT ٹوکن کنٹریکٹ کے پتے پر جمع کیا گیا USDT)۔ یہ تجویز کیا جاتا ہے کہ ایسی منتقلی کی کوششوں کو ریورٹ کرنے کے لیے transfer(..) فنکشن کو محدود کیا جائے۔ transfer(..) فنکشن کے نفاذ کے اندر require(_to != address(this)); چیک شامل کرنے پر غور کریں۔
  • عام طور پر transfer(..) فنکشن کنٹریکٹس میں ٹوکنز جمع کرنے کے لیے ڈیزائن نہیں کیا گیا ہے۔ اس کے بجائے کنٹریکٹس میں ERC-20 ٹوکنز جمع کرنے کے لیے approve(..) & transferFrom(..) پیٹرن استعمال کیا جاتا ہے۔ منتقلی کے فنکشن کو محدود کرنا ممکن ہے تاکہ اس کے ساتھ کسی بھی کنٹریکٹ میں ٹوکنز جمع کرنے کی اجازت نہ دی جائے، تاہم یہ ان کنٹریکٹس کے ساتھ مطابقت کو توڑ سکتا ہے جو یہ فرض کرتے ہیں کہ ٹوکنز کو transfer(..) فنکشن کے ساتھ کنٹریکٹس میں جمع کیا جا سکتا ہے (مثلاً، یونی سویپ سیالیت کے پولز)۔
  • ہمیشہ یہ فرض کریں کہ ERC-20 ٹوکنز آپ کے کنٹریکٹ میں آ سکتے ہیں یہاں تک کہ اگر آپ کے کنٹریکٹ کو کبھی کوئی ٹوکن وصول نہیں کرنا چاہیے۔ وصول کنندگان کے اختتام پر حادثاتی ڈپازٹس کو روکنے یا مسترد کرنے کا کوئی طریقہ نہیں ہے۔ یہ تجویز کیا جاتا ہے کہ ایک ایسا فنکشن نافذ کیا جائے جو حادثاتی طور پر جمع کیے گئے ERC-20 ٹوکنز کو نکالنے کی اجازت دے۔
  • متبادل ٹوکن سٹینڈرڈز استعمال کرنے پر غور کریں۔

اس مسئلے سے کچھ متبادل سٹینڈرڈز سامنے آئے ہیں جیسے ERC-223 یا ERC-1363۔

مزید مطالعہ

دیگر قابل تبادلہ ٹوکن سٹینڈرڈز

ٹیوٹوریلز: ایتھیریم پر ERC-20 کے ساتھ تعمیر کریں