آموزش عملیات ریاضی در سالیدیتی

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

آموزش عملیات ریاضی در سالیدیتی

برای جمع کردن اعداد می‌توانید به سادگی از عملگر + استفاده کنید:

محاسبه توان (exponent) نیز مانند زبان‌ های مبتنی بر C انجام می‌شود:
عملگر باقی‌مانده تقسیم (modulus) نیز به همان شیوه رایج کار می‌کند:

عملیات تفریق، ضرب و تقسیم به حدی بدیهی است که نیازی به توضیح بیشتر ندارد.

عدم پشتیبانی از اعداد اعشاری در Solidity

یکی از نکات مهم در Solidity این است که این زبان از اعداد اعشاری (floats) پشتیبانی نمی‌کند.
به عنوان مثال، اگر عدد ۵ را بر ۲ تقسیم کنید، نتیجه ۲ خواهد بود و نه ۲.۵؛ زیرا uint256 نوعی عدد صحیح بدون علامت (unsigned integer) است و تمام عملیات تقسیم به صورت تقسیم صحیح (integer division) انجام می‌شود.

حال اگر بخواهید درصدی مانند ۱۰٪ از ۲۰۰ را محاسبه کنید، چه باید کرد؟ این یک نیاز منطقی، مثلاً برای محاسبه سود بانکی، محسوب می‌شود.

راهکار ساده این است که به جای ضرب در ۰.۱، عمل ضرب را در ۱ تقسیم بر ۱۰ انجام دهید:

اگر درصد مورد نظر مقداری مانند ۷.۵٪ باشد، باید به صورت زیر عمل کنید:

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

این حالت نیازمند راهکارهای پیشرفته‌تری است که در ادامه به آن خواهیم پرداخت.

دلیل عدم وجود اعداد اعشاری در سالیدیتی

Solidity به دلیل ویژگی‌های خاص بلاکچین از اعداد اعشاری پشتیبانی نمی‌کند.
اعداد اعشاری همیشه رفتار قطعی (deterministic) ندارند؛ در حالی که در بلاکچین، قطعی بودن نتایج امری ضروری است. به عنوان نمونه، در تقسیم ۲ بر ۳ ممکن است برخی رایانه‌ها عدد ۰.۶۶۶۶ و برخی دیگر ۰.۶۶۶۶۷ را بازگردانند. این اختلاف می‌تواند باعث ایجاد عدم توافق میان نودها و در نهایت شکاف در شبکه بلاکچین شود. بنابراین برای جلوگیری از این مشکل، Solidity استفاده از اعداد اعشاری را ممنوع کرده است.

در Solidity، سرریز (Overflow) یا کم‌ریز (Underflow) رخ نمی‌دهد و در عوض، اجرای برنامه متوقف می‌شود.

کد زیر را در نظر بگیرید:

اگر مقدار x برابر با ۲ و مقدار y برابر با ۵ باشد چه اتفاقی می‌افتد؟
در این حالت شما مقدار منفی ۳ دریافت نخواهید کرد. در واقع، اجرای قرارداد متوقف شده و یک revert رخ می‌دهد.

در سالیدیتی، برخلاف برخی زبان‌های دیگر، در صورت بروز خطا، به جای ایجاد خطا (Exception)، عملیات برگشت داده می‌شود (revert) و هیچ تغییری ثبت نمی‌شود. یعنی همه تغییراتی که تا آن لحظه انجام شده بودند لغو می‌شوند و حالت قرارداد هوشمند به وضعیت قبل از اجرای تراکنش باز می‌گردد.

در نسخه‌های قدیمی‌تر سالیدیتی، وقوع Overflow و Underflow بدون هیچ مشکلی مجاز بود.
اما از آنجا که این موضوع باعث بروز مشکلات جدی، خرابی قراردادهای هوشمند و حتی حملات امنیتی شد، از نسخه‌ی ۰.۸.۰ به بعد، محافظت در برابر Overflow و Underflow به صورت پیش‌فرض به زبان سالیدیتی اضافه شده است.

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

این دستور مشخص می‌کند که کد منبع باید با نسخه‌ی ۰.۸.۰ یا نسخه‌های جدیدتر سالیدیتی کامپایل شود.
اگر با نسخه‌ای قدیمی‌تر از ۰.۸.۰ روبرو شدید، نباید انتظار داشته باشید که محافظت در برابر overflow و underflow به طور پیش‌فرض در آن اعمال شده باشد.

استفاده از بلوک unchecked

اگر بخواهید عمداً اجازه دهید Overflow یا Underflow رخ بدهد، باید از یک بلوک unchecked استفاده کنید.

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

مثال:

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

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

به این مطلب امتیاز دهید

راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.

آموزش گام به گام برنامه نویسی اندروید با B4A (پروژه محور)
  • انتشار: ۹ اردیبهشت ۱۴۰۴

دسته بندی موضوعات

آخرین محصولات فروشگاه

مشاهده همه

نظرات

بازخوردهای خود را برای ما ارسال کنید