اتریوم چگونه کار می کند؟- بخش پایانی

مدل اجرا
تا اینجا، مراحل اجرای یک تراکنش از آغاز تا پایان را یاد گرفتیم. حالا میخواهیم ببینیم یک تراکنش در ماشین مجازی واقعا چگونه انجام میشود.
بخشی از پروتکل که بررسی تراکنشها را انجام میدهد، EVM یا ماشین مجازی اتریوم (Ethereum Virtual Machine) است.
ماشین مجازی اتریوم یک ماشین مجازی تورینگ کامل است. تنها محدودیت این ماشین مجازی این است که بهشکل ذاتی محدود به سوخت است. بنابراین کل محاسباتی که این ماشین میتواند انجام دهد با مقدار سوخت تعیینشده محدود میشود.

علاوه بر این، معماری ماشین مجازی اتریوم مبتنی بر پشته است. یک ماشین مبتنی بر پشته، کامپیوتری است که برای نگهداری مقادیر موقت از پشتهای استفاده میکند که مبنای کارش LIFO (last-in first out) است. LIFO یعنی آخرین ورودی زودتر از بقیه خارج میشود.
اندازه هر بخش پشته در ماشین مجازی اتریوم ۲۵۶ بیت و بیشترین اندازه پشته ۱۰۲۴ بیت است.
ماشین مجازی اتریوم حافظهای دارد که در آن بخشها بهعنوان آرایههایی از آدرسهای کلمهای ذخیره میشوند. این حافظه ناپایدار است، یعنی دائمی نیست.
ماشین مجازی اتریوم فضای ذخیرهسازی هم دارد. برخلاف حافظه، فضای ذخیرهسازی پایدار است و بهعنوان بخشی از حالت سیستم است. ماشین مجازی اتریوم، کد برنامه را بهشکل جداگانه در یک حافظه فقط خواندنی (ROM) مجازی ذخیره میکند که فقط از طریق دستورالعملهای ویژه میتوان به آن دسترسی داشت. به این شیوه، ماشین مجازی اتریوم با معماری فون نویمان که در آن کد برنامه در حافظه یا فضای ذخیرهسازی ذخیره میشود متفاوت است.
ماشین مجازی اتریوم زبان مخصوص خودش را دارد: «بایتکد EVM»
هنگامی که یک برنامهنویس قراردادهای هوشمندی را مینویسد که روی اتریوم اجرا میشوند، معمولا کدها را با یک زبان سطح بالا مانند سالیدیتی مینویسد. سپس میتواند آن را به زبان بایتکد ماشین مجازی اتریوم کامپایل کند که برای این ماشین قابلفهم باشد.
حالا بیایید به اجرا برگردیم.
قبل از انجام محاسبهای خاص، پردازنده باید اطمینان یابد که اطلاعات زیر موجود و معتبر هستند:
- حالت سیستم؛
- سوخت موردنیاز برای محاسبه؛
- آدرس حسابی که مالک کد در حال اجراست؛
- آدرس فرستنده تراکنشی که مبدأ این اجراست؛
- آدرس حسابی که موجب اجرای این کد میشود (ممکن است متفاوت از فرستنده اصلی باشد)؛
- قیمت سوخت تراکنشی که مبدأ این اجراست؛
- دادههای ورودی برای این اجرا؛
- مقداری (بهشکل وی) که در این حساب بهعنوان بخشی از اجرای فعلی قرار داده شده است؛
- کد ماشین برای اجرا؛
- سربرگ بلاک از بلاک فعلی؛
- عمق پشته مربوط به فراخوانی پیام یا ایجاد قرارداد فعلی؛
در آغاز فرایند اجرا، حافظه و پشته خالی هستند و شمارنده برنامه صفر است.
سپس ماشین مجازی اتریوم بهشکل بازگشتی تراکنش را اجرا میکند و برای هر حلقه حالت سیستم و حالت ماشین را محاسبه میکند. حالت ماشین همان حالت جهانی اتریوم است. حالت ماشین متشکل از موارد زیر است:
- سوخت موجود؛
- شمارنده برنامه؛
- محتوای حافظه؛
- تعداد معلوم کلمات در حافظه؛
- محتوای پشته؛
بخشهای پشته از انتهاییترین بخش چپ سری اضافه یا حذف میشوند.
در هر چرخه، مقدار موردنیاز سوخت از سوخت باقیمانده کم میشود و شمارنده برنامه افزایش مییابد.
در انتهای هر حلقه، سه احتمال وجود دارد:
- ماشین به یکی از حالتهای استثنا (به عنوان مثال سوخت ناکافی، دستورالعملهای نامعتبر، کافینبودن آیتمهای پشته، سرریز شدن پشته، مقصد پرش (JUMP) نامعتبر و نظایر آنها) میرسد و باید متوقف شود. بنابراین فرایند اجرا بدون هیچ تغییری رد میشود.
- توالی به پردازش ادامه میدهد و به حلقه بعدی میرسد.
- ماشین به توقف کنترلشده میرسد (پایان فرایند اجرا).
اگر اجرا با هیچ یک از حالات استثنایی مواجه نشود و به توقف کنترلشده یا عادی برسد، آنگاه ماشین «حالت برایند»، «سوخت باقیمانده پس از این اجرا»، «حالت جانبی حاصلشده» و «خروجی برایند» را تولید میکند.
همین حالا یکی از پیچیدهترین بخشهای اتریوم را گذراندیم. اگر حتی به طور کامل این بخش را متوجه نشدید، ایرادی ندارد. اصلا نیازی نیست که تمام زیر و بم جزئیات اجرا را درک کنید؛ مگر اینکه بخواهید در سطح بسیار پیشرفتهتری کار کنید.
چگونه یک بلاک نهایی میشود؟
در نهایت، باید به این موضوع بپردازیم که چگونه بلاکی که حاوی تعداد زیادی تراکنش است، نهایی میشود.
نهاییشدن میتواند بسته به اینکه آیا این بلاک جدید است یا از قبل وجود دارد، به معنای دو چیز متفاوت باشد. اگر این یک بلاک جدید باشد، منظور از نهاییشدن فرایند استخراج این بلاک است. اما اگر این بلاک موجود بوده است، منظور فرایند اعتبارسنجی این بلاک است. در هر مورد، ۴ شرط برای نهاییشدن یک بلاک وجود دارد:
۱) اعتبارسنجی اومرها (برای استخراج: تعیین اومرها)
هر بلاک اومر در سربرگ بلاک، باید یک سربرگ معتبر باشد و حتما باید در محدوده نسل ششم به پایین (پنجم، چهارم و …) بلاک فعلی قرار گیرد.
۲) اعتبارسنجی تراکنشها (برای استخراج: تعیین تراکنشها)
مقدار سوخت استفاده شده در بلاک باید با مجموع سوخت مصرفشده توسط تراکنشهایی که در بلاک فهرست شدهاند برابر باشد (اگر یادتان باشد، هنگام اجرای یک تراکنش شمارنده سوخت بلاک را نگه میداریم که همه آنها در نهایت مقدار کل سوخت مصرفشده توسط همه تراکنشهای موجود در این بلاک را مشخص میکنند).
۳) پاداشدهی (فقط درباره استخراج)
برای استخراج بلاک 2 واحد اتر پاداش به آدرس ذینفع ارسال میشود. علاوهبرآن ذینفعِ بلاک فعلی برای هر اومر، به اندازه یک سیودوم پاداش بلاک فعلی را هم میگیرد. در نهایت، ذینفع بلاک اومر هم مقدار مشخصی پاداش میگیرد (برای محاسبه این مقدار مشخص، فرمول ویژهای وجود دارد).
۴) تأیید حالت و نانس (در استخراج: محاسبه حالت و نانس معتبر)
این مرحله برای اطمینان از انجام همه تراکنشها و تغییرات حالت برایند است. پس از اینکه پاداش بلاک تراکنش نهایی اعمال شد، تعریف بلاک جدید بهعنوان حالت نهایی صورت میگیرد. برای تأیید باید حالت نهایی را با درخت حالتی که در سربرگ ذخیره شده است مطابقت داد.
اثبات کار و استخراج
در بخش «بلاکها» مختصری به مفهوم سختی بلاک پرداختیم. الگوریتمی که به سختی بلاک معنا میدهد اثبات کار (PoW) است.
الگوریتم اثبات کار اتریوم اتهش (Ethash) نامیده میشود (قبلا بهعنوان داگر – هاشیموتو نامیده میشد).
تعریف رسمی این الگوریتم بهشکل زیر است:

اگر m میکسهش (mixHash)، n نانس و Hn سربرگ بلاک جدید باشد (به استثنای نانس و تابع درهمسازی مختلط که باید محاسبه شوند)، آنگاه Hn نانس سربرگ بلاک است و d همان دَگ (گراف جهتدار غیرمدور) است که مجموعهای بزرگ از دادههاست.
در بخش «بلاکها» درباره بخشهای مختلف موجود در یک سربرگ بلاک صحبت کردیم. دو مورد از آن اجزاء میکسهش و نانس بودند. گفتیم که:
- میکسهش، هشی است که همراه با نانس اثبات میکند که روی این بلاک محاسبات کافی انجام شده است؛
- نانس نیز هشی است که وقتی با میکسهش ترکیب میشود، اثبات میکند که محاسبات کافی روی این بلاک انجام شده است.
تابع اثبات کار برای ارزیابی این دو بخش به کار میرود.
اینکه چطور میتوان با استفاده از تابع اثبات کار دقیقا میکسهش و نانس را محاسبه کرد تا حدی پیچیده است و توضیح آن در این مطلب نمیگنجد. اما نحوه کار به صورت کلی به شکل زیر است:
یک «عبارت بازیابی (seed)» برای هر بلاک محاسبه میشود. این عبارت بازیابی در هر «دوره» به طول ۳۰,۰۰۰ بلاک تغییر میکند. عبارت بازیابی برای اولین دوره، درهمسازیِ یک سری متشکل از ۳۲ بایت با مقدار صفر است. اما برای هر دوره بعدی، درهمسازیِ درهمسازیِ عبارت بازیابی قبلی است. با استفاده از این عبارت بازیابی، یک نود میتواند یک «کَش یا حافظه پنهان» شبه تصادفی را محاسبه کند.
این حافظه پنهان بینهایت مفید است زیرا با همین حافظه پنهان است که میتوانیم لایت نودها را داشته باشیم. بدون وجود آن همه نودها باید فول نود میبودند. یاد گرفتیم که لایت نودها قابلیت این را دارند که یک تراکنش را بهشکلی کارامد تأیید کنند بدون اینکه مجبور باشند کل مجموعه دادههای بلاک چین را ذخیره کنند. یک لایت نود میتواند اعتبار یک تراکنش را بر اساس همین حافظه پنهان تأیید کند؛ زیرا حافظه پنهان میتواند هر چیزی را که برای تأیید یک بلاک نیاز است دوباره تولید کند.
با استفاده از این حافظه پنهان، یک نود میتواند «مجموعه داده» گراف جهتدار غیرمدور را تولید کند. هر آیتم در این مجموعه دادهها، به تعداد کمی از آیتمهای انتخابشده بهشکل شبه تصادفی از این حافظه پنهان بستگی دارند. برای اینکه یک ماینر باشید، باید کل این مجموعه داده را تولید کنید. همه کلاینتها و ماینرها این مجموعه داده را ذخیره میکنند، بهاینترتیب این مجموعه داده بهشکل خطی در طول زمان رشد میکند.
ماینرها میتوانند بهشکل تصادفی هر بخش از این مجموعه داده را بگیرند و با استفاده از یک تابع ریاضی آنها را درهمسازی کنند. یک ماینر بهطور مکرر یک تابع درهمسازی مختلط را تولید میکند تا زمانی که خروجی به نانس موردنظر برسد. هنگامیکه خروجی به این مقدار رسید، این نانس معتبر در نظر گرفته میشود و بلاک میتواند به زنجیره اضافه شود.
حفظ امنیت سیستم با استخراج
بهطورکلی، هدف اثبات کار این است که به روشی ایمنشده با رمزنگاری ثابت کند که مقدار مشخصی از محاسبات برای تولید خروجی (یعنی نانس) انجام شده است. دلیلش این است که هیچ راه بهتری به جز همین راه شمارش همه احتمالات برای یافتن یک نانس که نزدیک به آستانه موردنیاز باشد وجود ندارد. خروجی توابع هش تکرارشونده، توزیع یکریختی دارند و بنابراین میتوانیم اطمینان داشته باشیم که به طور متوسط، زمان موردنیاز برای یافتن چنین نانسی به آستانه سختی بستگی دارد.
هر چه سختی بیشتر باشد، یافتن نانس بیشتر طول میکشد. بهاینترتیب، الگوریتم اثبات کار به مفهوم سختی که برای تقویت امنیت بلاک چین به کار میرود معنا میدهد.
منظور از امنیت بلاک چین چیست؟ خیلی ساده است، ما میخواهیم بلاک چینی ایجاد کنیم که هر کسی به آن اعتماد داشته باشد. گفتیم که اگر بیش از یک زنجیره وجود داشته باشد، کاربران اعتمادشان را از دست خواهند داد؛ زیرا نمیتوانند بهشکل منطقی تعیین کنند که کدام زنجیره معتبر است. برای اینکه گروهی از کاربران حالت اصلی را که روی یک بلاک چین ذخیره شده است بپذیرند، به یک بلاک چین استاندارد یکتا که گروهی از مردم آن را باور داشته باشند نیاز داریم.
این دقیقا همان کاری است که الگوریتم اثبات کار انجام میدهد: این الگوریتم تضمین میکند که یک بلاک چین مشخص در آینده بهشکل استاندارد باقی خواهد ماند و سبب میشود که حمله برای یک فرد متخلف بینهایت سخت شود؛ زیرا در این صورت باید بخش معینی از تاریخچه را دوباره بنویسند (برای مثال، با پاک کردن تراکنشها یا ایجاد تراکنشهای جعلی) یا از یک فورک حمایت کنند. یک مهاجم برای اعتبارسنجی بلاکش باید ابتدا بهشکل مداوم نانس را سریعتر از هر کس دیگری در شبکه پیدا کند تا شبکه باور کند که زنجیره این مهاجم سنگینترین زنجیره است (بر مبنای اصول پروتکل شبح که قبلا دربارهاش صحبت کردیم). این هم غیرممکن خواهد بود مگر اینکه مهاجم، کنترل بیش از نیمی از قدرت استخراج شبکه را به دست آورد؛ سناریویی که بهعنوان حمله ۵۱ درصدی معروف است.

توزیع ثروت با استخراج
اثبات کار به جز ارائه یک بلاک چینِ ایمن، روشی برای توزیع ثروت بین کسانی که تجهیزات محاسباتی خودشان را برای ارائه این امنیت صرف میکنند نیز هست. اگر یادتان باشد، گفتیم که یک ماینر پاداشی برای استخراج یک بلاک دریافت میکند که شامل موارد زیر است:
- یک پاداش ثابت 2 اتری برای بلاک برنده؛
- هزینه سوخت مصرفشده در بلاک توسط تراکنشهای موجود در بلاک؛
- یک پاداش اضافی برای وارد کردن اومرها بهعنوان بخشی از بلاک.
برای اطمینان از اینکه استفاده از سازوکار اجماع اثبات کار برای امنیت و توزیع ثروت در درازمدت پایدار باشد، اتریوم تلاش میکند تا دو ویژگی زیر را بهتدریج به این الگوریتم اضافه کند:
- در دسترس بودن برای هر تعداد از افراد. هدف این است که افراد نیاز نداشته باشند از سختافزاری خاص یا غیرمعمول برای اجرای این الگوریتم استفاده کنند. مدل توزیع ثروت تا حد ممکن برای همه باز است تا هر کس بتواند هر مقدار از قدرت محاسباتیاش را در ازای اتر ارائه کند.
- کاهش امکان ایجاد مقدار بیرویه سود برای هر نود یکتا. دلیلش این است که هر نود (یا مجموعه کوچک) که بتواند مقدار بیرویهای سود ایجاد کند، ممکن است که نفوذ زیادی در تعیین بلاک چین استاندارد پیدا کند. این امر امنیت شبکه را کاهش میدهد.
در شبکه بلاک چین بیت کوین مشکلی وجود دارد که دقیقا با همین دو ویژگی بالا در ارتباط است: الگوریتم اثبات کار آن، تابع درهمسازی (هش) SHA256 است. نقطهضعف این نوع درهمسازی این است که با استفاده از سختافزارهای خاص که به ایسیکها معروف هستند بسیار راحت حل میشوند.
برای حل این مشکل، اتریوم الگوریتم اثبات کارش یعنی ethash را بهشکل متوالی روی حافظه سخت انجام میدهد. این بدان معناست که این الگوریتم بهشکلی مهندسی شده است که محاسبه نانس به مقدار زیادی حافظه و پهنای باند نیاز داشته باشد. نیاز به فضای حافظه زیاد موجب میشود که یک کامپیوتر به سختی بتواند از حافظهاش برای کشف همزمان نانسهای متعدد استفاده کند و نیاز به پهنای باند زیاد سبب میشود حتی برای سریعترین کامپیوترها هم کشف چند نانس بهشکل همزمان دشوار باشد. این امر خطر متمرکزسازی را کاهش میدهد و به این ترتیب نودهای بیشتری میتوانند در شبکه حضور داشته باشند تا قدرت دست یک سری افراد خاص نیفتد.
چیزی که در اینجا باید به آن توجه کنید این است که درحالحاضر، اتریوم در حال گذار از سازوکار اجماع اثبات کار به اثبات سهام است.
نتیجهگیری
این مطلب کمی سنگین بود، قبول داریم. اگر بتوانید آن را چندبار بخوانید کاملا متوجه خواهید شد قضیه از چه قرار است. نویسنده این مطلب چندین بار یلو پیپر، وایت پیپر و بخشهای مختلف کد اتریوم را مطالعه کرده است و این مطلب را تا حد امکان به شکل سادهتر نوشته است. بااینحال اگر دوست دارید کمی عمیقتر مطالعه کنید، بهتر است یلو پیپر اتریوم را بخوانید.
امتیاز دادن به خبر
با لایک کردن هر خبر میتوانید کوین بیشتری جایزه بگیرید




