عملیات ریاضی در زبان Solidity دقیقاً مشابه سایر زبان های برنامه نویسی عمل میکند. بنابراین نیازی به توضیح مفصل در این زمینه نیست.
آموزش عملیات ریاضی در سالیدیتی
برای جمع کردن اعداد میتوانید به سادگی از عملگر +
استفاده کنید:
1 2 3 4 5 6 |
uint256 sum = 10 + 5; // sum == 15 uint256 x = 1; uint256 y = 2; uint256 anotherSum = x + y; // anotherSum == 3 |
1 |
uint256 exp = 2 ** 3; // exp == 8 |
1 |
uint256 remainder = 10 % 4; // remainder == 2 |
عملیات تفریق، ضرب و تقسیم به حدی بدیهی است که نیازی به توضیح بیشتر ندارد.
عدم پشتیبانی از اعداد اعشاری در Solidity
یکی از نکات مهم در Solidity این است که این زبان از اعداد اعشاری (floats) پشتیبانی نمیکند.
به عنوان مثال، اگر عدد ۵ را بر ۲ تقسیم کنید، نتیجه ۲ خواهد بود و نه ۲.۵؛ زیرا uint256
نوعی عدد صحیح بدون علامت (unsigned integer) است و تمام عملیات تقسیم به صورت تقسیم صحیح (integer division) انجام میشود.
حال اگر بخواهید درصدی مانند ۱۰٪ از ۲۰۰ را محاسبه کنید، چه باید کرد؟ این یک نیاز منطقی، مثلاً برای محاسبه سود بانکی، محسوب میشود.
1 |
uint256 interest = 200 * 0.1; // fails, 0.1 is not valid |
راهکار ساده این است که به جای ضرب در ۰.۱، عمل ضرب را در ۱ تقسیم بر ۱۰ انجام دهید:
1 |
uint256 interest = 200 / 10; |
1 |
uint256 interest = 200 * 75 / 1000; |
در مواقعی که نیاز به محاسبه درصد جمعیتی یک شهر نسبت به کل کشور دارید، نمیتوانید به طور مستقیم تقسیم معمولی انجام دهید.
1 2 3 4 5 |
uint256 cityPopulation = 1000; uint256 nationPopulation = 10000; uint256 fractionOfPopulation = cityPopulation / nationPopulation; //fractionOfPopulation is zero! |
دلیل عدم وجود اعداد اعشاری در سالیدیتی
Solidity به دلیل ویژگیهای خاص بلاکچین از اعداد اعشاری پشتیبانی نمیکند.
اعداد اعشاری همیشه رفتار قطعی (deterministic) ندارند؛ در حالی که در بلاکچین، قطعی بودن نتایج امری ضروری است. به عنوان نمونه، در تقسیم ۲ بر ۳ ممکن است برخی رایانهها عدد ۰.۶۶۶۶ و برخی دیگر ۰.۶۶۶۶۷ را بازگردانند. این اختلاف میتواند باعث ایجاد عدم توافق میان نودها و در نهایت شکاف در شبکه بلاکچین شود. بنابراین برای جلوگیری از این مشکل، Solidity استفاده از اعداد اعشاری را ممنوع کرده است.
در Solidity، سرریز (Overflow) یا کمریز (Underflow) رخ نمیدهد و در عوض، اجرای برنامه متوقف میشود.
کد زیر را در نظر بگیرید:
1 2 3 4 5 6 7 |
function subtract(uint256 x, uint256 y) public pure returns (uint256) { uint256 difference = x - y; return difference; } |
اگر مقدار x
برابر با ۲ و مقدار y
برابر با ۵ باشد چه اتفاقی میافتد؟
در این حالت شما مقدار منفی ۳ دریافت نخواهید کرد. در واقع، اجرای قرارداد متوقف شده و یک revert رخ میدهد.
در سالیدیتی، برخلاف برخی زبانهای دیگر، در صورت بروز خطا، به جای ایجاد خطا (Exception)، عملیات برگشت داده میشود (revert) و هیچ تغییری ثبت نمیشود. یعنی همه تغییراتی که تا آن لحظه انجام شده بودند لغو میشوند و حالت قرارداد هوشمند به وضعیت قبل از اجرای تراکنش باز میگردد.
در نسخههای قدیمیتر سالیدیتی، وقوع Overflow و Underflow بدون هیچ مشکلی مجاز بود.
اما از آنجا که این موضوع باعث بروز مشکلات جدی، خرابی قراردادهای هوشمند و حتی حملات امنیتی شد، از نسخهی ۰.۸.۰ به بعد، محافظت در برابر Overflow و Underflow به صورت پیشفرض به زبان سالیدیتی اضافه شده است.
احتمالاً تاکنون متوجه شدهاید که بسیاری از فایلهای سالیدیتی دارای خط زیر هستند:
1 |
**pragma solidity ^0.8.0;** |
اگر با نسخهای قدیمیتر از ۰.۸.۰ روبرو شدید، نباید انتظار داشته باشید که محافظت در برابر overflow و underflow به طور پیشفرض در آن اعمال شده باشد.
استفاده از بلوک unchecked
اگر بخواهید عمداً اجازه دهید Overflow یا Underflow رخ بدهد، باید از یک بلوک unchecked
استفاده کنید.
درون بلوک unchecked
، میتوانید عملیاتهایی انجام دهید که حتی در صورت Overflow یا Underflow، اجرای برنامه متوقف نمیشود.
البته استفاده از این روش تنها در شرایط خاص و با آگاهی کامل از عواقب آن توصیه میشود.
مثال:
1 2 3 4 5 6 |
uint256 x = 1; uint256 y = 2; unchecked { uint256 z = x - y; // z == 2**256 - 1 } |
unchecked
قرار میگیرند، حتی اگر منجر به Overflow یا Underflow شوند، باعث توقف اجرای قرارداد نمیشوند.استفاده از این قابلیت پیشرفته تنها زمانی مناسب است که کاملاً به پیامدهای آن آگاه باشید و دلایل فنی معتبری برای این کار داشته باشید.
امیدواریم که آموزش عملیات ریاضی در سالیدیتی مورد توجه شما دوستان قرار گرفته باشد، در صورت داشتن هرگونه سوال میتوانید در کامنت ها مطرح کنید.
راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.
- انتشار: ۹ اردیبهشت ۱۴۰۴
دسته بندی موضوعات
- آموزش ارز دیجیتال
- آموزش برنامه نویسی
- آموزش متنی برنامه نویسی
- اطلاعیه و سایر مطالب
- پروژه برنامه نویسی
- دوره های تخصصی برنامه نویسی
- رپورتاژ
- فیلم های آموزشی
- ++C
- ADO.NET
- Adobe Flash
- Ajax
- AngularJS
- apache
- ARM
- Asp.Net
- ASP.NET MVC
- AVR
- Bootstrap
- CCNA
- CCNP
- CMD
- CSS
- Dreameaver
- EntityFramework
- HTML
- IOS
- jquery
- Linq
- Mysql
- Oracle
- PHP
- PHPMyAdmin
- Rational Rose
- silver light
- SQL Server
- Stimulsoft Reports
- Telerik
- UML
- VB.NET&VB6
- WPF
- Xml
- آموزش های پروژه محور
- اتوکد
- الگوریتم تقریبی
- امنیت
- اندروید
- اندروید استودیو
- بک ترک
- بیسیک فور اندروید
- پایتون
- جاوا
- جاوا اسکریپت
- جوملا
- دلفی
- دوره آموزش Go
- دوره های رایگان پیشنهادی
- زامارین
- سئو
- ساخت CMS
- سی شارپ
- شبکه و مجازی سازی
- طراحی الگوریتم
- طراحی بازی
- طراحی وب
- فتوشاپ
- فریم ورک codeigniter
- فلاتر
- کانستراکت
- کریستال ریپورت
- لاراول
- معماری کامپیوتر
- مهندسی اینترنت
- هوش مصنوعی
- یونیتی
- کتاب های آموزشی
- Android
- ASP.NET
- AVR
- LINQ
- php
- Workflow
- اچ تی ام ال
- بانک اطلاعاتی
- برنامه نویسی سوکت
- برنامه نویسی موبایل
- پاسکال
- پایان نامه
- پایتون
- جاوا
- جاوا اسکریپت
- جی کوئری
- داده کاوی
- دلفی
- رباتیک
- سئو
- سایر کتاب ها
- سخت افزار
- سی اس اس
- سی پلاس پلاس
- سی شارپ
- طراحی الگوریتم
- فتوشاپ
- مقاله
- مهندسی نرم افزار
- هک و امنیت
- هوش مصنوعی
- ویژوال بیسیک
- نرم افزار و ابزار برنامه نویسی
- وردپرس