در جلسه قبل با نام گذاری انواع نام گذاری متغیر در سالیدیتی آشنا شدیم حال میخواهیم بدانیم در Solidity، هر متغیر حالت یا محلی دارای یک نوع مشخص است زیرا این زبان به صورت ایستا است. تعامل بین آنها می تواند در عبارات حاوی عملگرها انجام شود.
این آموزش انواع مفاهیم مربوط به نوع ها در Solidity را بررسی می کند.
بخش اول انواع مقادیر Solidity را نشان میدهد:
بولی، اعداد صحیح، اعداد نقطه ثابت، آدرسهای قرارداد هوشمند، اعداد صحیح و غیره.
علاوه بر این، ما انواع تابع و مرجع را ارائه می کنیم و به Mapping Solidity و انواع آن عمیق تر می پردازیم.
این آموزش همچنین عملگرهای شامل LValues (a) را بررسی میکند و تبدیلهای احتمالی با انواع Solidity را نشان میدهد.
- Solidity Types: Main Tips
- Value Types
- Booleans
- Integers
- Fixed Point Numbers
- Addresses
- Contract Types
- Fixed-size Byte Arrays
- Dynamically-Sized Byte Array
- Rational and Integer Literals
- Enums
- Function Types
- Reference Types
- Data Location and Assignment Behavior
- Arrays
- Allocating Memory Arrays
- Array Literals
- Array Members
- Structs
- Mapping Types
- Operators Involving LValues
- delete
- Conversions Between Elementary Types
- Implicit Conversions
- Explicit Conversions
- Conversions Between Literals and Elementary Types
- Integer Types
- Fixed-Size Byte Arrays
- Solidity Types: Summary
انواع داده در سالیدیتی
شامل بولی ها، اعداد صحیح، اعداد نقطه ثابت، آدرس ها، انواع قرارداد، آرایه های بایت با اندازه ثابت، لفظ های منطقی و صحیح، و enums هستند.
انواع مرجع مانند آرایه ها و ساختارها را می توان در این گزینه ها ذخیره کرد:
- memory
- storage
- calldata
نگاشت (mapping ) در Solidity به صورت hash tables (به صورت مجازی) هر کلید و نگاشت آن به یک مقدار دیده می شود.
LValue a مربوط به delete
و delete a
است.
بولین (Booleans)
این نوع در Solidity می تواند true
یا false
باشد. بولی با کلمه کلیدی bool تعریف می شود.
با این عملگر ها کار می کند:
!
(نفی منطقی)&&
(رابط منطقی، AND)||
(انفصال منطقی، OR)==
(برابری)!=
(نابرابری)
اعداد صحیح (Integers )
در Solidity دو نوع از اعداد صحیح با اندازه های مختلف وجود دارد:
int – اعداد صحیح با علامت.
uint – اعداد صحیح بدون علامت.
در مورد اندازه صحبت می کنیم، برای مشخص کردن آن، شما کلمات کلیدی مانند uint8
تا uint256
دارید، یعنی از 8 تا 256 بیت. برای سادگی uint256
و int256
را به ترتیب uint
و int
مینویسیم.
اعداد صحیح با عملگرهای زیر کار می کنند:
عملگرهای مقایسه (ارزیابی به bool)
<= (کمتر یا مساوی)
< (کمتر از) == (برابر با) != (برابر نیست) >= (بزرگتر یا مساوی)
> (بیشتر از)
عملگرهای بیتی
& (به صورت بیتی AND)
| (به صورت بیتی شامل OR)
^ (XOR بیتی (انحصاری OR))
~ (به صورت بیتی نه)
عملگرهای حسابی
+ (اضافه)
– (منها کردن)
unary – (تفریق روی یک عملوند)
unary + (افزودن روی یک عملوند)
* (یک عملوند را ضرب کنید)
/ (تقسیم)
% (باقی مانده (تقسیم))
** (توان )
<< (شیفت چپ)
>> (شیفت راست)
اعداد نقطه ثابت (Fixed Point Numbers)
دو نوع اعداد نقطه ثابت وجود دارد:
fixed
– عدد علامت دار نقطه ثابت.ufixed
– عدد نقطه ثابت بدون علامت.
این نوع مقدار را نیز می توان کلمات کلیدی مانند ufixedMxN
و fixedMxN
تعریف کرد. M
نشان دهنده مقدار بیت هایی است که نوع عدد می گیرد، با N
نشان دهنده تعداد اعشار موجود است. M
باید بر 8 بخش پذیر باشد و عددی از 8 تا 256 قابل بخش باشد.N
باید مقداری بین 0 تا 80 باشد .
توجه: اعداد نقطه ثابت ( Fixed Point Numbers ) را می توان در Solidity اعلام کرد، اما به طور کامل توسط این زبان پشتیبانی نمی شوند.
اعداد نقطه ثابت با این عملگرها عمل می کنند:
عملگرهای مقایسه (ارزیابی به bool)
<= (کمتر یا مساوی)
< (کمتر از) == (برابر با) != (برابر نیست) >= (بزرگتر یا مساوی)
> (بیشتر از)
عملگرهای حسابی
+ (اضافه)
– (منها کردن)
unary – (تفریق روی یک عملوند)
unary+ (افزودن روی یک عملوند)
* (یک عملوند را ضرب کنید)
/ (تقسیم)
% (باقی مانده (تقسیم))
آدرس ها(Addresses)
نوع مقدار Addresses آدرس دارای دو نوع مشابه است:
address
دارای یک مقدار 20 بایتی (اندازه یک آدرس اتریوم) است.address payable
همان آدرس ، اما اعضا میتوانندtransfer
وsend
داشته باشند .
توجه: بین آدرس های قرارداد هوشمند دو تفاوت وجود دارد – آدرس قابل پرداخت می تواند اتر را دریافت کند، در حالی که آدرس ساده نمی تواند.
تبدیل ضمنی آدرس ها:
از address payable
به address
: مجاز است.
از address
به address payable
: مجاز نیست. این نوع تبدیل فقط با تبدیل متوسط به uint160 امکان پذیر است.
حرف address
را می توان به address payable
تبدیل کرد.
تبدیل صریح به آدرس:
از آدرس برای integers, integer literals, contact types و bytes20 مجاز است. با این حال، Solidity از تبدیلaddress payable(x)
جلوگیری می کند.
address(x)
را می توان بهaddress payable
در مواردی تبدیل کرد که x
از نوع عدد integer, fixed bytes type یا یک literal یا یک contract است که تابع بازگشتی payable
دارد.
وقتی x
یک قرارداد بدون تابع بازگشتی payable
است،address(x)
از نوع address
است.
اعضای آدرس (Members of Address)
ویژگی balance
یک آدرس را جستجو می کند، در حالی که Ether را می توان به آدرس هایی با تابع transfer
ارسال کرد.
تابع transfer
با اعمال موجودی دارایی و ارسال اتر (بر حسب واحد wei
) به یک آدرس قابل پرداخت، balance
یک آدرس را جویا می شود:

هنگامی که موجودی قراردادهای جاری به اندازه کافی کافی نباشد یا زمانی که گیرنده انتقال را رد کند، عملکرد انتقال از کار می افتد. با شکست برمی گردد.
به یاد داشته باشید: تابع ارسال یک جایگزین امن برای انتقال نیست. هنگامی که ( call stack depth ) به 1024 می رسد یا زمانی که گیرنده دیگر GAS ندارد، ارسال نمی تواند منتقل شود.
با توابع call
, delegatecall
و staticcall
میتوانید بر روی رمزگذاری یا اینترفیس و کنترل مستقیم بیشتری بدست آورید.
آنها پارامتر حافظه یک بایت را می پذیرند، شرط موفقیت را به عنوان یک متغیر بولی و داده های برگشتی تحویل می دهند.
برای رمز نگاری داده های ساختار یافته از abi.encode
, abi.encodePacked
, abi.encodeWithSelector
و abi.encodeWithSignature
استفاده کنید :

می توانید گس را با استفاده از gas() modifier تنظیم کنید:



انواع قرارداد ( Contract Types )
همه قراردادها نوع خود را تعریف می کنند.
تبدیل ضمنی قراردادها به قراردادهایی که از آنها به ارث می برند امکان پذیر است. قراردادها را می توان از و به آدرس با تبدیل صریح explicit conversion تغییر داد.
تبدیل صریح از و به آدرس قابل پرداخت تنها زمانی مجاز است که نوع قرارداد دارای تابع بازگشتی قابل پرداخت باشد.
توجه: قراردادها با عملگر ها کار نمی کند.
آرایه های بایت با اندازه ثابت (Fixed-size Byte Arrays)
آرایه ها مقادیر داده ای bytes1، bytes2، bytes3، …، bytes32 حاوی دنباله ای از بایت ها (از 1 تا 32) هستند.
عملگرهایی که می توان برای این نوع مقدار Solidity اعمال کرد:
مقایسه : <=، <، ==، !=، >=، > (ارزیابی به bool)
عملگرهای بیت : &، |، ^ (انحصاری بیتی یا)، ~ (نفی بیتی)
عملگرهای Shift : << (Shift چپ)، >> (Shift راست)
عملگرهای Index access: اگر x از نوع bytesI باشد، x[k] برای 0 <= k < I
امین بایت (فقط خواندنی) را برمیگرداند.
آرایه بایت با اندازه پویا (Dynamically-Sized Byte Array)
بایت ها آرایه بایتی با اندازه پویا هستند و یکی از انواع داده در Solidity نیستند.
رشته یک رشته با اندازه پویا با رمزگذاری UTF-8 است و یک نوع داده نیست.
اعداد گویا و صحیح (Rational and Integer Literals)
اعداد صحیح به صورت اعشاری دیده می شوند. آنها از دنباله ای از اعداد (0-9) ایجاد می شوند.
Enum
از انواع مقادیر تعریف شده توسط کاربر میباشد . تبدیل صریح به و از همه انواع عدد صحیح امکان پذیر است، اما تبدیل ضمنی برای آن امکان پذیر نیست.

از آنجایی که انواع enum بخشی از ABI نیستند، امضای getChoice
به طور خودکار به getChoice()
برمی گرداند (uint8) برای همه موارد خارج از Solidity.
نوع عدد صحیح به اندازه کافی بزرگ است که تمام مقادیر enum را در خود جای دهد، اگر بیش از 256 مقدار دارید، از uint16
و غیره استفاده میشود .
انواع توابع
نوع تابع در سالیدیتی نشان دهنده انواع توابع است. متغیرهای نوع تابع را می توان به توابع اختصاص داد. برای تعیین توابع و برگرداندن توابع از فراخوانی تابع، از پارامترهای تابع استفاده میشود.
توجه: توابع همیشه public هستند مگر اینکه نوع آن در اسم تابع اعمال شود . در این صورت، توابع internal هستند.
استفاده از اعضای تابع در این مثال کد نشان داده شده است:
