
برنامههای غیرمتمرکز یا Dappها، برنامههایی هستند که بر بستر بلاکچینهای مختلف مثل اتریوم ساخته میشوند. برای ساخت پلتفرمهای غیرمتمرکز از قراردادهای هوشمند استفاده میشود. همانند هر برنامه یا اپلیکیشن دیگری، توسعه برنامههای غیرمتمرکز نیز به برنامهنویسی و اجرای کد در سیستم نیازمند است. زبان برنامهنویسی منتخب برای شبکه اتریوم، سالیدیتی (Solidity) است. در این مقاله از میهن بلاکچین به این سوال پاسخ میدهیم که سالیدیتی چیست، نحوه کار آن چگونه است و چه ویژگیهایی دارد.
زبان برنامه نویسی سالیدیتی چیست؟
سالیدیتی یک زبان برنامهنویسی شیءگرا (Object-oriented) و سطح بالا است که برای ساخت قراردادهای هوشمند استفاده میشود. قراردادهای هوشمند وظیفه اتوماسیون یا خودکارسازی تراکنشها در بلاک چین را دارند. زبان برنامهنویسی سالیدیتی در سال ۲۰۱۴ معرفی شد و بعدها توسط مشارکتکنندگان در پروژه اتریوم توسعه یافت. از اولین کاربردهای اتریوم و قراردادهای هوشمند، امکان برگزاری ICO ها بود که منجر به رشد شدید قیمت اتریوم و نهایتا ترکیدن حباب عرضه اولین کوین نیز شد.
سالیدی تقریبا شبیه زبان برنامهنویسی جاوا اسکریپت (Javascript) است که یکی از رایجترین زبانهای برنامهنویسی محسوب میشود. سالیدیتی را میتوان مدلی از جاوا اسکریپت در نظر گرفت؛ یعنی اگر جاوا اسکریپت را بفهمید، درک سالیدیتی نیز برایتان آسان خواهد بود. زبانهای برنامهنویسی C++ و پایتون (Python) نیز شباهت زیادی به سالیدیتی دارند.
با توجه به سطح بالای سالیدیتی، در این زبان نیازی به نوشتن کد به صورت اعداد ۰ و ۱ نیست. در نتیجه برای افراد آسانتر است که با این زبان، برنامهها را به روشهای راحتتر و با استفاده از ترکیب حروف و اعداد بنویسند.
زبان Solidity از نوع استاتیک است و از وراثت، کتابخانه و دادههای پیچیده تعریفشده توسط کاربر پشتیبانی میکند. روند اجرای یک برنامه به این صورت است که ابتدا برنامهنویس کد را مینویسد، سپس کد نوشتهشده به کدی قابل درک برای ماشین تبدیل (Compile) میشود و نهایتا توسط ماشین اجرا میگردد. اعتبارسنجیهایی در زمان کامپایل یا زمان اجرای برنامه (Run Time) انجام میشود که دقیقا نحل تفاوت زبانهای دینامیک و استاتیک است. برخلاف زبانهای دینامیک که در زمان Run میتوان کدها را بازبینی کرد، در سالیدیتی بازبینی کدها در زمان Compile امکانپذیر است. برای مثال، پایتون و جاوا اسکریپت یک زبان برنامهنویسی دینامیک هستند، در حالی که C++ یک زبان استاتیک است. سالیدیتی از این حیث مشابه C++ است.
دیگر ویژگی ذکرشده زبان برنامهنویسی سالیدیتی، وراثت (Inheritance) است. وراثت یعنی توابع، متغیرها و سایر ویژگیهایی که در یک قرارداد هوشمند وجود دارد را میتوان در قرارداد هوشمند دیگری به کار برد.
از آنجایی که سالیدیتی یک زبان استاتیک است، متغیرها اکثرا توسط کاربر تعیین میشوند. وجود انواع مختلفی از دادهها باعث میشود که کامپایلر (Compiler) متغیر مناسب را تشخیص دهد. دادههای سالیدیتی معمولا در دو گروه مقداری (Value type) و ارجاعی (Reference type) دستهبندی میشوند. تفاوت اصلی دادههای مقداری با دادههای ارجاعی در نحوه تخصیص آنها به یک متغیر و ذخیره آنها در ماشین مجازی اتریوم (EVM) است. در انواع مقداری، تغییر مقدار یک متغیر اثری بر متغیر دیگر ندارد، اما در انواع ارجاعی با تغییر مقادیر، آن مقدار در متغیرهای دیگر نیز اعمال میشود.
نحوه کار و برخی ویژگیهای زبان برنامهنویسی سالیدیتی
زیبایی اکوسیستم اتریوم در این است که برنامههای غیرمتمرکز و ارزهای دیجیتال مختلف میتوانند از آن استفاده کنند. قراردادهای هوشمند این امکان را برای کسبوکارها و سازمانها فراهم میکنند که فناوریهای خاص خود را بر بستر اتریوم بسازند. سالانه در سراسر جهان میلیاردها دلار برای راهکارهای بلاکچینی هزینه میشود. اکثر این راهکارها با استفاده از زبان سالیدیتی ساخته میشوند. قراردادهای هوشمند ساختهشده با سالیدیتی را میتوان روشی برای اتوماسیون تراکنشهای تجاری و غیرتجاری بین افراد دانست.
یکی از اصلیترین عواملی که اجرای کد Solidity را ممکن میکند، ماشین مجازی اتریوم است. در واقع سالیدیتی کدهای ماشینی تولید میکند که در ماشین مجازی اتریوم قابل اجرا هستند. با استفاده از کامپایلر، کدهای سطح بالای قابل خواندن برای انسان تجزیه شده و به دستورالعملهایی که توسط پردازنده خوانده میشود تبدیل میشوند. برای کامپایل سالیدیتی میتوان از پلتفرمهای آنلاین مثل Remix و یا از کامپایلرهای دانلود شده در کامپیوتر استفاده کرد.
ماشین مجازی اتریوم EVM یک محیط اجرایی برای قراردادهای هوشمند اتریوم است. کار اصلی EVM، ایجاد امنیت و اجرای برنامههای غیرقابل اعتماد با استفاده از یک شبکه بینالمللی متشکل از نودهای عمومی است.
قراردادهای هوشمند کدهای برنامهنویسی سطح بالا هستند که ابتدا در ماشین مجازی اتریوم ترجمه یا کامپایل میشوند و سپس برای اجرا به بلاک چین اتریوم ارسال میشوند. قرارداد هوشمند بدون استفاده از واسطه و سرویس شخص ثالث، تراکنشها را به تراکنشهای امن، قابل اعتماد، قابل ردیابی و غیرقابل بازگشت تبدیل میکند.
در ادامه میخواهیم به تعدادی از ویژگیهای پایه زبان سالیدیتی اشاره کنیم. این ویژگیها مشابه ویژگیهای زبانهای سطح بالایی مثل جاوا و C++ است.
- نوع دادهای ایستا: هرچند که این زبان ساختاری شبیه جاوا اسکریپت را دارد، اما برخلاف جاوا اسکریپت نوع دادهای آن ایستا است. برای مثال شما در جاوا و C++ باید در زمان تعریف یک متغیر و پیش از استفاده از آن، نوع آن متغیر را تعیین کنید. در غیر این صورت در زمان کامپایل با خطا مواجه میشوید. از این نظر سالیدیتی مانند جاوا و C++ است.
- قرارداد و رابطها (Interfaces): در زبان برنامهنویسی سالیدیتی، یک قرارداد (Contract) یک ساختار داده (data structure) است و این امر کمک میکند تا بتوانیم قرارداد بسازیم و آن را مدیریت کنیم. قراردادها میتوانند توسط قراردادهای فرزند به ارث برده شوند و از این طریق قراردادهای پیچیدهتر ایجاد شود.
- اصلاح کننده توابع (Function Modifier): این ویژگی مشابه امکان بازنویسی توابع در زبانهای برنامهنویسی شیءگرا است. فرض کنید میخواهید در صورت برقراری یک شرط، یک تابع را به روشی متفاوت اجرا کنید. برای این منظور میتوانید از این ویژگی استفاده کنید و رفتار تابع را تغییر دهید. اصلاح کننده توابع برای بازنویسی توابع در قراردادهای وارث نیز کاربرد دارد.
- رویدادها (Events): رویدادها برای نوشتن اطلاعات مربوط به قراردادها روی لاگ بلاکچین (Blockchain Log) استفاده میشوند. یک رویداد مشابه یک تابع است که یک داده را به عنوان ورودی دریافت کرده و آن را روی لاگ بلاک چین مینویسد.
- تبدیل نوع دادهای به صورت صریح: شما با استفاده از سالیدیتی میتوانید نوع دادهها را تغییر دهید. این تغییرها معمولا در زمان کامپایل بررسی میشوند، البته استثناهایی هم وجود دارد.
- آرایههای داخل حافظه: آرایههای داینامیک میتوانند مستقیما داخل حافظه قرار بگیرند.
- تغییرناپذیری: پس از نوشته شدن و کامپایل یک قرارداد هوشمند، دیگر امکان تغییر کد آن وجود ندارد. یعنی تک تک خطوط کد باید طبق انتظار عمل کنند، در غیر این صورت کد ممکن است در معرض هک و سواستفاده قرار بگیرد. بلاک چین اتریوم نیز تغییرناپذیر است و نمیتوان داده و منطق نوشته شده در آن را تغییر داد. یکی از روشهای دور زدن تغییرناپذیری، استفاده از یک پروکسی و اشاره به قرارداد هوشمندی است که حاوی منطق تجاری حقیقی است. در این صورت امکان رفع باگها هنگام پیادهسازی نسخه جدید قرارداد فراهم میشود.
- کتابخانهها: شما میتوانید از کتابخانههای متنوعی برای نوشتن قراردادهای خود استفاده کنید و از این طریق قرارداد خود را سفارشیسازی کنید.
- امکان Import کردن: با استفاده از کلمه کلیدی import شما میتوانید کدهای فایلهای دیگر را به قرارداد خود اضافه کنید.
- سطح دسترسی تابع: سطح دسترسی در زبانبرنامه نویسی سالیدیتی نقش مهمی در تعیین محدوده توابع قرارداد هوشمند دارد. برای مثال، سطح دسترسی تابع عمومی یا Public امکان بکارگیری تابع از حسابهای خارج از قرارداد هوشمند را فراهم میکند. دسترسی داخلی یا Internal نیز در ساخت توابعی کاربرد دارد که فقط در داخل قراردادهای هوشمند قابل استفاده هستند.
قراردادهای هوشمندی که به کمک زبان سالیدیتی نوشته میشوند، معمولا شامل ۴ بخش زیر هستند:
- دستورالعمل Pragma: پراگما مولفه اساسی برای استفاده از Compiler به منظور بررسی ورژن نسخهای است که برای کدنویسی از آن استفاده شده است. در صورتی که نسخه Match نباشد، در این بخش اخطاری را مشاهده خواهید کرد. برای مثال اگر در ابتدای یک قرارداد هوشمند Pragma solidity ^۰.۷.۰ باشد، Compiler باید بالاتر از نسخه ۰.۷.۰ و پایینتر از ۰.۸.۰ باشد.
- State variable: این بخش اطلاعات متغیری همانند قیمت ارزهای دیجیتال را نشان میدهد که در یک قرارداد هوشمند ذخیره میشوند.
- توابع: توابع در یک قرارداد هوشمند به واحد اجرایی کد گفته میشود. یک تابع، یک فعالیت را برای رسیدن به یک هدف، تعریف میکند. این ویژگی قابلیت این را دارد که از کتابخانه سالیدیتی فراخوانده شود. این ویژگی دقیقا مشابه سایر زبانهای برنامه نویسی است.
- Event: ایونت فعالیتهایی که در یک قرارداد هوشمند وجود دارد را شرح میدهد.
انواع داده های زبان برنامهنویسی سالیدیتی
ساختار زبان Solidity شباهتهای زیادی با زبانهای برنامهنویسی محبوب مثل C++، پایتون و جاوا اسکریپت دارد. با توجه به شیگرا بودن زبان سالیدیتی، این زبان مشابه سایر زبانهای OOP است. برخی از انواع دادهها یا متغیرهای رایج در زبانهای OOP و سالیدیتی، شامل صحیح و غلط (Boolean)، عددی معمولی (Integer)، متنی (String)، آرایهای (Array) و ویرایشگر (Modifier) هستند.
- دادههای Boolean وضعیت را بررسی میکند و در صورت صحیح بودن اطلاعات و تایید وضعیت عدد ۱ و در صورت تشخیص شرایط غلط عدد ۰ را نشان میدهد.
- دادههای Integer تعیین میکنند که از متغیرهای اعداد صحیح در سالیدیتی استفاده شود یا استفاده نشود. پشتیبانی از استثنائات در اجرا و همچنین عبارتهای ‘uint256’ و ‘uint8’ نیز توسط این نوع از دادهها انجام میگیرد.
- نوع داده String شامل استفاده از نقلقولهای تک یا دوگانه برای طبقهبندی دادهها به عنوان یک رشته است.
- Modifier نوع دیگری از دادههای زبان سالیدیتی است و نقش مهمی در قبل از اجرای کد قرارداد هوشمند دارد. قبل از اجرای کد، Modifier تعیین میکند که یک وضعیت خاص معقول و منطقی است یا خیر.
- نحوه کار دادههای Array یا آرایهای مشابه دادههای سایر زبانهای OOP است، مخصوصا زبانهایی که از دادههای آرایهای تکبعدی و چندبعدی پشتیبانی میکنند.
ویژگی مهم دیگری که در ساختار زبان سالیدیتی وجود دارد این است که میتوان جهت بازگرداندن متغیرها به فضاهای ذخیره سازی خاص، از مقادیر هش، دادههای شمارشی (Enum) و اپراتورها برای نگاشت یا Mapping ساختارهای داده استفاده کرد.
ساختارهای داده در سالیدیتی
عامل بسیار مهم دیگری که در کار با زبان برنامهنویسی سالیدیتی باید به آن توجه کنید، ساختار داده یا Data structure است. یکی از اولین ساختارهای داده، ساختار داده شمارشی یا Enum است که اطلاعاتی درباره لیستهای شمارش شده در زبان سالیدیتی ارائه میدهد. Structs انواع دیگری از ساختارهای داده محبوب است که به کمک آنها میتوانید انواع داده مدنظر خود را تعریف کنید. Structs به شما کمک میکند تا هر نوع دادهای را مطابق با نیازها و ویژگیهای دلخواه خود طراحی کنید.
نوع دیگری از ساختارهای داده اصلی که در سالیدیتی با آن روبهرو میشوید، دادههای آرایهای یا Array هستند. ساختار داده دیگری که قطعا توجه علاقهمندان به زبانبرنامهنویسی سالیدیتی را به خود جلب خواهد کرد، ساختار داده Mappings است. ساختار Mappings یکی از مهمترین اجزای زبان سالیدیتی است و از آن در ذخیرهسازی جفتهای کلید-مقدار (Key-value pairs) استفاده میشود.
اجرای کد، استانداردها و هزینه گس در زبان برنامهنویسی سالیدیتی
دانش استفاده از زبان سالیدیتی در بلاکچین اتریوم تا حد زیادی به آشنایی شما با نحوه اجرای برنامههای سالیدیتی بستگی دارد. برنامههای سالیدیتی را میتوان به دو روش آنلاین و آفلاین اجرا کرد. در ادامه نحوه اجرای برنامههای سالیدیتی به دو روش آنلاین و آفلاین،استانداردها و هزینه گس را بررسی میکنیم. همچنین اشارهای به توابع خصوصی و عمومی خواهیم داشت.
روش آفلاین
اولین روش اجرای قراردادهای هوشمند EVM سالیدیتی، روش آفلاین است. قبل از اجرای یک قرارداد هوشمند بهصورت آفلاین، حتما باید ۳ نکته مهم زیر را رعایت کنید. اولین شرط اجرای قرارداد هوشمند سالیدیتی دانلود و نصب Node.js است. علاوه بر آن، برای اجرای قرارداد هوشمند سالیدیتی باید پیشنیازهای Truffle و Ganache-CLI را نیز نصب کنید. برای اجرای قرارداد هوشمند سالیدیتی بهصورت آفلاین، باید مراحل زیر را طی کنید:
- یک پروژه Truffle بسازید و یک شبکه توسعه قابل اعتماد برای آن ایجاد کنید.
- یک قرارداد هوشمند برای پروژه خود بسازید.
- از طریق داشبورد Truffle، کارها و تغییرات لازم را برای قرارداد هوشمند خود انجام دهید.
- با انجام تستهای مختلف، ویژگیهای اصلی سالیدیتی را آزمایش کنید.
روش آنلاین
کدهای قرارداد هوشمند Solidity در شبکه اتریوم را بهصورت آنلاین نیز میتوان اجرا کرد. استفاده از سرورهای Remix IDE، بهترین روش کامپایل و اجرای قرارداد هوشمند سالیدیتی بهصورت آنلاین است.
استانداردها و منطق کد
استانداردهای مختلفی وجود دارد که تعیین میکنند چگونه از قراردادهای هوشمند سالیدیتی برای ساخت برنامهها در بلاکچین اتریوم استفاده شود. این استانداردها Ethereum Request for Comments یا به اختصار استانداردهای ERC نام دارند. استانداردها مبتنی بر فایلی هستند که شامل دستورالعملهایی مربوط به توابع مورد نیاز و محدودیتهای کد است. استانداردهایی که نحوه کار سالیدیتی را تعیین میکنند عبارتند از:
به روشهای مختلف میتوان از سالیدیتی برای ایجاد تعامل بین قراردادهای هوشمند استفاده کرد. از طریق سالیدیتی میتوان دستورالعملهایی برای چگونگی ذخیره داده در قرارداد هوشمند ایجاد کرد. علاوه بر اینها، با استفاده از سالیدیتی میتوان منطق و دادههای قرارداد هوشمند را از هم جدا کرد. این کار با استفاده از قراردادهای جایگزین و تغییر منطق یک قرارداد ممکن میشود.
هزینه گس یا کارمزد
استفاده از سالیدیتی در شبکه اصلی اتریوم با هزینههای اضافی همراه است. بخشی از این هزینههای اضافی براساس سیستم گس (Gas) اتریوم است که در ازای تامین امنیت شبکه بلاکچین و کمک به اجرای کد در شرایط امن، به نودها پرداخت میشود. در نوشتن قرارداد هوشمند باید به این نکته توجه کرد که هزینه گس نقش مهمی در تعیین کارآمدی یک قرارداد هوشمند دارد. از آنجایی که برای استفاده از هر اسلات حافظه باید هزینه گس پرداخت شود، تمام عملیات انجام شده با کد سالیدیتی نیز با کارمزد همراه است. قراردادهای هوشمندی که اجرای آنها پرهزینه است، به احتمال زیاد در بلندمدت مورد استفاده قرار نخواهند گرفت.
بهینهسازی گس، به کاهش هزینههای اجرای کد سالیدیتی کمک میکند. محبوبترین روشهای بهینهسازی گس، استفاده از کتابخانهها و استفاده کمتر از توابع است. از کتابخانه اغلب برای ذخیرهسازی بایتکد (Bytecode) استفاده میشود.
بهجای اضافه کردن بایتکدهای بیلزوم به قرارداد هوشمند، میتوان منطق را در کتابخانهها قرار داد. این باعث میشود که اندازه قرارداد هوشمند کوچک بماند. با استفاده کمتر از توابع، به بایتکدهای کمتر نیاز خواهد بود و سختی بازبینی کد نیز کاهش خواهد یافت.
توابع عمومی و خصوصی
توابع عمومی (Public) مشابه APIهای عمومی هستند که هر کسی در دنیا میتواند به آنها دسترسی داشته باشد و در کد خود از آنها استفاده کند. توابع عمومی اغلب برای فرایندهای مشترک در پلتفرمها که برای تمام کاربران قابل استفاده است، طراحی میشوند. برای مثال میتوان یک تابع عمومی در پلتفرم ساخت تا بهوسیله آن تمام کاربران بتوانند موجودی حساب خود را مشاهده کنند. یکی از رایجترین روشهای هک قراردادهای هوشمند، هک کردن از طریق توابع عمومی است.
نوشتن قرارداد هوشمند با زبان سالیدیتی آسان است، اما ساخت قراردادهایی که از امنیت کافی برخوردار باشند سخت است. مثلا اگر تابع برداشت وجه یک قرارداد هوشمند امن نباشد، یک هکر میتواند تابع آسیبپذیر را دستکاری کرده و وجوه را سرقت کند، یا هکر میتواند از طریق تابع برداشت به یک حساب دیگر پول ارسال کند و با استفاده از یک چرخه یا لوپ، عمل انتقال پول را بهطور مکرر تکرار کند.
توابع خصوصی فقط از داخل قرارداد هوشمند قابل اجرا هستند. این توابع دارای دستورالعملهایی هستند که فقط هنگام فراخوانی توسط توابع دیگر و بهصورت زنجیره ای قابل اجرا هستند. این باعث میشود که دستکاری کد برای هکرها بسیار سخت شود.
مزایای زبان برنامهنویسی سالیدیتی
موفقیت و کارآمدی استفاده از برنامهنویسی سالیدیتی در اتریوم تا حد زیادی به مزیتهای ارزشی ایجاد شده توسط آن بستگی دارد. زبان سالیدیتی به غیر از قابلیتهای پایه، ویژگیهای جالب زیادی دارد که آن را به یک گزینه مناسبتر نسبت به سایر زبانهای برنامهنویسی اتریومی تبدیل کرده است. اولین مزیت سالیدیتی پشتیبانی همزمان از انواع داده پیچیده، متغیرهای جزء و انواع داده اصلی است.
همچنین زبان برنامهنویسی سالیدیتی از طریق یک واسط دودویی کاربردی یا ABI، امنیت نوع داده را تامین میکند. وقتی کامپایلر تشخیص میدهد که نوع داده با متغیر سازگار نیست، ABI امکان شناسایی سریع خطاها را فراهم میکند.
موارد زیر، مزیتهای دیگر استفاده از زبان سالیدیتی برای ساخت برنامههای غیرمتمرکز و قراردادهای هوشمند هستند:
- دسترسی آسان به قابلیتهای شیگرا در قراردادهای هوشمند، مثل ویژگیهای وراثتی چند-سطحی.
- پشتیبانی از متغیرهای مختلف با استفاده از ABI.
- نحوه کار ساده که به مبتدیها کمک میکند تا مبانی توسعه بلاکچین و قراردادهای هوشمند را یاد بگیرند.
- توسعه قراردادهای هوشمند با زبان برنامهنویسی سالیدیتی به افزایش امنیت و اعتبار پلتفرمهایی که با توافقات بین طرفهای مختلف سر و کار دارند، کمک میکند.
پرسش و پاسخ (FAQ)
- زبان برنامهنویسی سالیدیتی چیست؟
سالیدیتی زبان برنامهنویسی مورد استفاده در بلاکچین اتریوم است که توسط اعضای همین پروژه توسعه داده شده است. برای نوشتن قراردادهای هوشمند و ساخت برنامههای غیرمتمرکز در اتریوم از Solidity استفاده میشود.
- سالیدیتی به کدام یک از زبانهای برنامهنویسی مطرح نزدیک است؟
سالیدیتی شباهتهایی با زبانهای برنامهنویسی C++ و پایتون دارد، اما بیش از همه به زبان جاوا اسکریپت نزدیک است.
- نقش ماشین مجازی اتریوم در سالیدیتی چیست؟
اجرای کدهایی که با Solidity نوشته میشوند، به کمک ماشین مجازی اتریوم ممکن میشود. در واقع به کمک سالیدیتی کدهای ماشینی تولید میشود و اجرای این کدها در ماشین مجازی اتریوم رخ میدهد.
جمعبندی
سالیدیتی یک زبان برنامهنویسی محبوب و کاربردی است که برای ساخت برنامههای غیرمتمرکز و قراردادهای هوشمند در شبکه اتریوم از آن استفاده میشود. میتوان گفت که Solidity پرکاربردترین زیان برنامهنویسی در دنیای بلاکچین تا امروز بوده است. نحوه کار زبان سالیدیتی تا حد زیادی مشابه زبانهای محبوب مثل جاوا اسکریپت است. در این مقاله سعی کردیم تا پاسخی جامع به سوال سالیدیتی چیست بدهیم. همچنین ویژگیها، دادهها و ساختار، نحوه کار و استانداردهای زبان برنامهنویسی Solidity نیز بررسی شد. به نظر شما آیا سالیدیتی انتخاب مناسبی برای ساخت برنامههای غیرمتمرکز و قراردادهای هوشمند است؟ دیدگاه خود را با ما به اشتراک بگذارید.