ماشین حالت (State Machine) در سالیدیتی
State Machine یک راه راحت، عملی و آسان برای پیاده سازی گردش کار در زبان برنامه نویسی قرارداد هوشمند مبتنی بر بلاک چین اتریوم (Solidity) است. Solidity می تواند یک تابع اصلاح کننده ویژگی مفید را ارائه دهد، که یک راه ایده آل برای اجرای صحیح بررسی وضعیت فعلی قبل از تغییر وضعیت یک ماشین حالت است. در این مقاله در مورد آن صحبت خواهیم کرد ماشین حالت در Solidity من صحبت می کنم
ماشین حالت در Solidity
اتومات همیشه در یک حالت است و انتقال آن با تغییر ورودی یا خروجی بین حالت های مختلف انجام می شود. از نظر قراردادهای هوشمند Solidity، برای ایجاد تغییر حالت، پیامی از یک حساب دیگر به تابع قرارداد ارسال می شود. اگر ورودی وضعیت فعلی معتبر باشد، ماشین پایانی به حالت جدید منتقل می شود. در واقع می توان گفت که ماشین های حالت یک روش ایده آل و مناسب برای کنترل گردش کار در قراردادهای جامد هستند.
قراردادی را در نظر بگیرید که باید از حالت اولیه خود، از طریق چندین حالت میانی، به حالت نهایی خود در طول عمر خود تغییر کند. در هر مورد، قرارداد باید رفتار متفاوتی داشته باشد و عملکردهای متفاوتی را در اختیار کاربران خود قرار دهد. رفتار توصیف شده را می توان در بسیاری از موارد مشاهده کرد: حراج، قمار، تامین مالی جمعی و بسیاری موارد دیگر. حتی مستندات Solidity با فهرست کردن آن به عنوان یکی از الگوهای رایج، جامعه خود را تأیید می کند. راه های زیادی وجود دارد که در آن یک حالت می تواند به حالت دیگر تبدیل شود. گاهی اوقات حالت با پایان یک تابع به پایان می رسد، در موارد دیگر وضعیت باید پس از مدت زمان مشخصی تغییر کند.
مدلی با عملکردی که در بالا توضیح داده شد قبلاً توسط گاما و همکاران (1995) فرموله شده است، اما کاربرد آن در بلاک چین بسیار جالب است. این به این دلیل است که بلاک چین خود یک سیستم انتقال حالت است که در آن حالت اولیه همراه با یک تراکنش یک حالت جدید به عنوان خروجی دارد.
منظور از ماشین مجازی اتریوم چیست؟ برای خواندن مقاله کلیک کنید.
نمودار ماشین حالت UML
نمودار بالا یک نمودار UML از یک ماشین حالت است که در آن مستطیل ها، حالت ها و فلش ها انتقال ها را نشان می دهند و متن روی فلش ها رویدادهای فعال سازی هستند که انتقال را فعال می کنند.
ماشین مدل جامد
انتقال ماشین دولتی از طریق توابع انتقال بین دولت های تعریف شده در قرارداد انجام می شود. در تصویر زیر بخشی از قرارداد Solidity توسعه یافته را مشاهده می کنید:
مشاهده می شود که وضعیت فعلی، حالت های جدید و توابع انتقال مستقیماً در نمودار وارد می شوند حالت ماشین بودن مالک داده، طرفی است که مالک داده ها و اطلاعات است. دارنده قرارداد ممکن است با دارنده اطلاعات متفاوت باشد. درخواست کننده داده نیز به طرفی گفته می شود که می خواهد از اطلاعات استفاده کند.
قراردادهای پشتیبانی شده
این نقشها در قراردادهای عمومی وجود دارند، بنابراین کلاسهای پایه برای این نقشها و نقشهای عمومی دامنه میتوانند در طول توسعه قرارداد استفاده شوند. این روش می تواند برای تست کد استفاده شود، اما برای تولید کد توصیه نمی شود.
کلاس DataOwner اصلی شامل اعمال متداول اصلاح کننده تابع (onlyDataOwner) و مالک اطلاعات به عنوان سازنده (Constructor) است.
عملکردهای دیگری مانند changeDataOwner نیز می تواند برای کمک به توسعه سریعتر قراردادهای آزمایشی ارائه شود. کلاس پایه DataRequester و سایر کلاس های پایه مشابه هستند. اصلاح کننده های عملکردی از کلاس های پایه نیز می توانند به قرارداد اضافه شوند.
کلاس های پایه DataRequester و DataOwner باید در ابتدای سازنده قرارداد قرار گیرند. همچنین حساب یا آدرس هر دو طرف یا یکی از طرفین ممکن است به عنوان جزء قرارداد درج شود. اگر حساب شامل یک جزء نیست، به عنوان مثال. مجموع آن صفر است، باید از حساب msg.sender که دارنده قرارداد است استفاده شود. البته منطقی نیست که DataRequester و DataOwner یک اکانت باشند، بنابراین شرایط باید در کد سازنده بررسی شود.
ذخیره سازی اطلاعات در بلاک چین
در این قسمت باید سوالات درخواست کننده اطلاعات ذخیره شده و منتظر دریافت سوالات توسط دارنده اطلاعات باشید. مطابق تصویر زیر، سوال و پاسخ هر دو در یک رشته داده مشترک در قرارداد ذخیره می شوند:
همچنین امکان استفاده از یک رشته داده عمومی وجود دارد زیرا حالت ماشین اطمینان حاصل می کند که در هر زمان فقط یک بار استفاده از نخ مورد نیاز است. همچنین از آنجایی که فضای ذخیره سازی گران است، از فضای ذخیره سازی کم استفاده می شود.
ماشین حالت سلسله مراتبی
با راه حل فعلی یکی از مشکلات موجود این است که امکان فسخ قرارداد وجود ندارد و سرمایه قابل برگشت به دارنده قرارداد نیست.
با فرض اینکه می توان این کار را در هر زمان انجام داد، پس از طراحی ماشین حالت سلسله مراتبی، می توان این راه حل را پیاده سازی کرد:
این مورد با ارث بردن از کلاس پایه ContractOwner در قرارداد به راحتی قابل پیاده سازی است. همچنین به طور خودکار مالک قرارداد را ثبت می کند و اصلاح کننده onlyContractOwner را ارائه می دهد. تابع خود تخریبی Solidity با پایان دادن به تابع، اتر را به حساب مورد نظر برمی گرداند.
تست قرارداد
تست قرارداد را می توان روی بلاک چین انجام داد. برای انجام این کار، اجرای بر روی یک شبکه آزمایشی ایده خوبی است. علاوه بر این، سازنده قرارداد دارای 2 پارامتر، یک حساب DataOwner و یک حساب DataRequester است. تست خودکار را می توان با ایجاد حساب های پروکسی که می توانند اقدامات DataOwner و DataRequester را انجام دهند، تسهیل کرد.
قرارداد پروکسی DataRequester توابع setQuestion و getAnswer را ارائه می کند. ایجاد حساب های پروکسی و سپس قرارداد اصلی توسط خود قرارداد آزمایشی انجام می شود.
مصرف گاز
مصرف گاز در هر دوره برای عمل مستمر پرسیدن سوال 20 کاراکتری و دریافت فوری پاسخ 20 کاراکتری تقریباً 85000 بنزین است. البته بار اول مصرف گاز بیشتر است زیرا فضای اختصاص داده شده برای رشته داده در فضای ذخیره سازی است. پاسخ های بعدی فقط رشته اطلاعات قبلی را به روز می کند. همچنین مصرف گاز به طول رشته بستگی دارد. یک رشته حاوی اطلاعات نسبت به رشته بدون اطلاعات گاز بیشتری مصرف می کند. زیرا آدرس یک رشته باید به صورت کاراکتر در یک رشته ذخیره شود.
یک راه حل جایگزین که از رویدادها استفاده می کند
اگر کاربران تصمیم بگیرند که قرارداد اصلی آنها پس از دریافت یک سوال یا پاسخ، رویدادها را فعال می کند، ماشین حالت را می توان ساده کرد. علاوه بر این، مدیریت و کنترل رویداد توسط کد برنامه غیرمتمرکز انجام می شود، نه با قرارداد دیگری.
مشکلات با ماشین دولتی
اگر درخواست کننده بخواهد سوال دوم بپرسد، تا زمانی که به سوال اول پاسخ داده نشود، این روند ادامه نخواهد داشت. بنابراین، این قرارداد به دلیل غیر قابل استفاده بودن آن را به آستانه غیر قابل استفاده می رساند. البته روش های مختلفی برای حل این مشکل شناخته شده است. برای مثال اجرای چند قرارداد با اجرای یک صف پرسش و پاسخ یکی از این راهکارهاست.
آخرین کلمه
در این مقاله بررسی برنامه ماشین حالت در Solidity ما همچنین مسائل مربوط به ماشین حالت را مورد بحث قرار دادیم و به این نتیجه رسیدیم که تست ماشین حالت و ماشین استحکام آسان است. همچنین گاز ماشین حالت کمتر در مقایسه با هزینه ذخیره سازی اطلاعات مصرف می شود. البته ذخیره اطلاعات خارج از زنجیره می تواند هزینه کمتری داشته باشد.