اعلان‌ها

آیا می‌خواهید همه‌ی اعلان‌ها را از لیست حذف کنید؟


پشتیبانی‌بیت 24

ارسال پیام به پشتیبانی

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

متن ارور

متن ارور

متن ارور

متن ارور

اولویت:

ورود و ثبت نام

آموزش جامع زبان برنامه نویسی سالیدیتی (Solidity)

4.8
تاریخ انتشار : ۱۴۰۲/۰۱/۲۷
آخرین بروزرسانی : ۱۴۰۱/۱۲/۰۷

اگر از فعالان حوزه بلاک چین و ارز دیجیتال باشید، به احتمال زیاد تاکنون اسم قرارداد هوشمند (Smart Contract) و اپلیکیشن غیر متمرکز (Decentralized Application) را شنیده‌اید. قرارداد هوشمند ساختار زیربنای اپلیکیشن‌های غیر متمرکز است و برای طراحی و ساخت آن نیز به آموزش و یادگیری زبان برنامه نویسی سالیدیتی (Solidity) نیاز است.

مقدمه‌ای بر دوره آموزش کامل سالیدیتی

پیشرفت فناوری بلاک چین (Blockchain) در چند سال اخیر محبوبیت قراردادهای هوشمند و تکنولوژی غیر متمرکز را بسیار زیاد کرده است و به همین اندازه، نیاز به یک آموزش به درد بخور و مناسب برای زبان برنامه نویسی سالیدیتی برای طراحی قرارداد هوشمند در بلاک چین اتریوم (Ethereum) و دیگر شبکه‌های سازگار با ماشین مجازی آن، زیاد شده است.

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

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

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

زبان برنامه نویسی سالیدیتی (Solidity) چیست؟

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

سالیدیتی (Solidity) یک زبان برنامه نویسی سطح بالا است که تمرکز اصلی آن بر طراحی و اجرای قراردادهای هوشمند قرار گرفته است. از اصلی‌ترین زبان‌های برنامه‌نویسی تاثیر گذار بر سالیدیتی می‌توان به سی پلاس پلاس، جاوا اسکریپت و پایتون اشاره کرد.

زبان برنامه نویسی سالیدیتی چیست

توسعه دهندگان تازه‌کار و قدیمی این زبان‌های برنامه نویسی می‌توانند با کمی تغییر در روند خود و یادگیری اصول اولیه لازم برای طراحی و اجرای اپلیکیشن بر بستر ماشین مجازی اتریوم، هر قرارداد هوشمند و نرم افزار غیر متمرکزی که دوست دارند را بر بستر شبکه اتریوم و تمام بلاک چین‌های سازگار با ماشین مجازی اتریوم (Ethereum Virtual Machine) مثل بایننس اسمارت چین، شبکه پالیگان، شبکه اولانچ و فانتوم بسازند.

سالیدیتی در سال 2015 و تحت نظارت کریستیان رایتوایزنر (Christian Reitwiessner) طراحی شد. اگر بخواهیم مشخصه‌های سالیدیتی را به شکل خلاصه عنوان کنیم، نکات مهم زیر اصلی‌ترین آن‌ها هستند:

  • سالیدیتی یک زبان برنامه نویسی استاتیک است که برای اجرای بهتر و راحت‌تر قراردادهای هوشمند طراحی شده است. این زبان از مزیت‌های شی گرایی و قراردادمحور بودن خود برای ساخت و راه اندازی قراردادهای هوشمند استفاده می‌کند.
  • سالیدیتی در طراحی قرارداد هوشمند نرم افزارهایی که با حراجی‌های همگانی، والت‌های چند امضایی، رای‌دهی و تامین سرمایه جمعی سر و کار دارند بسیار مفید واقع می‌شود و در حقیقت ساختار آن مناسب چنین پروژه‌هایی است.
  • سالیدیتی از سیستم وراثت و کتابخانه‌های متعددی بهره می‌برد که در روش‌های برنامه نویسی پیچیده مورد نظر کاربرها بسیار به کار می‌آیند.

مفاهیم پایه برای درک ساختار سالیدیتی

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

شبکه اتریوم

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

یکی از موارد مهمی که در آموزش سالیدیتی به آن برمی‌خورید نیز جایگاه ماینرهای سابق اتریوم و اعتبارسنج‌های این شبکه پس از آپگرید مرج و راه اندازی اتریوم 2 است. ماینرها و اعتبارسنج‌ها وظیفه تایید و اعتبارسنجی تراکنش‌های قراردادهای هوشمند نوشته شده با زبان برنامه نویسی سالیدیتی را بر عهده دارند و به شبکه جان می‌بخشند. این ماینرها و اعتبارسنج‌ها در ازای تلاش خود برای امنیت بخشیدن به شبکه و تایید تراکنش‌ها، جایزه‌ای در قالب ارز دیجیتال اتریوم دریافت می‌کنند که در بیشتر صرافی‌های رمز ارزی دنیا قابل معامله و خرید و فروش است.

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

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

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

ماشین مجازی EVM

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

قرارداد هوشمند

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

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

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;
contract SimpleStorage {
uintstoredData;
function set(uint x) public {
storedData = x;
}
function get() public view returns (uint) {
return storedData;
}
}

اولین خط کد در مقاله آموزش زبان برنامه نویسی برای مبتدی ها به لیسانس و مجوز استفاده شده برای کد منبع اشاره می‌کند. اگر دقت کنید واضح است که مجوز مورد استفاده برای کد منبع از GPL یا General Public License نسخه 3.0 استفاده می‌کند. این مجوز برای استفاده عمومی و متن باز به کار می‌رود. البته گفتنی است که در نوشتن کد در محیط توسعه باید همواره دقت داشته باشید که نوع و نسخه مجوز کد خود را به صورت قابل درک برای ماشین بنویسید.

خط بعدی کد در این قرارداد هوشمند سالیدیتی نشان می‌دهد که کد منبع با نسخه 0.4.16 زبان برنامه نویسی Solidity و نسخه‌های جدیدتر آن سازگار است. همچنین دقت داشته باشید که در کد اعلام شده است زبان به کار رفته در قرارداد هوشمند شامل نسخه 0.9.0 نیست. اهمیت این خط از کد در آن است که اگر دستگاهی با نسخه سالیدیتی پشتیبانی نشده سعی در کامپایل کردن این کد داشته باشد، با ارور مواجه می‌شود و تنها دستگاه‌هایی توانایی اجرای کد را خواهند داشت که از نسخه‌های مشخص شده پشتیبانی کنند.

قراردادهای هوشمند با استفاده از پراگما (Pragma) در کد خود به نوعی یک دستورالعمل ساده به کامپایلرها می‌دهند تا درک بهتری از شیوه برخورد با این کد به دست بیاورند و بهترین روش را انتخاب کنند.

رمزگشایی بخش‌های سازنده یک قرارداد هوشمند

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

واژه uintstoredData برای اعلام یک متغیر وضعیت به نام storeData به کار می‌رود که نوع یا تایپ unit را دارد. uint همان نوع متغیر عدد صحیح بدون علامت منفی (یعنی اعداد صحیح مساوی و بزرگ‌تر از صفر) یا Unsigned Integer است و 256 بیت حجم دارد.

می‌توان اینطور در نظر گرفت که این متغیر یک تک‌اسلات در پایگاه داده است و به راحتی با هر تابعی که وظیفه مدیریت پایگاه داده یا دیتابیس (Database) را دارد، می‌توان اطلاعات ذخیره شده در این اسلات را فراخوانی و ویرایش کرد. در مثال ذکرشده همچنین توابع Get و Set نیز استفاده شده‌اند که هر دو در ویرایش و بازیابی ارزش ذخیره شده در متغیرها نقش دارند. همچنین سالیدیتی نیاز به پیشوند this را از بین برده که در بسیاری از دیگر زبان‌های برنامه نویسی معمول و پراستفاده است.

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

نصب کامپایلر سالیدیتی

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

نسخه‌گذاری

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

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

ریمیکس

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

پلتفرم ریمیکس سالیدیتی

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

مدیر بسته npm و Node.js

از ساده‌ترین روش‌های ثانویه برای نصب، راه اندازی یک محیط توسعه زبان برنامه نویسی سالیدیتی، استفاده از مدیر بسته نود یا Node Package Manager است که به اختصار npm نامیده می‌شود. برای راحتی و انعطاف بیشتر در نصب و استفاده از کامپایلر سالیدیتی به نام solc-js می‌توانید از npm استفاده کنید. البته نرم افزار solc-js محدودیت‌هایی در دسترسی اشخاص به کامپایلر ایجاد می‌کند که برای شناسایی و درک بهتر آن‌ها و همچنین روش استفاده بهتر از solc-js، می‌توانید به ریپازیتوری آن مراجعه کنید.

نکته اصلی درباره کامپایلر solc-js این است که بر پایه زبان برنامه نویسی ++C نوشته شده است. پروژه solc-js با استفاده از Emscripten اطمینان حاصل می‌کند که هر دو نرم افزار از نسخه کد منبع یکسان استفاده کرده‌اند. این موضوع می‌تواند مستقیما روی پروژه‌های جاوا اسکریپتی که از ریمیکس استفاده می‌کنند تاثیرگذار باشد. مستندات لازم برای استفاده از solc-js در ریپازیتوری این کامپایلر موجود است.

داکر ایمج

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

$docker pull ethereum/solc:stable

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

$docker run ethereum/solc:stable-version

نتیجه چیزی شبیه زیر خواهد بود:

$docker run ethereum/solc:stable -version

solc, the solidity compiler commandlineinterfaceVersion: 0.5.2+commit.1df8f40c.Linux.g++

بسته‌های باینری

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

سالیدیتی همچنین یک بسته Snap دارد که برای نصب سالیدیتی در تمام توزیع‌های پشتیبانی شده لینوکسی قابل استفاده است. بسته‌های Snap به خاطر معماری خاص خود محیطی ایمن و ایزوله برای اجرای سالیدیتی به وجود می‌آورند، در نتیجه ممکن است محدودیت‌هایی در استفاده از آن‌ها وجود داشته باشد. البته این محدودیت‌ها بیشتر در زمینه دسترسی نرم افزار به دیرکتوری‌های media/ و home/ است.

درک سینتکس یا نحوه نوشتار سالیدیتی

هر زمان که پرسشی مثل «آیا یادگیری زبان برنامه نویسی سالیدیتی سخت است؟» به ذهن‌تان رسید، بهتر است قبل از آنکه تصمیمی بگیرید، مقداری درباره سینتکس و نوشتار آن تحقیق کنید. همانطور که بالاتر ذکر شد، درک سینتکس سالیدیتی در روند یادگیری ساخت قرارداد هوشمند بسیار مهم است و کمک زیادی به ریختن ترس توسعه دهندگان تازه‌کار از فرآیند آن می‌کند. کد منبع برنامه سالیدیتی که شالوده اصلی قرارداد هوشمند را بنا می‌گذارد از مهم‌ترین بخش‌های هر دوره آموزش زبان برنامه نویسی Solidity است.

پراگما

اولین خط کد قرارداد هوشمندی که بالاتر نوشته شد دستورالعمل پراگما است. بخش اول اعداد دستورالعمل پراگما در مثال مذکور به این معنا است که کد برنامه برای نسخه 0.4.0 سالیدیتی و بالاتر از آن نوشته شده است. همچنین در بخش دوم به کامپایلر می‌فهمانیم که کد برای نسخه 0.6.0 قابل استفاده نیست.

پراگما زبان برنامه نویسی سالیدیتی

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

pragma solidity ^0.4.0;

قرارداد

پیش از این عنصر uint storedData را در مثال آموزش سالیدیتی بررسی کردیم. این دقیقا یک قرارداد سالیدیتی محسوب می‌شود که در حقیقت مجموعه‌ای از کد (توابع) و داده (وضعیت) در یک آدرس مشخص از بلاک چین اتریوم است. عنصر uint storedData در حقیقت یک متغیر وضعیت به نام storedData را از نوع داده عدد حسابی غیر منفی (صفر و مثبت) تعریف می‌کند و توابع Set و Get در آن برای ویرایش و فراخوانی مقادیر ذخیره شده در متغیرها به کار می‌آیند.

ایمپورت کردن فایل

از جمله مواردی که ممکن است هر کاربر تازه‌کار و حرفه‌ای در فرآیند یادگیری زبان برنامه نویسی سالیدیتی به آن نیازمند شود، قابلیت ایمپورت (Import) یا وارد کردن فایل‌ها به کد قرارداد است. با اینکه در مثال مقاله کنونی هیچ فایلی در کد ایمپورت نشده است، سالیدیتی کاملا قابلیت Import پشتیبانی می‌کند و از این نظر کاملا شبیه زبان برنامه نویسی جاوا اسکریپت است.
با استفاده از دستور زیر می‌توانید تمام سمبل‌های جهانی (یا گلوبال) موجود در فایل مورد نظر خود به نام filename را در کد قرارداد ایمپورت و فراخوانی کنید:

import "filename";

دستور زیر مثالی عملی از ایمپورت است که یک سمبل جهانی جدید به اسم symbolName می‌سازد. در نظر داشته باشید که محتوای این سمبل، تمام سمبل‌های جهانی موجود در filename است.

import * as symbolName from "filename";

زمانی که بخواهید یک فایل به نام x را از همان دایرکتوری ایمپورت کنید که فایل کنونی در آن قرار دارد، تنها کافی است کد زیر را بزنید.

import “./x” as x

توجه داشته باشید که در سینتکس لینوکس و هنگام کار با انواع ترمینال از جمله Bash، برای مشخص کردن دایرکتوری کنونی می‌توانید از علامت نقطه یا «.» استفاده کنید. علامت «/» بعد از نقطه نیز به معنای ورود به دایرکتوری مذکور (دایرکتوری «.») است.

کلمات کلیدی رزرو شده

در سالیدیتی نیز همانند بسیاری از زبان‌های برنامه نویسی دیگر، از C گرفته تا جاوا اسکریپت، تعدادی کلمه خاص و کلیدی وجود دارند که برای توابع درونی زبان رزرو هستند و استفاده می‌شوند. مفهوم این حرف به زبان ساده‌تر این است که اگر تابعی به نام Define در زبان سالیدیتی وجود داشته باشد، توسعه دهنده نمی‌تواند یک تابع دیگر با هر قابلیت یا استفاده‌ای به همین نام تعریف کند. در ادامه فهرستی از کلمات کلیدی رزرو شده در زبان برنامه نویسی سالیدیتی را معرفی می‌کنیم که یادگیری و حفظ کردن آن‌ها می‌تواند در روند آموزش Solidity برای کاربران تازه‌کار مفید واقع شود.

Abstract Auto Alias Default Override Sizeof Unchecked Typedef Inline Copyof Apply Reference Try Static Define After Switch Case Immutable Typeof

برای یادگیری دیگر کلمات کلیدی زبان سالیدیتی می‌توانید مثال‌های مختلف قرارداد هوشمن را از مستندات رسمی Solidity مطالعه کنید.

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

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

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

pragma solidity ^0.5.0;
contract SolidityTest {
constructor() public {
	}
	function getResult() public view returns(uint) {
uint a = 1;
uint b = 2;
uint result = a + b;
		return result;
	}
}
  1. در قدم اول این مثال ساده برای درک بهتر عملکرد زبان برنامه نویسی سالیدیتی، باید کد بالا را کپی و در بخش Code محیط توسعه ریمیکس جایگذاری کنید.
  2. حال وارد کشوی Solidity Compiler شوید و پس از انتخاب کامپایلر مناسب با کد نوشته شده، روی گزینه Compile Code.sol کلیک کنید.
  3. در کشوی Deploy & Run Transactions روی گزینه Deploy بزنید.
  4. در همان صفحه، از منوی کشویی گزینه SolidityTest at 0x را انتخاب کنید.
  5. روی گزینه getResult بزنید تا نتیجه قرارداد هوشمند به شما نشان داده شود.

پس از انجام تمام این مراحل کدنویسی و کامپایل کردن آن با سالیدیتی، نتیجه زیر را در قسمت خروجی دریافت خواهید کرد.

0: uint256: 3

اهمیت کامنت‌گذاری

اهمیت کامنت در درک و فهمیدن بهتر کد برنامه نویسی شده به هر زبانی از هیچ توسعه دهنده‌ای پنهان نیست و تقریبا موضوعی قبول شده و مورد تایید میان تمام برنامه نویسان است. خوشبختانه زبان سالیدیتی نیز از دو فرمت کامنت‌گذاری زبان C و ++C پشتیبانی می‌کند. بنابراین هر متنی که بین دو علامت /* و */ قرار بگیرد، حال تعداد خط‌های آن هر چقدر هم که باشد، به عنوان کامنت در نظر گرفته می‌شود و کامپایلر آن را بررسی و تفسیر نمی‌کند.

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

function getResult() public view returns(uint){
   // This is a comment. It is similar to comments in C++
   /*
      * This is a multi-line comment in solidity
      * It is very similar to comments in C Programming
   */
uint a = 1;
uint b = 2;
uint result = a + b;
   return result;
}

انواع متغیر در سالیدیتی

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

انواع داده و متغیر در زبان برنامه نویسی سالیدیتی

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

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

پیش از آنکه وارد مبحث بعد شویم، بد نیست بدانید که اتریوم می‌توان داده‌های خود را در سه قسمت مجزا ذخیره کند که به قرار زیر هستند:

  • فضای ذخیره Storage: تمام متغیرهای وضعیت قرارداد در این قسمت هستند. هر قراردادی فضای ذخیره مختص خود را دارد و بین فراخوانی‌های تابع این فضا تغییری نمی‌کند.
  • فضای حافظه Memory: این فضا برای ذخیره مقادیر موقت تعبیه شده است و بین فراخوانی‌های توابع پاک می‌شود، به همین دلیل استفاده از آن هزینه کمتری نسبت به Storage دارد.
  • فضای استک Stack: متغیرهای محلی کوچک در استک نگهداری می‌شوند و استفاده از آن تقریبا رایگان است، اما تنها مقادیر محدود قابل ذخیره در آن هستند.

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

انواع مقادیر

در زبان سالیدیتی کاربر اجازه دارد هر یک از انواع داده درونی این زبان برنامه نویسی را انتخاب یا حتی نوع داده خودش را تعریف کند. در جدول زیر فهرستی از هفت نوع داده مختص زبان برنامه نویسی ++C را معرفی کرده‌ایم که در سالیدیتی نیز استفاده می‌شوند.

نوع عبارت اختصاصی مقدار
بولین bool مقدار درست یا نادرست (True or False)
عدد صحیح int/uint عدد صحیح مثبت و منفی با مقادیر حجم مختلف
عدد صحیح int8 تا int256 عدد صحیح کوچک‌تر از صفر با حجمی از 8 بیت تا 256 بیت. int256 معادل int محسوب می‌شود
عدد صحیح uint8 تا uint256 عدد صحیح بزرگ‌تر و مساوی صفر با حجمی از 8 بیت تا 256 بیت. uint256 معادل uint محسوب می‌شود
عدد با اعشار ثابت fixed/unfixed عدد با اعشار ثابت مثبت و منفی با مقادیر حجم مختلف
عدد با اعشار ثابت fixedMxN عدد با اعشار ثابت کوچک‌تر و مساوی صفر با حجمی متغیر نسبت به M و N تعیین شده. توضیح زیر جدول.
عدد با اعشار ثابت ufixedMxN عدد با اعشار ثابت بزرگ‌تر از صفر با حجمی متغیر نسبت به M و N تعیین شده. توضیح زیر جدول.

نکته: توجه داشته باشید که همچنین می‌توانید اعداد با تعداد ثابت و غیر ثابت اعشار را به عنوان fixedMxN و ufixedMxN نشان دهید که در اینجا M نشان دهنده تعداد بیت‌های استفاده شده توسط نوع متغیر و N نشان دهنده اعداد اعشاری متغیر است. M باید به 8 تقسیم‌پذیر باشد و از 8 تا 256 مقدار می‌پذیرد. N نیز از 0 تا 80 تغییر پذیر است.

آدرس

المان آدرس (Address) در آموزش زبان برنامه نویسی سالیدیتی مقدار 20 بایت حجم فضا را به خود اختصاص داده است که در حقیقت سایز یک آدرس در شبکه اتریوم را نشان می‌دهد. این آدرس در فرآیند بازیابی مقدار موجودی حساب با استفاده از متد balance. بسیار به کار می‌آید. همچنین در زمان ارسال موجودی از یک حساب به حساب دیگر با متد transfer. نیز از آدرس استفاده می‌شود. مثال زیر نمونه خوبی برای هر دوی این متدها است که در یادگیری زبان برنامه نویسی Solidity به کار خواهد آمد.

address x = 0x212;
address myAddress = this;
if (x.balance< 10 &&myAddress.balance>= 10) x.transfer(10);

علامت‌های محاسباتی در Solidity

در سالیدیتی نیز همچون تمام زبان های برنامه نویسی دیگر، عملیات‌های ریاضیاتی یا منطقی متعدد انجام می‌شود و در حقیقت همین عملیات‌ها بین عملگر (Operator) و عملوند (Operand) است که ترکیب کلی قوانین قراردادهای هوشمند و اپلیکیشن‌های غیر متمرکز را شکل می‌دهد. در این بخش از مقاله آموزش زبان برنامه نویسی سالیدیتی (Solidity) قصد داریم انواع علامت از جمله عملگرهای ریاضی و منطقی مورد استفاده برای قرارداد هوشمند را معرفی و بررسی کنیم. سالیدیتی به طور کلی انواع عملگر زیر را پشتیبانی می‌کند:

  • عملگر ریاضی (Arithmetic)
  • عملگر مقایسه (Comparison)
  • عملگر منطقی (یا نسبی) (Logical)
  • عملگر بیتی (Bitwise)
  • عملگر انتسابی (Assignment)
  • عملگر شرطی (Conditional)

در ادامه تک تک این موارد را معرفی می‌کنیم.

عملگر ریاضی

در عملیات‌های ریاضیاتی همچون 9 = 5 + 4، علامت «+» یک عملگر ریاضیاتی است. زبان برنامه نویسی سالیدیتی از انواع مختلف عملگرهای ریاضی پشتیبانی می‌کند که در بیشتر زبان‌های دیگر همچون جاوا اسکریپت نیز می‌توان آن‌ها را پیدا کرد. فرض کنید متغیر A مقدار 10 را دارد و متغیر B مقدار 20 را در خود ذخیره کرده است. آنگاه:

عملگر اسم عملیات مثال
+ جمع دو عملوند را با همدیگر جمع می‌کند A + B = 30
تفریق یک عملوند را از دیگری کم می‌کند A – B = -10
* ضرب دو عملوند را در همدیگر ضرب می‌کند A * B = 200
/ تقسیم یک عملوند را بر دیگری تقسیم می‌کند B / A = 2
٪ باقیمانده یک عملوند را بر دیگری تقسیم می‌کند و باقیمانده تقسیم در خروجی ارائه می‌شود B % A = 0
++ افزایش عدد صحیح را یک واحد افزایش می‌دهد A++ = 11
کاهش عدد صحیح را یک واحد کاهش می‌دهد A– = 9

عملگر مقایسه

هنگام استفاده از متغیرها و ثابت‌ها در برنامه نویسی بدون شک زمانی لازم می‌شود آن‌ها را با همدیگر مقایسه کنیم تا اگر به عنوان مثال یکی از دیگری کمتر یا بیشتر بود، روند عملیات‌های قرارداد هوشمند به شیوه‌ای خاص پیش برود. زبان برنامه نویسی سالیدیتی نیز از چند نوع عملگر مقایسه پشتیبانی می‌کند که فهرست آن‌ها را در ادامه خواهید دید. مانند بخش قبل، فرض کنید متغیر A مقدار 10 را دارد و متغیر B مقدار 20 را در خود ذخیره کرده است. آن گاه:

عملگر اسم عملیات مثال
== مساوی بررسی می‌کند که دو عملوند با همدیگر مساوی هستند یا خیر. اگر مساوی باشند، نتیجه عملیات شرط True خواهد بود A == B : Not True
=! نامساوی بررسی می‌کند که دو عملوند با همدیگر مساوی هستند یا خیر. اگر مساوی نباشند، نتیجه عملیات شرط True خواهد بود A != B : True
< بزرگ‌تر بررسی می‌کند که عملوند سمت چپ از عملوند سمت راست بزرگ‌تر است یا خیر. اگر بزرگ‌تر باشد نتیجه عملیات شرط True خواهد بود A > B : Not True
> کوچک‌تر بررسی می‌کند که عملوند سمت چپ از عملوند سمت راست کوچک‌تر است یا خیر. اگر کوچک‌تر باشد نتیجه عملیات شرط True خواهد بود A < B : True
=< بزرگ‌تر و مساوی بررسی می‌کند که عملوند سمت چپ از عملوند سمت راست بزرگ‌تر یا مساوی با آن است یا خیر. اگر بزرگ‌تر یا مساوی باشد نتیجه عملیات شرط True خواهد بود A >= B : Not True
=> کوچک‌تر و مساوی بررسی می‌کند که عملوند سمت چپ از عملوند سمت راست کوچک‌تر یا مساوی با آن است یا خیر. اگر کوچک‌تر یا مساوی باشد نتیجه عملیات شرط True خواهد بود A <= B : True

عملگر منطقی

کاربرد اصلی عملگرهای منطقی در شرط گذاشتن و پیش‌برد عملیات‌های به کار رفته در قرارداد هوشمند است. زبان برنامه نویسی Solidity از سه عملگر منطقی استفاده می‌کند که در جدول زیر نام و کارکرد هر کدام توضیح داده می‌شود. فرض کنید متغیر A مقدار 10 را دارد و متغیر B مقدار 20 را در خود ذخیره کرده است. آن گاه:

عملگر اسم عملیات مثال
&& اَند (و) منطقی اگر هر دو عملوند غیرصفر باشند، آنگاه نتیجه عملیات شرط True خواهد بود A && B : True
|| اُر (یا) منطقی اگر هر کدام از دو عملوند غیرصفر باشند، آنگاه نتیجه عملیات شرط True خواهد بود A || B : True
! نات (نفی) منطقی وضعیت منطقی عملوند را برعکس می‌کند. اگر شرط True باشد، نات منطقی آن را False خواهد کرد ! (A && B) : False

عملگر بیتی

عملگرهای بیتی برای انجام تغییرات روی عملوندهای باینری در سطح بیت استفاده می‌شوند. این عملگرها بسیار ساده و سریع محسوب می‌شوند و به همین خاطر پردازنده کامپیوترها به صورت مستقیم از آن‌ها پشتیبانی می‌کند. در طراحی و نوشتن قراردادهای هوشمند به کمک آموزش زبان برنامه نویسی سالیدیتی نیز عملگرهای بیتی استفاده زیادی دارند. در ادامه انواع این عملگرها معرفی و توضیح داده می‌شوند. این بار فرض کنید که متغیر A مقدار 2 و متغیر B مقدار 3 را در خود ذخیره کرده‌اند.

عملگر اسم عملیات مثال
& اَند (و) بیتی روی هر بیت اعداد صحیح ورودی خود یک عملیات اَند بولین انجام می‌دهد A & B = 2
| اُر (یا) بیتی روی هر بیت اعداد صحیح ورودی خود یک عملیات اُر بولین انجام می‌دهد A | B = 3
^ اُر (یا) انحصاری بیتی روی هر بیت اعداد صحیح ورودی خود یک عملیات اُر انحصاری بولین انجام می‌دهد. عملیات اُر انحصاری یعنی فقط باید فقط یکی از دو ورودی True باشد تا نتیجه True شود. اگر هر دو ورودی True باشند، نتیجه False می‌شود A ^ B = 1
~ نات (نفی) بیتی یک عملگر یگانی است که تک تک بیت‌های عملوند را برعکس می‌کند ~B = -4
>> حرکت به چپ تک تک بیت‌های عملوند اول را به تعداد واحدهای مشخص شده در عملوند دوم به سمت چپ می‌برد. بیت‌های جدید سمت راست همگی با صفر پر می‌شوند. یک واحد بردن بیت‌ها به سمت چپ یعنی ضرب کردن آن‌ها در 2. دو واحد به سمت چپ بردن نیز یعنی ضرب کردن در 4 و… A << 1 = 4
<< حرکت به راست تک تک بیت‌های عملوند اول را به تعداد واحدهای مشخص شده در عملوند دوم به سمت راست می‌برد A >> 1 = 1
<<< حرکت به راست با صفر دقیقا مشابه حرکت به راست معمولی است، با این تفاوت که بیت‌های اضافه شده در سمت چپ همگی صفر خواهند بود A >>> 1 = 1

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

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

عملگر اسم عملیات مثال
= انتساب ساده مقدار عملوند سمت راست را در عملوند سمت چپ ذخیره می‌کند C = A + B یعنی مقدار A + B در C ذخیره می‌شود
=+ جمع و انتساب مقدار عملوند سمت راست را با مقدار عملوند سمت چپ جمع و در عملوند سمت چپ ذخیره می‌کند C += A یعنی مقدار C + A در C ذخیره می‌شود
=- تفریق و انتساب مقدار عملوند سمت راست را از عملوند سمت چپ تفریق و بعد در عملوند سمت چپ ذخیره می‌کند C -= A یعنی مقدار C – A در C ذخیره می‌شود
=* ضرب و انتساب مقدار عملوند راست را در مقدار عملوند چپ ضرب و بعد در عملوند چپ ذخیره می‌کند C *=A یعنی مقدار C * A در C ذخیره می‌شود
=/ تقسیم و انتساب مقدار عملوند چپ را بر مقدار عملوند سمت تقسیم و بعد در عملوند چپ ذخیره می‌کند C /= A یعنی مقدار C / A در C ذخیره می‌شود
=% باقیمانده و انتساب باقیمانده تقسیم مقدار عملوند سمت چپ به راست را به دست می‌آورد و در عملوند چپ ذخیره می‌کند C %= A یعنی مقدار C % A در C ذخیره می‌شود

گفتنی است که همین مفهوم برای عملگرهای بیتی نیز قابل اجرا است.

عملگر شرطی

عملگر شرطی در شرایطی کاربرد دارد که ابتدا درستی یا نادرستی عبارتی را بسنجیم و بعد بر اساس نتیجه این سنجش، تصمیم بگیریم که کدام عملیات را انجام دهیم. در مثال زیر در نظر بگیرید که عملوند A مقدار 20 و عملوند B مقدار 10 را در خود ذخیره دارند.

عملگر اسم عملیات مثال
(Condition ? A : B) شرط اگر شرط مشخص شده در سمت چپ عملگر صحیح باشد، مقدار سمت چپ : نمایش داده می‌شود و اگر صحیح نباشد، مقدار سمت راست نمایش داده می‌شود (A > B ? A : B)

نتیجه عملیات عملوند A یا همان 20 خواهد بود، چرا که 20 از 10 بزرگ‌تر است

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

متغیر در زبان برنامه نویسی Solidity به بیان ساده یک فضای خالی و «جانگه‌دار» برای داده است که در زمان اجرای برنامه می‌تواند دستخوش تغییر شود. متغیرها این امکان را برای کاربران به وجود می‌آورند که اطلاعات ذخیره شده در پایگاه داده (چه دیتابیس‌های سنتی و چه بلاک چین) را فراخوانی کنند و حتی تغییر دهند.

قوانین نام‌گذاری متغیر در سالیدیتی

در زمان تعیین اسم برای متغیرهای به کار رفته در قرارداد هوشمند خود، باید چند نکته مهم را مد نظر داشته باشید.

  • هرگز نباید یکی از کلمات کلیدی رزرو شده سالیدیتی را به عنوان نام متغیر استفاده کنید. تعدادی از این کلمات کلیدی بالاتر ذکر شدند.
  • نام متغیرهای زبان سالیدیتی نباید با اعداد (9-0) شروع شوند. حرف اول متغیرها باید همواره یک حرف انگلیسی کوچک یا خط تیره پهن باشد. به عنوان مثال 123test نامی نامناسب برای متغیر است، اما می‌توان به صورت 123test_ از آن استفاده کرد.
  • نام متغیر در زبان برنامه نویسی Solidity به بزرگی و کوچکی حروف حساس است. به عنوان مثال Name و name می‌توانند نمایانگر دو متغیر مختلف باشند.

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

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


int public int_var;

گونه‌های متغیر در Solidity

سالیدیتی یک زبان برنامه نویسی استاتیک است و این یعنی هر متغیر تعریف شده همیشه یک مقدار پیش‌فرض بر اساس نوع داده خود دارد. بنابراین مفهوم null یا undefined در زبان سالیدیتی وجود ندارد. سالیدیتی از سه نوع کلی متغیر پشتیبانی می‌کند که در ادامه هر کدام به همراه سینتکس و مثال معرفی خواهد شد.

متغیر وضعیت (State Variable)

مقدار این نوع از متغیرها به صورت دائمی و تغییرناپذیر در فضای قرارداد هوشمند ذخیره شده است. هر تابع محدوده یا اسکوپ (Scope) خود را دارد و متغیرهای وضعیت همیشه باید خارج از این محدوده‌ها تعریف شوند.

در مثال زیر، قرارداد Solidity_var_Test مقدار اولیه یک متغیر وضعیت از نوع عدد صحیح بزرگ‌تر و مساوی صفر را با استفاده از یک تابع سازنده تعیین می‌کند.

// Solidity program to 
// demonstrate state 
// variables
pragma solidity ^0.5.0;
  
// Creating a contract
contract Solidity_var_Test {
     
   // Declaring a state variable
   uint8 public state_var;      
  
   // Defining a constructor
   constructor() public {
      state_var = 16;   
   }
}

خروجی این کد در قسمت Output به صورت زیر خواهد بود:


"0": "uint8: 16"

متغیر محلی یا لوکال (Local Variable)

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

در مثال زیر، قرارداد Solidity_var_Test تابعی تعریف می‌کند و بعد دو متغیر محلی را با همدیگر جمع و نتیجه را فراخوانی می‌کند.

// Solidity program to demonstrate
// local variables
pragma solidity ^0.5.0;
  
// Creating a contract
contract Solidity_var_Test {
  
   // Defining function to show the declaration and
   // scope of local variables
   function getResult() public view returns(uint){
       
      // Initializing local variables
      uint local_var1 = 1; 
      uint local_var2 = 2;
      uint result = local_var1 + local_var2;
       
      // Access the local variable
      return result; 
   }
}

خروجی این کد در قسمت Output به شکل زیر خواهد بود:


"0": "uint256: 3"

متغیر جهانی یا گلوبال (Global Variable)

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

متغیر مقدار خروجی
blockhash(uint blockNumber) هش بلاک را فراخوانی می‌کند. البته فقط برای 256 تراکنش اخیر به جز بلاک کنونی عمل می‌کند
block.coinbase (address payable) آدرس ماینر بلاک کنونی
block.difficulty (uint) سختی بلاک کنونی شبکه
block.gaslimit (uint) محدوده گس بلاک کنونی
block.number (uint) شماره بلاک کنونی
block.timestamp (uint) مهر زمانی بلاک کنونی بر اساس ثانیه از زمان ایپاک یونیکس
gasleft() مقدار گس باقیمانده
msg.data (bytes calldata) تمام اطلاعات داده‌های فراخوانی شده بلاک
msg.sender (address payable) ارسال کننده پیام یا همان فراخوان‌دهنده کنونی
msg.sig (bytes4) چهار بیت اول داده فراخوانی شده یا همان مشخصه تابع
msg.value (uint) مقدار Wei ارسال شده همراه پیام
now (uint) مهر زمانی بلاک کنونی
tx.gasprice (uint) قیمت گس برای تراکنش
tx.origin (address payable) ارسال کننده تراکنش

در مثال زیر، قرارداد Test با استفاده از متغیر msg.sender به آدرس شخص ارسال کننده قرارداد روی بلاک چین دسترسی پیدا می‌کند.

// Solidity program to 
// show Global variables
pragma solidity ^0.5.0;
  
// Creating a contract
contract Test { 
    
  // Defining a variable
  address public admin;
    
  // Creating a constructor to
  // use Global variable
  constructor() public {    
    admin = msg.sender;  
  }
 }

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


0: address: 0x8168344597DB03aF571bc641ba7E960dF88B97CB

محدوده متغیر

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

در سوی دیگر، متغیرهای وضعیت می‌توانند هر یک از سه محدوده زیر را داشته باشند:

  • عمومی (Public): متغیرهای وضعیت عمومی هم از درون تابع و هم به کمک پیام‌های برون‌قراردادی قابل دسترسی هستند. برای هر متغیر وضعیت عمومی یک تابع Get خودکار تعریف شده است.
  • داخلی (Internal): متغیرهای وضعیت داخلی تنها از درون قراردادی که آن‌ها را تعریف کرده یا یک قرارداد شاخه گرفته از آن قابل دسترسی هستند.
  • خصوصی (Private): متغیرهای وضعیت خصوصی تنها از درون قراردادی که آن‌ها را تعریف کرده است قابل دسترسی هستند و حتی اگر قراردادی از قرارداد اصلی آن‌ها شاخه بگیرد، نمی‌تواند به متغیر وضعیت خصوصی دسترسی داشته باشد.

نمونه‌ای از انواع محدوده متغیر را در مثال زیر مشاهده می‌کنید.


pragma solidity ^0.5.0;
contract C {
   uint public data = 30;
   uint internal iData= 10;
   
   function x() public returns (uint) {
      data = 3; // internal access
      return data;
   }
}
contract Caller {
   C c = new C();
   function f() public view returns (uint) {
      return c.data(); //external access
   }
}
contract D is C {
   function y() public returns (uint) {
      iData = 3; // internal access
      return iData;
   }
   function getResult() public view returns(uint){
      uint a = 1; // local variable
      uint b = 2;
      uint result = a + b;
      return storedData; //access the state variable
   }
}

حلقه‌ها در آموزش برنامه نویسی با سالیدیتی

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

حلقه برنامه نویسی سالیدیتی

روش اول اینکه هزار تابع مختلف برای به دست آوردن عدد رندوم نوشته شود و در آخر نتیجه تمام توابع در هزار متغیر ذخیره گردد. اما روش دوم این است که یک تابع رندوم نوشته شود و با دادن یک متغیر عددی مثل i = 1 به آن، هر بار که تابع اجرا می‌شود یک رقم به i اضافه کنید و تا زمانی که i به مقدار 1000 نرسیده است تابع دوباره و دوباره اجرا شود. به این صورت تنها یک تابع رندوم توانسته برای شما 1000 رقم تصادفی بسازد.

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

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

حلقه While

ساده‌ترین نوع حلقه در زبان سالیدیتی از نوع While است که در ادامه آن را بررسی میکنیم. هدف حلقه While این است که تا زمان صحیح بودن یک عبارت، قسمتی از کد را دوباره و دوباره تکرار کند. پس از اشتباه یا فالس شدن عبارت، حلقه نیز از عمل بازمی‌ایستد.

حلقه Do…while

حلقه نوع Do…while نیز شباهت زیادی به حلقه While دارد با این تفاوت که بررسی شرط (صحیح بودن عبارت) در انتهای کد حلقه انجام می‌شود. به این ترتیب حلقه در هر شرایطی حداقل یک بار اجرا می‌شود، حتی اگر عبارت قرار گرفته در شرط اشتباه باشد.

حلقه For

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

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

کنترل حلقه

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

برای برطرف کردن مشکلات پیش آمده در تمام این موارد، زبان برنامه نویسی سالیدیتی دستورالعمل‌های break و continue را ارائه می‌کند. دستورالعمل break در عمل بلافاصله کد را قطع می‌کند و continue برای آن ساخته شده که شمارش بعدی کد حلقه را شروع کند.

دستور تصمیم‌گیری در زبان سالیدیتی

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

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

انواع ساختارهای داده در زبان Solidity

زبان برنامه نویسی سالیدیتی در مجموع سه مدل ساختار کلی برای انواع داده‌ها دارد که در ادامه آن‌ها را بررسی می‌کنیم.

استراکت (Struct)

از نوع ساختار داده استراکت برای نشان دادن یک بایگانی استفاده می‌شود. فرض کنید که می‌خواهید کتاب‌های خود در کتابخانه را فهرست کنید و آمارشان را داشته باشید. ممکن است بخواهید مشخصه‌های زیر را درباره هر کتاب مشخص و ذخیره کنید:

  • عنوان
  • نویسنده
  • موضوع
  • شناسه کتاب

حال به کمک استراکت می‌توان تمام این متغیرها را یک جا تعریف کرد. البته گفتنی است که استارکت محدودیت 16 عددی دارد و اگر تعداد متغیرها بیشتر شود، با ارور Stack too Deep مواجه خواهیم شد.

استراکت از آن نوع داده‌ها است که چندین مشخصه متفاوت را در یک تعریف خلاصه می‌کند. کد زیر یک مثال تعریف استراکت است:

pragma solidity ^0.4.0;
contract Ballot {
    struct Voter { // Struct
        uint weight1, weight2, weight3;
        bool voted;
        address delegate1, delegate2, delegate3, delegate4;
        string name;
        uint vote1, vote2, vote3, vote4, vote5;
        uint height1, height2, height3
    }
}

آرایه (Array)

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

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

در زبان برنامه نویسی سالیدیتی یک آرایه می‌تواند در زمان تعریف سایز یا تعداد معین یا نامعین (پویا) داشته باشد. برای یک آرایه ذخیره سازی (Storage) حتی می‌توان از انواع مختلف المان نیز استفاده کرد. در آرایه‌های حافظه (Memory) المان‌ها نمی‌توانند مپینگ باشند و برای آرایه‌هایی که قرار است به عنوان پارامتری در یک تابع استفاده شوند، المان باید از نوع ABI باشد.

تمام آرایه‌ها در فضای حافظه محل ذخیره پیوسته دارند و کم‌ارزش‌ترین آدرس به اولین المان و باارزش‌ترین آدرس به آخرین المان آرایه اشاره می‌کنند.

مپینگ (Mapping)

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

mapping(_KeyType => _ValueType)

در این کد KeyType_ می‌تواند هر نوع داده اولیه داخلی زبان سالیدیتی و همچنین بایت یا رشته باشد. گفتنی است که در این متغیر نمی‌توان یک داده ارجاع یا شیء پیچیده را قرار داد. اما ValueType_ می‌تواند هر نوع داده‌ای باشد.

از نکات قابل توجه درباره مپینگ می‌توان به این اشاره کرد که تنها نوع داده‌هایی که در فضای Storage ذخیره شده‌اند در آن قابل استفاده هستند و معمولا به عنوان متغیر وضعیت به کار می‌روند. همچنین مپینگ می‌تواند به صورت عمومی یا پابلیک علامت‌گذاری شود و زبان برنامه نویسی سالیدیتی به شکل خودکار برای آن تابع Get تعریف می‌کند.

برای درک بهتر نوع داده مپینگ در زبان برنامه نویسی Solidity می‌توانید کد زیر را اجرا کنید:

pragma solidity ^0.5.0;

contract LedgerBalance {
   mapping(address => uint) public balances;

   function updateBalance(uint newBalance) public {
      balances[msg.sender] = newBalance;
   }
}
contract Updater {
   function updateBalance() public returns (uint) {
      LedgerBalance ledgerBalance = new LedgerBalance();
      ledgerBalance.updateBalance(10);
      return ledgerBalance.balances(address(this));
   }
}

کد را با استفاده از روش ذکر شده در قسمت یادگیری عملکرد زبان برنامه نویسی سالیدیتی اجرا کنید. ابتدا روی دکمه updateBalance بزنید تا مقدار متغیر برابر با 10 شود. سپس اگر خروجی را نگاه کنید، خط زیر را خواهید دید:

{
   "0": "uint256: 10"
}

تابع در آموزش زبان برنامه نویسی Solidity

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

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

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

تعریف تابع در سالیدیتی

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

سینتکس ساده تعریف یک تابع به صورت زیر است:

function function-name(parameter-list) scope returns() {
   //statements
}

مثال زیر یک تابع به نام getResult تعریف می‌کند که پارامتر ورودی ندارد.

pragma solidity ^0.5.0;

contract Test {
   function getResult() public view returns(uint){
      uint a = 1; // local variable
      uint b = 2;
      uint result = a + b;
      return result;
   }
}

فراخوانی کردن یک تابع در Solidity

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

pragma solidity ^0.5.0;

contract SolidityTest {   
   constructor() public{       
   }
   function getResult() public view returns(string memory){
      uint a = 1; 
      uint b = 2;
      uint result = a + b;
      return integerToString(result); 
   }
   function integerToString(uint _i) internal pure 
      returns (string memory) {
      
      if (_i == 0) {
         return "0";
      }
      uint j = _i;
      uint len;
      
      while (j != 0) {
         len++;
         j /= 10;
      }
      bytes memory bstr = new bytes(len);
      uint k = len - 1;
      
      while (_i != 0) {
         bstr[k--] = byte(uint8(48 + _i % 10));
         _i /= 10;
      }
      return string(bstr);//access local variable
   }
}

برنامه بالا را طبق مراحل مشخص شده در اوایل مقاله اجرا کنید. خروجی زیر را مشاهده خواهید کرد:

0: string: 3

پارامترهای تابع سالیدیتی

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

مثال زیر نحوه استفاده از پارامتر را در تابع نشان می‌دهد. در اینجا از تابع uint2str استفاده کرده‌ایم که تنها یک پارامتر دریافتی دارد.

pragma solidity ^0.5.0;

contract SolidityTest {   
   constructor() public{       
   }
   function getResult() public view returns(string memory){
      uint a = 1; 
      uint b = 2;
      uint result = a + b;
      return integerToString(result); 
   }
   function integerToString(uint _i) internal pure 
      returns (string memory) {
      
      if (_i == 0) {
         return "0";
      }
      uint j = _i;
      uint len;
      
      while (j != 0) {
         len++;
         j /= 10;
      }
      bytes memory bstr = new bytes(len);
      uint k = len - 1;
      
      while (_i != 0) {
         bstr[k--] = byte(uint8(48 + _i % 10));
         _i /= 10;
      }
      return string(bstr);//access local variable
   }
}

خروجی این کد به شکل زیر خواهد بود:

0: string: 3

دستورالعمل بازگشت در تابع

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

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

pragma solidity ^0.5.0;

contract Test {
function getResult() public view returns(uint product, uint sum){
uint a = 1; // local variable
uint b = 2;
product = a * b;
sum = a + b;

//alternative return statement to return
//multiple values
//return(a*b, a+b);
}
}

برنامه بالا را طبق دستورالعمل‌های ذکر شده اجرا کنید. خروجی کد به صورت زیر خواهد بود:

0: uint256: product 2
1: uint256: sum 3

تغییردهنده توابع (Modifier)

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

contract Owner {
   modifier onlyOwner {
      require(msg.sender == owner);
      _;
   }
   modifier costs(uint price) {
      if (msg.value >= price) {
         _;
      }
   }
}

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

pragma solidity ^0.5.0;

contract Owner {
   address owner;
   constructor() public {
      owner = msg.sender;
   }
   modifier onlyOwner {
      require(msg.sender == owner);
      _;
   }
   modifier costs(uint price) {
      if (msg.value >= price) {
         _;
      }
   }
}
contract Register is Owner {
   mapping (address => bool) registeredAddresses;
   uint price;
   constructor(uint initialPrice) public { price = initialPrice; }
   
   function register() public payable costs(price) {
      registeredAddresses[msg.sender] = true;
   }
   function changePrice(uint _price) public onlyOwner {
      price = _price;
   }
}

توابع مشاهده

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

  • تغییر دادن متغیرهای وضعیت
  • برقراری رویداد
  • ساختن قراردادهای دیگر
  • استفاده از مکانیزم خودنابودی
  • ارسال ارز دیجیتال اتریوم با دستور فراخوانی
  • فرا خواندن هر تابعی که با مشخصه View یا Pure مشخص نشده باشد
  • استفاده از فراخوان‌های سطح پایین

الگوهای Get در توابع به طور پیش فرض View تعریف شده‌اند. در مثال زیر می‌توانید شیوه استفاده از یک تابع View را مشاهده کنید.

pragma solidity ^0.5.0;

contract Test {
function getResult() public view returns(uint product, uint sum){
uint a = 1; // local variable
uint b = 2;
product = a * b;
sum = a + b;
}
}

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

0: uint256: product 2
1: uint256: sum 3

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

بدون شک وقتی صحبت از طراحی و توسعه قرارداد هوشمند بر بستر شبکه اتریوم باشد، زبان برنامه نویسی سالیدیتی (Solidity) میان اکثریت توسعه دهندگان حرف اول را می‌زند. سادگی و سطح بالا بودن این زبان باعث می‌شود کاربران اسمارت کانترکت خود را برای مصارف مختلف به راحتی بسازند و روی بلاک چین اتریوم ارسال و راه اندازی کنند.

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

خدمات بانکی و مالی

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

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

قراردادهای قابل ارتقا

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

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

امور مالی معاملات

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

به همین خاطر اسمارت کانترکت‌های نوشته شده با سالیدیتی هم ریسک اشتباه را کاهش می‌دهند و هم سرعت اجرای تراکنش‌ها را بالا می‌برند. در عین حال کمتر شدن دخالت انسانی به بهوبود کارایی عملیات‌های امور مالی معاملاتی ختم می‌شود.

ذخیره اطلاعات

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

هویت دیجیتالی

هویت دیجیتال همیشه یکی از مهم‌ترین موضوعات دنیای وب 3 بوده و زبان برنامه نویسی Solidity نیز از آن پشتیبانی می‌کند. اسمارت کانترکت‌های نوشته شده با سالیدیتی می‌توانند مشکل تمرکز داده و دزدی هویت را برای همیشه حل کنند، چرا که بر بستر بلاک چین ثبت می‌شوند و اطلاعات ذخیره شده در شبکه‌های بلاک چینی نیز تغییرناپذیر هستند.

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

سخن پایانی آموزش زبان برنامه نویسی سالیدیتی

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

تهیه شده در بیت 24

از 1 تا 5 چه امتیازی به این مطلب میدهید؟

  • 1
  • 2
  • 3
  • 4
  • 5

از امتیازدهی شما سپاسگزاریم. اگر این مطلب برای شما مفید بوده است، با نوشتن نظر خود درباره آن یا اشتراک‌گذاری مقاله با دوستانتان، ما را همراهی کنید.

سوالات متداول


از سالیدیتی در کدام شبکه‌ها می‌توان استفاده کرد؟

plus minus

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


آیا یادگیری زبان سالیدیتی دشوار است؟

plus minus

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


نظر خود را بنویسید

پیام شما ثبت شد و بعد از تایید مدیر منتشر خواهد شد

کپچا

اشتراک گذاری

share

آموزش جامع زبان برنامه نویسی سالیدیتی (Solidity)

لینک کپی شد !

https://bit24.cash/blog/solidity-tutorial/