آموزش سالیدیتی Solidity
[vc_row][vc_column][vc_column_text]
آموزش سالیدیتی Solidity
آموزش سالیدیتی Solidity، به ظهور صنعت بلاکچین افراد زیادی به دنبال آن رفتند که با برنامه نویسی بلاکچین به زبان سالیدیتی آشنا شوند.و از آنجایی که آشنایی به زبان برنامه نویسی سالیدیتی دارای هزینه است، تیم زوم ارز تلاش کرد تا بتوانید محتوای بسیار خوبی را درباره برنامه نویسی بلاکچین تهیه کنند و افرادی که با برنامه نویسی آشنا هستند، میتوانند از طریق این محتوا با سینتکسهای زبان برنامه نویسی سالیدیتی آشنا شوند.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_tta_tour][vc_tta_section title=”Overview” tab_id=”Overview”][vc_column_text]
زبان برنامه نویسی Solidity سالیدیتی چیست؟ یک زبان برنامه نویسی سطح بالا و قرارداد محور برای اجرای قراردادهای هوشمند است. سالیدیتی Solidity بسیار تحت تاثیر زبانهای C++ Python، و JavaScript است و برای هدف قرار دادن ماشین مجازی اتریوم یا EVM طراحی شده است.
این آموزش یا مقاله مبتدیان را برای یادگیری زبان برنامه نویسی سالیدیتی Solidity مورد هدف قرار داده است و آنها را برای یادگیری مفاهیم پیشرفته تر در سالیدیتی راهنمایی میکند. پس از اتمام این آموزش شما میتوانید شروع به توسعه دانش خود کنید و به راحتی دانش خود را پیاده سازی کنید.
سالیدیتی Solidity از انواع کتابخانهها و زبان برنامه نویسی پیچیده تعریف شده توسط کاربر پشتیبانی میکند. برای ایجاد قراردادهایی همچون سرمایه گذاری گسترده و کیف پول های چند امضایی میتوانید از سالیدیتی Solidity استفاده کنید.
اتریوم Ethereum چیست؟
اتریوم غیرمتمرکز است. اتریوم در واقع یک پلتفرم بلاکچین است که قراردادهای هوشمند را اجرا میکند، برنامههایی که دقیقا اجرا میشوند و هیچگونه احتمال خرابی یا تداخل شخص ثالث در آن وجود ندارد.
ماشین مجازی اتریوم EVM
ماشین مجازی اتریوم یا Ethereum Virtual Machine که به آن EVM نیز گفته میشود، محیطی برای اجرای قراردادهای هوشمند در اتریوم است. ماشین مجازی اتریوم در تامین امنیت و اجرای کدهای نامعتبر در سراسر جهان متمرکز است.
EVM تخصصی در جلوگیری از حملات دارد و اطمینان حاصل میکند که ارتباطات بدون هیچگونه تداخل بالقوه ای برقرار میشود. ماشین مجازی اتریوم Ethereum Virtual Machine به گونه ای طراحی شده است که به عنوان یک محیط اجرا برای قراردادهای هوشمند مبتنی بر اتریوم عمل میکند.
قرارداد هوشمند Smart Contract چیست؟
قرارداد هوشمند یک پروتکل رایانه ای است که برای تسهیل، تایید یا اجرای قرارداد به صورت دیجیتالی طراحی شده است. قراردادهای هوشمند انجام معاملات و یا تراکنشهای معتبر را بدون اشخاص ثالث امکان پذیر میکند و این معاملات یا تراکنشها قابل پیگیری و برگشت ناپذیر است.
مفهوم قراردادهای هوشمند برای اولین بار توسط Nick Szabo در سال 1994 ارائه شد. در ادامه به جزئیات بیشتری در ارتباط با قراردادهای هوشمند خواهیم پرداخت.
[/vc_column_text][/vc_tta_section][vc_tta_section title=”Environment Setup” tab_id=”environmentsetup”][vc_column_text]
آموزش سالیدیتی Solidity – تنظیم محیط
در این فصل توضیح خواهیم داد که چگونه میتوان کامپایلر Solidity را بر روی دستگاه CentOS راه اندازی کرد. اگر دستگاه مجهز به سیستم عامل لینوکس ندارید، میتوانید از کامپایلر Compiler آنلاین ما برای قراردادهای کوچک و یادگیری سریع سالیدیتی Solidity استفاده کنید.
روش 1 – npm / Node.js
این سریعترین راه برای نصب کامپایلر Solidity بر روی دستگاه CentoS شماست. برای نصب کامپایلر سالیدیتی Solidity مراحل زیر را داریم.
Node.js را نصب کنید
ابتدا مطمئن شوید که Node.js را در دستگاه CentOS خود در دسترس دارید. اگر در دسترس نیست، با استفاده از دستورات زیر آن را نصب کنید.

اگر همه چیز نصب شده باشد، خروجی شما به شکل زیر است.

Solc را نصب کنید

پس از نصب Node.js، میتوانید به صورت زیر کامپایلر Solidity را نصب کنید.
دستور فوق برنامه solcjs را نصب میکند و آن را از طریق سیستم در سطح جهانی در دسترس قرار میدهد. اکنون میتوانید کامپایلر سالیدیتی Solidity خود را با صدور دستور زیر آزمایش کنید.

اگر همه چیز خوب پیش برود، این مورد چیزی را به شرح زیر چاپ میکند.

اکنون شما آماده استفاده از solcjs هستید که ویژگیهای کمتری نسبت به کامپایلر استاندارد Solidity دارد اما نقطه شروع خوبی به شما میدهد.
روش 2 – تصویر Docker
برای شروع برنامه نویسی Solidity میتوانید یک تصویر Docker نصب کنید و استفاده از آن را شروع کنید. در زیر مراحل آن اورده شده است. در ادامه دستور نصب یک تصویر Solidity Docker وجود دارد.

پس از بارگیری تصویر Docker، میتوانیم آن را با استفاده از دستور زیر تایید کنیم.

این دستور چیزی را به شرح زیر چاپ میکند.

روش 3 – نصب پکیجهای باینری Binary Packages
اگر شما مایل به نصب کامپایلر کامل بر روی دستگاه لینوکس خود هستید، لطفا وب سایت رسمی نصب کامپایلر Solidity را بررسی کنید.
[/vc_column_text][/vc_tta_section][vc_tta_section title=”Basic Syntax” tab_id=”basicsyntax”][vc_column_text]
آموزش سالیدیتی Solidity – سینتکس پایه Basic Syntax
فایلهای مرجع سالیدیتی Solidity میتواند شامل تعداد معینی از تعاریف قرارداد، بخشنامهها و دستورالعملهای عملی باشد.
بیایید با یک فایل مرجع ساده از سالیدیتی Solidity شروع کنیم. در زیر مثالی از یک فایل Solidity آورده شده است.

پراگما Pragma
خط اول یک دستورالعمل است که میگوید کد برای Solidity نسخه 0.4.0 یا هر مورد جدیدتری نوشته شده است که عملکرد را تا نسخه 0.6.0 از بین نمیبرد، اما شامل نمیشود.
یک دستورالعمل پراگما Pragma همیشه محلی برای یک فایل مرجع است و اگر فایل دیگری را وارد کنید، پراگما Pragma از آن فایل به طور خودکار در فایل وارد کننده استفاده نمیکند.
بنابراین پراگما Pragma برای فایلی جدیدتر از نسخه 0.4.0 کامپایل نخواهد شد و همچنین روی کامپایلر که از نسخه 0.5.0 شروع به کار نمیکند به شرح زیر نوشته میشود.

در اینجا شرط دوم با استفاده از ^ اضافه میشود.
قرارداد Contract
قرارداد سالیدیتی Solidity مجموعه ای از کد (توابع آن) و دادهها است که در یک آدرس خاص در بلاکچین اتریوم قرار دارد.
خط unitstoredData متغیری را با نام storedData از نوع unit اعلام میکند و توابع میتوانند برای تغییر یا بازیابی مقدار متغیر استفاده شوند.
وارد کردن فایلها Importing Files
اگرچه مثال فوق فایل ورودی ندارد اما سالیدیتی Solidity از گزارههای وارد شده پشتیبانی میکند که شباهت زیادی با عبارت موجود در زبان JavaScrypt دارد.
عبارت زیر تمامی نمادها را از ” filename ” وارد میکند.

مثال زیر یک نماد جدید ایجاد میکند که اعضای آن همه از ” filename ” هستند.

برای وارد کردن فایل X از همان فایل فعلی، از “X/.” به جای X استفاده کنید. اگر از “X” به عنوان X استفاده کنید یک فایل متفاوت میتواند در یک فهرست جهانی ارجاع شود.
کلمات کلیدی از پیش تعریف شده
در جدول زیر شما میتوانید کلمات کلیدی از پیش تعریف شده در سالیدیتی Solidity را مشاهده نمایید.

[/vc_column_text][/vc_tta_section][vc_tta_section title=”First Application” tab_id=”firstapplication”][vc_column_text]
آموزش سالیدیتی Solidity – First Application
ما برای کامپایل و اجرای پایه کد سالیدیتی Solidity خود از Remix IDE استفاده میکنیم.
مرحله 1 – کد داده شده را در بخش Remix IDE Code کپی کنید.
مثال

مرحله 2 – در زیر تب کامپایل، بر روی Start Compile کلیک کنید.
مرحله 3 – در زیر تب Run، بر روی Deploy کلیک کنید.
مرحله 4 – در زیر تب Run، Solidity Test at 0x… را انتخاب کنید.
مرحله 5 – برای نمایش نتیجه بر روی getResult کلیک کنید.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Comments” tab_id=”comments”][vc_column_text]
آموزش سالیدیتی Solidity – کامنتها Comments
Solidity از هر دو نوع زبان C و ++C پشتیبانی میکند. بنابراین:
1.هر متن بین // و انتهای یک خط به عنوان یک کامنت در نظر گرفته میشود و توسط کامپایلر سالیدیتی Solidity نادیده گرفته میشود.
2.هر متنی بین /* و */ به عنوان کامنت در نظر گرفته میشود. این ممکن است چندین خط را دربر بگیرد.
مثال زیر نحوه استفاده از کامنتها در سالیدیتی Solidity را نشان دهد.

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Types” tab_id=”types”][vc_column_text]
آموزش سالیدیتی Solidity – انواع متغیر در زبان سالیدیتی
هنگام نوشتن برنامه به هر زبانی، باید از متغیرهای مختلفی برای ذخیره اطلاعات مختلف استفاده کنید. متغیرها چیزی جز مکانهای ذخیره شده حافظه برای ذخیره مقادیر نیستند. این بدان معنی است که هنگام ایجاد یک متغیر، فضای بیشتری را در حافظه ذخیره میکنید.
ممکن است بخواهید اطلاعات انواع دادههای مختلف مانند کاراکتر، عدد صحیح و … را ذخیره کنید. بر اساس نوع داده یک متغیر، سیستم عامل حافظه را اختصاص میدهد و تصمیم میگیرد که چه مواردی را میتوان در حافظه از پیش تعریف شده ذخیره نمود.
انواع متغیرها
Solidity مجموعه ای غنی از انواع داده داخلی و همچنین تعریف شده توسط کاربر را به برنامه نویس ارائه میدهد. جدول زیر هفت نوع داده اصلی C++ را لیست میکند.

آدرس
آدرس مقدار 20 بایت را نشان میدهد که نشان دهنده اندازه آدرس اتریوم است. از یک آدرس میتوان برای بدست آوردن موجودی از روش .balance استفاده کرد و میتوان برای انتقال موجودی به آدرس دیگر از روش .transfer استفاده شود.

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Variable” tab_id=”variable”][vc_column_text]
آموزش متغیرهای سالیدیتی Solidity
سالیدیتی Solidity از سه نوع متغیر پشتیبانی میکند.
متغیرهای حالت state – متغیرهایی که مقادیر آنها به طور دائم در یک قرارداد ذخیره میشود.
متغیرهای محلی Local – متغیرهایی که مقادیر انها تا زمان اجرای تابع وجود دارد.
متغیرهای سراسری Global – متغیرهای ویژه ای در فضای جهانی وجود دارد که برای بدست آوردن اطلاعات در مورد بلاکچین استفاده میشود.
سالیدیتی Solidity یک زبان تایپ شده است، به این معنی که نوع متغیر state یا Local باید در هنگام اعلام مشخص شود. هر متغیر اعلام شده بر اساس نوع خود همیشه یک مقدار پیش فرض دارد. هیچ مفهومی از “تعریف نشده” یا “پوچ” وجود ندارد.
متغیر حالت State
متغیرهایی که مقادیر آنها برای همیشه در یک قراردارد ذخیره میشود.

متغیر محلی Local
متغیرهایی که مقادیر آنها فقط در داخل تابعی که در آن تعریف شده در دسترس است. پارامترهای تابع همیشه از نوع متغیرهای محلی Local میباشند.

مثال

رنامه فوق را با استفاده از مراحل ارائه شده در فصل Solidity First Application اجرا کنید.
خروجی

متغیرهای سراسری Global
اینها متغیرهای خاصی میباشند که اطلاعاتی در مورد بلاکچین و خصوصیات تراکنشها یا معاملات را ارائه میدهند.

نامهای متغیر سالیدیتی Solidity
هنگام نام گذاری متغیرهای خود در سالیدیتی Solidity، قوانین زیر را در خاطر داشته باشید.
- شما نباید از هیچ یک از کلمات کلیدی از پیش تعریف شده سالیدیتی به عنوان نام متغیر استفاده کنید. این کلمات کلیدی در بخش بعدی ذکر شده است. به عنوان مثال، نام متغیرهای break یا Boolean معتبر نیستند.
- نام متغیرهای سالیدیتی Solidity نباید با یک عدد (0-9) شروع شوند. آنها باید با یک حرف یا کاراکتر شروع شوند. به عنوان مثال 123test یک متغیر نامعتبر است اما _123test یک متغیر معتبر میباشد.
- نام متغیرهیا سالیدیتی Solidity به حروف کوچک و بزرگ حساس هستند. به عنوان مثال، Name و name دو متغیر متفاوت هستند.
[/vc_column_text][/vc_tta_section][vc_tta_section title=”Variable Scope” tab_id=”variablescope”][vc_column_text]
آموزش سالیدیتی Solidity – دامنه متغیر Variable Scope
دامنه متغیرهای محلی محدود به عملکردی است که در آن تعریف شده است اما متغیرهای حالت میتوانند سه نوع دامنه داشته باشند.
1.عمومی Public – به متغیرهای state عمومی و داخلی میتوان از طریق پیام نیز دسترسی داشت. برای یک متغیر state عمومی، یک تابع گیرنده خودکار تولید میشود.
2.داخلی Internal – متغیرهای state داخلی فقط از طریق قرارداد فعلی یا قرارداد ناشی از آن بدون استفاده از این قابل دسترسی هستند.
3.خصوصی Private – متغیرهای state خصوصی فقط از طریق قرارداد فعلی که در قرارداد مشتق شده از آن تعریف نشده است، قابل دسترسی هستند.

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Operators” tab_id=”operators”][vc_column_text]
آموزش سالیدیتی Solidity – عملگرها
عملگر چیست؟
بیایید یک عبارت ساده را برای مثال 4 + 5 را که مساوی با 9 میباشد در نظر بگیریم. در اینجا 4 و 5 را عملوند و “+” را عملگر مینامند. سالیدیتی Solidity انواع عملگرهای زیر را پشتیبانی میکند.
- عملگرهای حسابی Arithmetic Operators
- عملگرهای مقایسه کننده Comparison Operators
- عملگرهای منطقی Logical Operators
- عملگرهای انتساب Assignment Operators
- عملگرهای شرطی ConditionalOperators
بیاید نگاهی به همه عملگرها داشته باشیم.
عملگرهای حسابی Arithmetic Operators
سالیدیتی Solidity عملگرهای حسابی زیر را پشتیبانی میکند.

فرض کنید متغیر A مقدار 10 را نگه میدارد و متغیر B مقدار 20 را نگه میدارد.
عملگر به اضافه (+) برای اعداد و همچنین رشتهها String کار میکند. به عنوان مثال، + 10″a” برابر با “a10 ” میدهد.
مثال
کد زیر نحوه استفاده از عملگرهای حسابی در سالیدیتی Solidity را نشان میدهد.

برنامه فوق را میتوانید با استفاده از مراحل ارائه شده در فصل Solidity First Application اجرا کنید.
خروجی

عملگرهای مقایسه کننده Comparison Operators
سالیدیتی Solidity از عملگرهای مقایسه کننده زیر پشتیبانی میکند.

فرض کنید متغیر A مقداری برابر 10 دارد و متغیر B دارای مقدار 20 است.
مثال
کد زیر نحوه استفاده از عملگرهای مقایسه کننده را در سالیدیتی Solidity نشان میدهد.

برنامه فوق را با استفاده از مراحل ارائه شده در فصل Solidity First Application اجرا کنید.
خروجی

عملگرهای منطقی
سالیدیتی Solidity از عملگرهای منطقی زیر پشتیبانی میکند.

فرض کنید متغیر A برابر با 10 و متغیر B برابر با 20 باشد. سپس
مثال
برای یادگیری نحوه پیاده سازی اپراتورهای منطقی سالیدیتی Solidity کد زیر را امتحان کنید.

برنامه فوق را با استفاده از مراحل ارائه شده در فصل Solidity First Application اجرا کنید.
خروجی

اپراتورهای Bitwise Solidity
سالیدیتی Solidity از عملگرهای Bitwise زیر پشتیبانی میکند.

فرض کنید متغیر A، 2 و متغیر B مقدار 3 را ذخیره کند. سپس
مثال
برای پیاده سازی عملگر Bitwise در سالیدیتی کد زیر را امتحان کنید

برنامه فوق را با استفاده از مراحل ارائه شده در فصل Solidity First Application اجرا کنید.
خروجی

عملگرهای انتساب Assignment
سالیدیتی Solidity از عملگرهای انتساب Assignment زیر پشتیبانی میکند.

مثال
کد زیر را برای اجرای عملگر Assignment در سالیدیتی امتحان کنید.

برنامه فوق را با استفاده از مراحل ارائه شده در فصل Solidity First Application اجرا کنید.
خروجی

عملگرهای شرطی (؟ 🙂
عملگر شرطی ابتدا عبارتی را برای مقدار درست یا نادرست ارزیابی میکند و سپس نتیجه ارزیابی، یکی از دو عبارت داده شده را اجرا میکند.

مثال
برای درک نحوه عملکرد عملگر شرطی، کد زیر را امتحان کنید.

برنامه فوق را با استفاده از مراحل ارائه شده در فصل Solidity First Application اجرا کنید.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Loops” tab_id=”loops”][vc_column_text]
آموزش سالیدیتی Solidity – حلقهها
در حین نوشتن قرارداد، ممکن است با شرایطی روبرو شوید که لازم است عملی را بارها و بارها انجام دهید. در چنین شرایطی، برای کاهش تعداد عملیات، باید دستورات حلقه ای بنویسید.
Solidity از تمام حلقههای لازم برای کاهش فشار برنامه نویسی پشتیبانی میکند.
حلقه While
اساسیترین حلقه در سالیدیتی Solidity حلقه While است که در این فصل مورد بحث قرار خواهد گرفت. هدف از حلقه While اجرای دستور یا بلاک کد به صورت مکرر تا زمانی که درست است، میباشد. هنگامی که عبارت نادرست شد، حلقه خاتمه مییابد.
فلوچارت

فلوچارت حلقه While به صورت زیر است.
سینتکس حلقه While در Solidity به شرح زیر است.

مثال
برای پیاده سازی حلقه While، مثال زیر را امتحان کنید.

برنامه فوق را با استفاده از مراحل ارائه شده در فصل Solidity First Application اجرا کنید.
خروجی

حلقه do…while
حلقه do…while شبیه حلقه while است با این تفاوت که بررسی وضعیت در انتهای حلقه اتفاق میافتد. این بدان معنی است که حلقه همیشه حداقل یک بار اجرا میشود، حتی اگر شرط نادرست باشد.
فلوچارت
فلوچارت حلقه do…while به صورت زیر است.

سینتکس
سینتکس حلقه do…while در Solidity به شرح زیر است.

توجه: علامت استفاده در انتهای حلقه do…while یعنی ; را فراموش نکنید.
مثال
برای یادگیری پیاده سازی حلقه do…while در Solidity مثال زیر را اجرا کنید.

برنامه فوق را با استفاده از مراحل ارائه شده در فصل Solidity First Application اجرا کنید.
خروجی

حلقه For
حلقه For جمع و جورترین شکل حلقه است. این حلقه شامل سه بخش مهم زیر است:
- مقداردهی اولیه حلقه که در آن مقدار شمارنده خود را مقدار اولیه قرار میدهیم. مقداردهی اولیه قبل از شروع حلقه اجرا میشود.
- تستی که در صورت صحت یا عدم صحت یک شرط مشخص شده انجام میشود. اگر شرط درست باشد، پس کد داده شده در داخل حلقه اجرا میشود، در غیر این صورت از حلقه خارج میشود.
- عبارت تکرار که در آن میتوانید شمارنده خود را کم یا زیاد کنید.
میتوانید هر سه قسمت را در یک خط واحد و با نقطه ویرگول از هم جدا کنید.
فلوچارت
فلوچارت حلقه for در Solidity به صورت زیر است.

سینتکس
سینتکس حلقه for به شکل زیر است.

مثال

برنامه فوق را با استفاده از مراحل ارائه شده در فصل Solidity First Application اجرا کنید.
خروجی

کنترل حلقه
Solidity کنترل کامل را برای حلقهها فراهم میکند. ممکن است شرایطی پیش بیاید که شما نیاز به بیرون آمدن از حلقه، بدون رسیدن به انتهای آن داشته باشید. همچنین ممکن است شرایطی پیش بیاید که بخواهید بخشی از کد را رد کرده و تکرار بعدی حلقه را شروع کنید.
برای رسیدگی به چنین شرایطی، Solidity عبارتهای break و Continue را ارائه میدهد. این عبارت به ترتیب برای بیرون امدن سریع از هر حلقه یا شروع تکرار بعدی هر حلقه استفاده میشوند.
دستورbreak
دستور break، که به طور خلاصه با عبارت switch معرفی شد، برای بیرون آمدن زودهنگام از یک حلقه و یا خارج شدن از حلقه استفاده میشود.
فلوچارت
فلوچارت دستور break به صورت زیر است.

مثال
مثال زیر استفاده از دستور break با حلقه while را نشان میدهد.

برنامه فوق را با استفاده از مراحل ارائه شده در فصل Solidity First Application اجرا کنید.
خروجی

دستور Continue
دستور Continue میگوید که بلافاصله تکرار بعدی حلقه را شروع کرده و از کد باقی مانده بگذرد. وقتی با یک دستور Continue مواجه شدید، جریان برنامه بلافاصله به عبارت بررسی حلقه منتقل میشود و اگر شرط درست باقی بماند، تکرار بعدی را شروع میکند. در غیر این صورت کنترل از حلقه خارج میشود.
مثال
این مثال استفاده از یک دستور Continue را در حلقه while نشان میدهد.

برنامه فوق را با استفاده از مراحلی که در فصل Solidity First Application ارائه شده، اجرا کنید.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Decision Making” tab_id=”decisionmaking”][vc_column_text]
دستورات شرطی در Solidity
هنگام نوشتن یک برنامه، ممکن است شرایطی پیش بیاید که شما نیاز دارید یکی از مسیرهای مشخص را انتخاب کنید. در چنین مواردی، شما باید از عبارات شرطی استفاده کنید که به برنامه شما امکان تصمیم گیری صحیح و انجام اقدامات صحیح را میدهد.
Solidity از گزارههای شرطی پشتیبانی میکند که برای انجام اقدامات مختلف بر اساس شرایط مختلف استفاده میشود. در اینجا دستور if…else را توضیح خواهیم داد.
فلوچارت if…else

سالیدیتی Solidity از فرمهای زیر دستور if…else پشتیبانی میکند.
دستور if
دستور if عبارت کنترلی میباشد که به Solidity امکان تصمیم گیری و اجرای دستورات را به صورت مشروط میدهد.
سینتکس
سینتکس برای دستور if به صورت زیر میباشد.

در اینجا یک دستور Solidity ارزیابی میشود. اگر مقدار به دست آمده true یا درست باشد، دستورهای داده شده اجرا میشوند. اگر عبارت false یا نادرست باشد، هیچ گزاره ای اجرا نمیشود. در بیشتر مواقع، هنگام تصمیم گیری از عملگرهای مقایسه کننده استفاده خواهید کرد.
مثال
برای درک چگونگی دستور if، مثال زیر را اجرا کنید.

برنامه فوق را با استفاده از مراحلی که در فصل Solidity First Application ارائه شده، اجرا کنید.
خروجی

دستور if…else
دستور if…else فرم بعدی دستور کنترل است که به Solidity اجازه میدهد تا دستورات را با روشی کنترل شده اجرا کند.
سینتکس

در اینجا عبارت Solidity ارزیابی میشود. اگر مقدار بدست آمده صحیح یا true باشد، عبارتهای داده شده در بلوک if اجرا میشوند. اگر عبارت نادرست یا false باشد، عبارتهای داده شده در بلوک else اجرا میشوند.
مثال

برنامه فوق را با استفاده از مراحلی که در فصل Solidity First Application ارائه شده، اجرا کنید.
خروجی

دستور if…else if…
دستور if…else if فرم پیشرفته ای از if…else است که به Solidity امکان تصمیم گیری صحیح را از چندین شرایط میدهد.
سینتکس
سینتکس دستور if-else-if به شرح زیر است.

هیچ چیز خاصی در مورد این کد وجود ندارد. این فقط مجموعه ای از دستورات if است، جایی که هر if بخشی از else عبارت قبلی است. دستورات بر اساس شرط true اجرا میشوند، اگر هیچ یک از شرایط true یا درست نباشد، بلوک else اجرا میشود.
مثال

برنامه فوق را با استفاده از مراحلی که در فصل Solidity First Application ارائه شده، اجرا کنید.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Strings” tab_id=”strings”][vc_column_text]
آموزش سالیدیتی Solidity – رشتهها Strings
در زبان سالیدیتی در بحث String یا رشتهها از ” و ‘ استفاده میکند. این رشته ای را به عنوان نوع داده برای اعلام متغیر از نوع رشته یا String فراهم میکند.

در مثال بالا، “test” یک رشته و data یک متغیر از نوع رشته یا string است. در زبان Solidity امکان تبدیل داخلی بین بایت به String و بالعکس را فراهم میکند. در Solidity میتوانیم به راحتی String را به یک متغیر از نوع 32 بایت byte اختصاص دهیم.

معرفی کاراکترها

تبدیل بایت Byte به رشته String
دادههای از نوع بایت Byte را میتوان با استفاده از () به رشته یا String تبدیل کرد.

مثال
کد زیر را اجرا کنید تا نحوه کار String در Solidity درک کنید.

برنامه فوق را با استفاده از مراحل ارائه شده در فصل Solidity First Application اجرا کنید.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Arrays” tab_id=”arrays”][vc_column_text]
آموزش سالیدیتی Solidity – آرایهها Arrays
آرایه یک ساختار داده است، که یک مجموعه پی در پی با اندازه ثابت از همان نوع عناصر را ذخیره میکند. یک آرایه برای ذخیره مجموعه ای از دادهها استفاده میشود.
به جای اعلام متغیرهای منفرد، مانند number0، nymber1، و … number99 شما یک متغیر آرایه را اعلام میکنید و از [0]،[1]، …، [99] را برای نمایش اعداد استفاده میکنید. متغیرهای منفرد یک عنصر خاص در یک آرایه توسط یک فهرست قابل دسترسی است.
در Solidity، یک آرایه میتواند دارای اندازه ثابت یا اندازه پویا باشد. برای آرایه ذخیره سازی، انواع مختلفی از عناصر نیز میتواند داشته باشد.
همه آرایهها در حافظه دارای مکان میباشند. کمترین آدرس مربوط به اولین عنصر و بالاترین آدرس به آخرین عنصر مربوط میباشد.
اعلام آرایهها

برای اعلام آرایه ای با اندازه ثابت در Solidity، برنامه نویس نوع عناصر و تعداد عناصر مورد نیاز آرایه را به شرح زیر مشخص میکند.
به این آرایه تک بعدی گفته میشود. سایز آرایه باید یک ثابت عددی بزرگتر از صفر باشد و نوع آن میتواند هر نوع داده Solidity معتبری باشد. به عنوان مثال، برای اعلام یک آرایه 10 عنصری به نام balance of type unit، از این دستور استفاده کنید.

برای اعلام آرایه ای با اندازه داینامیک در Solidity، برنامه نویس نوع عناصر را به شرح زیر مشخص میکند.

شروع آرایهها
میتوانید عناصر آرایه در Solidity را یک به یک با استفاده از یک دستور به صورت زیر مقدار دهی اولیه کنید.

تعداد مقادیر بین [] نمیتواند از تعداد عناصری که برای آرایه اعلام میکنیم بیشتر باشد. در زیر مثالی برای اختصاص یک عنصر از آرایه ذکر شده است.

شما دقیقا همان آرایه ای را که در مثال قبلی ایجاد کرده اید، ایجاد خواهید کرد.

دستور فوق به عنصر شماره 3 در آرایه مقدار 5 اختصاص میدهد.
ایجاد آرایههای دارای حافظه داینامیک
آرایههای حافظه داینامیک با استفاده از کلمه کلیدی جدید ایجاد میشوند.

ایندکس در آرایه
دسترسی به عناصر آرایه با ایندکس کردن نام آرایه ایجاد میشود. مثال زیر را در نظر بگیرید:

در این قسمت مفاهیمی برای دسترسی به آرایهها ذکر شده است.
length – length اندازه آرایه را برمی گرداند. برای تغییر اندازه آرایه داینامیک میتوان از length استفاده کرد.
Push – push اجازه میدهد تا یک عنصر به یک آرایه در انتها اضافه شود. طول جدید آرایه را برمی گرداند.
مثال
برای درک چگونگی عملکرد آرایهها در Solidity، کد زیرا امتحان کنید.

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Enums” tab_id=”enums”][vc_column_text]
نوع شمارشی Enums در Solidity
Enums یک متغیر را محدود میکند تا فقط یکی از چند مقدار از پیش تعریف شده داشته باشد. مقادیر موجود در این لیست شمارش شده را enum مینامند.
با استفاده از enums میتوانید تعداد اشکالات کد خود را کاهش دهید.
به عنوان مثال، اگر برنامه ای را برای آب میوه فروشی در نظر بگیریم، میتوان اندازه لیوان را به کوچک، متوسط و بزرگ محدود کرد. این اطمینان میدهد که به هیچ کس اجازه نمیدهد اندازه دیگری غیر از کوچک، متوسط یا بزرگ سفارش دهد.
مثال
با امتحان کردن کد زیر میتوانید با عملکرد enum در زبان برنامه نویسی Solidity آشنا شوید.

برنامه فوق را با استفاده از مراحل ارائه شده در فصل Solidity First Application اجرا کنید.
ابتدا بر روی setLarge کلیک کنید تا مقدار به صورت LARGE تنظیم شود و سپس getChoice را انتخاب کنید تا گزینه ی انتخاب شده انجام شود.
خروجی

برای دریافت گزینه پیش فرض، روی گزینه getDefaultChoice کلیک کنید.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Structs” tab_id=”structs”][vc_column_text]
ساختار Struct در زبان Solidity
انواع ساختار struct برای نشان دادن یک رکورد استفاده میشود. فرض کنید میخواهید کتابهای خود را در کتابخانه پیگیری کنید. شاید بخواهید ویژگیهای زیر را در مورد هر کتاب ردیابی کنید.
- عنوان
- نویسنده
- موضوع
- شناسه کتاب
تعریف ساختار Struct
برای تعریف ساختار، باید از کلمه کلیدی struct استفاده کنید. کلمه کلیدی struct نوع جدیدی از داده را با بیش از یک عضو تعریف میکند. قالب دستور struct به شرح زیر است.

مثال

دسترسی به یک Struct و متغیر آن
برای دسترسی به هر عضو struct، از عملگر دسترسی عضو (.) استفاده میکنیم. عملگر دسترسی عضو به عنوان یک دوره زمانی بین نام متغیر struct و عضوی از ساختاری که میخواهیم به آن دسترسی پیدا کنیم کدگذاری میشود. شما میتوانید از Struct برای تعریف متغیرها استفاده کنید. مثال زیر نحوه استفاده از ساختار Struct در برنامه را نشان میدهد.
مثال
کد زیر را امتحان کنید تا بفهمید چطور ساختارها structs در Solidity کار میکنند.

برنامه فوق را با استفاده از مراحلی که در فصل Solidity First Application ارائه شده، اجرا کنید.
ابتدا بر روی setBook کلیک کنید تا مقدار آن به صورت LARGE تنظیم شود و سپس بر روی getBookId کلیک کنید تا شناسه کتاب انتخاب شده را دریافت کنید.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Mapping” tab_id=”mapping”][vc_column_text]
آموزش سالیدیتی – مپینگ Mapping
مپینگ Mapping یک نوع مرجع برای آرایهها و ساختارها است. در زیر سینتکس برای اعلام Mapping آورده شده است.

جایی که
- KeyType: میتواند انواع بایت bytes و رشته String باشد. هیچ نوع مرجع پیچیده ای مجاز نیستند.
- ValueType: میتواند هر نوعی باشد.
توجه:
.Mapping فقط میتواند نوع storage داشته باشد و به طور کلی برای متغیرهای state استفاده میشود.
.Mapping میتواند به صورت عمومی علامت گذاری شود. Solidity به طور خودکار گیرنده ای برای آن ایجاد میکند.
مثال
کد زیر را اجرا کنید تا بفهمید Mapping در Solidity چگونه کار میکند.

برنامه فوق را با استفاده از مراحلی که در فصل Solidity First Application ارائه شده، اجرا کنید.
ابتدا بر روی updateBalance کلیک کنید تا مقدار آن 10 شود، سپس خروجی را مشاهده نمایید.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Conversions” tab_id=”conversions”][vc_column_text]
آموزش سالیدیتی Solidity – تبدیلها
Solidity امکان تبدیل ضمنی و همچنین صریح را فراهم میکند. کامپایلر Solidity امکان تبدیل ضمنی بین دو نوع داده را فراهم میکند به شرطی که امکان تبدیل ضمنی و از بین رفتن اطلاعات وجود نداشته باشد. به عنوان مثال unit8 به unit16 قابل تبدیل است اما int8 به unit256 قابل تبدیل نیست زیرا int8 میتواند حاوی مقدار منفی باشد که در unit256 مجاز نیست.
تبدیل صریح
ما میتوانیم با استفاده از سینتکس سازنده، صریحا یک نوع داده را به نوع دیگر تبدیل کنیم.

تبدیل به نوع کوچکتر ارزش بیتهای بالاتر را دارد.

تبدیل به نوع بالاتر، بیتها را به سمت چب اضافه میکند.

تبدیل به بایت کوچکتر برای دادههای بالاتر هزینه دارد.

تبدیل به بایت بزرگتر بیتها را به سمت راست اضافه میکند.

تبدیل بین بایتهای با اندازه ثابت و int تنها زمانی امکان پذیر است که هر دو دارای یک اندازه باشند.

در صورت عدم نیاز به کوتاه کردن طول داده، میتوان اعداد هگزادسیمال Hexadecimal را به هر نوع عددی اختصاص داد.

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Ether Units” tab_id=”etherunits”][vc_column_text]
آموزش سالیدیتی Solidity – واحدهای اتر Ether
در زبان برنامه نویسی سالیدیتی Solidity میتوان از wei ،Finney ،Szabo یا ether به عنوان پسوند استفاده کرد تا برای تبدیل انواع مختلف مبتنی بر اتر استفاده شود. کمترین واحد wei است و 1e12 نشان دهنده 1 به توان 12 است.

واحدهای زمانی Time Units
مشابه ارز، Solidity دارای واحدهای زمانی است که کمترین واحد دوم است و ما میتوانیم از ثانیهها، دقیقهها، ساعتها، روزها و هفتهها به عنوان پسوند برای نشان دادن زمان استفاده کنیم.

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Special Variables” tab_id=”specialvariables”][vc_column_text]
آموزش سالیدیتی Solidity – متغیرهای ویژه
متغیرهای ویژه متغیرهای موجود در سطح جهانی هستند و اطلاعاتی را در مورد بلاکچین فراه میکنند. در زیر لیستی از متغیرهای خاص آورده شده است.

مثال
کد زیر را امتحان کنید تا استفاده از msg، متغیر ویژه برای دریافت آدرس فرستنده در سالیدیتی Solidity را مشاهده کنید.

برنامه فوق را با استفاده از مراحل ارائه شده در فصل Solidity First Application اجرا کنید.
ابتدا روی updateBalance کلیک کنید تا مقدار آن 10 شود، سپس میتوانید خروجی را مشاهده نمایید.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Style Guide” tab_id=”styleguide”][vc_column_text]
آموزش سالیدیتی Solidity – Style Guide
Style Guide به حفظ سازگاری کد و خوانایی بیشتر کد کمک میکند. در زیر بهترین روشهایی است که هنگام نوشتن قرارداد با Solidity دنبال میشود.
Code Layout
Indentation – برای حفظ سطح indentation از 4 اسپیس به جای tab استفاده کنید. از میکس شدن اسپیسها با تبها خودداری کنید.
قانون دو خط خالی Two Blank Lines – از 2 خط خالی بین دو تعریف قرارداد استفاده کنید.

قانون یک خط خالی One Blank Line – از 1 خط خالی بین دو عملکرد استفاده کنید. در صورت اعلام نیازی به داشتن سطرهای خالی نیست.

حداکثر طول خط – یک خط نباید از 79 کاراکتر بیشتر باشد تا خوانندگان بتوانند به راحتی کد را تجزیه کنند.
قوانین Wrapping – اولین استدلال بدون باز کردن پرانتز در خط جدید میباشد. در هر استدلال از indent منفرد استفاده کنید. عنصر پایان دهنده ;( باید آخرین باشد.

کدگذاری کد مرجع Source Code Encoding – کدگذاری UTF-8 یا ASCII ترجیحا استفاده میشود.
Import – Import statements باید درست در بالای فایل پس از اعلام pragma قرار گیرند.
ترتیب فانکشنها – فانکشنها باید از نظر میزان visibility گروه بندی شوند.

از فضای خالی اضافی خودداری کنید – از فضای خالی بلافاصله داخل پرانتز، براکت و … خودداری کنید.
ساختارهای کنترل – Braces باید در همان اعلام کننده باز شوند. روی خط خودشان ببندید و همان تو رفتگی را حفظ کنید. از یک فضای دارای Brace استفاده کنید.

Function Declaration – از قانون بالا برای braces استفاده کنید. همیشه visibility label را اضافه کنید. Visibility label باید قبل از هر modifier باشد.

نگاشتها Mappings – هنگام اعلام متغیرهای mapping از فضای خالی خودداری کنید.

اعلام متغیرها – هنگام اعلام متغیرهای آرایه از فضای خالی خودداری کنید.

اعلام رشته String – برای اعلام یک رشته به جای ‘ از ̎ استفاده کنید.

ترتیب Layout
عناصر باید به ترتیب زیر چیدمان شوند.
- Pragma statements
- Import statements
- Interfaces
- Libraries
- Contracts
در Interfaces، Libraries یا contracts باید به صورت زیر باشد:
- Type declarations
- State variables
- Events
- Functions
قراردادهای نامگذاری Naming conventions
-Contracts و Library باید با استفاده از CapWord Style یا حروف بزرگ نامگذاری شود. به عنوان مثال، Owner، SmartContract و غیره.
-نام Contract و Library باید با نام فایل آنها مطابقت داشته باشد.
-در صورت وجود چندین contract یا library در یک فایل، از نام contract یا library اصلی استفاده کنید.


نامهای ساختار Struct
- از حروف بزرگ CapWords مانند SmartCoin استفاده کنید.
نامهای Event
- از سبک CapWords مانند Deposit‚ AfterTransfer استفاده کنید.
نامهای تابع
- از سبک mixedCase مانند initiateSupply استفاده کنید.
متغیرهای Local و State
- از سبک MixedCase مانند CreatorAddress‚ supply استفاده کنید.
Constants
- برای جدا کردن کلمات بزرگ از _ استفاده کنید مانند MAX_BLOCKS.
نامهای modifier
- از سبک mixCase مانند onlyAfter استفاده کنید.
نامهای Enum
- از سبک CapWords مانند TokenGroup استفاده کنید.
[/vc_column_text][/vc_tta_section][vc_tta_section title=”Functions” tab_id=”functions”][vc_column_text]
آموزش سالیدیتی Solidity – توابع Functions
یک تابع گروهی از کدهایی میباشد که به صورت مجدد قابل استفاده است و میتواند در هر کجای برنامه شما فراخوانی شود. با این کار دیگر نیازی به نوشتن مجدد همان کد نیست. در نوشتن کدهای ماژولار به برنامه نویسان کمک میکند. توابع به یک برنامه نویس اجازه میدهد تا یک برنامه بزرگ را به تعدادی از توابع کوچک و قابل کنترل تقسیم کند.
مانند هر زبان برنامه نویسی پیشرفته دیگر، Solidity نیز از تمام ویژگیهای لازم برای نوشتن کد ماژولار با استفاده از توابع پشتیبانی میکند. این بخش نحوه نوشتن توابع خود را در Solidity توضیح میدهد.
تعریف توابع Function Definition
قبل استفاده از یک تابع، باید آن را تعریف کنیم. متداولترین روش برای تعریف یک تابع در Solidity با استفاده از کلمه کلیدی function و به دنبال آن یک نام منحصر به فردف لیستی از پارامترها (که ممکن است خالی باشد ) و یک بلوک احاطه شده توسط {} است.
سینتکس
سینتکس اصلی در اینجا نشان داده شده است.

مثال

فراخوانی تابع
برای فراخوانی یک تابع در جایی از قرارداد، شما به سادگی باید نام آن تابع را همانطور که در کد زیر نشان داده شده است، بنویسید.
کد زیر را امتحان کنید تا بدانید که این رشته string در Solidity چگونه کار میکند.

برنامه فوق را با استفاده از مراحلی که در فصل Solidity First Application ارائه شده است، اجرا کنید.
خروجی

پارامترهای تابع
تا کنون، توابع بدون پارامتر را مشاهده کرده ایم. اما یک امکان برای pass پارامترهای مختلف در هنگام فراخوانی یک تابع وجود دارد. این پارامترهای pass را میتوان در داخل تابع ضبط کرد و هر تغییری را میتوان بر روی آن پارامترها انجام داد. یک تابع میتواند چندین پارامتر را که با کاما از هم جدا شده اند، بگیرد.
مثال
مثال زیر را انجام دهید. ما در اینجا از یک تابع unit2str استفاده کرده ایم. این یک پارامتر است.

برنامه فوق را با استفاده از مراحلی که در فصل Solidity First Application ارائه شده است، اجرا کنید.
خروجی

عبارت بازگشتی
یک تابع Solidity میتواند یک عبارت بازگشتی اختیاری داشته باشد. اگر میخواهید مقداری را از یک تابع برگردانید، این مورد لازم است. این دستور باید آخرین عبارت یک تابع باشد.
مانند مثال بالا، ما از تابع unit2str برای برگرداندن یک رشته string استفاده میکنیم.
در Solidity، یک تابع میتواند مقادیر متعددی را نیز بازگرداند. مثال زیر را ببینید.

برنامه فوق را با استفاده از مراحلی که در فصل Solidity First Application ارائه شده است، اجرا کنید.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Function Modifiers” tab_id=”functionmodifiers”][vc_column_text]
آموزش سالیدیتی Solidity – اصلاح کنندههای تابع Function Modifiers
Function Modifiers یا اصلاح کنندههای تابع برای اصلاح رفتار یک تابع استفاده میشود. به عنوان مثال برای اضافه کردن یک شرط به به یک تابع میتواند مورد استفاده قرار گیرد.
ابتدا یک اصلاح کننده یا modifier با پارامتر یا بدون آن ایجاد میکنیم.

بدنه تابع در جایی قرار میگیرد که نماد ویژه “;_” در تعریف یک اصلاح کننده یا modifier ظاهر میشود. بنابراین اگر در هنگام فراخوانی این تابع شرط modifier برقرار باشد، تابع اجرا میشود و در غیر اینصورت، یک استثنا وجود دارد.
مثال زیر را ببینید.

[/vc_column_text][/vc_tta_section][vc_tta_section title=”View Functions” tab_id=”viewfunctions”][vc_column_text]
آموزش سالیدیتی Solidity – توابع View
توابع View اطمینان میدهند که state را تغییر نمیدهند. یک تابع را میتوان به عنوان view اعلام کرد. عبارات زیر اگر در تابع وجود داشته باشد، state را اصلاح میکنند و کامپایلر در چنین مواردی هشدار میدهد.
- اصلاح متغیرهای state / Modifying state variables
- Emitting events
- ایجاد قراردادهای دیگر Creating other contracts
- استفاده از self-destruct
- ارسال اتر از طریق فراخوانی Sending Ether via calls
- فراخوانی هر تابع که به عنوان view یا pure مشخص نشده باشد.
- استفاده از فراخوانیهای سطح پایین using low-level calls
- Using assembly containing certain opcodes
روش گیرنده به طور پیش فرض توابع view است.
مثال زیر را که از یک تابع view استفاده نموده است، مشاهده نمایید.
مثال

برنامه فوق را با استفاده از مراحلی که در فصل Solidity First Application ارائه شده است، اجرا کنید.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Pure Functions” tab_id=”purefunctions”][vc_column_text]
آموزش سالیدیتی Solidity – توابع Pure
توابع pure اطمینان حاصل میکنند که state را نمیخوانند و یا اصلاح نمیکنند. یک تابع را میتوان pure اعلام کرد. عبارات زیر اگر در تابع وجود داشته باشد، خواندن state را در نظر گرفته و کامپایلر در چنین مواردی هشدار میدهد.
- خواندن متغیرهای state
- دسترسی address(this).balance یا <address>.balance
- دسترسی به هر یک از متغیرهای خاص بلوک tx، msg ( msg.sig و msg.data قابل خواندن است).
- فراخوانی هر تابع که pure مشخص نشده باشد.
- استفاده از inline assembly that contains certain opcodes
توابع pure میتوانند از توابع revert() و require() برای بازگشت تغییرات state در صورت بروز خطا، استفاده کنند.
مثال زیر را که از یک تابع view استفاده نموده است، مشاهده نمایید.
مثال

برنامه فوق را با استفاده از مراحلی که در فصل Solidity First Application ارائه شده است، اجرا کنید.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Fallback Function” tab_id=”fallbackfunction”][vc_column_text]
آموزش سالیدیتی Solidity – تابع بازگشتی Fallback Function
تابع بازگشتی نوع خاصی از تابع است که در قرارداد در دسترس است و ویژگیهای زیر را دارا میباشد.
- زمانی فراخوانی میشود که یک تابع موجود در قرارداد فراخوانی شود.
- لازم است که در خارج علامت گذاری شود.
- هیچ اسمی ندارد.
- هیچ استدلالی ندارد.
- نمیتواند هیچ چیز را برگرداند.
- در هر قرارداد میتواند یک بار تعریف شود.
- اگر قرارداد اتر بدون داده دریافت کند، استثنا ایجاد خواهد شد.
مثال زیر مفهوم تابع بازگشتی در هر قرارداد را نشان میدهد.
مثال

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Function Overloading” tab_id=”functionoverloading”][vc_column_text]
آموزش سالیدیتی Solidity – تابع overloading
شما میتوانید چندین تعریف برای همان نام تابع در یک محدوده داشته باشید. تعریف تابع باید با انواع و یا تعداد آرگومانهای موجود در لیست آرگومانها از یکدیگر متفاوت باشد. نمیتوانید تابع را بارگیری کنید که فقط با نوع بازگشتی متفاوت هستند.
مثال زیر مفهوم تابع overloading در سالیدیتی Solidity را نشان میدهد.

برنامه فوق را با استفاده از مراحلی که در فصل Solidity First Application ارائه شده است، اجرا کنید.
ابتدا بر روی callSumWithTwoArguments کلیک کنید و سپس بر روی callSumWithThreeArguments کلیک نمایید تا نتیجه را مشاهده کنید.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Mathematical Functions” tab_id=”mathematicalfunctions”][vc_column_text]
آموزش سالیدیتی Solidity – توابع ریاضی Mathematical Functions
سالیدیتی Solidity توابع ریاضی داخلی را به خوبی فراهم میکند. در زیر روشهای بسیار استفاده شده است.
-addmod(unit x‚ unit y, unit k) returns (unit) – محاسبه میکند (x + y) % k جایی که جمع با دقت انجام میشود و در 2256 wrap نمیشود.
-mulmod(unit x‚ unit y, unit k) returns (unit) – محاسبه میکند (x * y) % k جایی که جمع با دقت دلخواه انجام میشود و در 2256 wrap نمیشود.
مثال زیر استفاده از توابع ریاضی را در Solidity نشان میدهد.
مثال

برنامه فوق را با استفاده از مراحلی که در فصل Solidity First Application ارائه شده است، اجرا کنید.
ابتدا بر روی callAddMod کلیک کنید و سپس callMulMod را بزنید تا نتجیه را مشاهده نمایید.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Cryptographic Functions” tab_id=”cryptographicfunctions”][vc_column_text]
آموزش سالیدیتی Solidity – توابع رمزنگاری
Solidity توابع رمزنگاری داخلی ارائه میدهد. در زیر متدهای مهم آورده شده است.
- keccak256(bytes memory) returns (bytes32) – هش ورودی Keccak-256 را محاسبه میکند.
- sha256(bytes memory) returns (bytes20) – هش ورودی SHA-256 را محاسبه میکند.
- ripemd160(bytes memory) returns (bytes20) – هش ورودی RIPEMD-160 را محاسبه میکند.
- sha256(bytes memory) returns (bytes32)- هش ورودی SHA-256 را محاسبه میکند.
- ecrecover(bytes32 hash‚ unit8 v‚ bytes32 s) returns (address) – آدرس مرتبط با کلید عمومی را از امضای منحنی بازیابی کنید ویا صفر را در هنگام خطا بازگردانید.
پارامترهای تابع با مقادیر ECDSA امضا مطابقت دارند:
- r: first 32 bytes of signature
- s: second 32 bytes of signature
- v: final 1 byte of signature
این روش یک آدرس را بر میگرداند.
مثال زیر استفاده از تابع رمزنگاری را در سالیدیتی Solidity نشان میدهد.
مثال

برنامه فوق را با استفاده از مراحلی که در Solidity First Application ارائه شده است، اجرا کنید.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Whithdrawal Pattern” tab_id=”whithdrawalpattern”][vc_column_text]
آموزش سالیدیتی Solidity – الگوی برداشت Withdrawal Pattern
الگوی برداشت اطمینان میدهد که فراخوانی انتقال مستقیم که تهدیدی برای امنیت است، ایجاد نمیشود. قرارداد زیر استفاده غیر مطمئن از فراخوانی انتقال برای ارسال اتر را نشان میدهد.

قرارداد فوق میتواند در حالت غیر قابل استفاده ارائه شود زیرا باعث میشود که غنیترین قرارداد با شکست تابع بازگشتی مواجه شود. وقتی تابع fallback یا تابع بازگشتی از کار بیفتد، تابع becomeRichest() نیز از کار میافتد و قرارداد برای همیشه به تعویق میافتد. برای کاهش این مشکل، میتوانیم از الگوی برداشت استفاده کنیم.
در الگوی برداشت، ما قبل از هر بار انتقال مبلغ مورد نظر را تنظیم میکنیم. این موضوع اطمینان حاصل میکند که تنها قرارداد فراخوان شده از کار میافتد.

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Restricted Access” tab_id=”restrictedaccess”][vc_column_text]
آموزش سالیدیتی Solidity – دسترسی محدود Restricted Access
دسترسی محدود به یک قرارداد یک عمل معمول است. به طور پیش فرض، یک قرارداد فقط خواندنی است مگر اینگه به صورت عمومی مشخص شود.
ما میتوانیم افرادی که میتوانند state قرارداد را تغییر دهند یا توابع قراردادها را با استفاده از اصلاح کنندهها modifiers فراخوانی کنند، محدود کنیم. همانطور که در زیر توضیح داده شده است، چندین اصلاح کننده modifiers ایجاد و استفاده خواهیم کرد.
- onlyBy – اگر یکبار از یک تابع استفاده شود، فقط صدا کننده caller ذکر شده میتواند این تابع را فراخوانی کند.
- onlyAfter – پس از استفاده از یک تابع، میتوان آن تابع را پس از یک دوره زمانی خاص فراخوانی کرد.
- costs – هنگامی که از یک تابع استفاده میشود، caller یا صدا کننده فقط در صورت ارائه مقدار مشخصی میتواند این تابع را فراخوانی کند.
مثال

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Contracts” tab_id=”contracts”][vc_column_text]
آموزش سالیدیتی Solidity – قراردادها Contracts
قرارداد در سالیدیتی Solidity مشابه یک کلاس در ++C است. یک قرارداد دارای ویژگیهای زیر است.
سازنده Constructor – یک تابع ویژه با کلمه کلیدی constructor اعلام میشود که در هر قرارداد یک بار اجرا میشود و هنگام ایجاد قرارداد فراخوانی میشود.
متغیرهای state – متغیرها در هر قرارداد برای ذخیره state قرارداد یا وضعیت قرارداد ارائه میشوند.
توابع Functions – توابع در هر قرارداد که میتواند متغیرهای state را اصلاح کند تا state قرارداد را تغییر دهد.
کمیتهای Visibility
در زیر، کمیتهای مختلف visibility برای توابع یا متغیرهای state قرارداد وجود دارد.
خارجی external – توابع خارجی به این منظور هستند که توسط قراردادهای دیگر فراخوانی میشوند. آنها نمیتوانند برای فراخوانی داخلی استفاده شوند. ()Function_name لازم است. متغیرهای state را نمیتوان به عنوان توابع خارجی مشخص کرد.
Public – توابع public / متغیرها را میتوان از دو جهت خارجی و داخلی استفاده کرد. برای متغیر public state، Solidity به طور خودکار یک تابع گیرنده ایجاد میکند.
داخلی internal – توابع داخلی/متغیرها فقط میتوانند به صورت داخلی یا توسط قراردادهای مشتق شده استفاده شوند.
Private – توابع خصوصی/متغیرها فقط در داخل و حتی در قراردادهای مشتق شده قابل استفاده هستند.
مثال

برنامه فوق را با استفاده از مراحلی که در Solidity First Application ارائه شده است، اجرا کنید. روشهای مختلف قراردادها را اجرا کنید. برای ()E.getComputedResult به دنبال ()E.getResult نشان میدهد.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Inheritance” tab_id=”inheritance”][vc_column_text]
آموزش سالیدیتی Solidity – وراثت Inheritance
وراثت راهی برای گسترش عملکرد قرارداد است. Solidity از وراثت منفرد و چندگانه پشتیبانی میکند. در زیر موارد برجسته و اصلی آورده شده است.
- یک قرارداد مشتق شده میتواند به تمام اعضای غیر خصوصی از جمله روشهای داخلی و متغیرهای state دسترسی داشته باشد. اما استفاده از این مجاز نیست.
- ما میتوانیم تابع super قرارداد را با استفاده از super keyword یا با استفاده از نام قرارداد super فراخوانی کنیم.
- در صورت وراثت چندگانه، فراخوانی تابع با استفاده از super، بیشتر قراردادهای مشتق شده را ترجیح میدهد.
مثال

برنامه فوق را با استفاده از مراحلی که در فصل Solidity First Application ارائه شده است، اجرا کنید. روشهای مختلف قراردادها را اجرا کنید.
برای ()E.getComputedResult و به دنبال ()E.getResultنشان میدهد.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Constructors” tab_id=”constructors”][vc_column_text]
آموزش سالیدیتی Solidity – سازندهها Constructors
سازنده constructor یک تابع خاص است که با استفاده از کلمه کلیدی constructor اعلام میشود. این برای شروع متغیرهای state قرارداد استفاده میشود. در زیر مشخصات اصلی constructor آورده شده است.
- یک قرارداد میتواند فقط یک constructor داشته باشد.
- یک کد constructor زمانی که یک قرارداد ایجاد میشود، یک بار اجرا میشود و برای شروع state قرارداد استفاده میشود.
- پس از اجرای کد constructor، کد نهایی بر روی بلاکچین مستقر میشود. این کد شامل توابع عمومی و کدهای قابل دسترسی از طریق توابع عمومی است. کد constructor یا هر روش داخلی که فقط توسط constructor استفاده میشود در کد نهایی موجود نیست.
- یک constructor میتواند هم عمومی و هم داخلی باشد.
- یک constructor داخلی قرارداد را به صورت چکیده علامت گذاری میکند.
- در صورت عدم تعریف constructor ،constructor پیش فرض در قرارداد حضور دارد.

- در صورتی که قرارداد پایه constructor استدلال داشته باشد، هر قرارداد مشتق شده باید آنها را تصویب کند.
- constructor پایه را میتوان مستقیما با استفاده از روش زیر راه اندازی کرد.

- در صورتی که قرارداد پایه constructor استدلال داشته باشد، هر قرارداد مشتق شده باید آنها را تصویب کند.
- constructor پایه را میتوان مستقیما با استفاده از روش زیر راه اندازی کرد.

- راههای مستقیم و غیرمستقیم برای مقداردهی اولیه constructor قرارداد پایه مجاز نیست.
- اگر قرارداد مشتق شده استدلالها را به constructor قرارداد اصلی منتقل نکند، قرارداد مشتق شده انتزاعی خواهد شد.
[/vc_column_text][/vc_tta_section][vc_tta_section title=”Abstract Contracts” tab_id=”abstractcontracts”][vc_column_text]
آموزش سالیدیتی Solidity – قراردادهای انتزاعی Abstract Contracts
قرارداد انتزاعی Abstract Contracts قراردادی است که حداقل شامل یک تابع بدون هیچگونه پیاده سازی باشد. از چنین قراردادی به عنوان قرارداد پایه یا اصلی استفاده میشود. به طور کلی یک قرارداد انتزاعی شامل توابع انتزاعی و اجرایی است. قرارداد مشتق شده تابع انتزاعی را پیاده سازی میکند و از توابع موجود در صورت لزوم استفاده میکند.
در صورتی که یک قرارداد مشتق شده تابع انتزاعی را اجرا نکند، این قراردا ممشتق شده به عنوان انتزاعی علامت گذاری میشود.
مثال

کد زیر را اجرا کنید تا متوجه شوید قراردادهای انتزاعی در Solidity چگونه کار میکند.
برنامه فوق را با استفاده از مراحل ارائه شده در فصل Solidity First Application اجرا کنید.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Interfaces” tab_id=”interfaces”][vc_column_text]
آموزش سالیدیتی Solidity – اینترفیسها Interfaces
اینترفیسها مشابه قراردادهای انتزاعی هستند و با استفاده از کلمه کلیدی interface ایجاد میشوند. در زیر مشخصات اصلی یک interface آورده شده است.
- اینترفیس نمیتواند هیچ تابعی با اجرا داشته باشد.
- توابع یک interface فقط از نوع خارجی است.
- interface نمیتواند یک constructor باشد.
- interface نمیتواند متغیرهای state داشته باشد.
- interface میتواند دارای enum باشد.
مثال
کد زیر را امتحان کنید تا متوجه شوید که interface در Solidity چگونه کار میکند.

با استفاده از مراحلی که در فصل Solidity First Application ارائه شده است، برنامه فوق را اجرا کنید.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Libraries” tab_id=”libraries”][vc_column_text]
آموزش سالیدیتی Solidity – کتابخانهها Libraries
کتابخانهها مشابه قراردادها میباشند اما عمدتا برای استفاده مجدد هستند. کتابخانه شامل توابعی است که سایر قراردادها میتوانند از آنها استفاده کنند. Solidity محدودیتهای خاصی در استفاده از کتابخانه دارد. در ادامه مشخصات اصلی کتابخانه Solidity آورده شده است.
- توابع کتابخانه میتوانند مستقیما فراخوانی شوند، اگر آنها state را تغییر ندهند. این بدان معناست کع توابه pure یا view از خارج کتابخانه قابل فراخوانی هستند.
- از انجا که فرض میشود کتابخانه بدون state نیست، نمیتواند از بین برود.
- یک کتابخانه نمیتواند متغیرهای state داشته باشد.
- یک کتابخانه نمیتواند هیچ عنصری را به ارث برساند.
- کتابخانه را نمیتوان به ارث برد.
مثال
کد زیر را امتحان کنید تا نحوه کار کتابخانه در Solidity را درک کنید.

شما میتوانید کد بالا را با استفاده از مراحلی که در فصل Solidity First Application ارائه شده است، اجرا کنید.
خروجی

استفاده از For
این دستورالعمل با استفاده از A برای B، میتواند برای پیوستن توابع کتابخانه A به یک نوع داده شده B استفاده شود. این توابع از نوع caller به عنوان اولین پارامتر استفاده میشود.
مثال
میتوانید با اجرای کد زیر نحوه کار کتابخانه در Solidity را درک کنید.

برنامه فوق را با استفاده از مراحلی که در فصل Solidity First Application ارائه شده است، اجرا کنید.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Assembly” tab_id=”assembly”][vc_column_text]
آموزش سالیدیتی Solidity – اسمبلی Assembly
Solidity گزینه ای را برای استفاده از زبان اسمبلی برای نوشتن اسمبلی inline در کد اصلی سالیدیتی فراهم میکند. همچنین میتوانیم یک کد Standalone Assembly بنویسیم که سپس به bytecode تبدیل شود. Standalone Assembly یک زبان میانی برای یک کامپایلر Solidity است و کد Solidity را به یک Standalone Assembly و سپس به کد Byte تبدیل میکند. ما میتوانیم از همان زبان استفاده شده در Inline Assembly برای نوشتن کد در یک مجموعه مستقل استفاده کنیم.
اسمبلی Inline
کد Inline assembly را میتوان درون کد اصلی Solidity قرار داد تا کنترل دقیق تری بر EVM داشته باشد و به ویژه هنگام نوشتن توابع کتابخانه استفاده میشود.
یک کد اسمبلی در زیر بلاک اسمبلی { … } نوشته میشود.
مثال
کد زیر را امتحان کنید تا نحوه کار کتابخانه در Solidity را درک کنید.

برنامه فوق را با استفاده از مراحلی که در فصل Solidity First Application ارائه شده است، اجرا کنید.
خروجی
![]()
[/vc_column_text][/vc_tta_section][vc_tta_section title=”Events” tab_id=”events”][vc_column_text]
آموزش سالیدیتی Solidity – رویدادها Events
Event یک عضو ارثی inheritable در یک قرارداد است. یک event منتشر میشود و استدلالهای منتقل شده در گزارشهای معاملات یا تراکنشها را ذخیره میکند. این گزارشها در بلاکچین ذخیره میشوند و تا زمان حضور قرارداد در بلاکچین با استفاده از آدرس قرارداد قابل دسترسی هستند. یک event ایجاد شده از طریق قراردادها، حتی event که آنها را ایجاد و منتشر کرده است، قابل دسترسی نیست.
یک event را میتوان با استفاده از کلمه کلیدی event اعلام کرد.

مثال
با امتحان کد زیر میتوانید با عملکرد یک event در Solidity آشنا شوید.
ابتدا یک قرارداد ایجاد کنید و یک event منتشر کنید.

سپس به event قرارداد در کد JavaScript دسترسی پیدا کنید.

این برنامه باید جزئیات مشابه موارد زیر را چاپ کند.
خروجی

[/vc_column_text][/vc_tta_section][vc_tta_section title=”Error Handling” tab_id=”errorhandling”][vc_column_text]
آموزش سالیدیتی Solidity – مدیریت خطا Error Handling
Solidity توابع مختلفی را برای مدیریت خطا فراهم میکند. به طور کلی وقتی خطایی رخ میدهد، state به state اولیه برگردانده میشود. بررسیهای دیگر برای جلوگیری از دسترسی کد غیرمجاز است. در زیر برخی از روشهای مهم مورد استفاده در مدیریت خطا آورده شده است.
- assert (شرط bool) – در صورت عدم تحقق شرط، این فراخوانی متد باعث کدگذاری نامعتبر میشود و هر گونه تغییر در state برگردانده میشود. این روش برای خطاهای داخلی استفاده میشود.
- require (شرط bool) – در صورت عدم تحق شرط، این فراخوانی روش به state اولیه یا حالت اولیه برمی گردد. این روش برای خطاهای ورودیها یا اجزای خارجی استفاده میشود.
- require (شرط bool، string memory message) – در صورت عدم تحقق شرط، این فراخوانی روش به state اولیه برمی گردد. این روش برای خطاهای موجود در ورودیها یا اجزای خارجی استفاده میشود. این گزینه برای ارائه پیام سفارشی فراهم میکند.
- ()revert – این روش اجرا را متوقف میکند و هر گونه تغییر ایجاد شده را به state اولیه بر میگرداند.
- revert (string memory reason) – این روش اجرا را متوقف میکند و هرگونه تغییر ایجاد شده را به state اولیه برمی گرداند. این گزینه ای را برای ارائه پیام سفارشی فراهم میکند.
مثال
با امتحان کد زیر میتوانید با نحوه مدیریت خطا در Solidity آشنا شوید.

وقتی revert فراخوانی شود، دادههای هگزادسیمال را به شرح زیر برمی گرداند.
خروجی

[/vc_column_text][/vc_tta_section][/vc_tta_tour][/vc_column][/vc_row]