زبان سالیدیتی، زبان برنامه نویسی برای قراردادهای هوشمند مبتنی بر بلاک چین اتریوم است که برای ساخت اپلیکیشن های غیرمتمرکز مبتنی بر بلاک چین در شبکه اتریوم به کار می رود. شما با استفاده از زبان برنامه نویسی سالیدیتی می توانید یک قرارداد هوشمند ایجاد کنید. بنابراین اگر علاقه مند به قراردادهای هوشمند هستید آموزش ایجاد قرارداد هوشمند با استفاده از زبان سالیدیتی را تا انتها دنبال کنید.
زبان سالیدیتی چیست؟
قبل از آموزش ایجاد قراداد هوشمند بهتر است در مورد ماهیت زبان برنامه نویسی سالیدیتی صحبت کنیم. Solidity یک زبان برنامه نویسی استاتیک و شیء گرا برای نوشتن قراردادهای هوشمند است که روی ماشین مجازی اتریوم در بلاک چین اتریوم اجرا می شود. این زبان یک زبان قرارداد محور و سطح بالا است که روش آن شبیه به زبان جاوا اسکریپت است. سالیدیتی یک زبان curly-bracket بوده که برای ماشین مجازی اتریوم (EVM) طراحی شده و تحت تأثیر زبان های ++C، پایتون و جاوا اسکریپت قرار گرفته است. Solidity به صورت ایستا تایپ می شود. با Solidity می توانید برای مواردی مانند رای دادن، تامین مالی جمعی، حراج ها و کیف پول های چند امضایی قرارداد ببندید. هنگام استقرار قراردادها، باید از آخرین نسخه منتشر شده Solidity استفاده کنید. چراکه به غیر از موارد استثنایی، فقط آخرین نسخه اصلاحات امنیتی را دریافت می کند. علاوه بر این، تغییرات قطعی و همچنین ویژگی های جدید به طور منظم معرفی می شوند.
پیش نیازها برای نوشتن قرارداد هوشمند با استفاده از زبان سالیدیتی
برای اینکه بتوانید یک قرارداد هوشمند با استفاده از زبان برنامه نویسی سالیدیتی بنویسید باید یک سری الزامات را برآورده کرده و مجهز به یک سری پیش نیازها باشید. این الزامات عبارتند از:
- مبانی بلاک چین
- اصول اولیه اتریوم
- مبانی ارزهای دیجیتال
- مبانی هر نوع زبان برنامه نویسی
اگر با مفهوم قراردادهای هوشمند آشنا نیستید یا در این زمینه تازه کار هستید، به شما توصیه می کنیم اصول قرارداد هوشمند را درک کنید. ممکن است درک ساختار قراردادهای هوشمند برای شما در ابتدا کمی کسل کننده و خسته کننده یا دشوار باشد. به خصوص اگر در این زمینه تازه وارد و بی تجربه باشید. نوشتن و ایجاد قرارداد هوشمند ممکن است شما را با چالش ها و موانعی روبرو کند که برایتان گیج کننده باشد. اما برای رسیدن به هدف باید ممارست کنید.
شما باید با انبوه اصطلاحاتی که در زمینه قرادادهای هوشمند وجود دارد آشنا باشید و آن ها را درک کنید. به عنوان مثال از بلاک چین به عنوان زیربنای ارزهای دیجیتال و قراردادهای هوشمند گرفته تا کارمزد گس در شبکه اتریوم یا مفهوم تغییر ناپذیری و عناوینی مانند EVM (ماشین مجازی اتریوم).
همچنین برای ایجاد قرارداد هوشمند، شما باید منابع درست و کافی و دست اول را در اختیار داشته باشید و دانش و مطالعات خود را به روز نگه دارید.
مفهوم قراردادهای هوشمند
در ادامه آموزش ایجاد قرارداد هوشمند با استفاده از زبان سالیدیتی باید قراردادهای هوشمند را بشناسید. قرادادهای هوشمند، همانطور که شاید بدانید برنامههایی هستند که رفتار حسابها را در حالت اتریوم کنترل میکنند. در قراردادهای هوشمند که به صورت کدهایی به زبان سالیدیتی نوشته شده اند، مشخصاتی در مورد اینکه چه کاری انجام می شود و چگونه آن کار به انجام می رسد نیز آورده شده است.
باید بدانید که زمانی که یک قرارداد هوشمند را با استفاده از زبان برنامه نویسی سالیدیتی نوشتید و روی بلاک چین قرار گرفت دیگر نمی توان آن را خارج کرد. همچنین برای اینکه قرارداد هوشمندی که به زبان سالیدیتی نوشته اید را روی بلاک چین مستقر کنید، میزان کمی پول در قالب گس فی یا کارمزد گس (سوخت شبکه اتریوم) لازم است تا بتوان این قرارداد را بر روی شبکه پیادهسازی کرد.
مراحل ایجاد قرارداد هوشمند با استفاده از زبان سالیدیتی
در اینجا، به آموزش ایجاد قرارداد هوشمند با استفاده از زبان سالیدیتی می رسیم. در ادامه مراحل نوشتن یک قرارداد هوشمند با استفاده از زبان برنامه نویسی سالیدیتی آمده است:
اولین قرارداد هوشمند خود را بسازید!
- Remix IDE را از طریق لینک https://remix.ethereum.org/ باز کنید. Remix IDE یک برنامه تحت وب و دسکتاپ منبع باز است که چرخه توسعه سریع را تقویت می کند و مجموعه ای غنی از افزونه ها با رابط کاربری گرافیکی بصری دارد. ریمیکس برای کل سفر توسعه قرارداد هوشمند با زبان Solidity و همچنین به عنوان یک زمین بازی برای یادگیری و آموزش اتریوم استفاده می شود.
- روی Sure و سپس Done کلیک کنید.
- در قسمت default_workshop، روی ایجاد فایل جدید کلیک کنید.
- نام آن را به Hostel.sol تغییر دهید.
اکنون آماده نوشتن و ایجاد قرارداد هوشمند خود هستید.
کد قرارداد (Contract Code)
1- شما باید نسخه solidity را در قرارداد هوشمند ارائه دهید:
2- اکنون قرارداد اصلی را با نام Hostel ایجاد کنید:
3- در داخل قرارداد هاستل {...} مراحل زیر را دنبال کنید.
4- چند متغیر ایجاد کنید که در آن قرارداد هوشمند آدرس قابل پرداخت (رشته هگزا 42 کاراکتری با پیشوند: "0x") مالک و مستاجر را ذخیره می کند.
5- چند متغیر عمومی ایجاد کنید که قرارداد هوشمند مقداری عدد صحیح را در آن ذخیره کند. برای این موضوع، یک نوع داده به نام uint (عدد صحیح بدون علامت 256 بیتی) وجود دارد.
6- اکنون، ساختاری برای ذخیره جزئیات هر هاستل روم ایجاد کنید، مانند شماره هاستل، نام هاستل، آدرس آن، تعداد کل قراردادها، اجاره ماهانه، سپرده تضمینی یکباره، زمان امضای آخرین قرارداد، جای خالی، آدرس صاحبخانه و نشانی مستاجر فعلی.
7- نقشه ساختار قبلی با یک uint (به نام: roomid).
8- مشابه موارد فوق، یک ساختار برای هر قرارداد اجاره ایجاد کنید و آن را با یک uint (به نام contractid) ترسیم کنید. این اطلاعات جزئیاتی مانند: شماره هاستل، شماره قرارداد، نام هاستل، آدرس هاستل، اجاره ماهانه، سپرده تضمینی یکباره، دوره قفل، زمان امضای قرارداد، آدرس صاحبخانه و آدرس مستاجر را ذخیره میکند.
9- اکنون، یک ساختار برای هر پرداخت اجاره ایجاد کنید و آن را با یک Uint ترسیم کنید. این اطلاعات جزئیاتی مانند: شماره اجاره نامه، شماره هاستل، شماره قرارداد، نام هاستل، آدرس هاستل، اجاره ماهانه، زمان پرداخت اجاره، آدرس صاحبخانه و آدرس مستاجر را ذخیره میکند.
10- چند اصلاح کننده ایجاد کنید که به شما کمک می کند قبل از اجرای یک تابع، چند مورد را تأیید کنید.
در اینجا نیاز به (...) است؛ به این معنی که اگر شرط داده شده برآورده نشود، تابع اجرا نمی شود و رشته داده شده به عنوان یک کد خطا ظاهر می شود.
کدهای زیر بررسی خواهند کرد که آیا فرستنده پیام صاحبخانه است یا خیر.
کدهای زیر بررسی خواهند کرد که آیا فرستنده پیام کسی است به جز صاحبخانه.
در ادامه بررسی می شود که آیا اتاق خالی است یا خیر.
کدهای زیر بررسی خواهند کرد که آیا مستاجر، اتر (ETH) کافی در کیف پول خود برای پرداخت اجاره دارد یا خیر.
کدهای زیر بررسی خواهند کرد که آیا مستاجر اتر کافی در کیف پول خود دارد تا یک بار ودیعه و اجاره یک ماهه را پیش پرداخت کند.
کدهای زیر بررسی میکنند که آیا آدرس مستاجر همان است که قرارداد اجاره قبلی را امضا کرده است یا خیر.
کدهای زیر بررسی خواهند کرد که آیا زمانی برای پایان توافق باقی مانده است یا خیر.
کدهای زیر بررسی خواهند کرد که آیا 365 روز پس از ایجاد آخرین توافق نامه گذشته است یا خیر.
کدهای زیر بررسی خواهند کرد که آیا 30 روز از آخرین پرداخت اجاره گذشته است یا خیر.
11. حالا، چند تابع (functions) ایجاد کنید.
تابع زیر برای افزودن اتاق ها استفاده خواهد شد.
اکنون، یک تابع برای امضای قرارداد اجاره اتاق هاستل بین صاحبخانه و مستاجر ایجاد کنید.
قبل از ایجاد تابع امضای توافقنامه یا sign Agreement موارد زیر را به خاطر بسپارید:
این قرارداد فقط در صورتی اجرا می شود که کاربر مستاجر باشد، به این معنی که آدرس کاربر و آدرس صاحبخانه مطابقت ندارند. این قرارداد تنها در صورتی اجرا میشود که کاربر اتر کافی ("اتر" قابل پرداخت) در کیف پول اتریوم خود داشته باشد.
بیایید از آن اصلاح کننده ها در اینجا استفاده کنیم، به طوری که:
قرارداد امضای توافقنامه تنها در صورتی اجرا می شود که اتاق مذکور خالی باشد و مستاجر اتر کافی در کیف پول خود داشته باشد. آن اصلاح کننده ها را در نقطه شماره 10 به خاطر دارید؟ از این اصلاح کننده ها برای اجرای تابع زیر استفاده کنید.
اکنون تابعی ایجاد کنید که مستاجر از آن برای پرداخت اجاره ماهانه به صاحبخانه استفاده کند.
قبل از ایجاد تابع payRent، موارد زیر را به خاطر بسپارید:
این قرارداد فقط در صورتی اجرا می شود که آدرس کاربر و آدرس مستاجر قبلی هر دو یکسان باشند، به این معنی که کاربر تنها در صورتی می تواند اجاره بها را بپردازد که ظرف 365 روز گذشته با صاحبخانه قراردادی امضا کرده باشد.
این قرارداد فقط در صورتی اجرا می شود که مستاجر اجاره قبلی خود را بیش از یک ماه قبل پرداخت کرده باشد.
این قرارداد تنها در صورتی اجرا می شود که کاربر اتر کافی ("اتر" قابل پرداخت) در کیف پول اتریوم خود داشته باشد. (اتر کافی = اجاره اتاق به اندازه کافی).
بیایید یک تابع ایجاد کنیم که صاحبخانه از آن برای علامت گذاری کامل یک توافق استفاده کند.
قبل از ایجاد قرارداد تکمیل توافقنامه یا contractCompleted، موارد زیر را به خاطر بسپارید:
این قرارداد تنها در صورتی اجرا می شود که آدرس کاربر و آدرس صاحبخانه یکسان باشد.
این عملکرد تنها در صورتی اجرا می شود که مستاجر آن قرارداد را بیش از یک سال پیش امضا کرده باشد.
بیایید قراردادی ایجاد کنیم که صاحبخانه از آن برای فسخ قرارداد استفاده کند.
قبل از ایجاد قرارداد فسخ یا contractTerminated، موارد زیر را به خاطر بسپارید:
این قرارداد تنها در صورتی اجرا می شود که آدرس کاربر و آدرس صاحبخانه یکسان باشد.
این عملکرد تنها در صورتی اجرا می شود که مستاجر آن قرارداد را کمتر از یک سال پیش امضا کرده باشد.
Compile
حال بر روی گزینه Solidity Compile در نوار کناری سمت چپ کلیک کنید.
- نسخه کامپایلر 0.5.16+ را انتخاب کنید.
- سپس بر روی Compile Hostel.sol کلیک کنید.
مشابه تصویر زیر:
Deploy
در مرحله بعد ایجاد قرارداد هوشمند، روی گزینه Deploy & Run Transactions در نوار کناری سمت چپ کلیک کنید.
- Environment > JavaScript VM را انتخاب کنید.
- حال بر روی Deploy کلیک کنید.
تبریک میگوییم، قرارداد هوشمند شما اجرا شد.
نمونه معاملات
به یاد داشته باشید که هر زمان که یک تراکنش در حال انجام است، تمام جزئیات را در یک کلید هش منحصر به فرد ذخیره می کند.
اکنون در قسمت Deployed Contract روی > HOSTEL AT ..... (MEMORY) کلیک کنید.
- روی نماد V (منوی کشویی) تابع addRoom کلیک کنید.
- جزئیات را پر کنید.
مشابه تصویر زیر:
3. سپس بر روی transact کلیک کنید.
تبریک میگوییم، شما با موفقیت اتاق اول خود را به قرارداد اضافه کردید.
(شما می توانید همان را در بخش ترمینال، terminal، نیز پیدا کنید.)
اکنون صاحب اتاق اولین آدرس اتر شما است (با اتر آزمایشی 99.99 در کیف پول).
4. آدرس حساب را از منوی کشویی تغییر دهید (هر کسی را انتخاب کنید به جز یکی با اتر 99.99).
5. کل مبلغی را که قبلاً انتخاب کرده اید اضافه کنید (هزینه اجاره + سپرده تضمینی)
6. و سپس از بخش wei، اتر را انتخاب کنید: ( wei کوچکترین واحد شمارش اتریوم است).
7. به پایین اسکرول کنید و روی signAgreement کلیک کنید، 1 را وارد کنید و signAgreement را فشار دهید.
با وارد کردن RoomAgreementNo :1 می توانید همین مورد را بررسی کنید.
تبریک می گویم، شما اولین قرارداد خود را با موفقیت امضا کردید.
تمام تراکنش های شما در ترمینال نشان داده می شود.
اکنون، میتوانید با بررسی آدرس حساب اتر خود، این موضوع را تأیید کنید.
مزایای قراردادهای هوشمند
ممکن است بپرسید "وقتی چندین روش متمرکز وجود دارد، قراردادهای هوشمند چه فایده ای برای کاربران دارند؟" اجازه دهید برخی از مزایای قراردادهای هوشمند را نسبت به سیستم های متمرکز توضیح دهیم:
- در قراردادهای هوشمند داده ها قابل تغییر یا دستکاری نیستند. بنابراین، دستکاری داده ها برای عوامل مخرب تقریبا غیرممکن است.
- قراردادهای هوشمند کاملا غیر متمرکز هستند.
- برخلاف هر کیف پول متمرکز پرداخت، برای انجام تراکنش به پرداخت درصد کمیسیون به یک واسطه نیازی ندارید.
ذخیره سازی قراردادهای هوشمند
همه تراکنش ها و قراردادهای هوشمند چگونه ثبت می شوند؟
باید به خاطر داشته باشید که قراردادهای هوشمند، داده ها را در بلوکی از زنجیره بلوکی ذخیره می کنند و همه تراکنش ها با یک کلید هش منحصر به فرد ذخیره می شوند. در Remix IDE می توانید تاریخچه کامل تراکنش ها را به صورت فایل JSON (JavaScript Object Notation) دانلود کنید. برای انجام این کار، مراحل زیر را دنبال کنید:
- روی Deploy & Run Transaction کلیک کنید
- سپس، منوی کشویی Transactions Recorded (..) V را گسترش دهید.
- سپس بر روی نماد ذخیره کلیک کنید.
- دکمه تایید را فشار دهید.
هزینه گس در تراکنش های اتریوم
ممکن است متوجه شده باشید که هر زمان تراکنش انجام می شود، چند wei از کیف پول اتر شما کسر می شود. این هزینه گس نامیده می شود و پرداختی است که توسط کاربران برای جبران انرژی محاسباتی مورد نیاز برای پردازش و اعتبارسنجی تراکنش ها انجام می شود.
با افزایش تعداد ماینرها و استخراج کنندگان اتریوم در آینده نزدیک، هزینه گس در یک رابطه معکوس کاهش می یابد.
در انتها به شما تبریک می گوییم. چرا که شما با موفقیت درک کرده اید که Solidity چیست و قراردادهای هوشمند چگونه کار می کنند و همچنین شما با موفقیت آموزش ایجاد قرارداد هوشمند با استفاده از زبان سالیدیتی را فراگرفته و یک قرارداد هوشمند کاملاً کارآمد ساخته و اجرا کردهاید.
نظر بدهید