اولین قرارداد هوشمند با Solidity
نوشتن یک قرارداد هوشمند برای کسی که اصول اولیه برنامهنویسی و مفاهیم شیگرایی را بداند کار بسیار راحتی است، تنها کافیست ابزارهای لازم برای انجام این کار را بشناسد و نحوه کار با آنها را فرا بگیرد. بنابراین در این مطلب قصد آموزش برنامهنویسی را ندارم و به صورت گام به گام نحوه نوشتن یک قرارداد هوشمند بسیار ساده و اجراء آن در یک محیط شبیهسازی شده تحت وب را شرح خواهم داد.
ابزارهای موردنیاز:
- IDE: با مراجعه به آدرس http://remix.ethereum.org یک IDE کامل تحت وب خواهید داشت و برای شروع نیاز به نصب هیچ نرمافزاری بر روی کامپیوتر خود ندارید.
- Solidity: زبان برنامهنویسی برای قراردادهای هوشمند بر روی ماشین مجازی اتریوم (Ethereum Virtual Machine)
در ابتدا لینک IDE فوق را در مرورگر دلخواه خود باز کنید. به صورت پیش فرض یک قرارداد هوشمند به نام ballot.sol نمایش داده میشود. برای شروع کار این کد کمی پیچیده به نظر میرسد، به همین دلیل یک قرارداد بسیار ساده به اسم HelloWorldContract در ادامه این مطلب نوشتم که میتوانید آن را کپی و درون ویرایشگر قرار دهید:
pragma solidity ^0.4.0;
contract HelloWorldContract {
string word = "Hello World!";
function getWord() public constant returns(string) {
return word;
}
function setWord(string newWord) public returns(string) {
word = newWord;
return word;
}
}
pragma:با استفاده از این کلمه کلیدی در اولین خط برنامه، نسخه کامپایلری که قرار است برنامه با استفاده از آن build شود، مشخص میشود.
contract: مشابه کلمه class در زبانهای شیگرا، این کلمه کلیدی برای ایجاد قرارداد هوشمند استفاده میشود.
returns: برای مشخصکردن نوع خروجی توابع از این کلمه کلیدی استفاده میشود. همانطور که مشاهده میکنید، در توابع فوق درون پرانتز نوع خروجی string تعیین شده است.
constant: ایجاد قراردادهای هوشمند و اجراء هر دستوری که باعث تغییر وضعیت بلاکچین بر روی ماشین مجازی اتریوم (EVM) شود، هزینه دارد و این هزینه با واحد Gas از حساب کسی که تابع را فراخوانی کرده کسر و به Miner ها پرداخت میشود. توابعی مانند getWord که تغییری در وضعیت قرارداد ایجاد نمیکنند و تنها مقدار یک متغیر را برمیگردانند، نباید هزینهایی داشته باشند. برای مشخصکردن این نوع توابع از کلمه کلیدی constant استفاده میشود.
نکته 1: اگر در تابع setWord از کلمه کلیدی constant استفاده کنید، بدون هیچ خطایی اجرا میشود اما مقدار متغیر تغییر نمیکند.
نکته 2: در تستهایی که انجام دادم، ظاهرا بود و نبود constant دیگر تاثیری ندارد و EVM در صورتیکه تشخیص دهد تغییری در وضعیت قرارداد هوشمند ایجاد شده هزینه را محاسبه و کسر میکند، در غیر اینصورت هزینهایی کسر نمیشود.
اجرا و تست قرارداد هوشمند:
در سمت راست IDE تحت وب، تبهای مختلفی مشابه تصویر زیر میبینید. (تصویر مربوط به زمان انتشار مطلب است و ممکن است با گذر زمان تغییراتی در نسخه آنلاین ایجاد شود که با تصویر زیر متفاوت باشد)
compile: در این تب برنامه به صورت دستی یا خودکار کامپایل میشود و در صورتی که خطا یا اخطاری داشته باشد به ترتیب در کادرهای قرمز و نارنجی رنگ نمایش داده میشود.
Run: بعد از برنامهنویسی و کامپایل قرارداد هوشمند، نوبت به اجرا و تست آن میرسد. برای اینکار شما میتوانید از شبکه اصلی اتریوم، TestNet اختصاصی خود و یا TestNetهایی که در بستر اینترنت وجود دارند، استفاده کنید. اما چون استفاده از شبکه اصلی اتریوم هزینه و استفاده از TestNetها برای تازهکارها پیچیدگیهای خاص خود را دارد، در این تب محیطی مجازی فراهم شده است که به راحتی قرارداد هوشمند خود را اجراء و نتیجه کار را مشاهده کنید.
در این تب پارامترهای قابل تنظیم مختلفی وجود دارند که در ادامه کاربرد آنها را شرح خواهیم داد اما در بیشتر مواقع مقادیر پیش فرض برای تست قرارداد مناسب هستند.
Environment: محیط شبیهسازی با استفاده از این گزینه مشخص میشود. گزینه پیش فرض (JavaScript VM) برای شبیهسازی بلاکچین بر روی مرورگر ایجاد شده است که در حال حاضر راحت ترین روش است. در آینده نحوه استفاده از سایر محیطهای شبیهسازی در مطالب جداگانه شرح داده خواهد شد.
Account: برای ایجاد یک قرارداد هوشمند و فراخوانی متدهای آن باید از یک حساب اتریوم استفاده شود. به صورت پیش فرض 5 حساب با موجودی 100 اتریوم در اختیار برنامه نویس قرار داده شده که هزینههای ایجاد و اجراء قرارداد از آنها کسر میشود.
Gas limit: گس (Gas)، واحدی با ارزش 1/100,000 اتریوم است که برای ارزشگذاری هزینه اجراء دستورات قرارداد هوشمند بر روی ماشین مجازی اتریوم استفاده میشود. Gas limit، حداکثر هزینهایی است که شما به عنوان اجراکننده قرارداد حاضر هستید برای اجراء آن هزینه کنید. چون هزینه اجراء قراردادهای هوشمند دستور به دستور و بعد از اجراء هر دستور کسر میشود، اگر در حین اجراء دستورات به این سقف برسد کل تراکنش کنسل میشود و هزینه دستورات اجرا شده هم پس داده نمیشود! در صورتیکه هزینه اجراء کمتر از Gas limit باشد، باقیمانده آن به حساب شما برگشت داده میشود.
Value: قراردادهای هوشمند دقیقا مشابه حسابهای شخصی اتریوم هستند و آدرس مخصوص به خود را دارند و شما قادر هستید که برای آنها اتریوم بفرستید. با استفاده از این گزینه، مقدار اتریومی که قصد دارید برای یک قرارداد هوشمند ارسال کنید را با واحدهای مختلف مشخص میکنید.
بعد از تعیین مقادیر فوق، حال بر روی کلید Create کلیک کنید تا مشابه تصویر ذیل قرارداد هوشمند بر روی شبیهساز تحت وب ایجاد شود:
همانطور که در تصویر فوق مشاهده میکنید قرارداد HelloWorldContract با موفقیت ایجاد و متدهای آن نیز لیست شدهاند. اگر دقت فرمائید متدهای setter به رنگ صورتی و متدهای getter به رنگ آبی نمایش داده شدهاند.
برای تست متدهای قرارداد، در TextBoxیی که در کنار متد setWord قرار دارد، مقدار “Hello Test” را به عنوان ورودی برای قرارداد ارسال و سپس با کلیک بر روی متد getWord مقدار جدید متغیر را دریافت میکنیم.
تا اینجای کار ما موفق شدیم یک قرارداد هوشمند بسیار ساده را بر روی محیط شبیهسازی شده تحت وب ایجاد و تست کنیم. هرچند قراردادی که نوشتهایم آنقدر ساده است که عملا در دنیای واقعی کاربردی ندارد اما میتواند شروع خوبی برای درک برنامهنویسی قراردادهای هوشمند باشد.
در مطلب بعدی که به زودی منتشر خواهد شد، با همدیگر یک قرارداد هوشمند واقعی (توکن) خواهیم نوشت.
Congratulations @mersana, you have decided to take the next big step with your first post! The Steem Network Team wishes you a great time among this awesome community.
The proven road to boost your personal success in this amazing Steem Network
Do you already know that awesome content will get great profits by following these simple steps that have been worked out by experts?