این آموزش انواع مفاهیم مربوط به نوع ها در 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 هستند.
انواع مرجع مانند آرایه ها و ساختارها را می توان در این گزینه ها ذخیره کرد:
نگاشت (mapping ) در Solidity به صورت hash tables (به صورت مجازی) هر کلید و نگاشت آن به یک مقدار دیده می شود.
LValue a مربوط به delete و delete a است.
این نوع در Solidity می تواند true یا false باشد. بولی با کلمه کلیدی bool تعریف می شود.
با این عملگر ها کار می کند:
! (نفی منطقی)
&& (رابط منطقی، AND)
|| (انفصال منطقی، OR)
== (برابری)
!= (نابرابری)
در Solidity دو نوع از اعداد صحیح با اندازه های مختلف وجود دارد:
int – اعداد صحیح با علامت.
uint – اعداد صحیح بدون علامت.
در مورد اندازه صحبت می کنیم، برای مشخص کردن آن، شما کلمات کلیدی مانند uint8 تا uint256 دارید، یعنی از 8 تا 256 بیت. برای سادگی uint256 و int256 را به ترتیب uint و int مینویسیم.
اعداد صحیح با عملگرهای زیر کار می کنند:
<= (کمتر یا مساوی)
< (کمتر از) == (برابر با) != (برابر نیست) >= (بزرگتر یا مساوی)
> (بیشتر از)
& (به صورت بیتی AND)
| (به صورت بیتی شامل OR)
^ (XOR بیتی (انحصاری OR))
~ (به صورت بیتی نه)
+ (اضافه)
– (منها کردن)
unary – (تفریق روی یک عملوند)
unary + (افزودن روی یک عملوند)
* (یک عملوند را ضرب کنید)
/ (تقسیم)
% (باقی مانده (تقسیم))
** (توان )
<< (شیفت چپ)
>> (شیفت راست)
دو نوع اعداد نقطه ثابت وجود دارد:
fixed – عدد علامت دار نقطه ثابت.
ufixed – عدد نقطه ثابت بدون علامت.
این نوع مقدار را نیز می توان کلمات کلیدی مانند ufixedMxN و fixedMxN تعریف کرد. M نشان دهنده مقدار بیت هایی است که نوع عدد می گیرد، با Nنشان دهنده تعداد اعشار موجود است. M باید بر 8 بخش پذیر باشد و عددی از 8 تا 256 قابل بخش باشد.N باید مقداری بین 0 تا 80 باشد .
توجه: اعداد نقطه ثابت ( Fixed Point Numbers ) را می توان در Solidity اعلام کرد، اما به طور کامل توسط این زبان پشتیبانی نمی شوند.
اعداد نقطه ثابت با این عملگرها عمل می کنند:
<= (کمتر یا مساوی)
< (کمتر از) == (برابر با) != (برابر نیست) >= (بزرگتر یا مساوی)
> (بیشتر از)
+ (اضافه)
– (منها کردن)
unary – (تفریق روی یک عملوند)
unary+ (افزودن روی یک عملوند)
* (یک عملوند را ضرب کنید)
/ (تقسیم)
% (باقی مانده (تقسیم))
نوع مقدار Addresses آدرس دارای دو نوع مشابه است:
توجه: بین آدرس های قرارداد هوشمند دو تفاوت وجود دارد – آدرس قابل پرداخت می تواند اتر را دریافت کند، در حالی که آدرس ساده نمی تواند.
از 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 است.
ویژگی balance یک آدرس را جستجو می کند، در حالی که Ether را می توان به آدرس هایی با تابع transfer ارسال کرد.
تابع transfer با اعمال موجودی دارایی و ارسال اتر (بر حسب واحد wei ) به یک آدرس قابل پرداخت، balance یک آدرس را جویا می شود:
هنگامی که موجودی قراردادهای جاری به اندازه کافی کافی نباشد یا زمانی که گیرنده انتقال را رد کند، عملکرد انتقال از کار می افتد. با شکست برمی گردد.
به یاد داشته باشید: تابع ارسال یک جایگزین امن برای انتقال نیست. هنگامی که ( call stack depth ) به 1024 می رسد یا زمانی که گیرنده دیگر GAS ندارد، ارسال نمی تواند منتقل شود.
با توابع call, delegatecall و staticcall میتوانید بر روی رمزگذاری یا اینترفیس و کنترل مستقیم بیشتری بدست آورید.
آنها پارامتر حافظه یک بایت را می پذیرند، شرط موفقیت را به عنوان یک متغیر بولی و داده های برگشتی تحویل می دهند.
برای رمز نگاری داده های ساختار یافته از abi.encode, abi.encodePacked, abi.encodeWithSelector و abi.encodeWithSignature استفاده کنید :
می توانید گس را با استفاده از gas() modifier تنظیم کنید:
می توانید مقدار اتر را نیز دستکاری کنید:
امکان ترکیب این اصلاح کننده ها وجود دارد. ترتیب آنها مهم نیست:
همه قراردادها نوع خود را تعریف می کنند.
تبدیل ضمنی قراردادها به قراردادهایی که از آنها به ارث می برند امکان پذیر است. قراردادها را می توان از و به آدرس با تبدیل صریح explicit conversion تغییر داد.
تبدیل صریح از و به آدرس قابل پرداخت تنها زمانی مجاز است که نوع قرارداد دارای تابع بازگشتی قابل پرداخت باشد.
توجه: قراردادها با عملگر ها کار نمی کند.
آرایه ها مقادیر داده ای bytes1، bytes2، bytes3، …، bytes32 حاوی دنباله ای از بایت ها (از 1 تا 32) هستند.
عملگرهایی که می توان برای این نوع مقدار Solidity اعمال کرد:
مقایسه : <=، <، ==، !=، >=، > (ارزیابی به bool)
عملگرهای بیت : &، |، ^ (انحصاری بیتی یا)، ~ (نفی بیتی)
عملگرهای Shift : << (Shift چپ)، >> (Shift راست)
عملگرهای Index access: اگر x از نوع bytesI باشد، x[k] برای 0 <= k < I امین بایت (فقط خواندنی) را برمیگرداند.
بایت ها آرایه بایتی با اندازه پویا هستند و یکی از انواع داده در Solidity نیستند.
اعداد صحیح به صورت اعشاری دیده می شوند. آنها از دنباله ای از اعداد (0-9) ایجاد می شوند.
از انواع مقادیر تعریف شده توسط کاربر میباشد . تبدیل صریح به و از همه انواع عدد صحیح امکان پذیر است، اما تبدیل ضمنی برای آن امکان پذیر نیست.
از آنجایی که انواع enum بخشی از ABI نیستند، امضای getChoice به طور خودکار به getChoice() برمی گرداند (uint8) برای همه موارد خارج از Solidity.
نوع عدد صحیح به اندازه کافی بزرگ است که تمام مقادیر enum را در خود جای دهد، اگر بیش از 256 مقدار دارید، از uint16 و غیره استفاده میشود .
نوع تابع در سالیدیتی نشان دهنده انواع توابع است. متغیرهای نوع تابع را می توان به توابع اختصاص داد. برای تعیین توابع و برگرداندن توابع از فراخوانی تابع، از پارامترهای تابع استفاده میشود.
توجه: توابع همیشه public هستند مگر اینکه نوع آن در اسم تابع اعمال شود . در این صورت، توابع internal هستند.
استفاده از اعضای تابع در این مثال کد نشان داده شده است: