تعیناتی سے پہلے سمارٹ کنٹریکٹ کے پتے کا تعین کیسے کریں: کرپٹو ایکسچینج کے لیے CREATE2 کا استعمال

بلاکچین کا موضوع نہ صرف ہر قسم کی ہائپ کا ذریعہ بنتا ہے بلکہ ایسے خیالات بھی جو تکنیکی نقطہ نظر سے بہت قیمتی ہوتے ہیں۔ لہذا، اس نے دھوپ والے شہر کے رہائشیوں کو نظرانداز نہیں کیا۔ لوگ قریب سے دیکھ رہے ہیں، مطالعہ کر رہے ہیں، روایتی معلومات کی حفاظت میں اپنی مہارت کو بلاک چین سسٹم میں منتقل کرنے کی کوشش کر رہے ہیں۔ اب تک، یہ اسپاٹ پر ہے: Rostelecom-Solar کی ترقیات میں سے ایک بلاکچین پر مبنی سافٹ ویئر کی سیکیورٹی کو چیک کر سکتی ہے۔ اور راستے میں، بلاکچین کمیونٹی کے لاگو مسائل کو حل کرنے کے بارے میں کچھ خیالات پیدا ہوتے ہیں۔ ان لائف ہیکس میں سے ایک - CREATE2 کا استعمال کرتے ہوئے تعیناتی سے پہلے سمارٹ کنٹریکٹ کے پتے کا تعین کیسے کریں - آج میں آپ کے ساتھ کٹ کے نیچے شیئر کرنا چاہتا ہوں۔

تعیناتی سے پہلے سمارٹ کنٹریکٹ کے پتے کا تعین کیسے کریں: کرپٹو ایکسچینج کے لیے CREATE2 کا استعمال
CREATE2 opcode اس سال 28 فروری کو قسطنطنیہ کے ہارڈ فورک میں شامل کیا گیا تھا۔ جیسا کہ EIP میں بتایا گیا ہے، یہ آپکوڈ بنیادی طور پر ریاستی چینلز کے لیے متعارف کرایا گیا تھا۔ تاہم، ہم نے اسے ایک مختلف مسئلہ حل کرنے کے لیے استعمال کیا۔

ایکسچینج پر بیلنس رکھنے والے صارفین ہیں۔ ہمیں ہر صارف کو ایک ایتھریم ایڈریس فراہم کرنا چاہیے جس پر کوئی بھی ٹوکن بھیج سکتا ہے، اس طرح ان کے اکاؤنٹ کو بھرنا ہوگا۔ آئیے ان پتوں کو "پرس" کہتے ہیں۔ جب ٹوکن بٹوے میں آتے ہیں، تو ہمیں انہیں ایک ہی والیٹ (ہاٹ والیٹ) پر بھیجنا چاہیے۔

مندرجہ ذیل حصوں میں، میں CREATE2 کے بغیر اس مسئلے کو حل کرنے کے اختیارات کا تجزیہ کرتا ہوں اور آپ کو بتاتا ہوں کہ ہم نے انہیں کیوں ترک کیا۔ اگر آپ صرف حتمی نتیجہ میں دلچسپی رکھتے ہیں، تو آپ اسے "حتمی حل" سیکشن میں تلاش کر سکتے ہیں۔

ایتھریم ایڈریس

سب سے آسان حل نئے صارفین کے لیے نئے Ethereum پتے تیار کرنا ہے۔ یہ پتے بٹوے ہوں گے۔ ٹوکن کو بٹوے سے ہاٹ والٹ میں منتقل کرنے کے لیے، آپ کو فنکشن کو کال کرکے لین دین پر دستخط کرنے کی ضرورت ہے۔ منتقلی() بیک اینڈ سے بٹوے کی نجی کلید کے ساتھ۔

اس نقطہ نظر کے درج ذیل فوائد ہیں:

  • یہ صرف ہے
  • بٹوے سے ہاٹ والٹ میں ٹوکن کی منتقلی کی لاگت فنکشن کال کی لاگت کے برابر ہے۔ منتقلی()

تاہم، ہم نے اس نقطہ نظر کے خلاف فیصلہ کیا کیونکہ اس میں ایک بڑی خرابی ہے: آپ کو نجی چابیاں کہیں ذخیرہ کرنے کی ضرورت ہے۔ نہ صرف وہ کھو سکتے ہیں، بلکہ آپ کو ان کیز تک رسائی کا احتیاط سے انتظام کرنے کی بھی ضرورت ہے۔ اگر ان میں سے کم از کم ایک سے سمجھوتہ کیا جاتا ہے، تو کسی خاص صارف کے ٹوکن گرم بٹوے تک نہیں پہنچیں گے۔

تعیناتی سے پہلے سمارٹ کنٹریکٹ کے پتے کا تعین کیسے کریں: کرپٹو ایکسچینج کے لیے CREATE2 کا استعمال

ہر صارف کے لیے الگ سمارٹ کنٹریکٹ بنائیں

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

ہم نے اس حل کو بھی ترک کر دیا، کیونکہ صارف کو سمارٹ کنٹریکٹ کے بغیر اس کے بٹوے کا پتہ نہیں دکھایا جا سکتا (یہ حقیقت میں ممکن ہے، لیکن دوسرے نقصانات کے ساتھ ایک پیچیدہ انداز میں جن پر ہم یہاں بات نہیں کریں گے)۔ ایکسچینج پر، صارف جتنے بھی اکاؤنٹس بنا سکتا ہے اسے ضرورت ہے، اور ہر ایک کو اپنے بٹوے کی ضرورت ہے۔ اس کا مطلب ہے کہ ہمیں کنٹریکٹ کی تعیناتی پر پیسے خرچ کرنے کی ضرورت ہے اس بات کا یقین کیے بغیر کہ صارف اس اکاؤنٹ کو استعمال کرے گا۔

Opcode CREATE2

پچھلے طریقہ کے مسئلے کو حل کرنے کے لیے، ہم نے CREATE2 opcode استعمال کرنے کا فیصلہ کیا۔ CREATE2 آپ کو اس ایڈریس کا پہلے سے تعین کرنے کی اجازت دیتا ہے جہاں سمارٹ کنٹریکٹ تعینات کیا جائے گا۔ پتہ درج ذیل فارمولے کا استعمال کرتے ہوئے شمار کیا جاتا ہے:

keccak256 (0xff ++ address ++ salt ++ keccak256 (init_code)) [12:]


، جہاں:

  • پتہ - سمارٹ کنٹریکٹ کا پتہ جو CREATE2 کو کال کرے گا۔
  • نمک - بے ترتیب قدر
  • init_code - تعیناتی کے لیے سمارٹ کنٹریکٹ بائٹ کوڈ

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

  • پتہ فارمولے میں مستقل ہے، کیونکہ یہ ہماری والیٹ فیکٹری کا پتہ ہے۔
  • نمک — user_id ہیش
  • init_code مستقل ہے کیونکہ ہم ایک ہی پرس استعمال کرتے ہیں۔

مزید بہتری

پچھلے حل میں اب بھی ایک خرابی ہے: آپ کو سمارٹ کنٹریکٹ کی تعیناتی کے لیے ادائیگی کرنے کی ضرورت ہے۔ تاہم، آپ اس سے چھٹکارا حاصل کر سکتے ہیں. ایسا کرنے کے لیے آپ فنکشن کو کال کر سکتے ہیں۔ منتقلی()اور پھر خود کو تباہ کرنا () والیٹ کنسٹرکٹر میں۔ اور پھر سمارٹ کنٹریکٹ پر تعیناتی کے لیے گیس واپس کر دی جائے گی۔

عام خیال کے برعکس، آپ ایک ہی پتے پر متعدد بار CREATE2 opcode کے ساتھ ایک سمارٹ کنٹریکٹ لگا سکتے ہیں۔ اس کی وجہ یہ ہے کہ CREATE2 چیک کرتا ہے کہ ہدف کا پتہ صفر ہے (اسے کنسٹرکٹر کے شروع میں قدر "1" تفویض کی گئی ہے)۔ اس صورت میں، فنکشن خود کو تباہ کرنا () ہر بار غیر پتوں کو دوبارہ ترتیب دیتا ہے۔ لہذا اگر آپ دوبارہ انہی دلائل کے ساتھ CREATE2 کو کال کرتے ہیں، تو غیر چیک پاس ہو جائے گا۔

براہ کرم نوٹ کریں کہ یہ حل Ethereum ایڈریس آپشن کی طرح ہے، لیکن نجی چابیاں ذخیرہ کرنے کی ضرورت کے بغیر۔ بٹوے سے ہاٹ والٹ میں رقم کی منتقلی کی لاگت تقریباً کسی فنکشن کو کال کرنے کی لاگت کے برابر ہے۔ منتقلی()چونکہ ہم سمارٹ کنٹریکٹ کی تعیناتی کے لیے ادائیگی نہیں کرتے ہیں۔

آخری فیصلہ

تعیناتی سے پہلے سمارٹ کنٹریکٹ کے پتے کا تعین کیسے کریں: کرپٹو ایکسچینج کے لیے CREATE2 کا استعمال

اصل میں تیار کردہ:

  • کی طرف سے نمک حاصل کرنے کے لئے تقریب USER_ID
  • ایک سمارٹ معاہدہ جو مناسب نمک کے ساتھ CREATE2 اوپکوڈ کو کال کرے گا (یعنی پرس فیکٹری)
  • والیٹ بائیک کوڈ مندرجہ ذیل کنسٹرکٹر کے ساتھ معاہدے کے مطابق ہے:

constructor () {
    address hotWallet = 0x…;
    address token = 0x…;
    token.transfer (hotWallet, token.balanceOf (address (this)));
    selfdestruct (address (0));
}


ہر نئے صارف کے لیے ہم حساب سے اس کے بٹوے کا پتہ دکھاتے ہیں۔

keccak256 (0xff ++ address ++ salt ++ keccak256 (init_code)) [12:]


جب کوئی صارف متعلقہ والیٹ ایڈریس پر ٹوکن منتقل کرتا ہے، تو ہمارا بیک اینڈ پیرامیٹر کے ساتھ ایک ٹرانسفر ایونٹ دیکھتا ہے۔ _سے، بٹوے کے پتے کے برابر۔ اس مقام پر، بٹوے کو تعینات کرنے سے پہلے ہی ایکسچینج پر صارف کا بیلنس بڑھانا ممکن ہے۔

جب ایک والیٹ ایڈریس کافی تعداد میں ٹوکن جمع کرتا ہے، تو ہم ان سب کو ایک ساتھ ہاٹ والٹ میں منتقل کر سکتے ہیں۔ ایسا کرنے کے لیے، پسدید سمارٹ کنٹریکٹ فیکٹری فنکشن کو کال کرتا ہے، جو درج ذیل اعمال انجام دیتا ہے:

function deployWallet (соль uint256) {
    bytes memory walletBytecode =…;
    // invoke CREATE2 with wallet bytecode and salt
}


اس طرح، والیٹ سمارٹ کنٹریکٹ کنسٹرکٹر کہلاتا ہے، جو اپنے تمام ٹوکنز کو ہاٹ والٹ ایڈریس پر منتقل کرتا ہے اور پھر خود کو تباہ کر دیتا ہے۔

مکمل کوڈ مل سکتا ہے۔ یہاں. براہ کرم نوٹ کریں کہ یہ ہمارا پروڈکشن کوڈ نہیں ہے، جیسا کہ ہم نے والیٹ بائیک کوڈ کو بہتر بنانے کا فیصلہ کیا اور اسے opcodes میں لکھا۔

مصنف Pavel Kondratenkov، Ethereum ماہر

ماخذ: www.habr.com

نیا تبصرہ شامل کریں