روز ۴/۱۰۰ - متغیرهای Solidity: بررسی متغیرهای Local، State، و Global

به چهارمین مقاله در سری #100DaysOfSolidity خوش آمدید! در این مقاله، ما عمیقاً به بررسی متغیرها در زبان برنامه‌نویسی Solidity می‌پردازیم که برای توسعه قراردادهای هوشمند بر روی بلاکچین اتریوم استفاده می‌شود. متغیرها، که نقش کلیدی در ذخیره‌سازی و کنترل داده‌ها درون قراردادهای هوشمند دارند، در Solidity به سه دسته تقسیم می‌شوند: Local، State و Global. فهمیدن تفاوت‌های میان این انواع متغیرها برای نگارش قراردادهای هوشمندی که هم کارآمد و هم امن باشند، اهمیت بسزایی دارد.


بیایید هر نوع را به طور دقیق بررسی کنیم و یک درک جامع از اهمیت آنها در توسعه Solidity بدست آوریم.

1️⃣ متغیرهای محلی (local):

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

pragma solidity ^0.8.17;
contract Variables {
 function doSomething() public {
 uint i = 456;
 // Rest of the function code…
 }
}

در مثال بالا، متغیر i یک متغیر local است. این متغیر درون تابع doSomething() مقدار 456 را دریافت می‌کند. پس از اتمام اجرای تابع، متغیر i از بین می‌رود و دیگر نمی‌توان به مقدار آن دسترسی داشت.


2️⃣ متغیرهای state:

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

pragma solidity ^0.8.17;
contract Variables {
 string public text = &quotHello&quot
 uint public num = 123;
 // Rest of the contract code…
}

در مثال بالا، متغیرهای text و num به عنوان متغیرهای State شناخته می‌شوند. Modifier دسترسی public به طور خودکار توابع getter را ایجاد می‌کند، که این امکان را فراهم می‌آورد تا مقادیر آنها از خارج قرارداد قابل دسترسی باشند. این متغیرها روی بلاکچین ذخیره می‌شوند و می‌توانند توسط قراردادهای دیگر یا دیگران خوانده یا تغییر یابند.

3️⃣متغیرهای سراسری (Global):

در Solidity، متغیرهای Global اطلاعات مهمی در مورد بلاکچین و تراکنش جاری را فراهم می‌کنند. این متغیرها در تمامی توابع یک قرارداد قابل دسترسی بوده و اطلاعات کلیدی لازم برای اجرای صحیح قرارداد را ارائه می‌دهند. بیایید به بررسی دو متغیر Global که به طور معمول استفاده می‌شوند، بپردازیم:

ـblock.timestamp: این متغیر زمان فعلی (به ثانیه) بلوکی را که در آن قرارداد اجرا می‌شود، برمی‌گرداند. این اجازه می‌دهد تا قراردادها از منطق مبتنی بر زمان استفاده کنند یا وقوع رویدادهای خاص را ثبت کنند.

ـmsg.sender: این متغیر نشان دهنده آدرس حساب (یا قرارداد) است که تابع فعلی را فراخوانی کرده است. می‌توان از آن برای تأیید هویت فراخواننده یا انجام بررسی‌های کنترل دسترسی استفاده کرد.

اینجا یک مثال است که نشان می‌دهد چگونه از متغیرهای globalاستفاده کنیم:

pragma solidity ^0.8.17;
contract Variables {
 function doSomething() public {
 uint timestamp = block.timestamp;
 address sender = msg.sender;
 // Rest of the function code…
 }
}

توی مثال بالا، با استفاده از block.timestamp ما زمان فعلی رو بدست می‌آوریم و اون رو توی متغیر timestamp ذخیره می‌کنیم. همچنین، با استفاده از msg.sender ما آدرس فراخواننده رو دریافت می‌کنیم و به متغیر sender تخصیص می‌دهیم. این متغیرهای global اطلاعات مفیدی رو برای توسعه قراردادهای هوشمند فراهم می‌کنن و امکانات مختلفی رو به شما می‌دهند.

🔍 تحلیل دقیق از قرارداد هوشمند ارائه شده:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract Variables {
 string public text = &quotHello&quot
 uint
public num = 123;
function doSomething() public {
 uint i = 456;
 uint timestamp = block.timestamp;
 address sender = msg.sender;
 // Rest of the function code…
 }
}

در قرارداد هوشمند ارائه شده، ما دو state variable داریم: text که از نوع string است و با مقدار "Hello" مقداردهی اولیه شده است، و num که از نوع uint است و با مقدار 123 مقداردهی اولیه شده است. این متغیرها روی بلاکچین ذخیره می‌شوند و می‌توان از طریق توابع getter مربوطه به آنها (()text و ()num) دسترسی پیدا کرد.

تابع `()doSomething` یک تابع public است که نحوه استفاده از متغیرهای local و global را نشان می‌دهد. این تابع یک متغیر local `i` از نوع `uint` تعریف می‌کند و به آن مقدار 456 را اختصاص می‌دهد. این متغیر local تنها در دامنه تابع `()doSomething` وجود دارد.

علاوه بر این، درون تابع ()doSomething که یک تابع public است، ما زمان بلاک فعلی را با استفاده از متغیر سراسری block.timestamp استخراج می‌کنیم و آن را به متغیر لوکال timestamp اختصاص می‌دهیم. همچنین، آدرس فراخواننده را با استفاده از متغیر سراسری msg.sender به دست می‌آوریم و آن را به متغیر لوکال sender اختصاص می‌دهیم. این متغیرهای global اطلاعات حیاتی در مورد بلاکچین و زمینه تراکنش را فراهم می‌کنند.

#100DaysOfSolidity Series 004 “Variables”
#100DaysOfSolidity Series 004 “Variables”


نتیجه‌گیری:

در این مقاله، ما به بررسی سه نوع متغیر در Solidity پرداختیم: local، state، و global. متغیرهای local موقتی هستند و تنها در دامنه تابع وجود دارند، در حالی که متغیرهای state روی بلاکچین ذخیره می‌شوند و بین فراخوانی‌های تابع باقی می‌مانند. متغیرهای global اطلاعات مهمی در مورد بلاکچین و زمینه تراکنش فراهم می‌کنند. درک و استفاده مناسب از این انواع متغیرها برای توسعه قراردادهای هوشمند کارآمد و امن ضروری است. با بهره‌گیری از قدرت متغیرها، شما می‌توانید داده‌ها را در قراردادهای خود ذخیره و دستکاری کنید تا برنامه‌های کاربردی غیرمتمرکز قدرتمندی ایجاد نمایید.

🎉 تبریک برای تکمیل چهارمین مقاله از سری #100DaysOfSolidity! منتظر موضوعات هیجان‌انگیز بیشتری در مقالات آینده باشید.




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

https://medium.com/@solidity101/100daysofsolidity-solidity-variables-exploring-local-state-and-global-variables-b720a5c20fb9