آموزش سالیدیتی Solidity

salamcrypto

زبان برنامه نویسی Solidity سالیدیتی چیست؟  یک زبان برنامه نویسی سطح بالا و قرارداد محور برای اجرای قراردادهای هوشمند است. سالیدیتی Solidity بسیار تحت تاثیر زبان های C++ Python، و JavaScript است و برای هدف قرار دادن ماشین مجازی اتریوم یا EVM طراحی شده است.

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

سالیدیتی Solidity از انواع کتابخانه ها و زبان برنامه نویسی پیچیده تعریف شده توسط کاربر پشتیبانی می کند. برای ایجاد قراردادهایی همچون سرمایه گذاری گسترده و کیف پول های چند امضایی می توانید از سالیدیتی Solidity استفاده کنید.

اتریوم Ethereum چیست؟

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

ماشین مجازی اتریوم EVM

ماشین مجازی اتریوم یا Ethereum Virtual Machine که به آن EVM نیز گفته می شود، محیطی برای اجرای قراردادهای هوشمند در اتریوم است. ماشین مجازی اتریوم در تامین امنیت و اجرای کدهای نامعتبر در سراسر جهان متمرکز است.

EVM تخصصی در جلوگیری از حملات دارد و اطمینان حاصل می کند که ارتباطات بدون هیچگونه تداخل بالقوه ای برقرار می شود. ماشین مجازی اتریوم Ethereum Virtual Machine به گونه ای طراحی شده است که به عنوان یک محیط اجرا برای قراردادهای هوشمند مبتنی بر اتریوم عمل می کند.

قرارداد هوشمند Smart Contract چیست؟

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

مفهوم قراردادهای هوشمند برای اولین بار توسط Nick Szabo در سال 1994 ارائه شد. در ادامه به جزئیات بیشتری در ارتباط با قراردادهای هوشمند خواهیم پرداخت.

آموزش  سالیدیتی Solidity – تنظیم محیط

در این فصل توضیح خواهیم داد که چگونه می توان کامپایلر Solidity را بر روی دستگاه CentOS راه اندازی کرد. اگر دستگاه مجهز به سیستم عامل لینوکس ندارید، می توانید از کامپایلر Compiler آنلاین ما برای قرارداد های کوچک و یادگیری سریع سالیدیتی Solidity استفاده کنید.

روش 1 – npm / Node.js

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

Node.js را نصب کنید

ابتدا مطمئن شوید که Node.js را در دستگاه CentOS خود در دسترس دارید. اگر در دسترس نیست، با استفاده از دستورات زیر آن را نصب کنید.

Node.js را نصب کنید
Node.js را نصب کنید

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

Node.js را نصب کنید
Node.js را نصب کنید

Solc را نصب کنید

Solc را نصب کنید
Solc را نصب کنید

پس از نصب Node.js، می توانید به صورت زیر کامپایلر Solidity را نصب کنید.

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

Solc را نصب کنید
Solc را نصب کنید

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

Solc را نصب کنید
Solc را نصب کنید

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

روش 2 – تصویر Docker

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

روش 2 – تصویر Docker
روش 2 – تصویر Docker

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

روش 2 – تصویر Docker
روش 2 – تصویر Docker

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

روش 2 – تصویر Docker
روش 2 – تصویر Docker

روش 3 – نصب پکیج های باینری Binary Packages

اگر شما مایل به نصب کامپایلر کامل بر روی دستگاه لینوکس خود هستید، لطفا وب سایت رسمی نصب کامپایلر Solidity را بررسی کنید.

آموزش سالیدیتی Solidity – سینتکس پایه Basic Syntax

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

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

سالیدیتی Solidity – سینتکس پایه Basic Syntax
سالیدیتی Solidity – سینتکس پایه Basic Syntax

پراگما Pragma

خط اول یک دستورالعمل است که می گوید کد برای Solidity نسخه 0.4.0 یا هر مورد جدیدتری نوشته شده است که عملکرد را تا نسخه 0.6.0 از بین نمی برد، اما شامل نمی شود.

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

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

پراگما Pragma
پراگما Pragma

در اینجا شرط دوم با استفاده از ^ اضافه می شود.

قرارداد Contract

قرارداد سالیدیتی Solidity مجموعه ای از کد (توابع آن) و داده ها است که در یک آدرس خاص در بلاکچین اتریوم قرار دارد.

خط unitstoredData متغیری را با نام storedData از نوع unit اعلام می کند و توابع می توانند برای تغییر یا بازیابی مقدار متغیر استفاده شوند.

وارد کردن فایل ها Importing Files

اگرچه مثال فوق فایل ورودی ندارد اما سالیدیتی Solidity از گزاره های وارد شده پشتیبانی می کند که شباهت زیادی با عبارت موجود در زبان JavaScrypt دارد.

عبارت زیر تمامی نمادها را از ” filename ” وارد می کند.

وارد کردن فایل ها Importing Files
وارد کردن فایل ها Importing Files

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

وارد کردن فایل ها Importing Files
وارد کردن فایل ها Importing Files

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

کلمات کلیدی از پیش تعریف شده

در جدول زیر شما می توانید کلمات کلیدی از پیش تعریف شده در سالیدیتی Solidity را مشاهده نمایید.

کلمات کلیدی از پیش تعریف شده
کلمات کلیدی از پیش تعریف شده

آموزش سالیدیتی Solidity – First Application

ما برای کامپایل و اجرای پایه کد سالیدیتی Solidity خود از Remix IDE استفاده می کنیم.

مرحله 1 – کد داده شده را در بخش Remix IDE Code کپی کنید.

مثال

کد داده شده را در بخش Remix IDE Code کپی کنید
کد داده شده را در بخش Remix IDE Code کپی کنید

مرحله 2 – در زیر تب کامپایل، بر روی Start Compile کلیک کنید.

مرحله 3 – در زیر تب Run، بر روی Deploy کلیک کنید.

مرحله 4 – در زیر تب Run، Solidity Test at 0x… را انتخاب کنید.

مرحله 5 – برای نمایش نتیجه بر روی getResult کلیک کنید.

خروجی

خروجی
خروجی

آموزش سالیدیتی Solidity – کامنتها Comments

Solidity از هر دو نوع زبان C و ++C پشتیبانی می کند. بنابراین:

1.هر متن بین // و انتهای یک خط به عنوان یک کامنت در نظر گرفته می شود و توسط کامپایلر سالیدیتی Solidity نادیده گرفته می شود.

2.هر متنی بین /* و */ به عنوان کامنت در نظر گرفته می شود. این ممکن است چندین خط را دربر بگیرد.

مثال زیر نحوه استفاده از کامنت ها در سالیدیتی Solidity را نشان دهد.

نحوه استفاده از کامنت ها در سالیدیتی
نحوه استفاده از کامنت ها در سالیدیتی

آموزش سالیدیتی Solidity – انواع متغیر در زبان سالیدیتی

هنگام نوشتن برنامه به هر زبانی، باید از متغیر های مختلفی برای ذخیره اطلاعات مختلف استفاده کنید. متغیرها چیزی جز مکانهای ذخیره شده حافظه برای ذخیره مقادیر نیستند. این بدان معنی است که هنگام ایجاد یک متغیر، فضای بیشتری را در حافظه ذخیره می کنید.

ممکن است بخواهید اطلاعات انواع داده های مختلف مانند کاراکتر، عدد صحیح و … را ذخیره کنید. بر اساس نوع داده یک متغیر، سیستم عامل حافظه را اختصاص می دهد و تصمیم می گیرد که چه مواردی را می توان در حافظه از پیش تعریف شده ذخیره نمود.

انواع متغیرها

Solidity مجموعه ای غنی از انواع داده داخلی و همچنین تعریف شده توسط کاربر را به برنامه نویس ارائه می دهد. جدول زیر هفت نوع داده اصلی C++ را لیست می کند.

انواع متغیرها
انواع متغیرها

آدرس

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

آدرس
آدرس

آموزش متغیرهای سالیدیتی Solidity

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

متغیرهای حالت state – متغیرهایی که مقادیر آنها به طور دائم در یک قرارداد ذخیره می شود.

متغیرهای محلی Local – متغیرهایی که مقادیر انها تا زمان اجرای تابع وجود دارد.

متغیرهای سراسری Global – متغیرهای ویژه ای در فضای جهانی وجود دارد که برای بدست آوردن اطلاعات در مورد بلاکچین استفاده می شود.

سالیدیتی Solidity یک زبان تایپ شده است، به این معنی که نوع متغیر state یا Local باید در هنگام اعلام مشخص شود. هر متغیر اعلام شده بر اساس نوع خود همیشه یک مقدار پیش فرض دارد. هیچ مفهومی از “تعریف نشده” یا “پوچ” وجود ندارد.

متغیر حالت State

متغیرهایی که مقادیر آنها برای همیشه در یک قراردارد ذخیره می شود.

متغیر حالت State
متغیر حالت State

متغیر محلی Local

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

متغیر محلی Local
متغیر محلی Local

مثال

متغیر محلی Local
متغیر محلی Local

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

خروجی

خروجی
خروجی

متغیرهای سراسری Global

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

متغیرهای سراسری Global
متغیرهای سراسری Global

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

هنگام نام گذاری متغیرهای خود در سالیدیتی Solidity، قوانین زیر را در خاطر داشته باشید.

  1. شما نباید از هیچ یک از کلمات کلیدی از پیش تعریف شده سالیدیتی به عنوان نام متغیر استفاده کنید. این کلمات کلیدی در بخش بعدی ذکر شده است. به عنوان مثال، نام متغیرهای break یا Boolean معتبر نیستند.
  2. نام متغیرهای سالیدیتی Solidity نباید با یک عدد (0-9) شروع شوند. آنها باید با یک حرف یا کاراکتر شروع شوند. به عنوان مثال 123test یک متغیر نامعتبر است اما _123test یک متغیر معتبر می باشد.
  3. نام متغیرهیا سالیدیتی Solidity به حروف کوچک و بزرگ حساس هستند. به عنوان مثال، Name و name دو متغیر متفاوت هستند.

آموزش سالیدیتی Solidity – دامنه متغیر Variable Scope

دامنه متغیرهای محلی محدود به عملکردی است که در آن تعریف شده است اما متغیرهای حالت می توانند سه نوع دامنه داشته باشند.

1.عمومی Public – به متغیرهای state عمومی و داخلی می توان از طریق پیام نیز دسترسی داشت. برای یک متغیر state عمومی، یک تابع گیرنده خودکار تولید می شود.

2.داخلی Internal – متغیرهای state داخلی فقط از طریق قرارداد فعلی یا قرارداد ناشی از آن بدون استفاده از این قابل دسترسی هستند.

3.خصوصی Private – متغیرهای state خصوصی فقط از طریق قرارداد فعلی که در قرارداد مشتق شده از آن تعریف نشده است، قابل دسترسی هستند.

سالیدیتی Solidity – دامنه متغیر Variable Scope
سالیدیتی Solidity – دامنه متغیر Variable Scope

آموزش سالیدیتی Solidity – عملگرها

عملگر چیست؟

بیایید یک عبارت ساده را برای مثال 4 + 5 را که مساوی با 9 می باشد در نظر بگیریم. در اینجا 4 و 5 را عملوند و “+” را عملگر می نامند. سالیدیتی Solidity انواع عملگرهای زیر را پشتیبانی می کند.

  1. عملگرهای حسابی Arithmetic Operators
  2. عملگرهای مقایسه کننده Comparison Operators
  3. عملگرهای منطقی Logical Operators
  4. عملگرهای انتساب Assignment Operators
  5. عملگرهای شرطی  ConditionalOperators

بیاید نگاهی به همه عملگرها داشته باشیم.

عملگرهای حسابی Arithmetic Operators

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

سالیدیتی Solidity – عملگرها
سالیدیتی Solidity – عملگرها

فرض کنید متغیر A مقدار 10 را نگه می دارد و متغیر B مقدار 20 را نگه می دارد.

عملگر به اضافه (+) برای اعداد و همچنین رشته ها String کار می کند. به عنوان مثال، + 10″a” برابر با “a10 ” می دهد.

مثال

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

نحوه استفاده از عملگرهای حسابی
نحوه استفاده از عملگرهای حسابی

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

خروجی

خروجی
خروجی

عملگرهای مقایسه کننده Comparison Operators

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

عملگرهای مقایسه کننده Comparison Operators
عملگرهای مقایسه کننده Comparison Operators

فرض کنید متغیر A مقداری برابر 10 دارد و متغیر B دارای مقدار 20 است.

مثال

کد زیر نحوه استفاده از عملگرهای مقایسه کننده را در سالیدیتی Solidity نشان می دهد.

نحوه استفاده از عملگرهای مقایسه کننده
نحوه استفاده از عملگرهای مقایسه کننده

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

خروجی

خروجی
خروجی

عملگرهای منطقی

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

عملگرهای منطقی
عملگرهای منطقی

فرض کنید متغیر A برابر با 10 و متغیر B برابر با 20 باشد. سپس

مثال

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

نحوه پیاده سازی اپراتورهای منطقی سالیدیتی
نحوه پیاده سازی اپراتورهای منطقی سالیدیتی

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

خروجی

خروجی
خروجی

اپراتورهای Bitwise Solidity

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

اپراتورهای Bitwise Solidity
اپراتورهای Bitwise Solidity

فرض کنید متغیر A، 2 و متغیر B مقدار 3 را ذخیره کند. سپس

مثال

برای پیاده سازی عملگر Bitwise در سالیدیتی کد زیر را امتحان کنید

پیاده سازی عملگر Bitwise در سالیدیتی
پیاده سازی عملگر Bitwise در سالیدیتی

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

خروجی

خروجی
خروجی

عملگرهای انتساب Assignment

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

عملگرهای انتساب Assignment
عملگرهای انتساب Assignment

مثال

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

اجرای عملگر Assignment در سالیدیتی
اجرای عملگر Assignment در سالیدیتی

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

خروجی

خروجی
خروجی

عملگرهای شرطی (؟ 🙂

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

عملگرهای شرطی (؟ :)
عملگرهای شرطی (؟ 🙂

مثال

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

عملکرد عملگر شرطی
عملکرد عملگر شرطی

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

خروجی

خروجی
خروجی

آموزش سالیدیتی Solidity – حلقه ها

در حین نوشتن قرارداد، ممکن است با شرایطی روبرو شوید که لازم است عملی را بارها و بارها انجام دهید. در چنین شرایطی، برای کاهش تعداد عملیات، باید دستورات حلقه ای بنویسید.

Solidity از تمام حلقه های لازم برای کاهش فشار برنامه نویسی پشتیبانی می کند.

حلقه While

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

فلوچارت

فلوچارت
فلوچارت

فلوچارت حلقه While به صورت زیر است.

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

سینتکس حلقه While در Solidity
سینتکس حلقه While در Solidity

مثال

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

پیاده سازی حلقه While
پیاده سازی حلقه While

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

خروجی

خروجی
خروجی

حلقه do…while

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

فلوچارت

فلوچارت حلقه do…while به صورت زیر است.

فلوچارت حلقه do…while
فلوچارت حلقه do…while

سینتکس

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

سینتکس حلقه do…while
سینتکس حلقه do…while

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

مثال

برای یادگیری پیاده سازی حلقه do…while در Solidity مثال زیر را اجرا کنید.

پیاده سازی حلقه do…while در Solidity
پیاده سازی حلقه do…while در Solidity

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

خروجی

خروجی
خروجی

حلقه For

حلقه For جمع و جورترین شکل حلقه است. این حلقه شامل سه بخش مهم زیر است:

  1. مقداردهی اولیه حلقه که در آن مقدار شمارنده خود را مقدار اولیه قرار می دهیم. مقداردهی اولیه قبل از شروع حلقه اجرا می شود.
  2. تستی که در صورت صحت یا عدم صحت یک شرط مشخص شده انجام می شود. اگر شرط درست باشد، پس کد داده شده در داخل حلقه اجرا می شود، در غیر این صورت از حلقه خارج می شود.
  3. عبارت تکرار که در آن می توانید شمارنده خود را کم یا زیاد کنید.

می توانید هر سه قسمت را در یک خط واحد و با نقطه ویرگول از هم جدا کنید.

فلوچارت

فلوچارت حلقه for در Solidity به صورت زیر است.

فلوچارت حلقه for در Solidity
فلوچارت حلقه for در Solidity

سینتکس

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

سینتکس حلقه for
سینتکس حلقه for

مثال

سینتکس حلقه for
سینتکس حلقه for

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

خروجی

خروجی
خروجی

کنترل حلقه

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

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

دستورbreak

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

فلوچارت

فلوچارت دستور break به صورت زیر است.

فلوچارت دستور break
فلوچارت دستور break

مثال

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

دستور break با حلقه while
دستور break با حلقه while

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

خروجی

خروجی
خروجی

دستور Continue

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

مثال

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

دستور Continue را حلقه while
دستور Continue را حلقه while

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

خروجی

خروجی
خروجی

دستورات شرطی در Solidity

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

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

فلوچارت if…else

فلوچارت if…else
فلوچارت if…else

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

دستور if

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

سینتکس

سینتکس برای دستور if به صورت زیر می باشد.

سینتکس برای دستور if
سینتکس برای دستور if

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

مثال

برای درک چگونگی دستور if، مثال زیر را اجرا کنید.

چگونگی دستور if
چگونگی دستور if

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

خروجی

خروجی
خروجی

دستور if…else

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

سینتکس

دستور if…else
دستور if…else

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

مثال

دستور if…else
دستور if…else

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

خروجی

خروجی
خروجی

دستور if…else if…

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

سینتکس

سینتکس دستور if-else-if به شرح زیر است.

سینتکس دستور if-else-if
سینتکس دستور if-else-if

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

مثال

سینتکس دستور if-else-if
سینتکس دستور if-else-if

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

خروجی

خروجی
خروجی

آموزش سالیدیتی Solidity – رشته ها Strings

در زبان سالیدیتی در بحث String یا رشته ها از ” و ‘ استفاده می کند. این رشته ای را به عنوان نوع داده برای اعلام متغیر از نوع رشته یا String فراهم می کند.

سالیدیتی Solidity – رشته ها Strings
سالیدیتی Solidity – رشته ها Strings

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

سالیدیتی Solidity – رشته ها Strings
سالیدیتی Solidity – رشته ها Strings

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

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

تبدیل بایت Byte به رشته String

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

تبدیل بایت Byte به رشته String
تبدیل بایت Byte به رشته String

مثال

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

نحوه کار String در Solidity
نحوه کار String در Solidity

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

خروجی

خروجی
خروجی

آموزش سالیدیتی Solidity – آرایه ها Arrays

آرایه یک ساختار داده است، که یک مجموعه پی در پی با اندازه ثابت از همان نوع عناصر را ذخیره می کند. یک آرایه برای ذخیره مجموعه ای از داده ها استفاده می شود.

به جای اعلام متغیرهای منفرد، مانند number0، nymber1، و … number99 شما یک متغیر آرایه را اعلام می کنید و از [0]،[1]، …، [99] را برای نمایش اعداد استفاده می کنید. متغیرهای منفرد یک عنصر خاص در یک آرایه توسط یک فهرست قابل دسترسی است.

در Solidity، یک آرایه می تواند دارای اندازه ثابت یا اندازه پویا باشد. برای آرایه ذخیره سازی، انواع مختلفی از عناصر نیز می تواند داشته باشد.

همه آرایه ها در حافظه دارای مکان می باشند. کمترین آدرس مربوط به اولین عنصر و بالاترین آدرس به آخرین عنصر مربوط می باشد.

اعلام آرایه ها

اعلام آرایه ها
اعلام آرایه ها

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

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

اعلام یک آرایه 10 عنصری به نام balance of type unit
اعلام یک آرایه 10 عنصری به نام balance of type unit

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

اعلام آرایه ای با اندازه داینامیک در Solidity
اعلام آرایه ای با اندازه داینامیک در Solidity

شروع آرایه ها

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

مقدار دهی به آرایه
مقدار دهی به آرایه

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

اختصاص یک عنصر از آرایه
اختصاص یک عنصر از آرایه

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

اختصاص یک عنصر از آرایه
اختصاص یک عنصر از آرایه

دستور فوق به عنصر شماره 3 در آرایه مقدار 5 اختصاص می دهد.

ایجاد آرایه های دارای حافظه داینامیک

آرایه های حافظه داینامیک با استفاده از کلمه کلیدی جدید ایجاد می شوند.

ایجاد آرایه های دارای حافظه داینامیک
ایجاد آرایه های دارای حافظه داینامیک

ایندکس در آرایه

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

دسترسی به عناصر آرایه با ایندکس کردن نام آرایه
دسترسی به عناصر آرایه با ایندکس کردن نام آرایه

در این قسمت مفاهیمی برای دسترسی به آرایه ها ذکر شده است.

length – length اندازه آرایه را برمی گرداند. برای تغییر اندازه آرایه داینامیک می توان از length استفاده کرد.

Push – push اجازه می دهد تا یک عنصر به یک آرایه در انتها اضافه شود. طول جدید آرایه را برمی گرداند.

مثال

برای درک چگونگی عملکرد آرایه ها در Solidity، کد زیرا امتحان کنید.

چگونگی عملکرد آرایه ها در Solidity
چگونگی عملکرد آرایه ها در Solidity

نوع شمارشی Enums  در Solidity

Enums یک متغیر را محدود می کند تا فقط یکی از چند مقدار از پیش تعریف شده داشته باشد. مقادیر موجود در این لیست شمارش شده را enum می نامند.

با استفاده از enums می توانید تعداد اشکالات کد خود را کاهش دهید.

به عنوان مثال، اگر برنامه ای را برای آب میوه فروشی در نظر بگیریم، می توان اندازه لیوان را به کوچک، متوسط و بزرگ محدود کرد. این اطمینان می دهد که به هیچ کس اجازه نمی دهد  اندازه دیگری غیر از کوچک، متوسط یا بزرگ سفارش دهد.

مثال

با امتحان کردن کد زیر می توانید با عملکرد enum در زبان برنامه نویسی  Solidity آشنا شوید.

عملکرد enum در زبان برنامه نویسی  Solidity
عملکرد enum در زبان برنامه نویسی  Solidity

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

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

خروجی

خروجی
خروجی

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

خروجی

خروجی
خروجی

ساختار Struct در زبان Solidity

انواع ساختار struct برای نشان دادن یک رکورد استفاده می شود. فرض کنید می خواهید کتاب های خود را در کتابخانه پیگیری کنید. شاید بخواهید ویژگی های زیر را در مورد هر کتاب ردیابی کنید.

  1. عنوان
  2. نویسنده
  3. موضوع
  4. شناسه کتاب

تعریف ساختار Struct

برای تعریف ساختار، باید از کلمه کلیدی struct استفاده کنید. کلمه کلیدی struct نوع جدیدی از داده را با بیش از یک عضو تعریف می کند. قالب دستور struct به شرح زیر است.

قالب دستور struct
قالب دستور struct

مثال

مثال قالب دستور struct
مثال قالب دستور struct

دسترسی به یک Struct و متغیر آن

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

مثال

کد زیر را امتحان کنید تا بفهمید چطور ساختارها structs در Solidity کار می کنند.

ساختارها structs در Solidity
ساختارها structs در Solidity

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

ابتدا بر روی setBook کلیک کنید تا مقدار آن به صورت LARGE تنظیم شود و سپس بر روی getBookId کلیک کنید تا شناسه کتاب انتخاب شده را دریافت کنید.

خروجی

خروجی
خروجی

آموزش سالیدیتی – مپینگ Mapping

مپینگ Mapping یک نوع مرجع برای آرایه ها و ساختارها است. در زیر سینتکس برای اعلام Mapping آورده شده است.

سالیدیتی – مپینگ Mapping
سالیدیتی – مپینگ Mapping

جایی که

  1. KeyType: می تواند انواع بایت bytes و رشته String باشد. هیچ نوع مرجع پیچیده ای مجاز نیستند.
  2. ValueType: می تواند هر نوعی باشد.

توجه:

.Mapping فقط می تواند نوع storage داشته باشد و به طور کلی برای متغیرهای state استفاده می شود.

.Mapping می تواند به صورت عمومی علامت گذاری شود. Solidity به طور خودکار گیرنده ای برای آن ایجاد می کند.

مثال

کد زیر را اجرا کنید تا بفهمید Mapping در Solidity چگونه کار می کند.

نحوه ی کارکرد Mapping در Solidity
نحوه ی کارکرد Mapping در Solidity

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

ابتدا بر روی updateBalance کلیک کنید تا مقدار آن 10 شود، سپس خروجی را مشاهده نمایید.

خروجی

خروجی
خروجی

آموزش سالیدیتی Solidity – تبدیل ها

Solidity امکان تبدیل ضمنی و همچنین صریح را فراهم می کند. کامپایلر Solidity امکان تبدیل ضمنی بین دو نوع داده را فراهم می کند به شرطی که امکان تبدیل ضمنی و از بین رفتن اطلاعات وجود نداشته باشد. به عنوان مثال unit8 به unit16 قابل تبدیل است اما int8 به unit256 قابل تبدیل نیست زیرا int8 می تواند حاوی مقدار منفی باشد که در unit256 مجاز نیست.

تبدیل صریح

ما می توانیم با استفاده از سینتکس سازنده، صریحا یک نوع داده را به نوع دیگر تبدیل کنیم.

تبدیل صریح
تبدیل صریح

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

تبدیل به نوع کوچکتر
تبدیل به نوع کوچکتر

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

تبدیل به نوع بالاتر
تبدیل به نوع بالاتر

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

تبدیل به بایت کوچکتر
تبدیل به بایت کوچکتر

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

تبدیل به بایت بزرگتر
تبدیل به بایت بزرگتر

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

تبدیل بین بایت های با اندازه ثابت و int
تبدیل بین بایت های با اندازه ثابت و int

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

اعداد هگزادسیمال Hexadecimal
اعداد هگزادسیمال Hexadecimal

آموزش سالیدیتی Solidity – واحدهای اتر Ether

در زبان برنامه نویسی سالیدیتی Solidity می توان از wei ،Finney ،Szabo یا ether به عنوان پسوند استفاده کرد تا برای تبدیل انواع مختلف مبتنی بر اتر استفاده شود. کمترین واحد wei است و 1e12 نشان دهنده 1 به توان 12 است.

سالیدیتی Solidity – واحدهای اتر Ether
سالیدیتی Solidity – واحدهای اتر Ether

واحدهای زمانی Time Units

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

واحدهای زمانی Time Units
واحدهای زمانی Time Units

آموزش سالیدیتی Solidity – متغیرهای ویژه

متغیرهای ویژه متغیرهای موجود در سطح جهانی هستند و اطلاعاتی را در مورد بلاکچین فراه می کنند. در زیر لیستی از متغیرهای خاص آورده شده است.

سالیدیتی Solidity – متغیرهای ویژه
سالیدیتی Solidity – متغیرهای ویژه

مثال

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

دریافت آدرس فرستنده در سالیدیتی Solidity
دریافت آدرس فرستنده در سالیدیتی Solidity

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

ابتدا روی updateBalance کلیک کنید تا مقدار آن 10 شود، سپس می توانید خروجی را مشاهده نمایید.

خروجی

خروجی
خروجی

آموزش سالیدیتی Solidity –  Style Guide

Style Guide به حفظ سازگاری کد و خوانایی بیشتر کد کمک می کند. در زیر بهترین روش هایی است که هنگام نوشتن قرارداد با Solidity دنبال می شود.

Code Layout

Indentation – برای حفظ سطح indentation از 4 اسپیس به جای tab استفاده کنید. از میکس شدن اسپیس ها با تب ها خودداری کنید.

قانون دو خط خالی Two Blank Lines – از 2 خط خالی بین دو تعریف قرارداد استفاده کنید.

قانون دو خط خالی Two Blank Lines
قانون دو خط خالی Two Blank Lines

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

قانون یک خط خالی One Blank Line
قانون یک خط خالی One Blank Line

حداکثر طول خط – یک خط نباید از 79 کاراکتر بیشتر باشد تا خوانندگان بتوانند به راحتی کد را تجزیه کنند.

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

قوانین Wrapping
قوانین Wrapping

کدگذاری کد مرجع Source Code Encoding – کدگذاری UTF-8 یا ASCII ترجیحا استفاده می شود.

Import – Import statements باید درست در بالای فایل پس از اعلام pragma قرار گیرند.

ترتیب فانکشن ها – فانکشن ها باید از نظر میزان visibility گروه بندی شوند.

ترتیب فانکشن ها
ترتیب فانکشن ها

از فضای خالی اضافی خودداری کنید – از فضای خالی بلافاصله داخل پرانتز، براکت و … خودداری کنید.

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

ساختارهای کنترل
ساختارهای کنترل

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

Function Declaration
Function Declaration

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

نگاشت ها Mappings
نگاشت ها Mappings

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

اعلام متغیرها
اعلام متغیرها

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

اعلام رشته String
اعلام رشته 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 اصلی استفاده کنید.

وجود چندین contract یا library در یک فایل
وجود چندین 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 استفاده کنید.

آموزش سالیدیتی Solidity – توابع Functions

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

مانند هر زبان برنامه نویسی پیشرفته دیگر، Solidity نیز از تمام ویژگی های لازم برای نوشتن کد ماژولار با استفاده از توابع پشتیبانی می کند. این بخش نحوه نوشتن توابع خود را در Solidity توضیح می دهد.

تعریف توابع Function Definition

قبل استفاده از یک تابع، باید آن را تعریف کنیم. متداول ترین روش برای تعریف یک تابع در Solidity با استفاده از کلمه کلیدی function و به دنبال آن یک نام منحصر به فردف لیستی از پارامترها (که ممکن است خالی باشد ) و یک بلوک احاطه شده توسط {} است.

سینتکس

سینتکس اصلی در اینجا نشان داده شده است.

سینتکس اصلی
سینتکس اصلی

مثال

سینتکس اصلی
سینتکس اصلی

فراخوانی تابع

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

کد زیر را امتحان کنید تا بدانید که این رشته string در Solidity چگونه کار می کند.

چگونگی کارکرد رشته string در Solidity
چگونگی کارکرد رشته string در Solidity

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

خروجی

خروجی
خروجی

پارامترهای تابع

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

مثال

مثال زیر را انجام دهید. ما در اینجا از یک تابع unit2str استفاده کرده ایم. این یک پارامتر است.

تابع unit2str
تابع unit2str

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

خروجی

خروجیخروجی
خروجی

عبارت بازگشتی

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

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

در Solidity، یک تابع می تواند مقادیر متعددی را نیز بازگرداند. مثال زیر را ببینید.

بازگرداند مقادیر در Solidity
بازگرداند مقادیر در Solidity

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

خروجی

خروجی
خروجی

آموزش سالیدیتی Solidity – اصلاح کننده های تابع Function Modifiers

Function Modifiers یا اصلاح کننده های تابع برای اصلاح رفتار یک تابع استفاده می شود. به عنوان مثال برای اضافه کردن یک شرط به به یک تابع می تواند مورد استفاده قرار گیرد.

ابتدا یک اصلاح کننده یا modifier با پارامتر یا بدون آن ایجاد می کنیم.

اصلاح کننده یا modifier با پارامتر یا بدون آن
اصلاح کننده یا modifier با پارامتر یا بدون آن

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

مثال زیر را ببینید.

اصلاح کننده modifier
اصلاح کننده modifier

آموزش سالیدیتی 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 استفاده نموده است، مشاهده نمایید.

مثال

تابع view
تابع view

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

خروجی

خروجی
خروجی

آموزش سالیدیتی 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 استفاده نموده است، مشاهده نمایید.

مثال

تابع view
تابع view

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

خروجی

خروجی
خروجی

آموزش سالیدیتی Solidity – تابع بازگشتی Fallback Function

تابع بازگشتی نوع خاصی از تابع است که در قرارداد در دسترس است و ویژگی های زیر را دارا می باشد.

  • زمانی فراخوانی می شود که یک تابع موجود در قرارداد فراخوانی شود.
  • لازم است که در خارج علامت گذاری شود.
  • هیچ اسمی ندارد.
  • هیچ استدلالی ندارد.
  • نمی تواند هیچ چیز را برگرداند.
  • در هر قرارداد می تواند یک بار تعریف شود.
  • اگر قرارداد اتر بدون داده دریافت کند، استثنا ایجاد خواهد شد.

مثال زیر مفهوم تابع بازگشتی در هر قرارداد را نشان می دهد.

مثال

تابع بازگشتی در قرارداد
تابع بازگشتی در قرارداد

آموزش سالیدیتی Solidity – تابع overloading

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

مثال زیر مفهوم تابع overloading در سالیدیتی Solidity را نشان می دهد.

تابع overloading در سالیدیتی Solidity
تابع overloading در سالیدیتی Solidity

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

ابتدا بر روی callSumWithTwoArguments کلیک کنید و سپس بر روی callSumWithThreeArguments کلیک نمایید تا نتیجه را مشاهده کنید.

خروجی

خروجی
خروجی

آموزش سالیدیتی 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
توابع ریاضی را در Solidity

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

ابتدا بر روی callAddMod کلیک کنید و سپس callMulMod را بزنید تا نتجیه را مشاهده نمایید.

خروجی

خروجی
خروجی

آموزش سالیدیتی 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 امضا مطابقت دارند:

  1. r: first 32 bytes of signature
  2. s: second 32 bytes of signature
  3. v: final 1 byte of signature

این روش یک آدرس را بر می گرداند.

مثال زیر استفاده از تابع رمزنگاری را در سالیدیتی Solidity نشان می دهد.

مثال

تابع رمزنگاری در سالیدیتی Solidity
تابع رمزنگاری در سالیدیتی Solidity

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

خروجی

خروجیخروجی
خروجی

آموزش سالیدیتی Solidity – الگوی برداشت Withdrawal Pattern

الگوی برداشت اطمینان می دهد که فراخوانی انتقال مستقیم که تهدیدی برای امنیت است، ایجاد نمی شود. قرارداد زیر استفاده غیر مطمئن از فراخوانی انتقال برای ارسال اتر را نشان می دهد.

سالیدیتی Solidity – الگوی برداشت Withdrawal Pattern
سالیدیتی Solidity – الگوی برداشت Withdrawal Pattern

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

در الگوی برداشت، ما قبل از هر بار انتقال مبلغ مورد نظر را تنظیم می کنیم. این موضوع اطمینان حاصل می کند که تنها قرارداد فراخوان شده از کار می افتد.

الگوی برداشت
الگوی برداشت

آموزش سالیدیتی Solidity – دسترسی محدود Restricted Access

دسترسی محدود به یک قرارداد یک عمل معمول است. به طور پیش فرض، یک قرارداد فقط خواندنی است مگر اینگه به صورت عمومی مشخص شود.

ما می توانیم افرادی که می توانند state قرارداد را تغییر دهند یا توابع قراردادها را با استفاده از اصلاح کننده ها modifiers فراخوانی کنند، محدود کنیم. همانطور که در زیر توضیح داده شده است، چندین اصلاح کننده modifiers ایجاد و استفاده خواهیم کرد.

  • onlyBy – اگر یکبار از یک تابع استفاده شود، فقط صدا کننده caller ذکر شده می تواند این تابع را فراخوانی کند.
  • onlyAfter – پس از استفاده از یک تابع، می توان آن تابع را پس از یک دوره زمانی خاص فراخوانی کرد.
  • costs – هنگامی که از یک تابع استفاده می شود، caller یا صدا کننده فقط در صورت ارائه مقدار مشخصی می تواند این تابع را فراخوانی کند.

مثال

ایجاد و استفاده از اصلاح کننده modifiers
ایجاد و استفاده از اصلاح کننده modifiers

آموزش سالیدیتی 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 – توابع خصوصی/متغیرها فقط در داخل و حتی در قراردادهای مشتق شده قابل استفاده هستند.

مثال

کمیت های Visibility
کمیت های Visibility

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

خروجی

خروجی
خروجی

آموزش سالیدیتی Solidity – وراثت Inheritance

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

  • یک قرارداد مشتق شده می تواند به تمام اعضای غیر خصوصی از جمله روش های داخلی و متغیرهای state دسترسی داشته باشد. اما استفاده از این مجاز نیست.
  • ما می توانیم تابع super قرارداد را با استفاده از super keyword یا با استفاده از نام قرارداد super فراخوانی کنیم.
  • در صورت وراثت چندگانه، فراخوانی تابع با استفاده از super، بیشتر قراردادهای مشتق شده را ترجیح می دهد.

مثال

سالیدیتی Solidity – وراثت Inheritance
سالیدیتی Solidity – وراثت Inheritance

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

برای ()E.getComputedResult و به دنبال ()E.getResultنشان می دهد.

خروجی

خروجی
خروجی

آموزش سالیدیتی Solidity – سازنده ها Constructors

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

  • یک قرارداد می تواند فقط یک constructor داشته باشد.
  • یک کد constructor زمانی که یک قرارداد ایجاد می شود، یک بار اجرا می شود و برای شروع state قرارداد استفاده می شود.
  • پس از اجرای کد constructor، کد نهایی بر روی بلاکچین مستقر می شود. این کد شامل توابع عمومی و کدهای قابل دسترسی از طریق توابع عمومی است. کد constructor یا هر روش داخلی که فقط توسط constructor استفاده می شود در کد نهایی موجود نیست.
  • یک constructor می تواند هم عمومی و هم داخلی باشد.
  • یک constructor داخلی قرارداد را به صورت چکیده علامت گذاری می کند.
  • در صورت عدم تعریف constructor ،constructor پیش فرض در قرارداد حضور دارد.
سالیدیتی Solidity – سازنده ها Constructors
سالیدیتی Solidity – سازنده ها Constructors
  • در صورتی که قرارداد پایه constructor استدلال داشته باشد، هر قرارداد مشتق شده باید آنها را تصویب کند.
  • constructor پایه را می توان مستقیما با استفاده از روش زیر راه اندازی کرد.
راه اندازی constructor پایه
راه اندازی constructor پایه
  • در صورتی که قرارداد پایه constructor استدلال داشته باشد، هر قرارداد مشتق شده باید آنها را تصویب کند.
  • constructor پایه را می توان مستقیما با استفاده از روش زیر راه اندازی کرد.
راه اندازی constructor پایه
راه اندازی constructor پایه
  • راه های مستقیم و غیرمستقیم برای مقداردهی اولیه constructor قرارداد پایه مجاز نیست.
  • اگر قرارداد مشتق شده استدلال ها را به constructor قرارداد اصلی منتقل نکند، قرارداد مشتق شده انتزاعی خواهد شد.

آموزش سالیدیتی Solidity – قراردادهای انتزاعی Abstract Contracts

قرارداد انتزاعی Abstract Contracts قراردادی است که حداقل شامل یک تابع بدون هیچگونه پیاده سازی باشد. از چنین قراردادی به عنوان قرارداد پایه یا اصلی استفاده می شود. به طور کلی یک قرارداد انتزاعی شامل توابع انتزاعی و اجرایی است. قرارداد مشتق شده تابع انتزاعی را پیاده سازی می کند و از توابع موجود در صورت لزوم استفاده می کند.

در صورتی که یک قرارداد مشتق شده تابع انتزاعی را اجرا نکند، این قراردا ممشتق شده به عنوان انتزاعی علامت گذاری می شود.

مثال

قرارداد انتزاعی در Solidity
قرارداد انتزاعی در Solidity

کد زیر را اجرا کنید تا متوجه شوید قرارداد های انتزاعی در Solidity چگونه کار می کند.

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

خروجی

خروجی
خروجی

آموزش سالیدیتی Solidity – اینترفیس ها Interfaces

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

  • اینترفیس نمی تواند هیچ تابعی با اجرا داشته باشد.
  • توابع یک interface فقط از نوع خارجی است.
  • interface نمی تواند یک constructor باشد.
  • interface نمی تواند متغیرهای state داشته باشد.
  • interface می تواند دارای enum باشد.

مثال

کد زیر را امتحان کنید تا متوجه شوید که interface در Solidity چگونه کار می کند.

کارکرد interface در Solidity
کارکرد interface در Solidity

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

خروجی

خروجیخروجی
خروجی

آموزش سالیدیتی Solidity – کتابخانه ها Libraries

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

  • توابع کتابخانه می توانند مستقیما فراخوانی شوند، اگر آنها state را تغییر ندهند. این بدان معناست کع توابه pure یا view از خارج کتابخانه قابل فراخوانی هستند.
  • از انجا که فرض می شود کتابخانه بدون state نیست، نمی تواند از بین برود.
  • یک کتابخانه نمی تواند متغیرهای state داشته باشد.
  • یک کتابخانه نمی تواند هیچ عنصری را به ارث برساند.
  • کتابخانه را نمی توان به ارث برد.

مثال

کد زیر را امتحان کنید تا نحوه کار کتابخانه در Solidity را درک کنید.

نحوه کار کتابخانه در Solidity
نحوه کار کتابخانه در Solidity

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

خروجی

خروجی
خروجی

استفاده از For

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

مثال

می توانید با اجرای کد زیر نحوه کار کتابخانه در Solidity را درک کنید.

نحوه کار کتابخانه در Solidity
نحوه کار کتابخانه در Solidity

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

خروجی

خروجی
خروجی

آموزش سالیدیتی Solidity – اسمبلی Assembly

Solidity گزینه ای را برای استفاده از زبان اسمبلی برای نوشتن اسمبلی inline در کد اصلی سالیدیتی فراهم می کند. همچنین می توانیم یک کد Standalone Assembly بنویسیم که سپس به bytecode تبدیل شود. Standalone Assembly یک زبان میانی برای یک کامپایلر Solidity است و کد Solidity را به یک Standalone Assembly و سپس به کد Byte تبدیل می کند. ما می توانیم از همان زبان استفاده شده در Inline Assembly برای نوشتن کد در یک مجموعه مستقل استفاده کنیم.

اسمبلی Inline

کد Inline assembly را می توان درون کد اصلی Solidity قرار داد تا کنترل دقیق تری بر EVM داشته باشد و به ویژه هنگام نوشتن توابع کتابخانه استفاده می شود.

یک کد اسمبلی در زیر بلاک اسمبلی { … } نوشته می شود.

مثال

کد زیر را امتحان کنید تا نحوه کار کتابخانه در Solidity را درک کنید.

نحوه کار کتابخانه در Solidity
نحوه کار کتابخانه در Solidity

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

خروجی

آموزش سالیدیتی Solidity – رویدادها Events

Event یک عضو ارثی inheritable در یک قرارداد است. یک event منتشر می شود و استدلال های منتقل شده در گزارش های معاملات یا تراکنش ها را ذخیره می کند. این گزارش ها در بلاکچین ذخیره می شوند و تا زمان حضور قرارداد در بلاکچین با استفاده از آدرس قرارداد قابل دسترسی هستند. یک event ایجاد شده از طریق قراردادها، حتی event که آنها را ایجاد و منتشر کرده است، قابل دسترسی نیست.

یک event را می توان با استفاده از کلمه کلیدی event اعلام کرد.

اعلام کردن event با استفاده از کلمه کلیدی event
اعلام کردن event با استفاده از کلمه کلیدی event

مثال

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

ابتدا یک قرارداد ایجاد کنید و یک event منتشر کنید.

عملکرد یک event در Solidity
عملکرد یک event در Solidity

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

event قرارداد در کد JavaScript
event قرارداد در کد JavaScript

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

خروجی

خروجی
خروجی

آموزش سالیدیتی 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 آشنا شوید.

نحوه مدیریت خطا در Solidity
نحوه مدیریت خطا در Solidity

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

خروجی

خروجی
خروجی
دکمه بازگشت به بالا