اپلیکیشنهای غیرمتمرکز (dApps) را میتوان بهعنوان مرحله مهمی از تکامل پروژههای دیجیتال در نظر گرفت. این اپلیکیشنها امکانات زیادی را برای پروژههای جدید فراهم کردهاند تا در صنایع مختلف مورد استفاده قرار بگیرند و در عین حال مشوق رشد اکوسیستم دیفای هم هستند. زبان برنامه نویسی سالیدیتی در اتریوم چه ارتباطی با اپلیکیشنهای غیرمتمرکز دارد؟ در حقیقت، بیشتر این اپلیکیشنها بر بستر بلاکچین اوپن سورس و غیرمتمرکز اتریوم، توسعه پیدا کردهاند.
سالیدیتی بهعنوان زبان برنامهنویسی اپلیکیشنهای غیرمتمرکز به کار رفته و ارتباط آنها با اتریوم از این طریق ایجاد شده است. در این مطلب به معرفی کامل اصول زبان برنامه نویسی سالیدیتی و مفاهیم مهم آن میپردازیم. همچنین در مورد روشهای شروع برنامهنویسی با سالیدیتی به طور مفصل خواهیم گفت.
تعریف زبان برنامه نویسی سالیدیتی
یکی از اولین موضوعات در بحث سالیدیتی، پاسخ به سوالات مربوط به «زبان برنامه نویسی سالیدیتی چیست؟» و اهمیت آن، خواهد بود. اپلیکیشنهای غیرمتمرکز درست مانند هر نرمافزار یا اپلیکیشن دیگری هستند و نیاز به زبان برنامهنویسی دارند تا کدهای مورد نیاز برای سیستم خود را اجرا کنند.
سالیدیتی زبان برنامهنویسی اصلی برای توسعه قراردادهای هوشمند در بلاکچین اتریوم است و به دلیل این که اساس آن مبتنیبر قرارداد است، منطق تعامل آن با اتریوم، از طریق قراردادهای هوشمند خواهد بود.
از لحاظ آماری، ویژگیهای این زبان برنامهنویسی سطح بالا شباهتهای چشمگیری با زبانهای برنامهنویسی محبوب مثل پایتون، سی پلاس پلاس و جاوا اسکریپت دارد. از همه مهمتر اینکه، زبان برنامه نویسی سالیدیتی برای اجرا روی ماشین مجازی اتریوم یا EVM، طراحی شده است و روی نودهای اتریوم که با بلاکچین در ارتباط هستند، قرار میگیرد.
در اصل، اهمیت زبان برنامه نویسی سالیدیتی برای بلاکچین اتریوم به دلیل قابلیت توسعه اپلیکیشنهای بلاکچینی در صنایع مختلف با استفاده از این زبان است. این زبان توسط تیم شبکه اتریوم ساخته شده و هدف اصلی آن طراحی و ایجاد قراردادهای هوشمند روی پلتفرمهای بلاکچینی است.
سالیدیتی به ایجاد قراردادهای هوشمند کمک میکند بنابراین پس از اجرای قرارداد، زنجیرهای از سوابق تراکنشها در داخل سیستم بلاکچین ایجاد میشود. کاربرد اصلی سالیدیتی روی توسعه کد در سطح ماشین و تسهیل پیادهسازی کدها روی ماشین مجازی اتریوم (Ethereum Virtual Machine) است. طراحی این زبان برنامهنویسی هم مشابه با سایر زبانها بوده و شامل متغیر، کلاس، عملیات محاسباتی، توابع و سایر مفاهیم است.
رشد برنامه نویسی با زبان سالیدیتی
رشد زبان برنامه نویسی سالیدیتی در اتریوم هم نکته مهم و قابل توجهی است که باید در معرفی آن بهعنوان زبان توسعه قراردادهای هوشمند، در نظر گرفته شود. سالیدیتی یک زبان نسبتا جدید محسوب میشود که به سرعت رشد کرده و به مرور بهبودهای بزرگی در آن ایجاد شده است. در حال حاضر، توسعه قراردادهای هوشمند در بلاکچین اتریوم بر زبان برنامه نویسی سالیدیتی استوار است.
علاوهبر این، سالیدیتی به نوشتن قراردادهای هوشمند برای شبکههای بلاکچین خصوصی که روی پلتفرمهای رقیب مانند Monax اجرا میشوند هم کمک میکند. پلتفرم Monax از بلاکچین Hyperledger Burrow استفاده میکند که وظیفه اطمینان از اجماع در آن، بر عهده پروتکل Tendermint است. در کنار همه اینها، SWIFT هم یک اثبات مفهوم (Proof of Concept) ایجاد کرده است که روی بلاکچین Burrow اجرا شده و از زبان برنامه نویسی سالیدیتی بهره میبرد.
اهمیت EVM و قراردادهای هوشمند
دوتا از مهمترین موضوعات در مورد کارکرد سالیدیتی شامل EVM و قراردادهای هوشمند است که به درک بهتر این زبان کمک میکنند. بهتر است اول از همه نقش EVM برای سالیدیتی را یاد بگیریم. تمام عملیات اجرایی روی بلاکچین اتریوم در EVM یا ماشین مجازی اتریوم انجام میشود و جزء جدانشدنی این بلاکچین است. این ماشین مجازی محیط لازم برای پردازش قراردادهای هوشمند اتریوم را فراهم میکند.
ماشین مجازی اتریوم از طریق شبکهای از نودهای عمومی که در سراسر جهان توزیع شدهاند، امنیت اکوسیستم را در برابر برنامههای نامطمئن حفظ میکند. برجستهترین نقش EVM در جلوگیری از حملات منع دسترسی به خدمات یا DoS است. برای این هدف، EVM جلوی دسترسی اپلیکیشنهای غیرمتمرکز به وضعیت یکدیگر را گرفته و در عین حال، کانالهای مناسبی را برای ارتباط آنها فراهم میکند تا هیچگونه وقفهای در عملکرد آنها ایجاد نشود.
موضوع مهم دیگری که برای شروع برنامه نویسی با سالیدیتی باید یاد بگیرید مربوط به قراردادهای هوشمند یا Smart Contract است. قراردادهای هوشمند جزئی بسیار مهم از اکوسیستم اتریوم هستند که از کدهای برنامهنویسی سطح بالا تشکیل شدهاند. این قراردادها قبل از قرار گرفتن روی بلاکچین اتریوم، برای تسهیل اجرا وارد EVM شده تا رمزگشایی شده و به زبان سادهتری تبدیل شوند.
قراردادهای هوشمند شرایطی را فراهم میکنند که طی آن امکان انجام تراکنشهای معتبر بدون نیاز به نهادهای واسطه وجود داشته باشد و از این طریق، ارزش افزوده ایجاد میکنند. نکته جالب اینکه، تراکنشهای مرتبط به قراردادهای هوشمند ماهیتی غیرقابل برگشت دارند و امکان ردیابی را تا حد زیادی ساده میکنند. سالیدیتی یکی از زبانهای برنامهنویسی به کار رفته برای ایجاد و اسکریپت نویسی قراردادهای هوشمند است. سایر زبانهای برنامهنویسی رایج که برای توسعه قراردادهای هوشمند به کار رفتهاند شامل Mutan، LLL و Serpent هستند.
انواع دادههای سالیدیتی
طراحی زبان برنامه نویسی سالیدیتی شباهتهای زیادی با زبانهای محبوب و سطح بالای ++C، پایتون و جاوا اسکریپت دارد. به عنوان یک زبان برنامهنویسی شیءگرا، انواع داده در سالیدیتی مشابه با سایر زبانهای برنامهنویسی شیءگرا است. بعضی از رایجترین انواع دادههایی که در این زبانها پشتیبانی میشوند و در سالیدیتی هم وجود دارد شامل Boolean، Integer، String، Array و Modifire است:
- داده Boolean شرایط را ارزیابی کرده و در صورتی که شرایط واقعی باشد نتیجه «۱» و در صورتی که شرایط غیرواقعی باشد نتیجه «۰» را بازمیگرداند
- داده Integer در سالیدیتی نقش علامت زدن یا برداشتن علامت اعداد صحیح را بر عهده دارد و همچنین از شرایط استثنایی در حین اجرا و کلمات کلیدی «unit256» و «unit8» پشتیبانی میکند.
- نوع داده String در زبان برنامه نویسی سالیدیتی در بلاکچین اتریوم شامل استفاده از نقل قولهای تکی و دوتایی برای دستهبندی دادهها به صورت رشته است.
- یکی دیگر از انواع دادههای مهم در زبان برنامه نویسی سالیدیتی، Modifier است که نقش مهمی پیش از اجرای کدهای قرارداد هوشمند بر عهده دارد. مسئولیت Modifier این است که پیش از اجرای کد، منطقی بودن یک شرایط خاص را تایید کند.
- نوع داده Array در سالیدیتی هم نقشی مشابه در سایر زبانهای شیءگرا دارد مخصوصا در بخش پشتیبانی از آرایههای تک بعدی و چندبعدی.
بهترین روش برای شروع برنامه نویسی با سالیدیتی
مبانی سالیدیتی در اتریوم میتواند هرکسی را به شروع طراحی و ایجاد قراردادهای هوشمند با این زبان برنامهنویسی، ترغیب و تشویق کند. البته لازم است که بهترین شیوهها را برای شروع برنامهنویسی با سالیدیتی یاد بگیرید و مهمتر از همه اینکه، با روشهای ابتدایی شروع کنید. در ادامه برخی از نمونههای جالب از کدهای ساده در برنامهنویسی با سالیدیتی آورده شده و به اهمیت آنها اشاره شده است.
- ورژن پراگما (Version Pragma)
پراگما در زبان برنامه نویسی سالیدیتی فرامین را به کامپایلر ارسال میکند تا روشهای مدیریت کد تعیین شود. بنابراین لازم است که در ابتدای هر خط از کدهای منبع در زبان سالیدیتی، یک «ورژن پراگما» اضافه کنید. ورژن پراگما تعیین میکند که هر کد باید از کدام نسخه از کامپایلر استفاده کند و همچنین نقش مهمی در کارایی ماشین مجازی اتریوم و قراردادهای هوشمند ایفا میکند. ورژن پراگما از ناسازگاری و مغایرت کد با نسخههای آینده کامپایلر که ممکن است تغییرات چشمگیری داشته باشند، جلوگیری میکند.
- کلمه کلیدی قرارداد (Contract Keyword)
کلمه کلیدی قرارداد یکی دیگر از پیششرطهای مهم برای شروع برنامهنویسی با سالیدیتی و استفاده از قابلیتهای آن است. کلمه کلیدی به معرفی یک قرارداد کمک کرده و فرآیند فشردهسازی کد را تسهیل میکند.
- معرفی متغیرهای حالت (Declaring State Variables)
متغیرهای حالت یک دستهبندی مهم از متغیرها در زبان سالیدیتی هستند و در بلاکچین اتریوم به صورت دائمی در محل ذخیره قراردادهای هوشمند، نگهداری میشوند. شما میتوانید یک متغیر حالت به نام «var1» را با یک خط کد «unit public var1» معرفی کنید. در این مثال، متغیر حالت var1 یک عدد صحیح ۲۵۶ بیتی بدون علامت است. میتوان گفت که معرفی متغیرهای حالت بیشتر به اضافه کردن اسلاتهای جدید در پایگاه داده شباهت دارد.
- معرفی توابع
یکی دیگر از اصول مهم درباره زبان برنامه نویسی سالیدیتی، معرفی توابع است. نمونه زیر از کدهای سالیدیتی را برای معرفی تابع در نظر بگیرید:
function set(uint a, uint b) public function get() public views return (uint)در این مثال میتوانید تابعی که «set» نام دارد را ببینید که یک تابع عمومی از نوع access modifier است و از متغیرهای «a» و «b» با نوع داده واحد بهعنوان پارامتر استفاده میکند. نمونهای مانند این قرارداد هوشمند ساده روی بهروزرسانی مقدار var1 و var2 تمرکز دارد. در عین حال، کاربرانی که میتوانند به بلاکچین اتریوم دسترسی داشته باشند هم میتواند از تابع «set» برای تغییر مقادیر var1 و var2 استفاده کنند. علاوه بر این، جمع مقادیر متغیرهای var1 و var2 میتواند به محاسبه مجموع متغیرها کمک کند. همچنین، قرارداد هوشمند هم میتواند با استفاده از تابع «get»، به بازیابی و بازنگری مقدار مجموع متغیر حالت بپردازد.
اجرای کد در برنامه نویسی با سالیدیتی
دانش شما در مورد برنامهنویسی با سالیدیتی برای بلاکچین اتریوم، به میزان آشنایی شما با اجرای برنامههای سالیدیتی، بستگی دارد. میتوانید از دو روش آنلاین و آفلاین برای اجرای برنامهای که با زبان برنامه نویسی سالیدیتی نوشته شده است، استفاده کنید. در ادامه نگاهی به این دو روش خواهیم داشت.
- حالت آفلاین
اولین انتخاب برای اجرای قراردادهای هوشمند EVM که با زبان سالیدیتی نوشته شدهاند، حالت آفلاین است. البته قبل از اجرای قرارداد هوشمند در این حالت، لازم است که سه شرط مهم، محقق شده باشد. اولین شرط مهم این است که فریم ورک node.js را دانلود و نصب کنید. همچنین باید نرمافزارهای Truffle و Ganache-CLI را بهعنوان پیششرط اجرای قرارداد هوشمند در حالت آفلاین، نصب کنید. سپس مراحل زیر را اجرا کنید:
۱. یک پروژه Truffle و یک شبکه توسعه مطمئن ایجاد کنید
۲. روی توسعه و اجرای قرارداد هوشمند برای این پروژه کار کنید
۳. از داشبورد Truffle با قرارداد هوشمند تعامل داشته باشید
۴. تستهایی را برای ارزیابی امکانات اولیه سالیدیتی ایجاد کنید
- حالت آنلاین
فرآیند استفاده از زبان سالیدیتی در اتریوم انعطافپذیری زیادی در اجرای کدها در حالت آنلاین دارد. بهترین انتخاب برای هرکسی که میخواهد قراردادهای هوشمند را در حالت آنلاین کامپایل و اجرا کند، Remix IDE است.
ساختار داده در سالیدیتی
نمیتوان در فرآیند یادگیری زبان برنامه نویسی سالیدیتی از ساختار داده چشمپوشی کرد چون عملکردهای حیاتی را بر عهده دارند. یکی از اولین ساختارهای داده، Enum است که به حفظ سوابق لیستهای معین در زبان سالیدیتی میپردازد. یکی دیگر از محبوبترین ساختارهای داده، Structs است که به شما کمک میکند نوع داده خود را تعریف کنید. این ساختار امکان ساخت نمونه از هر نوع داده را بر اساس ویژگیهای دلخواه انواع مختلف دادهها فراهم میکند. ساختار داده Array هم یکی دیگر از ساختارهای مهم در زبان سالیدیتی محسوب میشود.
هیجانانگیزترین ویژگی برای افرادی که به زبان سالیدیتی علاقهمند هستند، ساختار داده Mappings است که به ذخیره جفتهای کلید-مقدار کمک کرده و جزء جدانشدنی از توابع زبان برنامه نویسی سالیدیتی محسوب میشود. این ساختار داده شبیه جدول هش یا آرایه انجمنی در سایر توابع است.
قابل نمایش بودن تابع (Function Visibility)
در یادگیری زبان برنامه نویسی سالیدیتی باید به اهمیت خصوصیت قابل نمایش بودن تابع هم توجه کرد. این ویژگی نقش مهمی در تعیین حوزه عمل قراردادهای هوشمند که با زبان سالیدیتی نوشته شدهاند، ایفا میکند. برای مثال، اگر تابع به صورت عمومی قابل نمایش باشد، همه طرفین در داخل و خارج از قرارداد میتوانند آن را ببینند و به آن دسترسی داشته باشند. همچنین، قابل نمایش بودن تابع به صورت داخلی هم برای ایجاد توابعی مفید است که فقط میتوانند توسط طرفین داخل قراردادهای هوشمند مورد استفاده قرار بگیرند.
مزایای نوشتن قرارداد هوشمند با زبان سالیدیتی
برنامهنویسی با زبان سالیدیتی برای بلاکچین اتریوم مزایای ارزشمند زیادی به همراه دارد. به جز کارکردهای اولیه، سالیدیتی امکانات جالب زیادی ارائه میدهد که ثابت میکند این زبان گزینه بهتری از بسیاری از زبانهای برنامهنویسی مبتنی بر اتریوم است. اولین مزیت زبان برنامه نویسی سالیدیتی این است که علاوه بر انواع دادههای پایه، از انواع دادههای پیچیده و متغیر هم پشتیبانی میکند.
علاوه بر این، سالیدیتی دارای رابط باینری اپلیکیشن (ABI) است که امنیت نوع داده را تامین میکند. ABI میتواند به شناسایی سریع خطاها در زمانی که کامپایلر عدم تطابق نوع داده را با متغیرهای خاص تشخیص دهد، کمک کند. ویژگی مهم دیگری که میتوان در مورد سالیدیتی گفت، اثر «تشخیص زبان طبیعی» است که سالیدیتی از آن برای تبدیل مشخصههای کاربرمحور به زبانی که برای ماشین قابل فهم باشد، استفاده میکند.
سایر مزیتهای نوشتن قرارداد هوشمند با سالیدیتی برای ساخت اپلیکیشنهای غیرمتمرکز شامل موارد زیر است:
- استفاده آسان از خصوصیات شیءگرایی مانند صفات ارثی چندسطحی در قراردادهای هوشمند
- پشتیبانی از انواع داده با استفاده از رابط باینری اپلیکیشن
- مجموعه قواعد آسان برای یادگیری اصول توسعه قراردادهای هوشمند و بلاکچین
- اجرای فرآیندهای امن و قابل اعتماد از طریق توسعه قراردادهای هوشمند با زبان برنامه نویسی سالیدیتی برای پلتفرمهای مختلف که به ایجاد قرارداد بین دو طرف میپردازند
آنچه در مطلب نوشتن قرارداد هوشمند با سالیدیتی خواندیم:
پرداختن به مبانی زبان سالیدیتی نحوه کار آن را بیشتر مشخص میکند. سالیدیتی یک زبان برنامه نویسی محبوب در اکوسیستم اتریوم است که از آن برای ایجاد قراردادهای هوشمند استفاده میشود. این زبان شباهتهای زیادی با زبانهای سطح بالا و شناخته شده مانند جاوا و C++ دارد و فرصتی استثنایی را برای افرادی که با آن زبانها آشنا هستند ایجاد میکند تا بتوانند توسعه قراردادهای هوشمند را یاد بگیرند.
افرادی که به کشف قابلیتها و کاربردهای فناوری بلاکچین در توسعه اپلیکیشنهای غیرمتمرکز علاقه دارند میتوانند با یادگیری سالیدیتی شروع کنند. البته ابتدا لازم است که همه روشهای استفاده از کاربردهای اصلی این زبان را بررسی کنند. برای این که بتوانید بیشترین بهره را از سالیدیتی ببرید باید تمام اجزای آن را پیش از شروع برنامهنویسی با این زبان، یاد بگیرید. از منابع اطلاعاتی مطمئن در مورد زبان سالیدیتی کمک بگیرید سپس میتوانید اولین قرارداد هوشمند خود را بنویسید.
سوالات متداول – نوشتن قرارداد هوشمند با سالیدیتی
۱. علت اهمیت زبان سالیدیتی در اتریوم چیست؟
زبان برنامه نویسی سالیدیتی امکان توسعه اپلیکیشنهای غیرمتمرکز (dApps) و قراردادهای هوشمند که روی ماشین مجازی اتریوم اجرا میشوند را فراهم میکند.
۲. نحوه معرفی متغیرها و انواع داده در سالیدیتی چگونه است؟
برای معرفی متغیرها باید نوع داده را مشخص کرده و پس از آن نام متغیر را بنویسید. برای مثال «unit256 myNumber = 42» یک متغیر عدد صحیح بدون علامت به نام «myNumber» را معرفی میکند که مقدار اولیه آن ۴۲ است.
۳. نقاط ضعف امنیتی در برنامهنویسی با سالیدیتی چیست؟
حملات ورود مجدد (Reentrancy Attack)، تولید اعدام تصادفی ناامن، نظارت نامناسب بر دسترسیها و سرریز اعداد صحیح (Integer overflow) جزو نقاط ضعف امنیتی در سالیدیتی محسوب میشوند که لازم است برای جلوگیری از آنها، به طور منظم بررسیهای امنیتی انجام شده و از ابزارهای ارتقای امنیت استفاده شود.