متغیرهای ذخیره سازی در سالیدیتی

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

به همین دلیل، این توابع را تابع های خالص (pure) می‌نامند؛ چون هیچ وابستگی‌ای به وضعیت شبکه یا بلاکچین ندارند.

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

اینجاست که با مفهوم متغیر ذخیره سازی (storage variable) آشنا می‌شویم.

آموزش متغیرهای ذخیره سازی در سالیدیتی

متغیرهای ذخیره سازی در سالیدیتی چیست؟

در ظاهر، این متغیرها شبیه به متغیرهای سطح کلاس در زبان های دیگر هستند، اما دقیقاً همان‌طور عمل نمی‌کنند. می‌توانید آن‌ها را مثل یک پایگاه داده کوچک در نظر بگیرید که داده ها را نگه می‌دارد.

مثال زیر را ببینید:

نکاتی که باید از این مثال یاد بگیریم:

۱. متغیر خارج از تابع = storage variable

هر متغیری که خارج از توابع تعریف شده باشد، یک متغیر ذخیره ای است. یعنی مقدارش بعد از اتمام تراکنش هم باقی می‌ماند.

۲. تفاوت view و pure در سالیدیتی

تابع getX() از کلیدواژه‌ی view استفاده می‌کند، نه pure. چرا؟ چون این تابع به وضعیت ذخیره شده بلاکچین (یعنی مقدار x) نگاه می‌کند.

  • view یعنی فقط خواندن داده، بدون تغییر آن.

  • اگر view را به pure تغییر دهیم، کد ارور می‌دهد چون pure اجازه دسترسی به داده های ذخیره شده را نمی‌دهد.

همچنین دقت کنید نوع مقدار بازگشتی getX همان uint256 است که با نوع x یکی است.

۳. توابع تغییر دهنده‌ی وضعیت (State-Changing)

تابع setX() نه view دارد و نه pure. چرا؟

چون این تابع، متغیر ذخیره شده را تغییر می‌دهد. توابعی که وضعیت بلاکچین را تغییر می‌دهند (مثلاً مقدار متغیری را تغییر دهند)، نباید view یا pure داشته باشند. چون این‌ها فقط برای توابع “فقط خواندنی” هستند.

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

۴. درباره‌ internal

در مثال اصلی، متغیر x با internal تعریف شده. یعنی این متغیر فقط در همین قرارداد یا قرارداد های ارث بر قابل مشاهده است. اما internal بودن به معنای مخفی بودن نیست!

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

۵. حذف internal (اشتباه رایج)

کد زیر از نظر فنی درست است ولی روش خوبی نیست:

چرا بد است؟ چون ما به‌وضوح مشخص نکرده‌ایم که سطح دسترسی متغیر چطور باشد. بهتر است همیشه سطح دید (visibility) را مشخص کنید.

۶. public برای متغیرها

کد زیر هم درست است و حتی یک ویژگی جالب دارد:

در این حالت، متغیر x عمومی است، یعنی قراردادهای دیگر می‌توانند مقدار آن را بخوانند. اما نکته مهم: نمی‌توانند آن را تغییر دهند، مگر اینکه تابعی مثل setX وجود داشته باشد.

در واقع:

  • توابع public می‌توانند وضعیت را تغییر دهند.

  • متغیرهای public فقط خواندنی هستند (از بیرون قابل تغییر نیستند مگر با تابع).

جمع‌بندی

  • متغیرهایی که خارج از توابع تعریف می‌شوند، storage variable هستند.

  • توابع public بدون view یا pure می‌توانند متغیرهای ذخیره ای را تغییر دهند.

  • توابع pure حق دسترسی به متغیرهای ذخیره ای را ندارند.

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

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

دوره صفر تا صد آموزش بین المللی لینوکس
  • انتشار: ۱۰ اردیبهشت ۱۴۰۴

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

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

مشاهده همه

نظرات

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