سالیدیفا

معرفی

اگه نمیتونین چیزیو از اول بسازین، اونو درک نمی کنین.

اگه تا حالا با اتریوم، چه به عنوان توسعه‌دهنده و چه به عنوان کاربر، سر و کار داشتین، احتمالاً با EVM هم برخورد کردین.

EVM #

ماشین مجازی اتریوم با همون Ethereum Virtual Machine بخش مرکزی اتریوم هست. موتور اجرایی اتریوم، مسئول اجرای برنامه های اتریوم هست که به عنوان قراردادهای هوشمند هم شناخته میشن.

توی این آموزش، قصد داریم EVM را از ابتدا بسازیم. با این حال، این یک پیاده‌سازی مرجع نیست. من جزئیات پیاده‌سازی را که معتقدم برای درک نحوه کار EVM ضروری نیستن رو حذف خواهم کرد. اصل اول ما یادگیری مفاهیم اصلی EVM هست.

به همین دلیله که می خواهم آن را یک mini-EVM بنامم. یک نسخه کارآمد اما ساده شده از نسخه واقعی. یک ماشین مجازی که یک برنامه اتریوم را به عنوان ورودی دریافت می کند و آن را اجرا می کند.

اما EVM دقیقا چیه؟ EVM یک ماشین مجازیه که مسئول اجرای بایت کد(bytecode) اتریوم هست.

ماشین مجازی (Virtual Machine) #

یک ماشین مجازی مثل یک کامپیوتر ساختگیه که روی کامپیوتر واقعی شما اجرا میشه. به جای نیاز به یک کامپیوتر فیزیکی جداگانه، همه اینها با نرم افزار روی کامپیوتری که در حال حاضر دارین انجام میشن.

یه ماشین مجازی دقیقا مثل یک کامپیوتر واقعی، زبان خاص خودشو داره. توی EVM اسم این زبان بایت کد (bytecode) اتریوم هست.

بایت کد (Bytecode) #

بایت‌کد (Bytecode) به زبان ساده لیستی از کدهای معتبر توی EVM هست. در واقع یک کد عملیاتی (opcode)، عملیاتی مثل جمع (ADD)، تفریق (SUBTRACT) یا توقف (STOP) هست.

بعضی از اونا رو میتونین توی جدول زیر ببینین:

OPCODEاسمتوضیحات
0x00STOPHalts Execution
0x01ADDAddition operation
0x02MULMultiplication operation
0x03SUBSubtraction operation
0x04DIVInteger division operation

نکته مهم اینه که EVM معنای ADD یا SUBTRACT را متوجه نمی شه و فقط کد عملیاتی را بلده. برای ADD، این کد 0x01 ه.

بنابراین یه برنامه معتبر به این شکل خواهد بود: 604260005260206000F3. این چیزیه که EVM میتونه اونو تفسیر کنه.

در حال حاضر 144 کد عملیاتی وجود داره. شما می توانید همه اونها رو اینجا ببینین. این مقدار ثابت نیست و دائما در حال تغییره. کدهای عملیاتی جدید به طور مکرر اضافه میشن و کدهای قدیمی منسوخ می شن.

Solidity, Vyper, Huff #

به عنوان یه توسعه‌دهنده، تقریباً در اکثر مواقع قرار نیست مستقیماً بایت‌کد بنویسین. این کار بسیار زمان‌بر و مستعد خطا هستش. اینجاست که زبان‌های برنامه‌نویسی سطح بالا مثل Solidity یا Vyper وارد میشن.

اما یه فایل سالیدیتی یا Vyper فقط یک فایل متنی هستش. و این چیزی نیست که EVM اونو درک کنه. ما به برنامه‌ای نیاز داریم که فایل متنی را دریافت کنه و اونو به بایت‌کد EVM ترجمه کنه. به این برنامه میگن کامپایلر.

اگه یه زبان برنامه نویسی میتونه به بایت کد EVM ترجمه بشه(کامپایل بشه)، میگن هدف اون(زبان)، EVM هست.

اتریوم در مقابل بیت کوین #

چه چیزی اتریوم رو تا این حد خاص میکنه؟ در مقایسه بلاکچین‌های دیگه ای که قبل از اون مثل بیت‌کوین وجود داشتن.

اتریوم به این دلیل خاصه چون جهانی یا تورینگ کامل هست. به این معنی که هر برنامه دلخواهی رو میشه روی EVM اجرا کرد. (محدودیت های گاز(Gas) و حافظه را نادیده می گیریم).

بیت کوین هم قابلیت های برنامه نویسی داره که اسکریپت بیت کوین نامیده میشه. اما نکته مهم اینه که اسکریپت بیت کوین تورینگ کامل نیست. برنامه‌هایی وجود دارن که به سادگی نمیشه اونا رو توی اسکریپت بیت‌کوین پیاده سازی کرد. این قضیه در مورد EVM صدق نمی کنه.

طرح کلی #

ما mini-EVM خودمون رو از پایین به بالا خواهیم ساخت. اول با پشته (Stack) شروع می کنیم. بعد سراغ حافظه (Memory) و فضای ذخیره سازی (Storage) میریم. و بعدش کدهای عملیاتی (opcodes) رو پیاده سازی خواهیم کرد که قراره بیشتر وقت ما رو به خودش اختصاص بده.

بعد از ساختن تمام این بلوک‌های سازنده، اونا رو برای ایجاد EVM خودمون ترکیب می‌کنیم. در نهایت قصد داریم از EVM خودمون برای اجرای چند تا برنامه استفاده کنیم.

درک این نکته مهمه که mini-EVM ما کاملاً مستقل از قراردادها یا حساب‌های دیگه عمل می‌کنه. یعنی توابعی که نیاز به تعامل با «دنیای خارج» دارن، به صورت ساختگی در نظر گرفته میشن. انتخابمون این بوده تا از ساده بودن چیز ها دور نشیم.

پیش نیازها #

  • پایتون
  • اعداد هگزادسیمال

یادداشت ها #

  • تمام نوت بوک ها توی اینجا در دسترسن.
  • اگر اشتباهی دیدین، لطفا یک Issue در GitHub ایجاد کنین، یا حتی گزینه بهتر میتونین Pull Request ایجاد کنید. اگر هم توی ترجمه مشکلی دیدین میتونین توی یه ایمیل خبر بدین تا اصلاحش کنم.
احساست در مورد این مقاله چیه؟