تا اینجا، تمام توابع ما فقط مقادیری را برمیگرداندند که کاملاً وابسته به ورودی های تابع بودند. یعنی فقط بر اساس آرگومان هایی که به تابع داده میشود، خروجی تولید میکردند و هیچ ارتباطی با وضعیت قبلی بلاک چین یا داده های ذخیره شده نداشتند.
به همین دلیل، این توابع را تابع های خالص (pure) مینامند؛ چون هیچ وابستگیای به وضعیت شبکه یا بلاکچین ندارند.
اما این موضوع در شرایطی که بخواهیم چیزی را پیگیری کنیم (مثلاً مقدار بدهی یک فرد یا امتیاز او در یک بازی) مشکلساز میشود.
اینجاست که با مفهوم متغیر ذخیره سازی (storage variable) آشنا میشویم.
آموزش متغیرهای ذخیره سازی در سالیدیتی
متغیرهای ذخیره سازی در سالیدیتی چیست؟
در ظاهر، این متغیرها شبیه به متغیرهای سطح کلاس در زبان های دیگر هستند، اما دقیقاً همانطور عمل نمیکنند. میتوانید آنها را مثل یک پایگاه داده کوچک در نظر بگیرید که داده ها را نگه میدارد.
مثال زیر را ببینید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
contract ExampleContract { uint256 internal x; function setX( uint256 newValue ) public { x = newValue; } function getX() public view returns (uint256) { return x; } } |
نکاتی که باید از این مثال یاد بگیریم:
۱. متغیر خارج از تابع = storage variable
هر متغیری که خارج از توابع تعریف شده باشد، یک متغیر ذخیره ای است. یعنی مقدارش بعد از اتمام تراکنش هم باقی میماند.
۲. تفاوت view و pure در سالیدیتی
تابع getX()
از کلیدواژهی view
استفاده میکند، نه pure
. چرا؟ چون این تابع به وضعیت ذخیره شده بلاکچین (یعنی مقدار x) نگاه میکند.
-
view
یعنی فقط خواندن داده، بدون تغییر آن. -
اگر
view
را بهpure
تغییر دهیم، کد ارور میدهد چونpure
اجازه دسترسی به داده های ذخیره شده را نمیدهد.
همچنین دقت کنید نوع مقدار بازگشتی getX
همان uint256
است که با نوع x
یکی است.
۳. توابع تغییر دهندهی وضعیت (State-Changing)
تابع setX()
نه view
دارد و نه pure
. چرا؟
چون این تابع، متغیر ذخیره شده را تغییر میدهد. توابعی که وضعیت بلاکچین را تغییر میدهند (مثلاً مقدار متغیری را تغییر دهند)، نباید view
یا pure
داشته باشند. چون اینها فقط برای توابع “فقط خواندنی” هستند.
برای درک بیشتر، مثال زیر را ببینید که نادرست است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
contract ExampleContract { uint256 internal x; function setX( uint256 newValue ) public { x = newValue; } // خطا: این تابع نمیتواند pure باشد function getX() public pure returns (uint256) { return x; } } |
۴. درباره internal
در مثال اصلی، متغیر x
با internal
تعریف شده. یعنی این متغیر فقط در همین قرارداد یا قرارداد های ارث بر قابل مشاهده است. اما internal بودن به معنای مخفی بودن نیست!
اطلاعات متغیر هنوز در بلاکچین ذخیره میشود و هر کسی میتواند با تحلیل بلاکچین مقدار آن را بخواند.
۵. حذف internal (اشتباه رایج)
کد زیر از نظر فنی درست است ولی روش خوبی نیست:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
contract ExampleContract { uint256 x; function setX( uint256 newValue ) public { x = newValue; } function getX() public view returns (uint256) { return x; } } |
۶. public برای متغیرها
کد زیر هم درست است و حتی یک ویژگی جالب دارد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
contract ExampleContract { uint256 public x; function setX( uint256 newValue ) public { x = newValue; } function getX() public view returns (uint256) { return x; } } |
در این حالت، متغیر x
عمومی است، یعنی قراردادهای دیگر میتوانند مقدار آن را بخوانند. اما نکته مهم: نمیتوانند آن را تغییر دهند، مگر اینکه تابعی مثل setX
وجود داشته باشد.
در واقع:
-
توابع public میتوانند وضعیت را تغییر دهند.
-
متغیرهای public فقط خواندنی هستند (از بیرون قابل تغییر نیستند مگر با تابع).
جمعبندی
-
متغیرهایی که خارج از توابع تعریف میشوند، storage variable هستند.
-
توابع public بدون view یا pure میتوانند متغیرهای ذخیره ای را تغییر دهند.
-
توابع pure حق دسترسی به متغیرهای ذخیره ای را ندارند.
راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.
- انتشار: ۱۰ اردیبهشت ۱۴۰۴
دسته بندی موضوعات
- آموزش ارز دیجیتال
- آموزش برنامه نویسی
- آموزش متنی برنامه نویسی
- اطلاعیه و سایر مطالب
- پروژه برنامه نویسی
- دوره های تخصصی برنامه نویسی
- رپورتاژ
- فیلم های آموزشی
- ++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
- اچ تی ام ال
- بانک اطلاعاتی
- برنامه نویسی سوکت
- برنامه نویسی موبایل
- پاسکال
- پایان نامه
- پایتون
- جاوا
- جاوا اسکریپت
- جی کوئری
- داده کاوی
- دلفی
- رباتیک
- سئو
- سایر کتاب ها
- سخت افزار
- سی اس اس
- سی پلاس پلاس
- سی شارپ
- طراحی الگوریتم
- فتوشاپ
- مقاله
- مهندسی نرم افزار
- هک و امنیت
- هوش مصنوعی
- ویژوال بیسیک
- نرم افزار و ابزار برنامه نویسی
- وردپرس