ماشین حالت: راهکاری برای حل چالشهای برنامهنویسی بلاکچین
کدهای برنامهنویسی همیشه بیعیبونقص نیستند! گاهی وجود تعداد زیادی از شرایط و پیشامدهای ممکن، یک ماشین ممکن است از لحاظ نرمافزاری دچار مشکل شده و در یک حلقه بینهایت گرفتار شود. به خصوص وقتی صحبت از کدهای پیچیده قراردادهای هوشمند در دنیای بلاکچین میشود، احتمال ظاهر شدن این مشکل نیز به شدت افزایش خواهد یافت. اما مثل تمامی مشکلات دنیای مهندسی، این چالش نیز یک راهحل منحصربهفرد به نام ماشین حالت دارد. در این مقاله به صورت کامل به معرفی ماهیت این ماشین و کاربرد آن در دنیای بلاکچین پرداختهایم.
دنیای نهچندان بیعیبونقص برنامهنویسی!
امروزه توسعهدهندگان کدهای نرمافزاری، طیف گستردهای از زبانهای برنامهنویسی را پیش روی خود دارند. از زبانهای برنامهنویسی قدیمیتر نظیر اسمبلی و پایتون گرفته تا زبانهای جدید مانند سالیدیتی که از آن برای توسعه شبکههای بلاکچین استفاده میشود، همگی جزو ابزار توسعهدهندگان هستند. هرچند که این زبانها از لحاظ مختلفی با یکدیگر تفاوت دارند؛ اما در نهایت همه آنها در پشت پرده از قواعد و الگوریتمهای مشابهی نظیر حلقههای تکرار، حالتهای شرطی و موارد مشابه دیگر استفاده میکنند.
همانطور که انتظار میرود، پیادهسازی یک برنامه با حالتهای محدود و قابل پیشبینی چالش دشواری نخواهد بود؛ اما زمانی که صحبت از یک محیط بزرگ با پیشامدهای مختلف میشود، احتمال بروز خطا افزایش خواهد یافت. به عنوان مثال ممکن است تحت یک شرایط پیشبینی نشده، کدهای نرمافزاری وارد حلقه بیپایانی شده و یک قطعه کد را بارها و بارها بدون رسیدن به هدف اجرا کنند. این شرایط در نهایت موجب اتمام منابع پردازشی سیستم و شکست اجرای قطعه کد خواهد شد.
این مشکل در یک برنامه کوچک با تعداد کاربران محدود ممکن است چندان بحرانی نبوده و احتمال زیادی برای ایجاد آن در نظر گرفته نشود. در نتیجه ضرورت استفاده از راهکارهایی نظیر ماشین حالت نیز در این شرایط حس نخواهد شد. اما زمانی که از کدنویسی یک شبکه بلاکچین بزرگ، محبوب و کاربردی نظیر اتریوم صحبت میکنیم، به هیچ وجه نباید ریسک ایجاد شرایط پیشبینی نشده را به جان خرید. چرا که کاربران این شبکه به طور مستقیم با مسائل مالی طرف هستند و هر اشکال در کدنویسی، میتواند باعث خسارتهای بزرگ و جبرانناپذیری شود. با این حال خوشبختانه توسعهدهندگان نرمافزاری، برای چنین شرایطی یک راهحل به نام ماشینحالت در نظر گرفتهاند.
ماشین حالت چیست؟
به طور خلاصه، ماشین حالت (State Machine) یک مدل ریاضی محاسباتی است که توسعهدهندگان نرمافزاری از آن برای طراحی الگوریتمهای مختلف استفاده میکنند. ماشینحالت در هر زمان تنها میتواند در یک شرایط خاص قرار گرفته و تا برآورده نشدن شرایط تعیین شده، وارد حالت جدیدی نخواهد شد.
ماشین حالت مجموعهای از ورودیها را دریافت کرده و بر اساس آن، در مورد انتقال یا عدم انتقال به وضعیتی دیگر تصمیمگیری میکند. انتقال از یک حالت به حالتی دیگر، نیازمند تحقق یک شرط یا دریافت یک رویداد و ورودی خاص خواهد بود. در حالت کلی دو نوع ماشین حالت با نامهای محدود قطعی (deterministic finite state machine) و محدود غیرقطعی (non-deterministic finite state machine) وجود دارد.
ماشینحالت محدود قطعی تنها یک نوع انتقال ممکن را برای هر ورودی در نظر میگیرد. این دسته از ماشینها اغلب بر پایه منطق اگر – آنگاه بوده و یک حالت باینری دارند. به عنوان مثال اگر شرط انجام یک انتقال فراهم شود، این عمل انجام خواهد گرفت و در غیر این صورت جلوی انتقال به حالت بعدی گرفته خواهد شد. در این نوع الگوریتم حالت سومی وجود ندارد. نوع دوم یا همان ماشین حالت محدود غیرقطعی، باعث ایجاد شرایط متفاوتی میشود. در این مدل محاسباتی ممکن است یک ورودی بسته به شرایط خاص، منجر به خروجی و انتقالهای متفاوتی شود.
هر دو نوع ماشینهای حالت دارای بخشهای زیر هستند:
- حالت (State): این بخش عبارت است از وضعیتی که ماشین در آن قرار داشته یا امکان انتقال به آن را دارد. هر الگوریتم در ابتدا در یک حالت قرار دارد. با دریافت برخی ورودی رویدادها، ممکن است از وضعیت فعلی به یک حالت جدید منتقل شود.
- ورودی (Input): ورودی یا رویداد (Event)، مواردی هستند که باعث تغییر حالت ماشین میشوند. در صورتی که یک ورودی شرط کافی را فراهم کند، State Machine از یک حالت به حالت بعدی انتقال خواهد یافت.
- منطق شرطی (Conditional Logic): در بعضی شرایط ماشین پس از دریافت ورودیها، نیازمند بررسی آن و تصمیمگیری در مورد انجام یا عدم انجام عمل خواهد بود. این بررسی در قالب منطقهای شرطی صورت میگیرد.
- انتقال (Transition): انتقال به تغییر وضعیت در ماشین حالت گفته میشود. مسیر انتقال ممکن است بسته به رویداد و ورودیها متفاوت باشد.
- عمل (action): تأیید نهایی یک انتقال از وضعیتی به وضعیت دیگر، عمل نامیده میشود. به عبارت دیگر در صورت رخ دادن یک عمل، ماشین از حالتی به یک حالت متفاوت منتقل شده است.
کاربرد ماشین حالت در صنعت بلاکچین و ارزهای دیجیتال
با ظهور شبکه اتریوم، کاربرد شبکههای بلاکچین بسیار گسترش یافت. افزوده شدن امکاناتی نظیر اپلیکیشنهای غیرمتمرکز و قراردادهای هوشمند در کنار افزایش ارزش توکنهای دیجیتال، باعث افزایش قابل توجه کاربران و علاقهمندان به فناوری بلاکچین شد. قراردادهای هوشمند که طرفداران زیادی نیز دارند، در واقع یک سری قراردادهای توسعهیافته به وسیله کدهای نرمافزاری هستند. در این حالت دو طرف معامله موظف به انجام تعهدات خود بوده و در صورت برآورده شدن موارد درخواستی، قرارداد به صورت خودکار اجرا خواهد شد.
با این حال با توجه به تنوع بالای حالات موجود، توسعه یک قرارداد هوشمند ممکن است بسیار چالشبرانگیز باشد. یک قرارداد هوشمند نیازمند بررسی وضعیت هر دو طرف معامله خواهد بود. همچنین این قطعه کد باید به درستی شرایط ورودیها را بررسی کرده و در باره تغییر وضعیت تصمیمگیری کند. از طرفی احتمال بروز شرایط پیشبینی نشده در اینگونه قراردادها، بسیار بالاست. در صورتی که کدهای استفاده شده در قراردادهای هوشمند به خوبی توسعهنیافته باشند، احتمال ورود به حلقههای بیپایان، نافرجام ماندن معامله و از دست رفتن منابع مالی و سختافزاری شبکه بسیار بالا خواهد بود.
خوشبختانه زبان برنامهنویسی سالیدیتی توابع بسیاری را برای پیادهسازی ماشین حالت و جلوگیری از بروز بحران در قراردادهای هوشمند در نظر گرفته است. توسعهدهندگان نرمافزاری با استفاده از این توابع، ماشینهای حالت قابل آزمایشی را ارائه کنند. ماشینهای حالت دقیقاً مطابق با اجزای اصلی خود، یک قرارداد هوشمند را تقسیمبندی میکنند. به عبارت ساده از دید یک State Machine هر قرارداد هوشمند دارای چند حالت است. برای انتقال بین حالتها، برخی رویداد و ورودیها مورد نیاز خواهند بود. این ورودیها ممکن است در قالب هر نوع دیتایی از جانب دو طرف معامله ارائه شود. در نهایت در صورت برآورده شدن شروط، انتقال حالت صورت خواهد گرفت. این روند تا پایان کامل قرارداد ادامه خواهد یافت.
محدودیتهای ماشین حالت
هرچند که استفاده از State Machine به عنوان یک راهحل مناسب برای چالشهای قراردادهای هوشمند در شبکههای بلاکچین در نظر گرفته میشود؛ اما برخی از ویژگیهای این ماشین گاهی در نقش نقاط ضعف آن ظاهر خواهند شد. برای درک بهتر این موضوع، از یک مثال کمک میگیریم.
تصور کنید که موضوع یک قرارداد هوشمند، پاسخ دادن به سؤالات یک طرف باشد. در این وضعیت یک طرف معامله چندین سؤال را مطرح کرده و طرف دیگر باید پاسخ آنها را ارائه کند. در این شرایط با توجه به قوانین ماشین حالت، سمت دوم معامله برای پاسخگویی به سؤال دوم حتماً باید پاسخ سؤال اول را ثبت کرده باشد؛ چرا که در غیر این صورت، ورودیهای مورد انظار ماشین حالت برای عبور به وضعیت بعدی فراهم نشده و تغییری در وضعیت آن صورت نخواهد گرفت. این موضوع در قراردادهای چند بخشی که اجزای مختلف آن به صورت سلسلهمراتبی به همدیگر مرتبط نیستند، ممکن است مشکلاتی را ایجاد کرده یا حتی قرارداد را به طور کامل غیرقابل استفاده کند.
برای رفع این موضوع، یک قرارداد میتواند شکسته شده و در قالب چندین قرارداد هوشمند کوچکتر ارائه شود. همچنین با ارائه یک طراحی بهینه و تعاملیتر بین طرفین قرارداد، ممکن است بتوان تا حد بسیار بالایی این مشکل را رفع کرد. اما در نهایت ساختار و ماهیت ماشین حالت که مزایای آن را به وجود آورده، در این موارد نقش یک مانع را ایفا میکند.
بلاکچین و دنیایی از حالتها!
شبکههای بلاکچین کاربردی نظیر اتریوم با ارائه ویژگیهایی نظیر قراردادهای هوشمند، سطح زندگی و تعاملات علاقهمندان به فناوری را وارد سطح جدیدی کردند. با این حال وجود حالتهای مختلف، توسعهدهندگان نرمافزاری در این حوزه را با مشکلاتی مواجه میساخت. خوشبختانه به لطف الگوریتمهای مبتنی بر ماشین حالت این مشکلات به مرور زمان حل شده و ظرفیتهای بیشتر این فناوری شروع به پیدایش کردند.
در این مقاله به معرفی و بررسی مفهوم State Machine پرداختیم. به نظر شما به غیر از این شیوه محاسباتی، چه روشهای دیگری میتوانند برای حل چالشهای زبان سالیدیتی و حالتهای فراوان موجود در دنیای بلاکچین مورد استفاده قرار بگیرند؟ نظرات ارزشمند خود در این زمینه را با ما و سایر کاربران والکس به اشتراک بگذارید.