• تهران -خیابان شریعتی - بالاتر از سه راه ملک - روبروی آتش نشانی - آرتارسانه
  • تلفن تماس: 02191303424

متغیر ها در سالیدیتی

متغیر ها در سالیدیتی

در جلسه قبل با نام گذاری انواع نام گذاری متغیر در سالیدیتی آشنا شدیم حال میخواهیم بدانیم در Solidity، هر متغیر حالت یا محلی دارای یک نوع مشخص است زیرا این زبان به صورت ایستا است. تعامل بین آنها می تواند در عبارات حاوی عملگرها انجام شود.

این آموزش انواع مفاهیم مربوط به نوع ها در Solidity را بررسی می کند.

بخش اول انواع مقادیر Solidity را نشان می‌دهد:

بولی، اعداد صحیح، اعداد نقطه ثابت، آدرس‌های قرارداد هوشمند، اعداد صحیح و غیره.

علاوه بر این، ما انواع تابع و مرجع را ارائه می کنیم و به Mapping Solidity و انواع آن عمیق تر می پردازیم.

این آموزش همچنین عملگرهای شامل LValues ​​(a) را بررسی می‌کند و تبدیل‌های احتمالی با انواع Solidity را نشان می‌دهد.

 

 

  1. Solidity Types: Main Tips
  2. Value Types
    1. Booleans
    2. Integers
    3. Fixed Point Numbers
    4. Addresses
    5. Contract Types
    6. Fixed-size Byte Arrays
    7. Dynamically-Sized Byte Array
    8. Rational and Integer Literals
    9. Enums
  3. Function Types
  4. Reference Types
    1. Data Location and Assignment Behavior
    2. Arrays
    3. Allocating Memory Arrays
    4. Array Literals
    5. Array Members
    6. Structs
  5. Mapping Types
  6. Operators Involving LValues
    1. delete
  7. Conversions Between Elementary Types
    1. Implicit Conversions
    2. Explicit Conversions
  8. Conversions Between Literals and Elementary Types
    1. Integer Types
    2. Fixed-Size Byte Arrays
  9. 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 هستند.

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