اہم مواد پر جائیں

یلو پیپر کے EVM کی تفصیلات کو سمجھنا

evm
متوسط
qbzzt
15 مئی، 2022
22 منٹ کی پڑھائی

یلو پیپرopens in a new tab Ethereum کے لیے رسمی تفصیل ہے۔ سوائے ان جگہوں کے جہاں EIP کے عمل کے ذریعے ترمیم کی گئی ہے، اس میں ہر چیز کے کام کرنے کے طریقے کی صحیح تفصیل موجود ہے۔ اسے ایک ریاضیاتی مقالے کے طور پر لکھا گیا ہے، جس میں ایسی اصطلاحات شامل ہیں جن سے پروگرامرز واقف نہیں ہو سکتے ہیں۔ اس مقالے میں آپ اسے پڑھنا سیکھتے ہیں، اور اس کے نتیجے میں دیگر متعلقہ ریاضیاتی مقالے بھی پڑھنا سیکھتے ہیں۔

کون سا یلو پیپر؟

Ethereum میں تقریباً ہر دوسری چیز کی طرح، یلو پیپر بھی وقت کے ساتھ ساتھ تیار ہوتا ہے۔ ایک مخصوص ورژن کا حوالہ دینے کے قابل ہونے کے لیے، میں نے لکھتے وقت کا موجودہ ورژن اپ لوڈ کیا ہے۔ میں جو سیکشن، صفحہ، اور مساوات کے نمبر استعمال کرتا ہوں وہ اسی ورژن کا حوالہ دیں گے۔ اس دستاویز کو پڑھتے وقت اسے ایک الگ ونڈو میں کھلا رکھنا ایک اچھا خیال ہے۔

EVM کیوں؟

اصل یلو پیپر Ethereum کی ترقی کے بالکل آغاز میں لکھا گیا تھا۔ یہ اصل پروف آف ورک پر مبنی اتفاق رائے کے طریقہ کار کو بیان کرتا ہے جو اصل میں نیٹ ورک کو محفوظ بنانے کے لیے استعمال کیا گیا تھا۔ تاہم، Ethereum نے پروف آف ورک کو بند کر دیا اور ستمبر 2022 میں پروف آف اسٹیک پر مبنی اتفاق رائے کا استعمال شروع کر دیا۔ یہ ٹیوٹوریل یلو پیپر کے ان حصوں پر توجہ مرکوز کرے گا جو Ethereum ورچوئل مشین کی وضاحت کرتے ہیں۔ پروف آف اسٹیک میں منتقلی سے EVM میں کوئی تبدیلی نہیں ہوئی (سوائے DIFFICULTY آپ کوڈ کی واپسی کی قدر کے)۔

9 ایگزیکیوشن ماڈل

اس سیکشن (صفحہ 12-14) میں EVM کی زیادہ تر تعریف شامل ہے۔

اصطلاح سسٹم اسٹیٹ میں وہ سب کچھ شامل ہے جو آپ کو سسٹم کو چلانے کے لیے جاننے کی ضرورت ہے۔ ایک عام کمپیوٹر میں، اس کا مطلب ہے میموری، رجسٹرز کا مواد وغیرہ۔

ایک Turing machineopens in a new tab ایک کمپیوٹیشنل ماڈل ہے۔ بنیادی طور پر، یہ کمپیوٹر کا ایک آسان ورژن ہے، جس کے بارے میں یہ ثابت ہے کہ اس میں وہی کمپیوٹیشن چلانے کی صلاحیت ہے جو ایک عام کمپیوٹر کر سکتا ہے (ہر وہ چیز جو ایک کمپیوٹر کیلکولیٹ کر سکتا ہے، ایک ٹورنگ مشین بھی کیلکولیٹ کر سکتی ہے اور اس کے برعکس)۔ یہ ماڈل اس بارے میں مختلف نظریات کو ثابت کرنا آسان بناتا ہے کہ کیا کمپیوٹ ایبل ہے اور کیا نہیں۔

اصطلاح Turing-completeopens in a new tab کا مطلب ایک ایسا کمپیوٹر ہے جو ٹورنگ مشین جیسی کیلکولیشنز چلا سکتا ہے۔ ٹورنگ مشینیں لامحدود لوپس میں جا سکتی ہیں، اور EVM نہیں جا سکتا کیونکہ اس کی گیس ختم ہو جائے گی، اس لیے یہ صرف نیم-ٹورنگ-کملپیٹ ہے۔

9.1 بنیادی باتیں

یہ سیکشن EVM کی بنیادی باتیں بتاتا ہے اور یہ کہ یہ دوسرے کمپیوٹیشنل ماڈلز کے ساتھ کیسے موازنہ کرتا ہے۔

ایک stack machineopens in a new tab ایک ایسا کمپیوٹر ہے جو درمیانی ڈیٹا کو رجسٹرز میں نہیں، بلکہ ایک stackopens in a new tab میں اسٹور کرتا ہے۔ یہ ورچوئل مشینوں کے لیے ترجیحی فن تعمیر ہے کیونکہ اسے لاگو کرنا آسان ہے، جس کا مطلب ہے کہ بگس اور سیکیورٹی کی کمزوریوں کا امکان بہت کم ہوتا ہے۔ اسٹیک میں میموری 256-بٹ ورڈز میں تقسیم ہے۔ اسے اس لیے چنا گیا کیونکہ یہ Ethereum کے بنیادی کرپٹوگرافک آپریشنز جیسے Keccak-256 ہیشنگ اور ایلیپٹک کرو کمپیوٹیشنز کے لیے آسان ہے۔ اسٹیک کا زیادہ سے زیادہ سائز 1024 آئٹمز (1024 x 256 بٹس) ہے۔ جب آپ کوڈز ایگزیکیوٹ ہوتے ہیں تو وہ عام طور پر اپنے پیرامیٹرز اسٹیک سے حاصل کر رہے ہوتے ہیں۔ اسٹیک میں عناصر کو دوبارہ ترتیب دینے کے لیے خاص طور پر آپ کوڈز ہیں جیسے POP (اسٹیک کے اوپر سے آئٹم ہٹاتا ہے)، DUP_N (اسٹیک میں N'واں آئٹم ڈپلیکیٹ کرتا ہے)، وغیرہ۔

EVM میں ایک غیر مستحکم جگہ بھی ہے جسے میموری کہا جاتا ہے جو ایگزیکیوشن کے دوران ڈیٹا اسٹور کرنے کے لیے استعمال ہوتی ہے۔ یہ میموری 32-بائٹ ورڈز میں منظم ہے۔ تمام میموری لوکیشنز کو صفر پر شروع کیا جاتا ہے۔ اگر آپ میموری میں ایک ورڈ شامل کرنے کے لیے یہ Yulopens in a new tab کوڈ ایگزیکیوٹ کرتے ہیں، تو یہ ورڈ میں خالی جگہ کو صفر سے بھر کر میموری کے 32 بائٹس بھر دے گا، یعنی، یہ ایک ورڈ بناتا ہے - لوکیشنز 0-29 میں صفر کے ساتھ، 30 پر 0x60، اور 31 پر 0xA7۔

1mstore(0, 0x60A7)

mstore ان تین آپ کوڈز میں سے ایک ہے جو EVM میموری کے ساتھ تعامل کے لیے فراہم کرتا ہے - یہ میموری میں ایک ورڈ لوڈ کرتا ہے۔ دیگر دو mstore8 ہیں جو میموری میں ایک ہی بائٹ لوڈ کرتا ہے، اور mload جو میموری سے اسٹیک میں ایک ورڈ منتقل کرتا ہے۔

EVM میں ایک الگ غیر مستحکم اسٹوریج ماڈل بھی ہے جسے سسٹم اسٹیٹ کے حصے کے طور پر برقرار رکھا جاتا ہے - یہ میموری ورڈ ارے میں منظم ہے (اسٹیک میں ورڈ-ایڈریس ایبل بائٹ ارے کے برعکس)۔ یہ اسٹوریج وہ جگہ ہے جہاں کنٹریکٹس مستقل ڈیٹا رکھتے ہیں - ایک کنٹریکٹ صرف اپنے اسٹوریج کے ساتھ ہی تعامل کر سکتا ہے۔ اسٹوریج کلیدی-قدر کی میپنگ میں منظم ہے۔

اگرچہ یلو پیپر کے اس سیکشن میں اس کا ذکر نہیں ہے، لیکن یہ جاننا بھی مفید ہے کہ میموری کی ایک چوتھی قسم بھی ہے۔ Calldata بائٹ-ایڈریس ایبل ریڈ-اونلی میموری ہے جو ٹرانزیکشن کے data پیرامیٹر کے ساتھ بھیجی گئی قدر کو اسٹور کرنے کے لیے استعمال ہوتی ہے۔ EVM میں calldata کو منظم کرنے کے لیے مخصوص آپ کوڈز ہیں۔ calldatasize ڈیٹا کا سائز واپس کرتا ہے۔ calldataload ڈیٹا کو اسٹیک میں لوڈ کرتا ہے۔ calldatacopy ڈیٹا کو میموری میں کاپی کرتا ہے۔

معیاری Von Neumann architectureopens in a new tab کوڈ اور ڈیٹا کو ایک ہی میموری میں اسٹور کرتا ہے۔ EVM سیکورٹی وجوہات کی بنا پر اس معیار کی پیروی نہیں کرتا ہے - غیر مستحکم میموری کا اشتراک پروگرام کوڈ کو تبدیل کرنا ممکن بناتا ہے۔ اس کے بجائے، کوڈ کو اسٹوریج میں محفوظ کیا جاتا ہے۔

صرف دو صورتیں ہیں جن میں کوڈ میموری سے ایگزیکیوٹ ہوتا ہے:

  • جب کوئی کنٹریکٹ دوسرا کنٹریکٹ بناتا ہے (CREATEopens in a new tab یا CREATE2opens in a new tab کا استعمال کرتے ہوئے)، تو کنٹریکٹ کنسٹرکٹر کا کوڈ میموری سے آتا ہے۔
  • کسی بھی کنٹریکٹ کی تخلیق کے دوران، کنسٹرکٹر کوڈ چلتا ہے اور پھر اصل کنٹریکٹ کے کوڈ کے ساتھ واپس آتا ہے، جو میموری سے بھی ہوتا ہے۔

اصطلاح 'غیر معمولی ایگزیکیوشن' کا مطلب ایک ایسی رعایت ہے جو موجودہ کنٹریکٹ کے ایگزیکیوشن کو روکنے کا سبب بنتی ہے۔

9.2 فیس کا جائزہ

یہ سیکشن بتاتا ہے کہ گیس کی فیس کا حساب کیسے لگایا جاتا ہے۔ تین لاگتیں ہیں:

آپ کوڈ کی لاگت

مخصوص آپ کوڈ کی موروثی لاگت۔ اس قدر کو حاصل کرنے کے لیے، اپینڈکس H (صفحہ 28، مساوات (327) کے تحت) میں آپ کوڈ کا لاگت گروپ تلاش کریں، اور مساوات (324) میں لاگت گروپ تلاش کریں۔ یہ آپ کو ایک لاگت کا فنکشن دیتا ہے، جو زیادہ تر معاملات میں اپینڈکس G (صفحہ 27) سے پیرامیٹرز کا استعمال کرتا ہے۔

مثال کے طور پر، آپ کوڈ CALLDATACOPYopens in a new tab گروپ Wcopy کا رکن ہے۔ اس گروپ کے لیے آپ کوڈ کی لاگت Gverylow+Gcopy×⌈μs[2]÷32⌉ ہے۔ اپینڈکس G کو دیکھتے ہوئے، ہم دیکھتے ہیں کہ دونوں مستقل 3 ہیں، جو ہمیں 3+3×⌈μs[2]÷32⌉ دیتا ہے۔

ہمیں ابھی بھی ⌈μs[2]÷32⌉ کے اظہار کو سمجھنے کی ضرورت ہے۔ سب سے باہری حصہ، ⌈ <value> ⌉ سیلنگ فنکشن ہے، ایک ایسا فنکشن جو دی گئی قدر کے لیے سب سے چھوٹا عدد لوٹاتا ہے جو اس قدر سے چھوٹا نہ ہو۔ مثال کے طور پر، ⌈2.5⌉ = ⌈3⌉ = 3. اندرونی حصہ μs[2]÷32 ہے۔ صفحہ 3 پر سیکشن 3 (کنونشنز) کو دیکھتے ہوئے، μ مشین کی حالت ہے۔ مشین کی حالت کی تعریف صفحہ 13 پر سیکشن 9.4.1 میں کی گئی ہے۔ اس سیکشن کے مطابق، مشین اسٹیٹ کے پیرامیٹرز میں سے ایک اسٹیک کے لیے s ہے۔ ان سب کو ایک ساتھ رکھتے ہوئے، ایسا لگتا ہے کہ μs[2] اسٹیک میں لوکیشن #2 ہے۔ آپ کوڈopens in a new tab کو دیکھتے ہوئے، اسٹیک میں لوکیشن #2 بائٹس میں ڈیٹا کا سائز ہے۔ گروپ Wcopy میں دیگر آپ کوڈز، CODECOPYopens in a new tab اور RETURNDATACOPYopens in a new tab کو دیکھتے ہوئے، ان کے پاس بھی اسی لوکیشن میں ڈیٹا کا سائز ہوتا ہے۔ لہذا ⌈μs[2]÷32⌉ کاپی کیے جانے والے ڈیٹا کو اسٹور کرنے کے لیے درکار 32 بائٹ ورڈز کی تعداد ہے۔ سب کچھ ایک ساتھ رکھتے ہوئے، CALLDATACOPYopens in a new tab کی موروثی لاگت 3 گیس ہے اور کاپی کیے جانے والے ڈیٹا کے ہر ورڈ کے لیے 3 ہے۔

چلانے کی لاگت

اس کوڈ کو چلانے کی لاگت جسے ہم کال کر رہے ہیں۔

میموری کی توسیع کی لاگت

میموری کی توسیع کی لاگت (اگر ضروری ہو)۔

مساوات 324 میں، اس قدر کو Cmemi')-Cmemi) کے طور پر لکھا گیا ہے۔ دوبارہ سیکشن 9.4.1 کو دیکھتے ہوئے، ہم دیکھتے ہیں کہ μi میموری میں ورڈز کی تعداد ہے۔ لہذا μi آپ کوڈ سے پہلے میموری میں ورڈز کی تعداد ہے اور μi' آپ کوڈ کے بعد میموری میں ورڈز کی تعداد ہے۔

فنکشن Cmem مساوات 326 میں بیان کیا گیا ہے: Cmem(a) = Gmemory × a + ⌊a2 ÷ 512⌋۔ ⌊x⌋ فلور فنکشن ہے، ایک ایسا فنکشن جو دی گئی قدر کے لیے سب سے بڑا عدد لوٹاتا ہے جو اس قدر سے بڑا نہ ہو۔ مثال کے طور پر، ⌊2.5⌋ = ⌊2⌋ = 2. جب a < √512, a2 < 512, اور فلور فنکشن کا نتیجہ صفر ہوتا ہے۔ لہذا پہلے 22 ورڈز (704 بائٹس) کے لیے، لاگت درکار میموری ورڈز کی تعداد کے ساتھ لکیری طور پر بڑھتی ہے۔ اس نقطہ سے آگے ⌊a2 ÷ 512⌋ مثبت ہے۔ جب درکار میموری کافی زیادہ ہو تو گیس کی لاگت میموری کی مقدار کے مربع کے متناسب ہوتی ہے۔

نوٹ کریں کہ یہ عوامل صرف موروثی گیس کی لاگت کو متاثر کرتے ہیں - یہ فیس مارکیٹ یا ویلیڈیٹرز کو دی جانے والی ٹپس کو مدنظر نہیں رکھتا جو یہ طے کرتی ہیں کہ ایک آخری صارف کو کتنی رقم ادا کرنے کی ضرورت ہے - یہ صرف EVM پر کسی خاص آپریشن کو چلانے کی خام لاگت ہے۔

گیس کے بارے میں مزید پڑھیں۔

9.3 ایگزیکیوشن ماحول

ایگزیکیوشن ماحول ایک ٹپل، I ہے، جس میں ایسی معلومات شامل ہیں جو بلاکچین اسٹیٹ یا EVM کا حصہ نہیں ہیں۔

پیرامیٹرڈیٹا تک رسائی کے لیے آپ کوڈڈیٹا تک رسائی کے لیے Solidity کوڈ
IaADDRESSopens in a new tabaddress(this)
IoORIGINopens in a new tabtx.origin
IpGASPRICEopens in a new tabtx.gasprice
IdCALLDATALOADopens in a new tab، وغیرہ۔msg.data
IsCALLERopens in a new tabmsg.sender
IvCALLVALUEopens in a new tabmsg.value
IbCODECOPYopens in a new tabaddress(this).code
IHبلاک ہیڈر فیلڈز، جیسے NUMBERopens in a new tab اور DIFFICULTYopens in a new tabblock.number, block.difficulty, وغیرہ۔
Ieکنٹریکٹس کے درمیان کالز کے لیے کال اسٹیک کی گہرائی (بشمول کنٹریکٹ کی تخلیق)
Iwکیا EVM کو اسٹیٹ تبدیل کرنے کی اجازت ہے، یا یہ جامد طور پر چل رہا ہے

سیکشن 9 کے باقی حصے کو سمجھنے کے لیے چند دیگر پیرامیٹرز ضروری ہیں:

پیرامیٹرسیکشن میں بیان کیا گیا ہےمطلب
σ2 (صفحہ 2، مساوات 1)بلاکچین کی حالت
g9.3 (صفحہ 13)بقیہ گیس
A6.1 (صفحہ 8)جمع شدہ سب اسٹیٹ (ٹرانزیکشن ختم ہونے پر طے شدہ تبدیلیاں)
o9.3 (صفحہ 13)آؤٹ پٹ - اندرونی ٹرانزیکشن (جب ایک کنٹریکٹ دوسرے کو کال کرتا ہے) اور ویو فنکشنز کو کال کرنے کی صورت میں واپس کیا گیا نتیجہ (جب آپ صرف معلومات مانگ رہے ہوں، لہذا ٹرانزیکشن کا انتظار کرنے کی ضرورت نہیں ہے)

9.4 ایگزیکیوشن کا جائزہ

اب جب کہ ہمارے پاس تمام ابتدائی باتیں ہیں، ہم آخر کار اس پر کام کرنا شروع کر سکتے ہیں کہ EVM کیسے کام کرتا ہے۔

مساوات 137-142 ہمیں EVM چلانے کے لیے ابتدائی شرائط دیتی ہیں:

علامتابتدائی قدرمطلب
μggبقیہ گیس
μpc0پروگرام کاؤنٹر، ایگزیکیوٹ کرنے کے لیے اگلی ہدایت کا ایڈریس
μm(0, 0, ...)میموری، تمام صفروں پر شروع کی گئی
μi0استعمال شدہ سب سے اونچی میموری لوکیشن
μs()اسٹیک، ابتدائی طور پر خالی
μoآؤٹ پٹ، خالی سیٹ جب تک کہ ہم یا تو واپسی کے ڈیٹا (RETURNopens in a new tab یا REVERTopens in a new tab) کے ساتھ یا اس کے بغیر (STOPopens in a new tab یا SELFDESTRUCTopens in a new tab) رک نہ جائیں۔

مساوات 143 ہمیں بتاتی ہے کہ ایگزیکیوشن کے دوران ہر وقت چار ممکنہ شرائط ہوتی ہیں، اور ان کے ساتھ کیا کرنا ہے:

  1. Z(σ,μ,A,I)۔ Z ایک فنکشن کی نمائندگی کرتا ہے جو یہ جانچتا ہے کہ آیا کوئی آپریشن ایک غلط اسٹیٹ ٹرانزیشن بناتا ہے (دیکھیں غیر معمولی روک)۔ اگر یہ سچ کا اندازہ کرتا ہے، تو نئی اسٹیٹ پرانی اسٹیٹ جیسی ہی ہے (سوائے اس کے کہ گیس جل جاتی ہے) کیونکہ تبدیلیاں نافذ نہیں کی گئی ہیں۔
  2. اگر ایگزیکیوٹ کیا جانے والا آپ کوڈ REVERTopens in a new tab ہے، تو نئی اسٹیٹ پرانی اسٹیٹ جیسی ہی ہے، کچھ گیس ضائع ہو جاتی ہے۔
  3. اگر آپریشنز کا سلسلہ ختم ہو گیا ہے، جیسا کہ RETURNopens in a new tab سے ظاہر ہوتا ہے، تو اسٹیٹ کو نئی اسٹیٹ میں اپ ڈیٹ کر دیا جاتا ہے۔
  4. اگر ہم اختتامی شرائط 1-3 میں سے کسی ایک پر نہیں ہیں، تو چلنا جاری رکھیں۔

9.4.1 مشین اسٹیٹ

یہ سیکشن مشین کی حالت کو مزید تفصیل سے بیان کرتا ہے۔ یہ بتاتا ہے کہ w موجودہ آپ کوڈ ہے۔ اگر μpc، ||Ib|| سے کم ہے، جو کوڈ کی لمبائی ہے، تو وہ بائٹ (Ibpc]) آپ کوڈ ہے۔ بصورت دیگر، آپ کوڈ کو STOPopens in a new tab کے طور پر بیان کیا گیا ہے۔

چونکہ یہ ایک stack machineopens in a new tab ہے، اس لیے ہمیں ہر آپ کوڈ کے ذریعے باہر نکالے گئے (δ) اور اندر ڈالے گئے (α) آئٹمز کی تعداد کا ٹریک رکھنے کی ضرورت ہے۔

9.4.2 غیر معمولی روک

یہ سیکشن Z فنکشن کی وضاحت کرتا ہے، جو یہ بتاتا ہے کہ ہمارے پاس غیر معمولی خاتمہ کب ہوتا ہے۔ یہ ایک Booleanopens in a new tab فنکشن ہے، لہذا یہ کو منطقی 'یا'opens in a new tab کے لیے اور کو منطقی 'اور'opens in a new tab کے لیے استعمال کرتا ہے۔

ہمارے پاس ایک غیر معمولی روک ہے اگر ان شرائط میں سے کوئی بھی سچ ہے:

  • μg < C(σ,μ,A,I) جیسا کہ ہم نے سیکشن 9.2 میں دیکھا، C وہ فنکشن ہے جو گیس کی لاگت بتاتا ہے۔ اگلے آپ کوڈ کو پورا کرنے کے لیے کافی گیس باقی نہیں ہے۔

  • δw=∅ اگر کسی آپ کوڈ کے لیے پاپ کیے گئے آئٹمز کی تعداد غیر متعین ہے، تو آپ کوڈ خود غیر متعین ہے۔

  • || μs || < δw اسٹیک انڈر فلو، موجودہ آپ کوڈ کے لیے اسٹیک میں کافی آئٹمز نہیں ہیں۔

  • w = JUMP ∧ μs[0]∉D(Ib) آپ کوڈ JUMPopens in a new tab ہے اور ایڈریس JUMPDESTopens in a new tab نہیں ہے۔ جمپس صرف اس وقت درست ہوتے ہیں جب منزل ایک JUMPDESTopens in a new tab ہو۔

  • w = JUMPI ∧ μs[1]≠0 ∧ μs[0] ∉ D(Ib) آپ کوڈ JUMPIopens in a new tab ہے، شرط سچ ہے (غیر صفر) اس لیے جمپ ہونا چاہیے، اور ایڈریس JUMPDESTopens in a new tab نہیں ہے۔ جمپس صرف اس وقت درست ہوتے ہیں جب منزل ایک JUMPDESTopens in a new tab ہو۔

  • w = RETURNDATACOPY ∧ μs[1]+μs[2]>|| μo || آپ کوڈ RETURNDATACOPYopens in a new tab ہے۔ اس آپ کوڈ میں اسٹیک عنصر μs[1] واپسی ڈیٹا بفر میں پڑھنے کے لیے آفسیٹ ہے، اور اسٹیک عنصر μs[2] ڈیٹا کی لمبائی ہے۔ یہ حالت اس وقت ہوتی ہے جب آپ واپسی ڈیٹا بفر کے آخر سے آگے پڑھنے کی کوشش کرتے ہیں۔ نوٹ کریں کہ کال ڈیٹا یا خود کوڈ کے لیے کوئی ملتی جلتی شرط نہیں ہے۔ جب آپ ان بفرز کے آخر سے آگے پڑھنے کی کوشش کرتے ہیں تو آپ کو صرف صفر ملتے ہیں۔

  • || μs || - δw + αw > 1024

    اسٹیک اوور فلو۔ اگر آپ کوڈ چلانے سے 1024 سے زیادہ آئٹمز کا اسٹیک بنے گا، تو رک جائیں۔

  • ¬Iw ∧ W(w,μ) کیا ہم جامد طور پر چل رہے ہیں (¬ نفی ہےopens in a new tab اور Iw سچ ہے جب ہمیں بلاکچین اسٹیٹ کو تبدیل کرنے کی اجازت ہے)؟ اگر ایسا ہے، اور ہم اسٹیٹ تبدیل کرنے والا آپریشن آزما رہے ہیں، تو یہ نہیں ہو سکتا۔

    فنکشن W(w,μ) بعد میں مساوات 150 میں بیان کیا گیا ہے۔ W(w,μ) سچ ہے اگر ان میں سے کوئی ایک شرط سچ ہے:

    • w ∈ {CREATE, CREATE2, SSTORE, SELFDESTRUCT} یہ آپ کوڈز اسٹیٹ کو تبدیل کرتے ہیں، یا تو ایک نیا کنٹریکٹ بنا کر، ایک قدر کو اسٹور کر کے، یا موجودہ کنٹریکٹ کو تباہ کر کے۔

    • LOG0≤w ∧ w≤LOG4 اگر ہمیں جامد طور پر کال کیا جاتا ہے تو ہم لاگ اندراجات خارج نہیں کر سکتے۔ لاگ آپ کوڈز سب LOG0 (A0)opens in a new tab اور LOG4 (A4)opens in a new tab کے درمیان کی رینج میں ہیں۔ لاگ آپ کوڈ کے بعد کا نمبر بتاتا ہے کہ لاگ اندراج میں کتنے موضوعات ہیں۔

    • w=CALL ∧ μs[2]≠0 جب آپ جامد ہوں تو آپ دوسرے کنٹریکٹ کو کال کر سکتے ہیں، لیکن اگر آپ ایسا کرتے ہیں تو آپ اسے ETH منتقل نہیں کر سکتے۔

  • w = SSTORE ∧ μg ≤ Gcallstipend آپ SSTOREopens in a new tab نہیں چلا سکتے جب تک کہ آپ کے پاس Gcallstipend (اپینڈکس G میں 2300 کے طور پر بیان کیا گیا ہے) سے زیادہ گیس نہ ہو۔

9.4.3 جمپ ڈیسٹینیشن کی درستگی

یہاں ہم رسمی طور پر بیان کرتے ہیں کہ JUMPDESTopens in a new tab آپ کوڈز کیا ہیں۔ ہم صرف بائٹ ویلیو 0x5B کو نہیں دیکھ سکتے، کیونکہ یہ PUSH کے اندر ہو سکتا ہے (اور اس لیے ڈیٹا ہے نہ کہ آپ کوڈ)۔

مساوات (153) میں ہم ایک فنکشن، N(i,w) کی وضاحت کرتے ہیں۔ پہلا پیرامیٹر، i، آپ کوڈ کا مقام ہے۔ دوسرا، w، خود آپ کوڈ ہے۔ اگر w∈[PUSH1, PUSH32] تو اس کا مطلب ہے کہ آپ کوڈ ایک PUSH ہے (مربع بریکٹ ایک رینج کی وضاحت کرتے ہیں جس میں اختتامی نقطے شامل ہیں)۔ اس صورت میں اگلا آپ کوڈ i+2+(w−PUSH1) پر ہے۔ PUSH1opens in a new tab کے لیے ہمیں دو بائٹس آگے بڑھنے کی ضرورت ہے (خود PUSH اور ایک بائٹ ویلیو)، PUSH2opens in a new tab کے لیے ہمیں تین بائٹس آگے بڑھنے کی ضرورت ہے کیونکہ یہ دو بائٹ ویلیو ہے، وغیرہ۔ دیگر تمام EVM آپ کوڈز صرف ایک بائٹ لمبے ہوتے ہیں، لہذا دیگر تمام صورتوں میں N(i,w)=i+1۔

اس فنکشن کا استعمال مساوات (152) میں DJ(c,i) کی وضاحت کے لیے کیا جاتا ہے، جو کوڈ c میں تمام درست جمپ ڈیسٹینیشنز کا سیٹopens in a new tab ہے، جو آپ کوڈ لوکیشن i سے شروع ہوتا ہے۔ اس فنکشن کی وضاحت تکراری طور پر کی گئی ہے۔ اگر i≥||c|| ہے، تو اس کا مطلب ہے کہ ہم کوڈ کے آخر میں یا اس کے بعد ہیں۔ ہمیں مزید جمپ ڈیسٹینیشنز نہیں ملیں گی، لہذا صرف خالی سیٹ واپس کریں۔

دیگر تمام صورتوں میں ہم اگلے آپ کوڈ پر جا کر اور اس سے شروع ہونے والا سیٹ حاصل کر کے باقی کوڈ کو دیکھتے ہیں۔ c[i] موجودہ آپ کوڈ ہے، لہذا N(i,c[i]) اگلے آپ کوڈ کا مقام ہے۔ لہذا DJ(c,N(i,c[i])) درست جمپ ڈیسٹینیشنز کا سیٹ ہے جو اگلے آپ کوڈ سے شروع ہوتا ہے۔ اگر موجودہ آپ کوڈ JUMPDEST نہیں ہے، تو صرف وہ سیٹ واپس کریں۔ اگر یہ JUMPDEST ہے، تو اسے نتیجہ سیٹ میں شامل کریں اور اسے واپس کریں۔

9.4.4 عمومی روک

روکنے کا فنکشن H، تین قسم کی قدریں واپس کر سکتا ہے۔

  • اگر ہم روکنے والے آپ کوڈ میں نہیں ہیں، تو ، یعنی خالی سیٹ واپس کریں۔ روایتی طور پر، اس قدر کو بولین فالس کے طور پر تعبیر کیا جاتا ہے۔
  • اگر ہمارے پاس ایک ہالٹ آپ کوڈ ہے جو آؤٹ پٹ پیدا نہیں کرتا ہے (یا تو STOPopens in a new tab یا SELFDESTRUCTopens in a new tab)، تو واپسی کی قدر کے طور پر صفر سائز کے بائٹس کی ایک ترتیب واپس کریں۔ نوٹ کریں کہ یہ خالی سیٹ سے بہت مختلف ہے۔ اس قدر کا مطلب ہے کہ EVM واقعی رک گیا تھا، بس پڑھنے کے لیے کوئی واپسی ڈیٹا نہیں ہے۔
  • اگر ہمارے پاس ایک ہالٹ آپ کوڈ ہے جو آؤٹ پٹ پیدا کرتا ہے (یا تو RETURNopens in a new tab یا REVERTopens in a new tab)، تو اس آپ کوڈ کے ذریعہ بیان کردہ بائٹس کی ترتیب واپس کریں۔ یہ ترتیب میموری سے لی جاتی ہے، اسٹیک کے اوپر کی قدر (μs[0]) پہلا بائٹ ہے، اور اس کے بعد کی قدر (μs[1]) لمبائی ہے۔

H.2 انسٹرکشن سیٹ

EVM کے آخری سب سیکشن، 9.5، پر جانے سے پہلے، آئیے خود ہدایات کو دیکھتے ہیں۔ ان کی تعریف اپینڈکس H.2 میں کی گئی ہے جو صفحہ 29 سے شروع ہوتا ہے۔ کوئی بھی چیز جسے اس مخصوص آپ کوڈ کے ساتھ تبدیل ہونے کے طور پر بیان نہیں کیا گیا ہے، اس سے وہی رہنے کی توقع کی جاتی ہے۔ جو متغیرات تبدیل ہوتے ہیں انہیں <something> کے ساتھ بیان کیا جاتا ہے۔

مثال کے طور پر، آئیے ADDopens in a new tab آپ کوڈ کو دیکھتے ہیں۔

قدریادداشتδαتفصیل
0x01ADD21اضافے کا عمل۔
μ′s[0] ≡ μs[0] + μs[1]

δ ان قدروں کی تعداد ہے جنہیں ہم اسٹیک سے پاپ کرتے ہیں۔ اس معاملے میں دو، کیونکہ ہم سب سے اوپر کی دو قدروں کو جوڑ رہے ہیں۔

α ان قدروں کی تعداد ہے جنہیں ہم واپس پش کرتے ہیں۔ اس معاملے میں ایک، یعنی مجموعہ۔

لہذا نیا اسٹیک ٹاپ (μ′s[0]) پرانے اسٹیک ٹاپ (μs[0]) اور اس کے نیچے کی پرانی قدر (μs[1]) کا مجموعہ ہے۔

تمام آپ کوڈز کو "آنکھیں پھیرنے والی فہرست" کے ساتھ دیکھنے کے بجائے، یہ مضمون صرف ان آپ کوڈز کی وضاحت کرتا ہے جو کچھ نیا متعارف کراتے ہیں۔

قدریادداشتδαتفصیل
0x20KECCAK25621Keccak-256 ہیش کا حساب لگائیں۔
μ′s[0] ≡ KEC(μms[0] . ۔ ۔ (μs[0] + μs[1] − 1)])
μ′i ≡ M(μis[0],μs[1])

یہ پہلا آپ کوڈ ہے جو میموری تک رسائی حاصل کرتا ہے (اس معاملے میں، صرف پڑھنے کے لیے)۔ تاہم، یہ میموری کی موجودہ حدود سے باہر پھیل سکتا ہے، لہذا ہمیں μi. کو اپ ڈیٹ کرنے کی ضرورت ہے۔ ہم یہ M فنکشن کا استعمال کرتے ہوئے کرتے ہیں جو صفحہ 29 پر مساوات 328 میں بیان کیا گیا ہے۔

قدریادداشتδαتفصیل
0x31BALANCE11دیے گئے اکاؤنٹ کا بیلنس حاصل کریں۔
...

جس ایڈریس کا بیلنس ہمیں تلاش کرنا ہے وہ μs[0] mod 2160 ہے۔ اسٹیک کا سب سے اوپر ایڈریس ہے، لیکن چونکہ ایڈریس صرف 160 بٹس کے ہوتے ہیں، اس لیے ہم قدر کا حساب ماڈیولوopens in a new tab 2160 کرتے ہیں۔

اگر σ[μs[0] mod 2160] ≠ ∅ ہے، تو اس کا مطلب ہے کہ اس ایڈریس کے بارے میں معلومات موجود ہیں۔ اس صورت میں، σ[μs[0] mod 2160]b اس ایڈریس کا بیلنس ہے۔ اگر σ[μs[0] mod 2160] = ∅ ہے، تو اس کا مطلب ہے کہ یہ ایڈریس غیر شروع شدہ ہے اور بیلنس صفر ہے۔ آپ صفحہ 4 پر سیکشن 4.1 میں اکاؤنٹ کی معلومات کے فیلڈز کی فہرست دیکھ سکتے ہیں۔

دوسری مساوات، A'a ≡ Aa ∪ {μs[0] mod 2160}، گرم اسٹوریج (وہ اسٹوریج جس تک حال ہی میں رسائی حاصل کی گئی ہے اور جس کے کیش ہونے کا امکان ہے) اور سرد اسٹوریج (وہ اسٹوریج جس تک رسائی حاصل نہیں کی گئی ہے اور جس کے سست اسٹوریج میں ہونے کا امکان ہے جسے بازیافت کرنا زیادہ مہنگا ہے) تک رسائی کی لاگت میں فرق سے متعلق ہے۔ Aa ان ایڈریسز کی فہرست ہے جن تک ٹرانزیکشن کے ذریعے پہلے رسائی حاصل کی گئی ہے، جن تک رسائی حاصل کرنا سستا ہونا چاہیے، جیسا کہ صفحہ 8 پر سیکشن 6.1 میں بیان کیا گیا ہے۔ آپ اس موضوع کے بارے میں EIP-2929opens in a new tab میں مزید پڑھ سکتے ہیں۔

قدریادداشتδαتفصیل
0x8FDUP16161716 ویں اسٹیک آئٹم کو ڈپلیکیٹ کریں۔
μ′s[0] ≡ μs[15]

نوٹ کریں کہ کسی بھی اسٹیک آئٹم کو استعمال کرنے کے لیے، ہمیں اسے پاپ کرنے کی ضرورت ہے، جس کا مطلب ہے کہ ہمیں اس کے اوپر کے تمام اسٹیک آئٹمز کو بھی پاپ کرنے کی ضرورت ہے۔ DUP<n>opens in a new tab اور SWAP<n>opens in a new tab کے معاملے میں، اس کا مطلب ہے کہ سولہ تک کی قدروں کو پاپ کرنا اور پھر پش کرنا ہے۔

9.5 ایگزیکیوشن سائیکل

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

مساوات (155) کہتی ہے کہ دی گئی حالت:

  • σ (عالمی بلاکچین اسٹیٹ)
  • μ (EVM اسٹیٹ)
  • A (سب اسٹیٹ، ٹرانزیکشن ختم ہونے پر ہونے والی تبدیلیاں)
  • I (ایگزیکیوشن ماحول)

نئی اسٹیٹ (σ', μ', A', I') ہے۔

مساوات (156)-(158) اسٹیک اور اس میں آپ کوڈ (μs) کی وجہ سے ہونے والی تبدیلی کی وضاحت کرتی ہیں۔ مساوات (159) گیس (μg) میں تبدیلی ہے۔ مساوات (160) پروگرام کاؤنٹر (μpc) میں تبدیلی ہے۔ آخر میں، مساوات (161)-(164) بتاتی ہیں کہ دیگر پیرامیٹرز وہی رہتے ہیں، جب تک کہ آپ کوڈ کے ذریعہ واضح طور پر تبدیل نہ کیا جائے۔

اس کے ساتھ EVM مکمل طور پر بیان ہو جاتا ہے۔

نتیجہ

ریاضیاتی اشارے درست ہیں اور اس نے یلو پیپر کو Ethereum کی ہر تفصیل کو بیان کرنے کی اجازت دی ہے۔ تاہم، اس کے کچھ نقصانات بھی ہیں:

  • اسے صرف انسان ہی سمجھ سکتے ہیں، جس کا مطلب ہے کہ تعمیل ٹیسٹopens in a new tab دستی طور پر لکھے جانے چاہئیں۔
  • پروگرامرز کمپیوٹر کوڈ کو سمجھتے ہیں۔ وہ ریاضیاتی اشارے کو سمجھ بھی سکتے ہیں اور نہیں بھی۔

شاید ان وجوہات کی بنا پر، نئے کنسنسس لیئر کی تفصیلاتopens in a new tab Python میں لکھی گئی ہیں۔ Python میں ایگزیکیوشن لیئر کی تفصیلاتopens in a new tab ہیں، لیکن وہ مکمل نہیں ہیں۔ جب تک کہ پورا یلو پیپر بھی Python یا کسی ملتی جلتی زبان میں ترجمہ نہ ہو جائے، یلو پیپر سروس میں رہے گا، اور اسے پڑھنا مددگار ہے۔

صفحہ کی آخری تازہ کاری: 21 اکتوبر، 2025

کیا یہ ٹیوٹوریل کارآمد تھا؟