میهن بلاکچین
  • اخبار
    • همه
    • رمزارز در ایران
    • اخبار بیت کوین
    • اخبار اتریوم
    • اخبار آلتکوین
    • اخبار بلاکچین
    • اخبار عمومی
    • اطلاعیه صرافی‌های داخلی
  • تحلیل
    • همه
    • تحلیل آنچین
    • تحلیل اقتصادی
    • تحلیل تکنیکال
    • تحلیل فاندامنتال
  • آموزش
    • همه
    • کریپتو پدیا
    • کریپتو کده
    • دیفای
    • سرمایه گذاری
    • آموزش همه صرافی های ارز دیجیتال
    • ترید
    • کیف پول
    • بازی
    • استخراج
    • NFT
    • مقالات عمومی
  • ایردراپ
  • هک و کلاهبرداری
  • قیمت ارزهای دیجیتال
  • ماشین حساب ارزهای دیجیتال
  • مقایسه قیمت در صرافی
No Result
مشاهده همه‌ی نتایج
  • اخبار
    • همه
    • رمزارز در ایران
    • اخبار بیت کوین
    • اخبار اتریوم
    • اخبار آلتکوین
    • اخبار بلاکچین
    • اخبار عمومی
    • اطلاعیه صرافی‌های داخلی
  • تحلیل
    • همه
    • تحلیل آنچین
    • تحلیل اقتصادی
    • تحلیل تکنیکال
    • تحلیل فاندامنتال
  • آموزش
    • همه
    • کریپتو پدیا
    • کریپتو کده
    • دیفای
    • سرمایه گذاری
    • آموزش همه صرافی های ارز دیجیتال
    • ترید
    • کیف پول
    • بازی
    • استخراج
    • NFT
    • مقالات عمومی
  • ایردراپ
  • هک و کلاهبرداری
  • قیمت ارزهای دیجیتال
  • ماشین حساب ارزهای دیجیتال
  • مقایسه قیمت در صرافی
No Result
مشاهده همه‌ی نتایج
میهن بلاکچین
No Result
مشاهده همه‌ی نتایج
میهن بلاکچین آموزش کریپتو پدیا

ماشین‌ حالت (State Machine) در سالیدیتی چه کاربردی دارد؟

نگارش:‌مازیار نسیمی
20 اردیبهشت 1401 - 16:52
در کریپتو پدیا
زمان مطالعه: 5 دقیقه
0
سالیدیتی قرارداد هوشمند اتریوم

در این مقاله درباره ماشین حالت (State Machine) به عنوان روشی آسان و مناسب برای اعمال گردش کار در سالیدیتی (Solidity)، زبان برنامه‌نویسی قراردادهای هوشمند در بلاک چین اتریوم صحبت خواهیم کرد.

ماشین حالت (State Machine) همواره در یک حالت قرار دارد و با تغییر ورودی یا خروجی بین حالت‌های مختلف انتقال می‌یابد؛ در خصوص قراردادهای هوشمند در سالیدیتی ، پیامی از حسابی دیگر به تابع قرارداد ارسال می‌شود تا تغییری در حالت ایجاد کند. اگر ورودی برای حالت کنونی معتبر باشد، ماشین حالت به حالت جدید انتقال خواهد یافت.

توصیه هایی کاربردی برای توسعه دهندگان زبان سالیدیتی (Solidity) در اتریوم!

آنچه در این مطلب می‌خوانید

Toggle
  • پیش‌زمینه‌ای درباره زبان برنامه نویسی سالیدیتی
  • نمودار ماشین حالت UML
  • مدل ماشین حالت سالیدیتی
  • قراردادهای دارای پشتیبانی
  • ذخیره‌سازی اطلاعات در بلاک چین
  • ماشین حالت سلسله مراتبی
  • آزمایش قرارداد
  • مصرف گس
  • راهکار جایگزین استفاده کننده از رویدادها
  • مشکلات ماشین‌ حالت
  • نتیجه‌گیری

پیش‌زمینه‌ای درباره زبان برنامه نویسی سالیدیتی

طی توسعه و آزمایش الگوهای قرارداد هوشمند دسترسی به اطلاعات (S-DAC) سالیدیتی ، اغلب از ماشین‌های حالت برای در بر گرفتن گردش کار استفاده می‌کنیم.

در مثالی که در این مقاله بیان می‌شود، گردش کار بین دو طرف است که یک طرف سوالاتی می‌پرسد و طرف دیگر پاسخ می‌دهد.

سالیدیتی قرارداد هوشمند اتریوم

نمودار ماشین حالت UML

نمودار ماشین حالت UML در مثال ما، به شرح زیر است:

سالیدیتی قرارداد هوشمند اتریوم

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

مدل ماشین حالت سالیدیتی

ماشین حالت با توابع انتقال بین حالت‌های تعریف شده در قرارداد جابجا می‌شود. بخشی از قرارداد توسعه‌یافته سالیدیتی به شرح زیر است:

سالیدیتی قرارداد هوشمند اتریوم

می‌توان به راحتی مشاهده کرد که حالت کنونی (که توسط اصلاح کننده تابع onlyState بررسی شده است تا اطمینان حاصل شود که انتقال حالت فقط در حالت کنونی انجام می‌شود)، حالت‌های جدید و توابع انتقال مستقیما به نمودار ماشین حالت وارد می‌شوند.

به طرفی که اطلاعات و داده‌ها را در اختیار دارد “دارنده اطلاعات (Data Owner)” می‌گوییم. دارنده اطلاعات می‌تواند با دارنده قرارداد متفاوت باشد.

به طرفی که علاقه‌مند به استفاده از اطلاعات است “درخواست‌کننده اطلاعات (Data Requester)” می‌گوییم.

قراردادهای دارای پشتیبانی

از آنجایی که این نقش‌ها در قراردادها رایج هستند، طی توسعه قرارداد می‌توانیم از کلاس‌های پایه برای این نقش‌ها و سایر نقش‌های رایج در دامنه (Domain) خود استفاده کنیم. این روش می‌تواند برای آزمایش کد قابل قبول باشد، اما برای تولید کد، آن را توصیه نمی‌کنیم.

قرارداد هوشمند (Smart Contract) چیست؟

کلاس پایه DataOwner شامل اقدامات کلی دارنده اطلاعات نظیر سازنده (Constructor) و اصلاح کننده تابع (onlyDataOwner) به صورت زیر است:

سالیدیتی قرارداد هوشمند اتریوم

سایر توابع نظیر changeDataOwner نیز ممکن است به منظور کمک به توسعه سریع‌تر قراردادهای آزمایشی ارائه شوند، اما در این مثال به هیچ کدام از آنها نیازی نیست.

کلاس پایه DataRequester و سایر کلاس‌های پایه مشابه هستند.

می‌توانیم اصلاح کنندههای تابع را از کلاس‌های پایه به قرارداد اضافه کنیم:

سالیدیتی قرارداد هوشمند اتریوم

کلاس‌های پایه DataOwner و DataRequester باید در ابتدای سازنده قرارداد قرار بگیرند. حساب (یا همان آدرس) هر کدام از طرفین یا هر دو طرف می‌توانند به عنوان مولفه قرارداد وارد شوند. اگر حساب شامل مولفه‌ای نباشد (مقدار آن صفر باشد)، حساب msg.sender (یعنی همان دارنده قرارداد) مورد استفاده قرار می‌گیرد. ما از تابع getAccount برای کمک به خوانا کردن سازنده فوق استفاده کرده ایم.

منطقی نیست که DataOwner و DataRequester یک حساب باشند، بنابراین باید این شرایط را نیز در کد سازنده بررسی کنیم:

سالیدیتی قرارداد هوشمند اتریوم

ذخیره‌سازی اطلاعات در بلاک چین

ما باید سوالات درخواست‌کننده اطلاعات را ذخیره کنیم، در حالی که منتظر دارنده اطلاعات باشیم تا سوالات را دریافت کند. هم‌چنین باید پاسخ دارنده اطلاعات را ذخیره کنیم، در حالی که منتظر درخواست‌کننده اطلاعات باشیم تا پاسخ را دریافت کند. در این مثال، ما هم سوال و هم پاسخ را در یک رشته اطلاعات مشترک در قرارداد ذخیره می‌کنیم:

سالیدیتی قرارداد هوشمند اتریوم

می‌توانیم از یک رشته اطلاعات مشترک استفاده کنیم؛ زیرا ماشین حالت اطمینان حاصل می‌کند که در هر لحظه فقط به یک استفاده از رشته (سوال یا پاسخ) نیاز است. هم‌چنین به استفاده حداقلی از فضای ذخیره‌سازی ترغیب می‌شویم زیرا فضای ذخیره‌سازی گران است.

ماشین حالت سلسله مراتبی

یکی از مسائل موجود در راهکار کنونی این است که به هیچ‌وجه نمی‌توان قرارداد را فسخ کرد و سرمایه‌ها را به دارنده قرارداد برگرداند.

با فرض بر این که این مورد را در هر زمانی می‌توان انجام داد، این راهکار را می‌توان پس از طراحی ماشین حالت سلسله مراتبی پیاده سازی کرد:

سالیدیتی قرارداد هوشمند اتریوم

این مورد با وراثت (inheritance) از کلاس پایه ContractOwner به آسانی در قرارداد پیاده‌سازی می‌شود و به صورت خودکار دارنده قرارداد را ثبت می‌کند و اصلاح کننده onlyContractOwner را ارائه می‌دهد:

سالیدیتی قرارداد هوشمند اتریوم

تابع ()selfdestruct سالیدیتی ، اتر را از طریق فسخ تابع به حساب مورد نظر برمی‌گرداند.

آزمایش قرارداد

به منظور آزمایش قرارداد، می‌توانیم آن را در بلاک چین اجرا کنیم. در این مورد، اجرا در شبکه آزمایشی ایده خوبی است. هرچند، سازنده قرارداد دارای ۲ پارامتر است: حساب DataOwner و حساب DataRequester.

برای تسهیل آزمایش به صورت خودکار، می‌توانیم حساب‌های پروکسی (proxy یا همان واسطه) ایجاد کنیم که اقدامات DataOwner و DataRequester را انجام می‌دهند. مثالی از حساب پروکسی DataOwner به شرح زیر است:

سالیدیتی قرارداد هوشمند اتریوم

قرارداد پروکسی DataRequester نیز مشابه است. این قرارداد، توابع setQuestion و getAnswer را ارائه می‌دهد.

خود قرارداد آزمایش، حساب‌های پروکسی و سپس قرارداد اصلی را ایجاد می‌کند:

سالیدیتی قرارداد هوشمند اتریوم

مثال فوق، تابع عمومی TestQnA را ارائه می‌‌دهد که سوال مورد نظر را از طریق proxyDataRequester به قرارداد اصلی ارسال می‌کند. سپس سوال را از proxyDataOwner دریافت و تایید می‌کند که این سوال معتبر است. اقدامات مشابهی نیز در سمت دیگر رخ می‌‌دهد، به طوری که پاسخ مورد نظر از طریق proxyDataOwner ارسال می‌شود، سپس از proxyDataRequester دریافت و بررسی می‌شود.

سایر آزمایش‌ها برای اطمینان از رفتار مورد انتظار ماشین حالت توصیه می‌شود.

مصرف گس

مصرف گس برای عمل مستمر پرسیدن سوال ۲۰ کاراکتری و بلافاصله دریافت پاسخ ۲۰ کاراکتری تقریبا ۸۵,۰۰۰ گس در هر دوره است:

سالیدیتی قرارداد هوشمند اتریوم

مصرف گس در بار اول بیشتر است؛ زیرا فضای اختصاص یافته برای رشته اطلاعات در فضای ذخیره‌سازی قرار دارد. پاسخ‌های بعدی صرفا رشته اطلاعات قبلی را به‌روزرسانی می‌کند.

مصرف گس هم‌چنین به طول رشته نیز بستگی دارد.

سالیدیتی قرارداد هوشمند اتریوم

یک رشته‌ای که بدون اطلاعات نیست، گس بیشتری نسبت به رشته بدون اطلاعات مصرف می‌کند، زیرا آدرس رشته نیز همانند کاراکترهای رشته باید ذخیره شود.

راهکار جایگزین استفاده کننده از رویدادها

اگر تصمیم بگیرید که قرارداد اصلی شما هرگاه که سوال یا پاسخی دریافت می‌کند به حذف رویدادها بپردازد، ماشین حالت قابل ساده‌سازی است. برای مثال:

سالیدیتی قرارداد هوشمند اتریوم

هرچند، رویدادها فقط توسط کد برنامه غیرمتمرکز قابل مدیریت و کنترل هستند، نه توسط یک قرارداد دیگر. قرارداد اصلی نیز حداقل به اصلاحات زیر نیاز پیدا خواهد کرد:

سالیدیتی قرارداد هوشمند اتریوم

مشکلات ماشین‌ حالت

بزرگ‌ترین مشکل ماشین‌های حالت را می‌توان هم بزرگ‌ترین قوت و هم بزرگ‌ترین نقطه ضعف آنها خواند که در این مثال نشان داده شده است. گردش کار باید همانند طراحی باشد. هیچ انحرافی امکان‌پذیر نیست.

در این مورد، اگر درخواست‌کننده اطلاعات بخواهد سوال دوم را بپرسد، تا زمانی که سوال اول پاسخ داده نشود نمی‌تواند ادامه دهد. این موضوع در عمل می‌تواند بسیار دست‌ و پاگیر باشد و قرارداد را تا آستانه بلااستفاده بودن پیش ببرد.

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

نتیجه‌گیری

ماشین‌های حالت یک روش ایده‌آل برای کنترل گردش کار در قراردادهای سالیدیتی هستند.

آزمایش ماشین‌های حالت آسان است و این موضوع برای ماشین‌های حالت سالیدیتی نیز صادق است.

ماشین حالت سلسله مراتبی باید طوری طراحی شود که از کنترل مناسب توابع مختلف نظیر متوقف ساختن ماشین حالت اطمینان حاصل شود.

اگر قراردادها مستقیما توسط افراد مورد استفاده قرار بگیرند، ماشین حالت باید به دقت طراحی شود.

سالیدیتی ویژگی اصلاح کننده تابع مفیدی ارائه می‌دهد که برای روشی ایده‌آل برای پیاده‌سازی مناسب بررسی حالت کنونی قبل از تغییر حالت ماشین حالت است.

مصرف گس ماشین حالت در مقایسه با هزینه ذخیره‌سازی اطلاعات بسیار کم است. شاید ذخیره‌سازی برون زنجیره‌ای اطلاعات هزینه کمتری داشته باشد.

تگ: اتریومسالیدیتیقرارداد هوشمند
اشتراک‌گذاریتوئیت

نوشته‌های مشابه

j.p morgan-جی پی مورگان
اخبار اتریوم

جی‌پی مورگان نخستین صندوق بازار پولِ توکنیزه‌شده خود را روی اتریوم راه‌اندازی کرد

24 آذر 1404 - 21:00
45
فیچر اکانت های اتریوم
اخبار اتریوم

اختلال شبکه اتریوم در آستانه فیوساکا؛ کلاینت پرایزم (Prysm) قربانی باگی قدیمی شد

24 آذر 1404 - 15:00
52
اخبار اتریوم

اتریوم و بازتعریف هویت دیجیتال؛ حریم خصوصی در قالب انتخابی آزاد ارائه می‌شود

23 آذر 1404 - 17:00
53
اخبار اتریوم

قیمت اتریوم در آستانه رشد ۲۶۰ درصدی؛ داده‌های آنچین چه می‌گویند؟

22 آذر 1404 - 11:00
564
Vitalik Buterin
اخبار اتریوم

اتریوم و اختلال در فرآیند نهایی‌سازی بلاک‌ها؛ ویتالیک بوترین می‌گوید هیچ اشکالی وجود ندارد

20 آذر 1404 - 11:59
45
رفع تعلیق تراکنش های اتریوم
اخبار اتریوم

کاهش ۶۲ درصد کارمزدهای شبکه اتریوم؛ لایه‌های دوم وزن بیشتری پیدا می‌کنند

19 آذر 1404 - 18:00
70
اشتراک
اطلاع از
0 دیدگاه
جدید ترین
قدیمی ترین محبوب ترین
Inline Feedbacks
View all comments

آموزش

فیچر کیف پول متامسک
کیف پول

بیت کوین رسما به کیف پول متامسک اضافه شد؛ ارزهای بیشتری در راهند!

25 آذر 1404 - 15:00
46
فیچر گزینه های اصلی ترامپ برای ریاست فدرال رزرو
مقالات عمومی

گزینه‌های اصلی ترامپ برای ریاست فدرال رزرو چه کسانی هستند؟

24 آذر 1404 - 22:00
77
فیچر پسکی تلگرام
مقالات عمومی

آموزش فعال‌سازی پسکی تلگرام در iOS؛ از مزایای امنیتی تا همه سناریوهای دردسرساز

24 آذر 1404 - 11:57
95
نهنگ‌های کوچک بیت کوین آخرین سنگر دفاعی در برابر رویداد تسلیم Minor Bitcoin Whales Capitulation Event
مقالات عمومی

بازگشت نهنگ‌های خفته؛ چرا غول‌های خاموش بازار کریپتو دوباره به حرکت افتاده‌اند؟

22 آذر 1404 - 22:00
1107
قراردادهای آتی دائمی پیش از عرضه
کریپتو پدیا

پرپ‌های پیش از عرضه چیست؟ وقتی بازار قبل از تولد توکن قیمت را می‌سازد

21 آذر 1404 - 22:00
66
فیچر نرخ بهره
مقالات عمومی

جمله‌ای از فدرال رزرو، موجی در بیت کوین: چرا بازار کریپتو با «لحن نرخ بهره» منفجر می‌شود؟

21 آذر 1404 - 20:00
802

پیشنهاد سردبیر

کلید عبور

پسکی (PassKey) چیست؟ رمزنگاری کلید عمومی امن‌تر از پسورد‌ها و عبارات بازیابی! 

23 آذر 1404 - 10:38
289

اکسکوینو زیر سایه‌ سنگین احکام قضایی؛ کاربران چطور شکایت رسمی ثبت کنند؟

مقایسه پسکی (Passkey) با ۲۴ یا ۱۲ کلمه؛ از کاغذ و عبارت بازیابی تا ورود با اثر انگشت

مقایسه بهترین صرافی های رمزارز ایرانی؛ بهترین صرافی داخلی کدام است؟

پرونده اکسکوینو؛ از وعده‌های پرداخت تا واقعیت حساب‌های مسدود

تفاوت کیف پول حضانتی و غیرحضانتی چیست؟ ولت امانی بهتر است یا غیرامانی؟

  • خانه
  • قیمت ارز
  • صرافی ها
  • ماشین حساب
No Result
مشاهده همه‌ی نتایج
  • اخبار
    • همه
    • رمزارز در ایران
    • اخبار بیت کوین
    • اخبار اتریوم
    • اخبار آلتکوین
    • اخبار بلاکچین
    • اخبار عمومی
    • اطلاعیه صرافی‌های داخلی
  • تحلیل
    • همه
    • تحلیل آنچین
    • تحلیل اقتصادی
    • تحلیل تکنیکال
    • تحلیل فاندامنتال
  • آموزش
    • همه
    • کریپتو پدیا
    • کریپتو کده
    • دیفای
    • سرمایه گذاری
    • آموزش همه صرافی های ارز دیجیتال
    • ترید
    • کیف پول
    • بازی
    • استخراج
    • NFT
    • مقالات عمومی
  • ایردراپ
  • هک و کلاهبرداری
  • قیمت ارزهای دیجیتال
  • ماشین حساب ارزهای دیجیتال
  • مقایسه قیمت در صرافی

© 2025 - تمامی حقوق مادی و معنوی این وبسایت نزد میهن بلاکچین محفوظ است

سرویس‌ها
لیست قیمت ارزهای دیجیتال مقایسه قیمت صرافی‌ها مقایسه ویژگی صرافی‌ها ماشین حساب ارزهای دیجیتال مقایسه رمزارز‌ها
خبر و آموزش
اخبار آموزش ویدیو پیشنهاد سردبیر
میهن بلاکچین
درباره ما ارتباط با ما تبلیغات و همکاری تجاری قوانین و مقررات سیاست های حریم خصوصی فرصت های شغلی
تگ‌های پربازدید
قانون گذاری سرمایه‌ گذاری افراد معروف صرافی ارز دیجیتال دوج‌کوین بیت‌کوین استیبل کوین رمزارز در ایران پیش بینی بازار تکنولوژی بلاک چین اتریوم ‌کاردانو شیبا هک و کلاهبرداری
سرویس‌ها
لیست قیمت ارزهای دیجیتال مقایسه قیمت صرافی‌ها مقایسه ویژگی صرافی‌ها ماشین حساب ارزهای دیجیتال مقایسه رمزارز‌ها
خبر و آموزش
اخبار آموزش ویدیو پیشنهاد سردبیر
میهن بلاکچین
درباره ما ارتباط با ما تبلیغات و همکاری تجاری قوانین و مقررات سیاست های حریم خصوصی فرصت های شغلی
تگ‌های پربازدید
قانون گذاری سرمایه‌ گذاری افراد معروف صرافی ارز دیجیتال دوج‌کوین بیت‌کوین استیبل کوین رمزارز در ایران پیش بینی بازار تکنولوژی بلاک چین اتریوم ‌کاردانو شیبا هک و کلاهبرداری
میهن بلاکچین دست در دست، بی‌نهایت برای میهن

© 2025 - تمامی حقوق مادی و معنوی این وبسایت نزد میهن بلاکچین محفوظ است.