پیش‌نویس:ماشین مجازی اتریوم

ماشین مجازی اتریوم (به انگلیسی: ؛ به‌اختصار EVM) محیط اجرای قراردادهای هوشمند در شبکهٔ اتریوم است. این ماشین مجازی، که در قلب معماری اتریوم قرار دارد و گاه «سیستم‌عامل اتریوم» نامیده می‌شود، مسئول اجرای بایت‌کد قراردادهای هوشمند و به‌روزرسانی «وضعیت جهانی» () بلاک‌چین اتریوم، شامل موجودی حساب‌ها، کد قراردادها و داده‌های ذخیره‌شده در آن‌هاست. هر گرهٔ کامل () در شبکهٔ اتریوم نمونه‌ای از این ماشین مجازی را اجرا می‌کند تا تضمین شود اجرای قراردادها در سراسر شبکه قطعی (deterministic) و برای همگان قابل‌راستی‌آزمایی است.

 معرفی و جایگاه 
تعریف رسمی و صوری EVM در سند مرجع اتریوم موسوم به «مقالهٔ زرد» ()، نوشتهٔ گاوین وود، از بنیان‌گذاران اتریوم، آمده است. این ماشین مجازی، محیطی ایزوله («جعبه‌شنی» یا ) فراهم می‌کند که در آن کد قرارداد هوشمند، بدون دسترسی به شبکه، سامانهٔ فایل یا سایر فرایندهای موجود بر روی گره، اجرا می‌شود؛ حتی ارتباط میان قراردادهای مختلف نیز محدود به مکانیزم‌های تعریف‌شدهٔ خود ماشین مجازی است.

 معماری 
EVM ماشینی پشته‌محور () و بدون ثبات (register-less) است که از معماری هاروارد پیروی می‌کند؛ یعنی فضای آدرس‌دهی کد (بایت‌کد قرارداد) و داده را از یکدیگر جدا نگاه می‌دارد. این ماشین مجازی از اندازه‌کلمهٔ (word size) ۲۵۶ بیتی استفاده می‌کند؛ انتخابی که عمدتاً برای تسهیل عملیات درهم‌سازی (هش) و محاسبات منحنی بیضوی در نظر گرفته شده است.

اجزای اصلی مدل اجرایی EVM عبارت‌اند از:

 پشته (Stack): ساختمان‌دادهٔ فرارونده و آخرین‌ورودی-نخستین‌خروجی (LIFO) که برای انتقال داده میان دستورالعمل‌ها (اپ‌کدها) در طول اجرای تراکنش استفاده می‌شود. هر عنصر پشته ۲۵۶ بیت (۳۲ بایت) است و پشته می‌تواند حداکثر ۱۰۲۴ عنصر را در خود جای دهد.
 حافظه (Memory): ناحیه‌ای فرّار و خطی (linear) که برای نگهداری داده‌های موقت در طول اجرای یک تراکنش به کار می‌رود و پس از پایان تراکنش از میان می‌رود. هزینهٔ استفاده از حافظه با افزایش اندازهٔ آن به‌صورت درجهٔ‌دوم افزایش می‌یابد، اما همچنان ارزان‌تر از حافظهٔ ذخیره‌سازی دائمی است.
 ذخیره‌سازی (Storage): نگاشتی کلید-مقدار که وضعیت هر قرارداد را میان تراکنش‌ها و فراخوانی‌های مختلف به‌صورت دائمی و ثبت‌شده بر روی بلاک‌چین حفظ می‌کند. از آنجا که داده‌های ذخیره‌سازی مستقیماً بر بلاک‌چین ثبت می‌شوند، هزینهٔ ایجاد و به‌روزرسانی آن‌ها بسیار بیشتر از حافظهٔ موقت است.
 شمارندهٔ برنامه (Program Counter): اشاره‌گری که مشخص می‌کند کدام دستورالعمل (اپ‌کد) در ادامه باید اجرا شود.
 کد EVM: بایت‌کد کامپایل‌شدهٔ قرارداد که به‌صورت دائمی به‌عنوان بخشی از وضعیت حساب قرارداد ذخیره می‌شود.

هرگاه یک قرارداد، قرارداد دیگری را فراخوانی کند، نمونهٔ تازه‌ای از EVM، با وضعیت جعبه‌شنی مقداردهی‌شده بر پایهٔ وضعیت سطح بالاتر، ایجاد می‌شود؛ این نمونه نیز سهمیهٔ گاز مشخصی (که هرگز نمی‌تواند از گاز باقی‌ماندهٔ سطح بالاتر بیشتر باشد) دریافت می‌کند و ممکن است در صورت اتمام گاز، با یک استثنا متوقف شود.

 اپ‌کدها و مجموعه‌دستورات 
EVM دارای مجموعه‌دستورات تورینگ-کامل است که هر دستور آن با یک اپ‌کد (opcode) یک‌بایتی نمایش داده می‌شود؛ این مجموعه‌دستورات، بسته به نسخهٔ فعلی پروتکل اتریوم، بین ۱۴۰ تا ۱۵۰ دستورالعمل مجزا را در بر می‌گیرد که طیفی از عملیات محاسباتی پایه (مانند جمع و تفریق)، دستکاری پشته (مانند PUSH و POP)، دسترسی به ذخیره‌سازی (مانند SSTORE و SLOAD)، تا کنترل جریان اجرا و پرس‌وجوی وضعیت بلاک‌چین (مانند شمارهٔ بلوک یا آدرس فرستنده) را پوشش می‌دهند.

 گاز و مکانیزم هزینه 
از آنجا که EVM از نظر نظری تورینگ-کامل است، بدون مکانیزم محدودکننده، اجرای یک برنامهٔ نامعتبر می‌توانست به یک حلقهٔ بی‌پایان و فلج‌شدن شبکه بینجامد. برای جلوگیری از این وضعیت، اتریوم مفهوم «گاز» () را به‌عنوان واحد سنجش هزینهٔ محاسباتی معرفی کرده است؛ از این رو، EVM را «شبه‌تورینگ-کامل» () نیز می‌نامند، چرا که مدل اجرایی آن با گاز محدود می‌شود. هر اپ‌کد هزینهٔ گازی مشخصی متناسب با پیچیدگی محاسباتی و مصرف منابعش دارد؛ برای نمونه، عملیات ضرب پنج واحد گاز مصرف می‌کند.

هنگام اجرای یک تراکنش، EVM سهمیهٔ گازی برابر با «سقف گاز» () تعیین‌شده در تراکنش دریافت می‌کند و پیش از اجرای هر عملیات، بررسی می‌شود که گاز کافی برای آن باقی مانده باشد؛ در صورت ناکافی بودن گاز، اجرا متوقف و تراکنش بازگردانده (revert) می‌شود. در صورت تکمیل موفق اجرا، هزینهٔ گاز مصرف‌شده -بر پایهٔ قیمت گاز مشخص‌شده در تراکنش- به اتر تبدیل و به عنوان کارمزد تراکنش به تولیدکنندهٔ بلوک پرداخت می‌شود.

 کامپایل و زبان‌های پشتیبانی‌شده 
EVM مستقیماً بایت‌کد را اجرا می‌کند و توسعه‌دهندگان معمولاً قراردادهای هوشمند را با زبان‌های سطح‌بالاتری مانند سالیدیتی یا وایپر () می‌نویسند که سپس توسط کامپایلرهایی مانند `solc` به بایت‌کد سازگار با EVM ترجمه می‌شوند. بایت‌کد ذخیره‌شده بر روی بلاک‌چین، موسوم به «بایت‌کد اجرایی» ()، توسط موتور محاسباتی EVM به اپ‌کد تفسیر و اجرا می‌شود.

 پیاده‌سازی‌ها 
از آنجا که EVM یک مشخصهٔ صوری (فرمال) است و نه یک نرم‌افزار واحد، کلاینت‌های اجرایی مختلف اتریوم -مانند گث ()، نت‌ماایند () و رث ()- هر یک پیاده‌سازی مستقل خود از این ماشین مجازی را دارند که باید دقیقاً مطابق با قواعد مشترک مشخصه عمل کنند تا اجماع شبکه حفظ شود.

 ملاحظات امنیتی 
مدل اجرایی EVM و ماهیت غیرقابل‌بازگشت تراکنش‌های بلاک‌چین باعث شده‌اند نگارش کد ایمن برای این ماشین مجازی اهمیتی حیاتی داشته باشد. آسیب‌پذیری‌های سطح بایت‌کد، مانند حملات بازورودی () یا سوءاستفاده از منطق واریز جعلی (fake deposit)، از جمله موضوعاتی هستند که پژوهش‌های امنیتی متعددی دربارهٔ آن‌ها و روش‌های مقابله در سطح EVM انجام شده است.

 کاربرد فراتر از اتریوم 
به دلیل استانداردشدن EVM و رواج گستردهٔ آن، بسیاری از بلاک‌چین‌های دیگر، به‌جای طراحی ماشین مجازی اختصاصی، محیط اجرایی سازگار با EVM را در شبکهٔ خود پیاده‌سازی کرده‌اند تا بتوانند از اکوسیستم ابزارها، زبان‌ها (مانند سالیدیتی) و قراردادهای هوشمند موجود اتریوم بهره ببرند. این ویژگی، EVM را عملاً به یکی از رایج‌ترین استانداردهای صنعت بلاک‌چین تبدیل کرده است.

 جستارهای وابسته 
 اتریوم
 سالیدیتی
 قرارداد هوشمند
 بلاک‌چین
 اتر (ارز دیجیتال)
 دیفای

 منابع 

:رده:اتریوم
:رده:ماشین‌های مجازی
:رده:فناوری بلاک‌چین
:رده:نرم‌افزارهای معرفی‌شده در ۲۰۱۵ (میلادی)