زبان برنامه نویسی سالیدیتی (Solidity) چیست ؟
۲۱ تیر ۱۴۰۲
زبان برنامه نویسی سالیدیتی: سالیدیتی (Solidity) زبان برنامهنویسی مورد استفاده در شبکه اتریوم است که برای توسعه قراردادهای هوشمند (smart contract) و برنامههای غیرمتمرکز (Dapp) استفاده میشود. این زبان برنامهنویسی، شبیه به زبان برنامهنویسی جاوااسکریپت (JavaScript) است و با استفاده از آن میتوان قراردادهای هوشمندی را که در بستر بلاکچین اجرا میشوند، ایجاد و اجرا کرد. سالیدیتی یک زبان قوی و انعطاف پذیر است که به برنامهنویسان امکان میدهد قراردادهای هوشمند پیچیدهتری را ایجاد کرده و با بلاکچین ارتباط برقرار کنند. این زبان برای تعریف توابع، متغیرها و کلاسها از ساختارهایی مانند زبانهای شیءگرا استفاده میکند. به طور کلی، زبان برنامه نویسی سالیدیتی یکی از تکنولوژیهای مهم در زمینه پرداخت ارزی و خرید و فروش ارز دیجیتال به شمار میرود. امروز در این این مطلب با این زبان کدنویسی آشنا خواهیم شد، پس با ما همراه باشید.
فهرست مطالب
زبان برنامه نویسی سالیدیتی چیست (Solidity)؟
یکی از ویژگیهای مهم سالیدیتی، ایمنی و امنیت قراردادهای هوشمند است. با توجه به اینکه قراردادهای هوشمند در بستر بلاکچین اجرا میشوند و تغییری در آنها بعدازافتراق ناممکن است، باید از زبانی استفاده کرد که امنیت و ایمنی قراردادهای هوشمند را تضمین کند. این ویژگی باعث شده است که سالیدیتی به عنوان زبان استاندارد برای توسعه قراردادهای هوشمند در شبکه اتریوم انتخاب شود. سالیدیتی یک زبان برنامهنویسی شیءگرا و سطح بالا برای ساخت قراردادهای هوشمند استفاده میشود. قراردادهای هوشمند در بلاکچین وظیفه اتوماسیون یا خودکارسازی تراکنشها را دارند. Solidity در سال ۲۰۱۴ معرفی شد و بعدها توسط توسعهدهندگان پروژه اتریوم توسعه یافت. اولین کاربردی که در اتریوم و قراردادهای هوشمند آن پیدا شد، امکان برگزاری ICO بود که منجر به رشد قیمت اتریوم شد و در نهایت باعث شکست حباب عرضه اولیه کوینها شد.
زبان سالیدیتی که به شدت شبیه به جاوااسکریپت است و یکی از رایجترین زبانهای برنامهنویسی محسوب میشود. با این حال، سالیدیتی میتواند به عنوان یک مدل از جاوااسکریپت در نظر گرفته شود، به این معنی که اگر شما با جاوااسکریپت آشنا باشید، درک Solidity برای شما آسان خواهد بود. علاوه بر این، زبانهای برنامهنویسی C++ و پایتون نیز شباهتهای زیادی با سالیدیتی دارند. با توجه به سطح بالای Solidity، نوشتن کد به صورت اعداد ۰ و ۱ در این زبان لزومی ندارد و برای افراد آسانتر است که با استفاده از ترکیب حروف و اعداد، برنامههای خود را بنویسند.
Solidity یک زبان استاتیک است که از وراثت، کتابخانهها و دادههای پیچیده تعریف شده توسط کاربر پشتیبانی میکند. در فرآیند اجرای یک برنامه Solidity، برنامهنویس کد را مینویسد، سپس کد نوشته شده تبدیل به کدی قابل درک برای ماشین میشود و در نهایت توسط ماشین اجرا میشود. اعتبارسنجیهایی در زمان کامپایل یا زمان اجرای برنامه انجام میشود که دقیقاً نحوه تفاوت زبانهای استاتیک و دینامیک را نشان میدهد. برای مثال، پایتون و جاوااسکریپت دو نمونه از زبانهای برنامهنویسی دینامیک هستند، در حالی که C++ یک زبان استاتیک است. زبان برنامه نویسی سالیدیتی از این حیث با C++ شباهت دارد.
یکی از ویژگیهای مهم زبان برنامهنویسی سالیدیتی ، وراثت (Inheritance) است. این ویژگی به کاربر این امکان را میدهد که توابع، متغیرها و ویژگیهای دیگری که در یک قرارداد هوشمند وجود دارد، را در قرارداد هوشمند دیگری به کار ببرد.
با توجه به اینکه Solidity یک زبان استاتیک است، معمولاً متغیرها توسط کاربر تعیین میشوند. وجود انواع مختلف دادهها باعث میشود که کامپایلر، متغیر مناسب را تشخیص دهد. دادههای Solidity در دو گروه مقداری (Value type) و ارجاعی (Reference type) قرار میگیرند. تفاوت اصلی بین دادههای مقداری و ارجاعی در نحوه تخصیص آنها به یک متغیر و ذخیره آنها در ماشین مجازی اتریوم (EVM) است. در دادههای مقداری، تغییر مقدار یک متغیر بر روی متغیر دیگر تأثیری ندارد، اما در دادههای ارجاعی با تغییر مقدار، آن مقدار در متغیرهای دیگر نیز تأثیرگذار است.
ویژگی های زبان برنامه نویسی Solidity
یکی از مهمترین عواملی که اجرای کدهای زبان برنامه نویسی سالیدیتی را ممکن میکند، ماشین مجازی اتریوم است. سالیدیتی کدهای ماشینی تولید میکند که در ماشین مجازی اتریوم قابل اجرا هستند. با استفاده از کامپایلر، کدهای سطح بالای خوانا برای انسان تجزیه شده و به دستورالعملهایی که توسط پردازنده خوانده میشوند تبدیل میشوند. برای کامپایل سالیدیتی، میتوان از پلتفرمهای آنلاین مانند Remix استفاده کرد یا از کامپایلرهایی که در کامپیوتر دانلود شدهاند استفاده کرد.
ماشین مجازی اتریوم EVM، محیط اجرایی برای قراردادهای هوشمند اتریوم است. کار اصلی EVM، ایجاد امنیت و اجرای برنامههای غیرقابل اعتماد با استفاده از یک شبکه بینالمللی از نودهای عمومی است. قراردادهای هوشمند، کدهای برنامهنویسی سطح بالایی هستند که با استفاده از ماشین مجازی اتریوم، ترجمه یا کامپایل میشوند و سپس برای اجرا به بلاکچین اتریوم ارسال میشوند. از طریق قراردادهای هوشمند، تراکنشها بدون نیاز به واسطه و سرویس شخص ثالث، به تراکنشهایی امن، قابل اعتماد، قابل ردیابی و غیرقابل بازگشت تبدیل میشوند.
قراردادهای هوشمندی که با استفاده از زبان سالیدیتی نوشته میشوند، معمولاً شامل چهار بخش اصلی هستند:
1. دستورالعمل Pragma: پراگما یک مولفه اساسی برای استفاده از کامپایلر است که برای بررسی ورژن نسخهای از زبان سالیدیتی که برای کدنویسی استفاده شده است، استفاده میشود. در صورتی که نسخهی کامپایلر با نسخهی سالیدیتی که برای کدنویسی استفاده شده مطابقت نداشته باشد، در این بخش اخطاری نمایش داده میشود. برای مثال، اگر در ابتدای یک قرارداد هوشمند، Pragma solidity ^0.7.0 باشد، کامپایلر باید بالاتر از نسخهی 0.7.0 و پایینتر از نسخهی 0.8.0 باشد.
2. متغیرهای وضعیت (State Variables): این بخش اطلاعاتی مانند قیمت ارزهای دیجیتال را نشان میدهد که در یک قرارداد هوشمند ذخیره میشوند. این متغیرها در طول اجرای قرارداد هوشمند، تغییر میکنند.
3. توابع: توابع در یک قرارداد هوشمند به عنوان واحدهای اجرایی کد، تعریف میشوند. هر تابع، یک فعالیت را برای رسیدن به یک هدف، تعریف میکند. این توابع میتوانند از کتابخانههای سالیدیتی فراخوانی شوند. این ویژگی مشابه سایر زبانهای برنامهنویسی است.
4. ایونتها (Events): ایونتها فعالیتهایی که در یک قرارداد هوشمند انجام میشود را شرح میدهند. با استفاده از ایونتها، میتوان تغییرات در قرارداد هوشمند را برای کاربران نمایش داد. مثلاً، وقتی یک تراکنش در قرارداد هوشمند انجام میشود، میتوان به وسیلهی یک ایونت، اطلاعات مربوط به آن تراکنش را به کاربران نمایش داد.
زبان سالیدیتی شباهتهای زیادی با زبانهای برنامهنویسی محبوب مانند C++، پایتون و جاوا اسکریپت دارد. به دلیل شیگرایی زبان سالیدیتی، این زبان مشابه سایر زبانهای برنامهنویسی شیگرا است. برخی از انواع دادهها یا متغیرهای رایج در زبانهای شیگرا و سالیدیتی، شامل موارد زیر هستند:
- دادههای Boolean: وضعیت را بررسی میکنند و در صورت صحیح بودن اطلاعات و تایید وضعیت، عدد ۱ و در صورت تشخیص شرایط غلط، عدد ۰ را نشان میدهند.
- دادههای Integer: تعیین میکنند که از متغیرهای اعداد صحیح در سالیدیتی استفاده شود یا خیر. همچنین، پشتیبانی از استثنائات در اجرا و همچنین عبارتهای uint256 و uint8 نیز توسط این نوع دادهها انجام میگیرد.
- دادههای String: شامل استفاده از نقلقولهای تک یا دوگانه برای طبقهبندی دادهها به عنوان یک رشته است.
- Modifier: نوع دادهی دیگری از زبان سالیدیتی است که نقش مهمی در قبل از اجرای کد قرارداد هوشمند دارد. قبل از اجرای کد، Modifier تعیین میکند که یک وضعیت خاص معقول و منطقی است یا خیر.
- دادههای Array یا آرایهای: نحوه کار دادههای آرایهای در سالیدیتی مشابه دادههای آرایهای در سایر زبانهای شیگرا است، بهویژه زبانهایی که از دادههای آرایهای تکبعدی و چندبعدی پشتیبانی میکنند.
- دادههای شمارشی (Enum)، هش و اپراتورهای نگاشت (Mapping): ویژگیهای دیگری هستند که در ساختار زبان سالیدیتی وجود دارند. با استفاده از مقادیر هش، دادههای شمارشی (Enum) و اپراتورهای نگاشت (Mapping)، میتوان متغیرها را به فضاهای ذخیرهسازی خاص بازگرداند.
ساختار دیتا در زبان برنامه نویسی سالیدیتی
ساختار داده یا Data structure یکی از عوامل بسیار مهم در کار با زبان برنامهنویسی سالیدیتی است. یکی از اولین ساختارهای داده، ساختار داده شمارشی یا Enum است که اطلاعاتی درباره لیستهای شمارش شده در زبان سالیدیتی ارائه میدهد. ساختار دیگری که در سالیدیتی مورد استفاده قرار میگیرد، Structs نام دارد. با استفاده از Structs، میتوانید انواع دادهای را مطابق با نیازها و ویژگیهای دلخواه خود طراحی کنید.
نوع دیگری از ساختارهای داده اصلی که در سالیدیتی با آن روبرو میشوید، دادههای آرایهای یا Array هستند. ساختار داده دیگری که قطعا توجه علاقهمندان به زبانبرنامهنویسی سالیدیتی را به خود جلب خواهد کرد، ساختار داده Mappings است. ساختار Mappings یکی از مهمترین اجزای زبان سالیدیتی است و برای ذخیرهسازی جفتهای کلید-مقدار (Key-value pairs) استفاده میشود. با استفاده از این ساختار داده، میتوانید به سادگی اطلاعات را در داخل قرارداد هوشمند ذخیره کنید و به آنها دسترسی داشته باشید.
اجرای برنامه های سالیدیتی
آشنایی شما با نحوه اجرای برنامههای سالیدیتی در بلاکچین اتریوم، به دانش شما در زمینه استفاده از زبان سالیدیتی بستگی دارد. برای اجرای برنامههای سالیدیتی، دو روش آنلاین و آفلاین وجود دارد. در روش آنلاین، برنامهها به صورت مستقیم در بلاکچین اجرا میشوند و در روش آفلاین، برنامهها ابتدا در یک محیط شبیهسازی اجرا میشوند و پس از اطمینان از صحت آنها، در بلاکچین اجرا میشوند.
همچنین در زبان سالیدیتی، استانداردها برای برنامههای کاربردی وجود دارند که باید رعایت شوند. همچنین، هزینه گس نیز برای اجرای برنامهها در بلاکچین اتریوم وجود دارد که باید به آن توجه شود. در زبان سالیدیتی، توابع خصوصی و عمومی نیز وجود دارند. توابع خصوصی فقط در داخل قرارداد هوشمند در دسترس هستند و توابع عمومی در سایر قراردادها و برنامهها مورد استفاده قرار میگیرند. این دسته از توابع برای دسترسی عمومی و استفاده در برنامههای دیگر طراحی شدهاند.
روش آفلاین
برای اجرای قراردادهای هوشمند EVM سالیدیتی بهصورت آفلاین، ابتدا باید ۳ نکته مهم را رعایت کنید. اولین شرط اجرای قرارداد هوشمند سالیدیتی دانلود و نصب Node.js است. علاوه بر آن، برای اجرای قرارداد هوشمند سالیدیتی باید پیشنیازهای Truffle و Ganache-CLI نیز نصب شوند.
برای اجرای قرارداد هوشمند سالیدیتی بهصورت آفلاین، باید مراحل زیر را طی کنید:
1. یک پروژه Truffle بسازید و یک شبکه توسعه قابل اعتماد برای آن ایجاد کنید.
2. یک قرارداد هوشمند برای پروژه خود بسازید.
3. کارها و تغییرات لازم را برای قرارداد هوشمند خود از طریق داشبورد Truffle انجام دهید.
4. با انجام تستهای مختلف، ویژگیهای اصلی سالیدیتی را برای قرارداد هوشمند خود آزمایش کنید.
در این روش اجرایی، یک شبیهسازی از بلاکچین اتریوم در محیط خود شما ایجاد میشود و شما میتوانید قرارداد هوشمند خود را در این محیط تست کنید. بهعنوان مثال، میتوانید با استفاده از Ganache-CLI، شبکه توسعه خود را شبیهسازی کرده و قرارداد هوشمند خود را در آن تست کنید. این روش اجرایی بهعنوان یک روش آموزشی و تستی بسیار مناسب است و برای توسعهدهندگانی که قصد یادگیری زبان سالیدیتی و توسعه قراردادهای هوشمند را دارند، بسیار مفید است.
روش آنلاین
سالیدیتی زبانی برای نوشتن قراردادهای هوشمند در اتریوم است. کدهای Solidity می توانند به صورت آنلاین در سرورهای Remix IDE کامپایل و اجرا شوند. استاندارهای مختلفی برای نحوه اجرای کد Solidity وجود دارد مانند:ERC20, ERC721 که منطق و روش کار زبان برنامه نویسی سالیدیتی را مشخص می کنند. Solidity امکان ساخت دستورالعملهای ذخیره داده در قراردادهای هوشمند را فراهم میکند. هر عملیات اجرایی هزینه Gas دارد که باید بهینه سازی شود. توابع عمومی و خصوصی تعریف شده اند. مزایایSolidity عبارتند از: پشتیبانی از انواع داده، امنیت نوع داده و قابلیتهای شی گرا.
کارمزد یا گس فی (Gas Fee)
استفاده از Solidity در شبکه اتریوم با هزینه های اضافه ای به حساب گس مرتبط است. گس به عنوان سوخت بلاکچین اتریوم عمل می کند. هزینه گس بسیار مهم برای کارایی قرارداد هوشمند است. زیرا برای استفاده از هر بخش حافظه نیاز به پرداخت گس وجود دارد. بهینه سازی گس شامل استفاده از کتابخانه ها و کاهش استفاده از توابع است. اضافه کردن بایت کد های اضافی باعث افزایش گس می شود.
با قرار دادن منطق در کتابخانه ها، اندازه قرارداد کم می شود و استفاده کمتر از توابع باعث کاهش بایت کد می شود. در کل، هزینه گس یکی از جنبه های کلیدی برای موفقیت قرارداد هوشمند است. و راههای بهینهسازی گس میتواند عملکرد آن را بهبود بخشد.
توابع خصوصی و عمومی زبان برنامه نویسی سالیدیتی
توابع عمومی مانند APIهای عمومی عمل می کنند و توسط همه قابل دسترسی هستند. معمولا برای فرآیندهای مشترک استفاده می شوند. یکی از روش های متداول هک قراردادهای هوشمند از طریق توابع عمومی است. بنابراین لازم است آنها را با احتیاط نوشته شوند. توابع خصوصی فقط از داخل قرارداد هوشمند قابل فراخوانی هستند. این امنیت بیشتری را فراهم می آورد.
توابع عمومی بهتر است برای فرآیندهای ساده مورد استفاده قرار گیرند و توابع خصوصی برای الگوریتم های پیچیده. بنابراین توابع خصوصی امنیت بیشتری دارند زیرا دسترسی آنها محدود است.
نتیجه گیری
طبق تجربه نشان میدهد زبان برنامه نویسی سالیدیتی زبان بسیار مناسبی برای ساخت قراردادهای هوشمند در اتریوم است؛ چرا که:
• ساختار و سنتاکس ساده ای دارد که قابل فهم برای توسعه دهندگان می باشد.
• پشتیبانی از اکثر مفاهیم شی گرایی توسط کلاس ها و ارث بری دارد.
• انواع داده های غیراسکالر مانند رشته، آرایه و اشیاء نیز پشتیبانی می شوند.
• برای امنیت بالا، توابع Solidity از نوع دادههای بسته پیروی میکنند.
نکته مثبت دیگر زبان برنامه نویسی سالیدیتی این است که به طور فزاینده ای استانداردها و الگوهای تعریف شدهای دارد که ساخت و استفاده از قراردادهای هوشمند را آسان میکند. همچنین ساختار قراردادهای هوشمند و توابع خاص آنها در Solidity به خوبی تعریف شده است. بنابراین میتوان گفت Solidity زبانی قدرتمند، امن و پشتیبانی شده برای توسعه قراردادهای هوشمند در اتریوم است و از همین رو میتواند انتخاب مناسبی برای این منظور باشد. شما هم در این خصوص نظرتان را بیان کنید.