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

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

زبان برنامه نویسی سالیدیتی (Solidity) چیستReviewed by arzmonitor on Aug 18Rating: 5.0زبان برنامه نویسی سالیدیتی (Solidity) چیستزبان برنامه نویسی سالیدیتی (Solidity) چیست و چه کاربردی در صنعت ارزهای دیجیتال دارد.آموزش تنظیم قراردادهای هوشمند با استفاده از Solidity.آموزش زبان برنامه.

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

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

مفهوم قراردادهای هوشمند در زبان برنامه نویسی سالیدیتی (Solidity)

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

از نظر زبان برنامه نویسی سالیدیتی، یک قرارداد مجموعه‌ای از داده‌ها (شامل وضعیت‌ها) و یک قطعه کد (شامل توابع) است که داخل یک آدرس در شبکه اتریوم قرار گرفته است. داخل هر قرارداد می‎توانیم متغیر وضعیت، متد و یا رویداد (Event) تعریف کنیم. این قرارداد می‌تواند تراکنش‌ها را داخل بلاک ها در بلاک چین مدیریت کند. هر بلاک یک آدرس مشخص در قالب یک کلید رمزنگاری دارد. این آدرس نتیجه اعمال تابع هش روی آدرس بلاک قبلی است. این موضوع باعث ایجاد ارتباط بین بلاک های مجاور می‌شود، بنابراین ایجاد تغییر در بلاک ها و یا هک کردن به روش های دیگر به آسانی ممکن نخواهد بود.

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

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

زبان برنامه نویسی solidity یک ابزار است که از آن برای تولید کد سطح ماشین استفاده می‌ کنیم تا بتوانیم بر روی EVM اجرا نماییم. solidity یک زبان برنامه ‌نویسی با یک کامپایلر است که کد سطح بالا و خوانا برای انسان را برداشته و آن را به دستور های ساده مانند «put data into a register»، «add data from two registers»، «jump back to instruction at memory point xxxxx» تبدیل می‌ کند که اساس برنامه اجرایی هر ریز پردازنده را تشکیل می‌ دهند.

بنابراین زبان برنامه ‌نویسی solidity تنها یکی از چندین زبانی است که می‌ توانند به بایت ‌کد (bytecode) EVM  کامپایل شوند؛ زبان برنامه نویسی دیگری که کار مشابهی انجام می ‌دهد Serpent نام دارد. هر زبان برنامه نویسی ممکن است تعدادی ابزار کامپایلر داشته باشد اما همه ‌ی آن ‌ها یک کار، یعنی همان تولید بایت کد EVM در سطح ماشین برای اجرا شدن در نود های اتریوم، که سرانجام به پرداخت می‌ انجامد را انجام می ‌دهند.

زبان برنامه نویسی Solidity به خودی خود زبان ساده ‌ای است. در حقیقت، این زبان سینتکسی بسیار مشابه به ECMAScript یا همان جاوا اسکریپت دارد. نکات کلیدی‌ ای برای مرور سند Ethereum Design Rationale وجود دارد؛ از جمله اینکه با یک مدل stack-and-memory با حافظه ‌ی ۳۲ بایت کار می‌ کنیم. EVM اجازه دسترسی به برنامه «stack» را که شبیه به یک فضای رجیستر است و در آن می ‌توانیم آدرس‌ های حافظه را به یکدیگر بچسبانیم تا برنامه را وادار به تکرار حلقه و یا پرش (برای کنترل مستمر برنامه) بکنیم، را می ‌دهد. همچنین، دارای یک «memory» موقت و قابل گسترش، یک حافظه «storage» دائمی‌ که در واقع درون بلاک چین دائمی نوشته شده است. از همه مهم ‌تر، EVM نیاز به قطعیت کامل در قرارداد های هوشمند دارد.

مهمترین محیط های توسعه نرم افزار (IDE) برای برنامه نویسی به زبان برنامه نویسی سالیدیتی (Solidity)عبارتند از:

  • ریمیکس Remix
  • ویژوال استدیو Visual Studio (با استفاده از پلاگین)
  • اتر اتم Ether atom (با استفاده از پلاگین)

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

در این قسمت به تعدادی از ویژگی های پایه زبان سالیدیتی اشاره می‌کنیم. این ویژگی ها مشابه ویژگی های زبان های سطح بالایی مثل جاوا و C++ است.

  • نوع داده‌ای ایستا

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

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

  •  قرارداد و رابط‌ها (Interfaces)

در زبان برنامه نویسی سالیدیتی، یک قرارداد (Contract) یک ساختار داده (data structure) است و این امر کمک می‌کند تا بتوانیم قرارداد بسازیم و آن را مدیریت کنیم. قراردادها می‌توانند توسط قراردادهای فرزند به ارث برده شوند و از این طریق قردادهای پیچیده‌تر ایجاد شود.

  •  اصلاح کننده توابع (Function Modifier)

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

  • رویدادها (Events)

رویدادها برای نوشتن اطلاعات مربوط به قراردادها روی لاگ بلاک چین (Blockchain Log) استفاده می‌شوند. یک رویداد مشابه یک تابع است که یک داده را به عنوان ورودی دریافت کرده و آن را روی لاگ بلاک چین می‌نویسد.

  • تعیین سطح دسترسی

این ویژگی مشابه دسترسی های public و private در زبان های برنامه نویسی شیء‌گرا است. در زبان سالیدیتی نام و قوانین این دسترسی‌ها کمی تغییر کرده است. برای مثال در سالیدیتی دو سطح دسترسی owned و mortal داریم. سطح دسترسی های بیشتری هم برای برقراری امنیت بیشتر در این زبان برنامه نویسی وجود دارد.

  • تبدیل نوع داده‌ای به صورت صریح

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

  • آرایه‌های داخل حافظه

آرایه های داینامیک می‌توانند مستقیما داخل حافظه قرار بگیرند.

  • کتابخانه‌ها

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

  • امکان Import کردن

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

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

1. IDE: با مراجعه به آدرس remix.ethereum.org یک IDE کامل تحت وب خواهید داشت و برای شروع نیاز به نصب هیچ نرم‌افزاری بر روی کامپیوتر خود ندارید
2. Solidity: زبان برنامه‌نویسی برای قراردادهای هوشمند بر روی ماشین مجازی اتریوم (Ethereum Virtual Machine)

در ابتدا لینک IDE فوق را در مرورگر دلخواه خود باز کنید. به صورت پیش فرض یک قرارداد هوشمند به نام ballot.sol نمایش داده می‌شود. برای شروع کار این کد کمی پیچیده به نظر می‌رسد، به همین دلیل یک قرارداد بسیار ساده به اسم HelloWorldContract در ادامه این مطلب نوشتم که می‌توانید آن را کپی و درون ویرایشگر قرار دهید:
زبان برنامه نویسی سالیدیتی (Solidity)

تبریک می‌گم به همین راحتی اولین قرارداد هوشمندتان را با زبان برنامه نویسی سالیدیتی (Solidity) نوشتید! کد فوق آنقدر آسان است که احتمالا نیازی به توضیحات اضافه ندارید، تنها چند نکته و کلمه کلیدی که جدید به نظر می‌رسند را در ادامه شرح خواهم داد:

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

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

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

constant: ایجاد قراردادهای هوشمند و اجراء هر دستوری که باعث تغییر وضعیت بلاک‌چین بر روی ماشین مجازی اتریوم (EVM) شود، هزینه دارد و این هزینه با واحد Gas از حساب کسی که تابع را فراخوانی کرده کسر و به Miner ها پرداخت می‌شود. توابعی مانند getWord که تغییری در وضعیت قرارداد ایجاد نمی‌کنند و تنها مقدار یک متغیر را برمی‌گردانند، نباید هزینه‌ایی داشته باشند. برای مشخص‌کردن این نوع توابع از کلمه کلیدی constant استفاده می‌شود.

نکته ۱: اگر در تابع setWord از کلمه کلیدی constant استفاده کنید، بدون هیچ خطایی اجرا می‌شود اما مقدار متغیر تغییر نمی‌کند.

نکته ۲: در تست‌هایی که انجام دادم، ظاهرا بود و نبود constant دیگر تاثیری ندارد و EVM در صورتیکه تشخیص دهد تغییری در وضعیت قرارداد هوشمند ایجاد شده هزینه را محاسبه و کسر می‌کند، در غیر اینصورت هزینه‌ایی کسر نمی‌شود.

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

اجرا و تست قرارداد هوشمند:

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

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

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

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

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

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

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

Accountبرای ایجاد یک قرارداد هوشمند و فراخوانی متدهای آن باید از یک حساب اتریوم استفاده شود. به صورت پیش فرض ۵ حساب با موجودی ۱۰۰ اتریوم در اختیار برنامه نویس قرار داده شده که هزینه‌های ایجاد و اجراء قرارداد از آنها کسر می‌شود.

Gas limitگس (Gas)، واحدی با ارزش ۱/۱۰۰,۰۰۰ اتریوم است که برای ارزش‌گذاری هزینه اجراء دستورات قرارداد هوشمند بر روی ماشین مجازی اتریوم استفاده می‌شود. Gas limit، حداکثر هزینه‌ایی است که شما به عنوان اجراکننده قرارداد حاضر هستید برای اجراء آن هزینه کنید. چون هزینه اجراء قراردادهای هوشمند دستور به دستور و بعد از اجراء هر دستور کسر می‌شود، اگر در حین اجراء دستورات به این سقف برسد کل تراکنش کنسل می‌شود و هزینه دستورات اجرا شده هم پس داده نمی‌شود! در صورتیکه هزینه اجراء کمتر از Gas limit باشد، باقیمانده آن به حساب شما برگشت داده می‌شود.

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

بعد از تعیین مقادیر فوق، حال بر روی کلید Create کلیک کنید تا مشابه تصویر ذیل قرارداد هوشمند بر روی شبیه‌ساز تحت وب ایجاد شود:

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

همانطور که در تصویر فوق مشاهده می‌کنید قرارداد HelloWorldContract با موفقیت ایجاد و متدهای آن نیز لیست شده‌اند. اگر دقت فرمائید متدهای setter به رنگ صورتی و متدهای getter به رنگ آبی نمایش داده شده‌اند.

برای تست متدهای قرارداد، در TextBoxیی که در کنار متد setWord قرار دارد، مقدار “Hello Test” را به عنوان ورودی برای قرارداد ارسال و سپس با کلیک بر روی متد getWord مقدار جدید متغیر را دریافت می‌کنیم.

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

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

 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *