انواع داده ها و متغیرها در سالیدیتی solidity
انواع داده ها و متغیرها در زبان برنامه نویسی سالیدیتی
زبان برنامهنویسی سالیدیتی در حال حاضر به عنوان محبوبترین زبان برنامهنویسی و انتخابی مناسب برای توسعه قراردادهای هوشمند است. با گسترش استفاده از این زبان، تمایل به یادگیری در مورد انواع داده ها و متغیرها در سالیدیتی نیز در حال افزایش است. این زبان برنامهنویسی از کتابخانهها، وراثت و انواع دادههای پیشرفته که توسط کاربر تعریف میشوند، پشتیبانی میکند.
برای کسانی که با زبانهای برنامهنویسی دیگر مثل مانند C++ و JavaScript آشنایی دارند، شناخت انواع داده در سالیدیتی (solidity variables) آسان است. با وجود شباهتهای زیاد انواع داده در سالیدیتی و دیگر زبانهای شیگرا، تفاوتهای ظریفی نیز در این مورد وجود دارد. در این مقاله از سایت توکن خان قصد داریم تا به بررسی انواع داده در سالیدیتی بپردازیم، با ما همراه باشید.
قبل از مطالعه کامل مقاله “انواع داده ها و متغیرها در سالیدیتی” پیشنهاد میکنیم مقالات دیگر حوزه آموزش برنامه نویسی سالیدیتی را هم مطالعه کنید.
نحوه ایجاد توکن ERC721 با قرارداد هوشمند
بررسی رفتار توابع View و Pure در سالیدیتی Solidity
کتابخانه ها (Library) در قراردادهای هوشمند Solidity
گس فی GAS FEE در شبکه اتریوم چیست؟
استفاده از Import در سالیدیتی Solidity
انواع حافظه در قرارداد هوشمند سالیدیتی
انواع داده در سالیدیتی
انواع داده در سالیدیتی نمایانگر نوع دادهای است که میبایستی از آن استفاده شود، این نوع میتواند عدد صحیح، حروف، عدد اعشاری و بولین یا سایر دادههایی باشد که سالیدیتی از آنها پشتیبانی میکند. برای یک زبان برنامهنویسی ایستا مانند سالیدیتی نوع هر متغیر باید در کدهای نوشته شده توسط کاربر مشخص باشد.
انواع دادهها دارای مقدار پیشفرض هستند که به آن حالت صفر (Zero-State) گفته میشود. این حالت صفر برای نوع دادهای مانند بولین، مقدار پیشفرضی است که تحت عنوان False (نادرست) میشناسیم. در نتیجه زبانهای برنامهنویسی ایستا و همچنین زبان مورد بحث ما، دارای انواع مقدار (Value) و انواع مرجع (Reference) هستند که در ادامه به معرفی آنها خواهیم پرداخت.
Value Typeها در سالیدیتی
متغیرهایی تحت عنوان نوع مقدار (یا نوع ارزش)، دادههای خودشان را ذخیره میکنند. اینها انواع دادههای اساسی هستند که سالیدیتی ارائه میدهد و همیشه همراه با مقدار ارسال میشوند. متغیرها در هر جایی که در آرگومانهای تابع یا واگذاری استفاده شوند، کپی میشوند.
انواع دادههای نوع مقدار در سالیدیتی به ترتیب زیر هستند:
- بولین Boolean
این نوع داده تنها دو مقدار را قبول میکند و آن True یا False است، مقدار پیشفرض برای آن False است. این نوع داده یکی از انواع داده در سالیدیتی است که در مواردی که نتایج باینری پیدا میکنید، اهمیت زیادی پیدا میکند. این نوع داده تنها در حدود یک بایت فضا برای ذخیره نیاز دارد و پشتیبانی از تمام عملگرهای استاندارد بولین در سالیدیتی یافت میشود.
تعدادی از مثالهای رایج برای این نوع داده، نامساوی با نماد (!=) ، مساوی با نماد (==) ، نفی منطقی با نماد (!) است.
-
اعداد
- اعداد نشانه دار یا int:
- متغیر از نوع int برای نگهداری مقادیر عددی مثبت و منفی استفاده میشود. انواع مختلفی از این نوع از متغیر داریم. از جمله int8, int16, int24, … int256. حداکثر میزان گنجایش عددی که در هر کدام از این متغیرها میتوان تعریف نمود، توسط عددی که در جلوی int نوشته شده است مشخص میشود. مثلاً اگر متغیری از نوع int8 تعریف کنیم، گنجایش آن، از مقدار 2 به توان -7 تا 2 به توان 8 منهای 1 خواهد بود. از این نوع متغیر کمتر استفاده میشود.
- متغیر int معادل int256 میباشد.
- اعداد بدون نشانه یا uint:
- متغیرهایی که بصورت uint تعریف شوند، اعداد 0 و بزرگتر از آن را شامل میشوند. قواعد متغیر از نوع uint نیز مشابه نوع int است با این فرق که حداکثر عددی که میتوانیم در این نوع متغیر نگهداری کنیم، در مثلاً نوع uint8، به این صورت خواهد بود: از 0 تا 2 به توان 8، منهای 1(یعنی مقدار نهایی گنجایش آن معادل 255 میشود.)
- متغیر uint معادل uint256 میباشد.
- اعداد نشانه دار یا int:
-
اعداد نقطه ثابت Fixed Point Numbers
بنا بر مستندات سالیدیتی، این نوع داده هنوز به طور کامل در سالیدیتی پشتیبانی نمیشود. آنها میتوانند برای اعداد نقطه ثابت علامتدار با کلمه کلیدی fixed و برای اعداد نقطه ثابت بدون علامت با کلمه کلیدی unfixed اعلان شوند. این اعداد نقطه ثابت میتوانند دارای اندازههای مختلف باشند.
-
آدرس Address
آدرس در سالیدیتی، دارای یک مقدار 20 بایتی(160 بیتی) است که نشاندهنده اندازه یک آدرس اتریوم است. یک آدرس میتواند برای به دست آوردن موجودی یا انتقال یک موجودی به ترتیب با متد balance و transfer مورد استفاده قرار بگیرد. البته این نوع مقدار به طور خاصی برای ذخیرهسازی تا 20 یا 160 بایت هم طراحی شده است.
علاوه بر این، سالیدیتی دو نوع آدرس مجزا را ارائه میکند یه یکی با نام آدرس و دیگری با نام آدرس قابل پرداخت (address payable) شناخته میشود. در بیان تنها تفاوت این دو باید گفت که آدرس های payable میتوانند کوین بومی شبکه مربوطه(مثلاً ETH) را دریافت کنند.
-
بایتها BytesN
با وجود تشابه میان بایتها و رشتهها (strings) اما تفاوتهایی بین این دو وجود دارد. بایتها برای ذخیره یک مجموعه کاراکتر دارای اندازه ثابت استفاده میشوند در حالی که رشته برای ذخیره یک مجموعه کاراکتر برابر یا بیشتر از یک بایت استفاده میشود. طول متغیر از نوع bytesN از یک(bytes1) تا 32 است(bytes32) در حالی که stringها و همینطور bytes در سالیدیتی دارای یک طول دینامیک و پویا است. بایت این مزیت را دارد که گس کمتری مصرف میکند در نتیجه بهتر است در زمانی که طول داده را میدانیم، از بایت استفاده کنیم.
-
Enums
از Enums یا enumeration برای ایجاد انواع داده تعریف شده توسط کاربر (user-defined) استفاده میشود، که در تخصیص یک نام به یک مقدار ثابت کاربرد دارد. استفاده از این نوع داده موجب میشود قرارداد هوشمند ما خوانایی بالاتری داشته باشد و احتمال بروز خطا در آن نیز کمتر باشد. گزینههای enums توسط مقادیر صحیح بدون علامت که از صفر شروع میشوند(طبیعی است که منظورمان uint است) نشان داد.
دستور Enums در برنامه نویسی سالیدیتی در واقع محدودکننده متغیر برای تنها یکی از چند مقدار از پیش تعریف شده است. واقعیت مهم در مورد این نوع از داده، این است که برنامههای غیرمتمرکز، مقدار المان های تعریف شده در متغیر از نوع enum را بصورت رشته تشخیص نمیدهند و با آنها مثل اعداد رفتار میکنند. این مهم است که یک مقدار عدد صحیح مطابق با ثابت enum را ارائه دهیم.
مثال کلی برای انواع از نوع Value Typeها در سالیدیتی
در مثال زیر که قراردادی با نام Value_Types ایجاد شده است، انواع مختلف value typeها را مشاهده میکنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
// SPDX-License-Identifier: MIT // کد سالیدیتی برای آشنایی با // متغیرهای از نوع // Value types pragma solidity ^0.8.17; // ایجاد قرارداد هوشمند contract Value_Types { // Initializing Address variable address public owner = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4; // Initializing Bool variable bool public boolean = false; // Initializing Integer variable int32 public int_var = -75445; // Initializing Unsigned Integer variable uint8 public uint_var = 255; // Initializing BytesN variable bytes1 public b = "a"; // تعریف یک آرایه استاتیک(با طول ثابت) uint[5] staticArray = [1, 2, 3, 4, 5] ; // Defining an enumerator enum My_enum { token_, _khan, _academy } // Defining a function to return // values stored in an enumerator function showEnum() public pure returns(My_enum) { return My_enum._academy; } // Defining a function to return // staticArray elements function showStaticArrayElements() public view returns(uint[5] memory) { return staticArray; } } |
خروجی کدهای بالا مطابق با تصویر زیر است:
Reference Type ها در سالیدیتی
در بررسی انواع داده ها و متغیرها در سالیدیتی نوبت به انواع دادههای از نوع reference میرسد که این نوع داده ها، مکان دادهها را ذخیره میکند و دادهها را به طور مستقیم به اشتراک نمیگذارند. با این مورد از انواع داده در سالیدیتی، دو(یا تعداد بیشتری) متغیر مختلف میتوانند به یک مکان خاص از حافظه اشاره کنند که در آن هر تغییر در یک متغیر میتواند بر متغیر دیگر تاثیر بگذارد. همچنین باید توجه داشته باشید که reference type های سالیدیتی از نظر گنجایش میتوانند بیش از 32 بایت حافظه مصرف کنند.
با در نظر گرفتن نقش reference typeها، در استفاده از آنها باید محتاطانه عمل کنیم، زیرا data location یا همان مکان داده یک عامل مهم و تاثیرگذار در میزان گس مصرفی در یک تراکنش است. در نتیجه مکان نامناسب داده میتواند تاثیری منفی در عملکرد پروژههای توسعه قرارداد هوشمند در سالیدیتی داشته باشد. و علاوه بر آن میتواند اشکالاتی منطقی نیز در برنامه نویسی سالیدیتی ما ایجاد کند.
انواع دادههای از نوع Reference در سالیدیتی:
-
آرایه ها Arrays
در سالیدیتی، آرایه، گروهی از متغیرهای با نوع داده ای یکسان است که در آن هر عنصر، یک مکان خاص که به عنوان اندیس یا شاخص (index) شناخته میشود دارد. با استفاده از مکان اندیس عنصر آرایه میتوان به متغیر مورد نظر دسترسی پیدا کرد. در زبان سالیدیتی اندازه یک آرایه میتواند ثابت یا پویا باشد. آرایه های با طول ثابت، در دسته value typeها، و آرایه های با طول متغیر( منظورمان dynamically sized array ها هستند) از نوع reference type میباشند.
-
رشته ها Strings
رشتهها مانند آرایههایی از کاراکترها هستند. وقتی از آنها استفاده میکنیم ممکن است فضای ذخیرهسازی بزرگتر یا کوتاهتری از اسلات های حافظه قرارداد هوشمند را اشغال کنیم.
-
ساختار Struct
سالیدیتی به کاربران اجازه میدهد تا نوع داده خود را تعریف و ایجاد کنند و این کار در قالب ساختارها انجام میشود. ساختار، گروهی از انواع مختلف داده است هر چند امکان وجود عضوی از نوع خودش در آن وجود نداشته باشد. ساختار یک نوع متغیر نوع مرجع است که میتواند شامل هم نوع مقدار و هم نوع مرجع باشد.
-
Mapping
مپینگ پرکاربردترین نوع مرجع است که داده ها را در یک جفت ” کلید – ارزش (مقدار) ” ذخیره میکند که در آن یک کلید میتواند یک نوع مقدار باشد. این مورد از انواع داده در سالیدیتی مشابه یک جدول هش (hash table) یا فرهنگ لغت (dictionary) در هر زبان برنامه نویسی دیگری است که دادهها را با کلید میتوان بازیابی کرد.
-
Bytes
متغیرهای نوع bytes در سالیدیتی، شباهت زیادی به متغیرهای bytesN که پیشتر در قسمت value type ها تعریف کردیم دارند، با این تفاوت که طول آنها میتواند کمتر یا بیشتر از 32 بایت باشد. دقت داشته باشید که این نوع از متغیر، از نوع reference type است.
مثال کلی برای Reference Typesها در سالیدیتی
در مثال زیر که قراردادی با نام Reference_Types ایجاد شده است، انواع مختلف دادههای مرجع برای درک بهتر مطلب، مقداردهی اولیه شده است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
// SPDX-License-Identifier: MIT // کد سالیدیتی برای آشنایی با // متغیرهای از نوع // Reference Types pragma solidity ^0.8.17; // ایجاد قرارداد هوشمند contract Reference_Types { // تعریف یک آرایه داینامیک(با طول متغیر) uint[] dynamicArray = [1, 2, 3, 4, 5] ; // تعریف یک متغیر از نوع // struct struct Student { string name; string family; uint8 marks; } // ایجاد یک شئ از // Student struct Student public std; // ایجاد یک متغیر از نوع // Mapping mapping (address => Student) result; address[] Student_result; // Initializing String variable string public str = "Tokenkhan"; // Initializing Bytes variable bytes public user = "TokenKhan is teaching you +\ smart contract development +\ with solidity language!"; // تعریف یک تابع برای کار با // Student struct function structure() public returns( string memory, string memory, uint) { std.name = "Token"; std.family = "Khan"; std.marks = 88; return (std.name, std.family, std.marks); } function showDynamicArrayElements() public view returns (uint[] memory) { return dynamicArray; } } |
خروجی کدهای بالا مطابق با تصویر زیر است:
جمعبندی
در این مقاله، انواع داده ها و متغیرها در سالیدیتی را در دو دسته مختلف بررسی کردیم، در واقع زبان برنامهنویسی سالیدیتی از دو نوع متمایز از نوع داده پشتیبانی میکند که یکی value typeها (انواع مقدار (یا ارزش)) و دیگری reference typeها (انواع مرجع) است. هر کدام از انواع داده نقش خاصی در عملکرد سالیدیتی که در زمینه طراحی، تعریف و ایجاد قراردادهای هوشمند آنها را به کار میگیرد، دارند.
در نتیجه یادگیری و شناخت هر یک از انواع داده در سالیدیتی در یادگیری این زبان برنامهنویسی و استفاده درست از آن در ایجاد قراردادهای هوشمند دارای اهمیت زیادی است.
در صورت تمایل جهت یادگیری مطالب بیشتر در خصوص متغیرها و سایر مباحث سالیدیتی، میتوانید سرفصل های دوره آموزش سالیدیتی را مشاهده نموده و در صورت تمایل در این دوره پربار ثبت نام نمائید.
منابع معتبر مرتبط:
https://medium.com/@mazma/solidity-variables-and-value-data-types-e2b29bddcaf7
https://www.geeksforgeeks.org/solidity-variables
مطالب زیر را حتما مطالعه کنید
بررسی رفتار توابع View و Pure در سالیدیتی Solidity
توابع Payable در قراردادهای هوشمند Solidity
سالیدیتی Solidity چیست؟
سطح دسترسی Visibility در سالیدیتی Solidity
توابع Function در سالیدیتی Solidity
انواع حافظه در قرارداد هوشمند سالیدیتی
7 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
اکثر محتواهای سالیدیتی تون رو خوندم
این محتوا خیلی کامل و عالی بود
واقعا ارزش وقت گذاشتن داشت
حرف نداشت👌🏻
مطلب خوبی بود
مقالاتتون عالین واقعا!
خیلی دنبال این موضوع بودم
سلام عالی بود