ماشین مجازی اتریوم ( EVM ) چیست؟
ماشین مجازی اتریوم یک ماشین تورینگ کامل است که روی شبکه بلاک چین اتریوم به اجرا در میآید و این امکان را به هر کسی میدهد که بتواند پلتفرم ها و اپلیکیشن های خودش را بصورت غیر متمرکز روی آن اجرا کند. در واقع این ماشین مجازی یه دستگاه کدنویسی شده است که میتواند قراردادهای هوشمندی که به زبان Solidity نوشته شدهاند را، روی شبکه بلاک چین اجرا کند. ماشین مجازی اتریوم وظیفه تایید اعتبار تراکنشهای انجام شده در بلاک چین اتریوم را از طریق کنترل وضعیت حساب، وضعیت جهانی، وضعیت ذخیرهسازی، اطلاعات بلاک و اطلاعات فضای رانتایم به عهده دارد. همچنین در اتریوم، از مفهوم gas به عنوان کارمزد انجام تراکنش استفاده میشود.
ماشین مجازی اتریوم را میتوان به عنوان یک ماشین شبکه تورینگ کامل در نظر گرفت. کامل بودن تورینگ به یک نظام قوانین دستکاری داده اطلاق میشود که به نام آلن تورینگ (Alan Turing)، خالق ماشین تورینگ نامگذاری شده است. زبانهای برنامهنویسی و واحدهای پردازش مرکزی (CPU) نمونههای خوبی از سیستمهایی هستند که به دادهها دسترسی پیدا کرده و آنها را تغییر میدهند. اگر بتوان از این قوانین برای شبیهسازی ماشین محاسبات فرضی تورینگ استفاده کرد، قوانین «تورینگ کامل» در نظر گرفته میشوند. میتوان به صورت ریاضی ثابت کرد یک سیستم تورینگ کامل توانایی انجام هر محاسبه یا برنامه کامپیوتری را دارد. به عبارت دیگر، یک دستگاه تورینگ کامل از لحاظ ریاضی قادر به حل هر مسالهای است که در برابر آن قرار داده شود. ماشین مجازی اتریوم تنها شبه تورینگ کامل است، چرا که محاسبات انجام شده توسط ماشین با gas محدود میشود، که به عنوان محدودیتی برای تعداد محاسباتی است که میتواند انجام گیرد.
gas و بایتکد EVM
در اتریوم، gas را میتوان معادل کارمزد در نظر گرفت. هر معاملهای که در شبکه اتریوم انجام میشود، نیاز به کارمزدی دارد که به صورت gas پرداخت می شود. مفهوم gas اتریوم را میتوان به دو قسمت تقسیم کرد: gas و قیمت gas
- gas: به عنوان ابزاری عمل میکند که به وسیله آن کارمزدهای اجرای محاسباتی خاص را میسنجیم.
- قیمت gas: این مقدار اتری است که یک فرد مایل در ازای هر واحد gas مایل به پرداخت آن است. قیمت gas اغلب با «Wei» اندازهگیری میشود و Wei کوچکترین واحد اتر بوده که در آن ۱۰ به توان ۱۸ Wei نشاندهنده یک اتر است.
بنابراین، برای اینکه فردی بتواند یک معامله را در شبکه اتریوم اجرا کند، فرستنده باید حد مجاز gas و قیمت gas در معامله را تعیین کند. اگر فرستنده gas لازم برای انجام یک معامله را نداشته باشد، گفته میشود که «gas وی تمام شده» و نامعتبر است.
gas میتواند تعداد محاسباتی را که توسط ماشین مجازی اتریوم در چند روز انجام میشود را محدود کند. این محاسبات عبارتند از:
- بلاکهایی که در بلاک چین اتریوم استخراج میشوند شامل یک محدودیت gas هستند، بنابراین مقدار gas مورد استفاده در تمام معاملات مشمول یک بلاک نمیتواند از یک مقدار معین تجاوز کند.
- قیمت gas به میزان gas متصل است، صرف نظر از اینکه آیا محدودیت gas برداشته شده و ماشین به طور نظری قادر به حل هرگونه مساله دریافت شده باشد، برخی از معاملات ممکن است بسیار پیچیده و از نظر اقتصادی غیرعملی باشند.
ماشین مجازی اتریوم دارای زبان برنامه نویسی خاص خود است، که به نام بایتکد EVM شناخته میشود. وقتی کد در زبانهای برنامه نویسی سطح بالاتر مانند زبان متمرکز بر قرارداد اتریوم Solidity نوشته شود، میتوان آن کد را در بایتکد EVM کامپایل کرد، تا ماشین مجازی اتریوم بتواند آنچه را نوشته شده است، درک کند.
ماشین وضعیت مبتنی بر تراکنش
ماشین مجازی اتریوم یک عنصر مهم از ساختار اتریوم است، زیرا مسئول رسیدگی به وضعیت داخلی و محاسبات در شبکه است. ماشین همچنین باید اطلاعات حساب مربوط به نشانی، موجودیها، قیمت فعلی gas و اطلاعات بلاک را مدیریت کند.
همانطور که قبلا ذکر شد، ماشین مجازی اتریوم مسئول مدیریت وضعیت داخلی در شبکه است. دستگاه باید وضعیت مولفههای متعدد را برای یک تراکنش موفق پیگیری کند. به همین دلیل است که اغلب از اتریوم به عنوان ماشین وضعیت مبتنی بر تراکنش یاد میشود. قبل از اینکه به اجزای مختلفی بپردازیم که ماشین مجازی اتریوم پیگیری میکند، شاید یک توضیح مختصر از مفهوم «وضعیت» مفید باشد.
در حوزه علوم رایانه، یک ماشین وضعیت به یک ماشینی اشاره میکند که قادر به خواندن مجموعهای از ورودی ها بوده و براساس آن ورودیها، انتقال به وضعیتی جدید را ممکن میکند. به طور مشابه، ماشین وضعیت اتریوم نیز به همین شکل عمل میکند. قبل از اینکه یک ورودی وارد شود، و یا قبل از اجرای هرگونه تراکنش در اتریوم، نقطه شروع چیزی مانند یک صفحه خالی است. همزمان با انجام معاملات در شبکه، هر نقطهای در این زمان، وضعیت فعلی اتریوم را نشان میدهد. برای اینکه یک انتقال وضعیت انجام شود، تراکنشهای انجام شده باید معتبر باشند و یک معامله زمانی معتبر تلقی میشود که از طریق فرایند استخراج با موفقیت تایید شود.
این فرایند استخراج عموما به عنوان اثبات کار (PoW) شناخته میشود و شامل نودهایی در شبکه اتریوم است که منابع کامپیوتری را به مصرف میرسانند تا اجازه ایجاد یک بلاک از تراکنشهای معتبر و اضافه کردن آن به بلاکچین را دریافت کنند. یک ماینر زمانی میتواند بلاک را به بلاک چین اضافه کند که بتواند «اثبات» ریاضی ارائه دهد. یک سیگنال اثبات معتبر به شبکه نشان میدهد که بلاک معتبر است و پس از آن بلاک پذیرفته شده و به چین اضافه میشود. ماینری که به طور موفقیتآمیز یک بلاک را تأیید میکند، دارایی بومی اتریوم یعنی اتر را در ازای صرف منابع رایانشی در طول روند PoW پاداش میگیرد.
اجزایی که ماشین مجازی اتریوم باید آنها پیگیری کند عبارتند از: وضعیت حساب، وضعیت جهانی، وضعیت ذخیرهسازی، اطلاعات بلاک و اطلاعات فضای رانتایم (Runtime).
وضعیت حساب
اتریوم را میتوان متشکل از حسابهای کوچک متعدد در نظر گرفت که قادر به تعامل با یکدیگر هستند (این به دلیل چارچوب ارسال پیام اتریوم ممکن شده است). حسابها در اتریوم را میتوان به موارد زیر تقسیم کرد: حسابهای متعلق به عناصر خارجی و حسابهای قرارداد.
- حسابهای متعلق به عناصر خارجی: این حسابها توسط کلید خصوصی کنترل میشوند و هیچ کدی به آنها نسبت داده نشده است.
- حسابهای قرارداد: این حسابها با کد قرارداد خود کنترل میشوند و کدی به آنها نسبت داده شده است.
یک حساب کاربری متعلق به عناصر خارجی قادر به ارسال پیام به دیگر حسابهای متعلق به عناصر خارجی و یا دیگر حسابهای قرارداد است. این عمل از طریق امضای دیجیتال یک تراکنش توسط یک کلید خصوصی انجام میشود. ارتباط بین دو حساب متعلق به عناصر خارجی میتواند صرفا به عنوان یک انتقال ارزش در نظر گرفته شود. با این حال، پیامی بین یک حساب متعلق به عناصر خارجی به یک حساب قرارداد اثری مشابه اجرای کد حساب قرارداد دارد. این کار حساب قرارداد را قادر میسازد تا اقداماتی را انجام دهد که در کد قرار پیشبینی شده است که میتواند شامل نقل و انتقال توکن و ایجاد توکن جدید و غیره باشد. باید اشاره شود که حسابهای قرارداد به تنهایی قادر به ایجاد یک معامله جدید نیستند (بر خلاف حساب متعلق به عناصر خارجی). حسابهای قرارداد واکنشدهنده هستند، یعنی آنها فقط میتوانند در تراکنشهایی شرکت کنند که به عنوان پاسخی به سایر تراکنشهایی که دریافت کردهاند عمل میکنند، که میتوان از یک حساب متعلق به عناصر خارجی یا یک حساب قرارداد دیگر باشد.
چهار عنصر وضعیت حساب را شکل میدهند که شامل موارد زیر میگردند:
- نانس (Nonce): اگر حسابی متعلق به عناصر خارجی باشد، این مقدار نشاندهنده تعداد تراکنشهای ارسال شده از نشانی حساب است. اما اگر این یک حساب قرارداد باشد، nonce نشاندهنده تعداد قراردادهای ایجاد شده توسط حساب است.
- Balance: تعداد Weiهای متعلق به آدرس حساب است.
- CodeHash: مقدار هش تغییرناپذیر ماشین مجازی اتریوم برای حساب متناظر است.
وضعیت جهان
وضعیت جهانی اتریوم به طور موثر متشکل از نگاشت بین شناسههای آدرس ۱۶۰ بیتی و وضعیت حساب است. تمام این اطلاعات نگاشت در یک ساختار داده به عنوان Merkle Patricia Tree نگهداری میشوند. این ساختار داده از مجموعهای از نودها با موارد زیر ساخته شده است:
- مقدار زیادی از نودهای برگی در انتهای درخت که دادههای زیربنایی در آن قرار دارند.
- مجموعهای از نودهای واسطه، که در آنها هر نود، هش دو نود فرزند است.
- یک هش ریشهای نیز از هش دو نود فرزند پیشین تشکیل میشود که نشاندهنده بالای ساختار درخت است.
وضعیت ذخیره
این اطلاعات مربوط به وضعیت حسابی خاص است که در زمان اجرا در ماشین مجازی اتریوم نگهداری میشود.
اطلاعات بلاک
مقادیر وضعیت که برای پشتیبانی از یک تراکنش مورد نیاز هستند. اطلاعات بلاک شامل موارد زیر است:
- Blockhash: هش آخرین بلاکی که تکمیل شده است
- Coinbase: آدرس گیرنده
- Timestamp: برچسب زمان فعلی بلاک
- Number: شماره بلاک کنونی
- Difficulty: دشواری بلاک کنونی
- Gaslmit: سقف gas که به بلاک کنونی متصل است
اطلاعات فضای رانتایم
این اطلاعاتی است که برای اجرای یک تراکنش استفاده میشود و شامل موارد زیر است:
- قیمت gas: قیمت فعلی gas که توسط آغازگر تراکنش مشخص شده است
- Codesize: اندازه کدبیس تراکنش
- Caller: نشانی حسابی که تراکنش را اجرا میکند
- Origin: آدرس فرستنده اصلی تراکنش
برای اطلاعات بیشتر در مورد ماشین مجازی اتریوم میتوانید به Github اتریوم (آموزش توسعه اتریوم) مراجعه کنید.