تکنولوژی بلاک چین به صورت روزافزونی در حال توسعه و پیشرفت است و یادگیری اصطلاحات در حال رشد این بستر و همگام بودن با این اطلاعات کار دشواریست. قراردادهای هوشمند که به صورت عمده بر بستر اتریوم در حال اجرا هستند بخشی از بلاک چین بوده و زبان برنامهنویسی رایج مورد نیاز آنها نیز سالیدیتی است. با میهن بلاکچین در این مقاله همراه باشید تا اولین Smart Contract خود را در طول آموزش کدنویسی قرارداد هوشمند با سالیدیتی به صورت تصویری، ایجاد کنید.
دلایل نیاز به یادگیری نحوه ایجاد قراردادهای هوشمند
بدون شک چیزهای زیادی در مورد دنیای نسل سوم وب یا وب ۳.۰ شنیدهاید و همه در حال صحبت کردن در مورد آن هستند. شاید حتی دوستانتان قصد داشته باشند تا این تکنولوژی را فرا بگیرند و شما هنوز مطمئن نیستید که چگونه باید وارد این حوزه شد. فرض کنید که به فضای آنلاین مراجعه میکنید تا شیوه آغاز مسیر این راه را بیابید و با افرادی در یوتیوب مواجه میشوید که تا حد زیادی با دانش فنی در مورد این مقوله صحبت میکنند.
این در حالیست که شما تنها به اطلاعات سادهای برای درک بیشتر و ورود به این عرصه نیاز دارید. خب، اگر ماجرایی که تعریف کردیم شبیه به اتفاقاتی است که تجربه کردهاید، دیگر جای نگرانی نیست. در این مقاله و مطالب آموزشی بعدی، شما را به دنیای توسعه نسل سوم وب خواهیم برد و با شیوه ساخت اولین قرارداد هوشمند خود آشنا میشوید.
چرا یادگیری قراردادهای هوشمند دشوار است؟
ممکن است یادگیری تکنولوژی مورد استفاده در قراردادهای هوشمند کمی خستهکننده باشد، به ویژه اگر فردی نوپا در این حوزه هستید. حتی یک توسعهدهنده باتجربه نیز ممکن است بر اثر مواجه شدن با برخی از پیچیدگیهای اسمارت کانترکتها شگفتزده شود. در ادامه این مطلب به دلایلی که به پیچیدگی توسعه قرارداد هوشمند منجر میشوند و چالشهای آن میپردازیم.
دربرگیری اصطلاحات برنامهنویسی انبوه
یکی از ابتداییترین شگفتیهایی که اغلب افراد تازهوارد به این فضا با آن روبهرو میشوند، فهرست کلماتی است که برای استفاده از این تکنولوژی باید یاد بگیرند. از بلاک چین شروع میکنیم که تکنولوژی زیربنای قرارداد هوشمند بوده و این قراردادها بر این بنیان استوار هستند. توضیح این تکنولوژی برای تازهکارها میتواند امر بسیار گیجکنندهای باشد.
تنها کافیست به گستردگی مفاهیم این حیطه فکر کنید. باید مفاهیمی از قبیل بلاکچین، زبان برنامه نویسی سالیدیتی و قراردادهای هوشمند را یاد بگیرید. از طرف دیگر، مقولههایی مثل گس فی، بلاکها، تغییرناپذیری، ماشین مجازی اتریوم و غیره نیز در دسته مفاهیم بسیار مهم قرار دارند.
صادقانه بگوییم، مفاهیم و زبان کاربردی در حوزه توسعه بلاک چین گسترده است و به دلیل رشد روزافزون و تصاعدی این تکنولوژی، کلمات بیشتری نیز در حال افزوده شدن به این عرصه هستند.
منابع مطالعاتی ناکافی
فارغ از اینکه منابع مورد نیاز ما رایگان و یا پریمیوم باشند، میزان سورسهای مورد نیاز ما برای تامین تقاضای در حال رشد پیرامون این تکنولوژی بسیار اندک هستند.
منابع رایگان موجود در این حوزه که به تبدیل شدن شما به یک توسعهدهنده حرفهای بلاک چین منجر میشوند نیز بسیار محدود هستند. لازم است بگوییم، این امری طبیعی محسوب میشود که افراد فعال در حیطه تولید محتوای آموزشی بلاک چین از چنین کاری کسب درآمد کنند. به همین دلیل است که دورههای حرفهای معدودی به صورت آنلاین وجود دارند که میتوانند در این مسیر به شما کمک کنند.
اگر قصد دارید تا برای یادگیری تکنولوژی بلاک چین و توسعه قراردادهای هوشمند وارد مسیر آموزشی رایگان بشوید، لازم است تا جستجوی زیادی را پشت سر بگذارید و مطالب مورد نیاز خود را در این فضا گلچین کنید.
شک و تردید گسترده در مورد راهکارهای ارائه شده توسط بلاک چین
ابر غلیظی از شک و تردید در رابطه با تکنولوژی بلاک چین وجود دارد. با وجود اینکه این تکنولوژی به تازگی موفق شده است تا توجه زیادی را به خود جلب کند، ذهنیت فعلی مردم و حتی کشورهای سراسر جهان در حال محدود کردن پذیرش کامل این تکنولوژی است. با توجه به سوءاستفادههایی که از ارزهای دیجیتال در حوزه بلاک چین شده است، نمیتوان دنیا را برای چنین ذهنیتی سرزنش کرد.
قرارداد هوشمند چیست؟
به بیان ساده، یک قرارداد هوشمند برنامهای است که بر روی بلاکچین اجرا میشود. با یک مثال به این بحث ادامه میدهیم. فرض کنید بلاکچین یک اقیانوس است و قراردادهای هوشمند مانند ماهیهای درون آن هستند. در حال حاضر، قابلیت اجرای یک قرارداد هوشمند تنها بر روی شبکه بلاکچینی مانند ماشین مجازی اتریوم (EVM) قابل اجرا است. این قراردادها تا پیش از پیادهسازی و استقرار بر روی چنین شبکهای بدون استفاده و بیفایده هستند.
شیوه کارکرد قراردادهای هوشمند
همانطور که از نام این قراردادها پیداست، یک قرارداد هوشمند مانند یک سند قرارداد حقیقی بین دو یا چند طرف عمل میکند. قرارداد هوشمند مشخصاتی در مورد اینکه چه کاری انجام میدهد و چگونه آن کار را به انجام میرساند نیز در بر دارد.
یک قرارداد هوشمند شامل قطعه کدی است که با استفاده از زبان برنامهنویسی بلاک چین مثل سالیدیتی نوشته شده است و پس از استقرار در شبکه بلاکچین، دیگر نمیتوان آن را از شبکه خارج کرد و یا تغییر داد.
به محض نوشتن یا کدنویسی قرارداد هوشمند با سالیدیتی میزان کمی پول در قالب گس فی لازم است تا بتوان این قرارداد را بر روی شبکه پیادهسازی کرد. هر یک از تراکنشهایی که بر روی شبکه بلاک چین به انجام میرسند، نیازمند یک مکانیسم تایید هستند تا اثبات کنند که چنین تراکنشهایی صورت گرفتهاند. در فضای بلاک چین، مکانیسم تایید و اعتبارسنجی همان مفهومی است که تحت عنوان الگوریتم اجماع شناخته میشود.
تعداد انگشت شماری از این مدلهای اجماع مانند گواه اثبات کار (PoW) و گواه اثبات سهام (PoS) وجود دارند و هر یک از مدلهای اجماع بر روی مقیاسپذیری، امنیت و سرعت آن بلاکچین تاثیر دارد. ما قصد نداریم تا وارد جزئیات فنی زیادی بشویم. پس بیایید به همین دلیل در ادامه این مطلب نیز اصل سادگی را حفظ کنیم.
قراردادهای هوشمند چه کارهایی میتوانند انجام دهند؟
بلاکچینی که از ادغام قراردادهای هوشمند پشتیبانی میکند به منزله یک معدن طلا محسوب میشود. قراردادهای هوشمند روند کل ماجرا را تغییر میدهند و به شما اجازه میدهند تا برنامههایی بنویسید که به صورت دائمی بر روی بلاک چین اجرا میشوند. کاربردهای زیادی برای Smart Contractها در دنیای بلاک چین وجود دارند که در ادامه به برخی از آنها پرداختهایم.
- ساخت ارزهای دیجیتال (توکنها)
- تسهیل تراکنشهای مالی (دیفای)
- مدیریت هویت و حریم خصوصی آنلاین (کیف پول ارز دیجیتال)
- داراییهای دیجیتال و قابل ذخیرهسازی (توکن NFT و متاورس)
- ساخت برنامههای غیرمتمرکز (DApp)
- اجرای ساختارهای حاکمیتی، سازمان مستقل غیرمتمرکز (DAO)
- و موارد دیگر.
مثالهایی از کاربرد کدنویسی قرارداد هوشمند با سالیدیتی
وقت آن رسیده تا به مهمترین و جذابترین بخش این آموزش بپردازیم. در این بخش کدنویسی قرارداد هوشمند با سالیدیتی را به صورت ساده بررسی میکنیم. این قرارداد، کمکهای مردمی را همراه با یک مکانیسم برداشت میپذیرد. در کد زیر میتوانید نسخه کامل کد این قرارداد هوشمند را مشاهده کنید.
"//SPDX-License-Identifier: MIT pragma solidity >=0.7.0 <0.9.0; contract Donors { mapping (address => uint256) public paymentsOf; mapping (address => uint256) public donationsBy; address payable public owner; uint256 public balance; uint256 public withdrawn; uint256 public totalDonations = 0; uint256 public totalWithdrawal = 0; event Donation( uint256 id, address indexed to, address indexed from, uint256 amount, uint256 timestamp ); event Withdrawal( uint256 id, address indexed to, address indexed from, uint256 amount, uint256 timestamp ); constructor() { owner = payable(msg.sender); } function donate() payable public { require(msg.value > 0, "Donation cannot be zero!"); paymentsOf[msg.sender] += msg.value; donationsBy[msg.sender] += 1; balance += msg.value; totalDonations++; emit Donation( totalDonations, address(this), msg.sender, msg.value, block.timestamp ); } function withdraw(uint256 amount) external returns (bool) { require(msg.sender == owner, "Unauthorized!"); require(balance >= amount, "Insufficient balance"); balance -= amount; withdrawn += amount; owner.transfer(amount); totalWithdrawal++; emit Withdrawal( totalWithdrawal, msg.sender, address(this), amount, block.timestamp ); return true; } }
حالا به توضیح اتفاقی که در حال شکلگیری در این قرارداد هوشمند است میپردازیم.
در بخش بالا، قسمت ابتدایی کدنویسی قرارداد هوشمند با سالیدیتی را مشاهده میکنیم که شناسه مجوز و محدوده نسخههای کامپایلر (compiler) قابل استفاده برای قرارداد ما را مشخص میکند. شناسه مجوز به ما نشان میدهد که آیا سورس کد یا کد منبع Smart Contract به صورت متن باز است یا خیر و اینکه تا چه اندازه میتوانید از آن استفاده کنید. شما میتوانید تمامی مجوزهای موجود برای استفاده را در این بخش مشاهده کنید.
بخش کد بالا ساختار یک قرارداد هوشمند را تعریف میکند. اگر کمی برنامهنویسی object-oriented انجام داده باشید، زمان زیادی طول نمیکشد تا متوجه شوید که الگوهای مشابهی نیز در توسعه قراردادهای هوشمند مورد استفاده قرار گرفته است. دلیل این امر بدین صورت است که زبان برنامهنویسی سالیدیتی سینتکسهای (syntax) زیادی از زبانهای برنامهنویسی محبوب و رایجی مثل C++ ،JavaScript ،C و Python را در خود جای داده است.
نمونه کد بالا نوعی متغیر در زبان برنامهنویسی سالیدیتی است که کلیدها را با مقادیر مرتبط آنها نشان میدهد. این بخش کد به صورت تقریبی شبیه به یک آرایه شرکتپذیر (associative array) در PHP و یا یک آبجکت (Object) در جاوا اسکریپت است. در کد بالا، ما به سادگی به قرارداد هوشمند خود دستور میدهیم تا هر آدرسی را با مقادیر تخصیص داده شده مرتبط کند.
قطعه کد بالا متغیرهایی که در جریان کدنویسی قرارداد هوشمند مورد استفاده قرار میگیرند را اعلام میکند. این آدرس نوعی داده است که آدرس کیف پول یک شخص یا خود قرارداد هوشمند را پوشش میدهد. Uint256 مقادیر اعداد صحیح بدون علامت (اینتجرهای مثبت یا غیر منفی) را در خود جای میدهد و این یعنی از صفر تا ۲ به توان ۲۵۶ منهای ۱. واژه Payable در قطعه کد ما نشان میدهد که این حساب کاربری و یا آدرس میتواند پول دریافت کند و در این مثال، پول مورد نظر به واحد اتر (ETH) دریافت میشود. واژه Public بدین معناست که میتوان از خارج این قرارداد هوشمند نیز به این متغیر دسترسی داشت و این اصل شبیه به OOP است.
Event چیست؟ Eventها ساختارهایی در زبان برنامهنویسی سالیدیتی هستند که دادههای مربوط به یک تراکنش خاص را ثبت و یا منتشر میکنند و در پیوند با آدرس قرارداد هوشمند در بلاکچین ذخیره میشوند. در بخش کد بالا قصد داریم تا هر یک از تراکنشهای ورودی و برداشتیهای ما اطلاعاتی از قبیل تعداد برداشت و واریز، مبلغ آنها و مهر زمانی را در بر داشته باشند و برای مراجعه آتی به این قسمت در EVM ثبت شوند.
این در حقیقت اولین عملکردی است که پس از اجرای قرارداد هوشمند شکل میگیرد. در رابطه با این مثال، فرد پیادهکننده قرارداد و یا حساب کاربری او به مالک قرارداد هوشمند تبدیل میشود.
تابع بالا هم Payable و هم Public است و این بدان معناست که توانایی دریافت پول داشته و برای افرادی که قصد اهدای کمک مالی را دارند نیز قابل دسترسی است. در این بخش به بررسی لازم در راستای اطمینان حاصل کردن از ارسال پول توسط افراد احتیاج داریم. ارسال صفر اتر به یک استثنا منتهی میشود و تراکنش بازگردانده میشود.
به محض اینکه تابع کمک مالی وجود پول را تایید کند، در مرحله بعد تعدادی از سوابق پرداخت را به متغیرهای اعلام شده اختصاص میدهد. در این نقطه میتوانیم اطلاعاتی در مورد اینکه چه کسی کمک مالی ارسال کرده است، مقدار آن، تعداد دفعاتی که این شخص به ما کمک کرده و میزان موجودی قابل برداشت را در اختیار داشته باشیم. یک ایونت یا رویداد Donation در بخش نهایی و پیش از اینکه عملکرد وظیفه تابع مورد نظر به پایان برسد نیز در این مرحله منتشر میشود.
این تابع مسئول پرداخت مبلغ مشخصی به صاحب یا توزیعکننده قرارداد هوشمند است. ما بررسیهایی را در این بخش انجام دادیم تا تایید کنیم که مالک قرارداد کسی است که پول را برداشت میکند و یک فرد تصادفی و رندوم توانایی انجام چنین کاری را ندارد. علاوه بر این، بررسی کردیم که مبلغ قابل برداشت بیشتر از موجودی ما نباشد. در بخش پایانی، یک رویداد اهدای پول یا Donation پیش از تکمیل عملکرد تابع ما به انجام میرسد.
در مرحله بعد، میتوانید وارد ویراستار Remix شوید و قرارداد هوشمند را مطابق تصویر زیر اجرا کنید.
تبریک میگوییم، در این مرحله شما اولین تجربه خود در زمینه کدنویسی قرارداد هوشمند با سالیدیتی را به پایان رساندهاید.
پرسش و پاسخ (FAQ)
- چطور یک قرارداد هوشمند با سالیدیتی بنویسیم؟
پیشنیاز نوشتن یک قرارداد هوشمند، داشتن دانش و اطلاعات هم در حوزه برنامهنویسی و هم در مورد تکنولوژی بلاکچین است. در این مقاله به صورت تصویری نوشتن یک اسمارت کانترکت آموزش داده شده است. - سالیدیتی چیست؟
مهمترین دستاورد اتریوم را میتوان امکان نوشتن قراردادهای هوشمند دانست. زبان برنامهنویسی مورد استفاده برای نوشتن Smart Contract روی اتریوم سالیدیتی نام دارد. سالیدیتی یک زبان برنامهنویسی متنباز و استاتیک است. - چه عواملی کدنویسی قرارداد هوشمند با سالیدیتی را سخت میکند؟
قراردادهای هوشمند بر بستر بلاکچین اجرا میشوند که خود مفهوم و تکنولوژی جدید و به شدت در حال توسعه است. اصطلاحات برنامهنویسی انبوه، منابع مطالعاتی ناکافی و شک و تردیدهای موجود در مورد بلاکچین از جمله عواملی هستند که یادگیری قراردادهای هوشمند را سخت میکنند.
سخن پایانی
در این مقاله به بررسی جزئیات کدنویسی قرارداد هوشمند با سالیدیتی پرداختیم و شیوه ساخت اولین قرارداد هوشمند را آموزش دادیم. امیدواریم که درک کاملی از شیوه نوشتن قراردادهای هوشمند کسب کرده باشید. زبان برنامهنویسی سالیدیتی که در بستر بلاک چین مورد استفاده قرار میگیرد از کلمات و دستورات مشابهی با زبانهای برنامهنویسی رایج بهره گرفته و فراگیری آن کار دشواری نیست. با این حال و با توجه به توسعه و پیشرفت روزافزون حوزه بلاکچین، لازم است تا اطلاعات خود در مورد اصطلاحات در حال افزایش این تکنولوژی را به روز کنیم. آیا تا به امروز تجربهای در زمینه برنامهنویسی بلاکچین داشتهاید؟ آیا با استفاده از سالیدیتی به ساخت قرارداد هوشمند پرداختهاید؟ مطالب آموزش داده شده در این مقاله را چطور ارزیابی میکنید؟