اسمارت کانترکت (Smart Contract) یا قرارداد هوشمند مزیتی مهم در بلاک چین اتریوم (Ethereum) است که در این مطلب نحوه ساخت آن را آموزش میدهیم. از سال 2015 که شبکه اتریوم در فضای بلاک چین راهاندازی شد، برنامهنویسی کانادایی-روسی به نام ویتالیک بوترین (Vitalik Buterin) برای اولین بار مفهوم اپلیکیشنهای غیر متمرکز را خلق و معرفی کرد؛ دلیل اصلی موفقیت Ethereum در این حوزه توسعه مفهومی جامعتر به نام قرارداد هوشمند یا اسمارت کانترکت (Smart Contract) بود که در اصل زیربنای دپها محسوب میشوند. تا انتهای این مقاله شما نیز با نحوه ساخت قرارداد هوشمند در اتریوم آشنا میشوید.
مقدمهای بر اسمارت کانترکتها
بسیاری عقیده دارند قرارداد هوشمند مفهومی جدید است که همزمان با ساخت بلاک چین اتریوم ایجاد شده، اما اولین بار یک محقق علوم کامپیوتری به نام نیک زابو (Nick Szabo) عبارت Smart Contract را ساخت و آن را به صورت زیر تعریف کرد:
این قراردادهای جدید را «هوشمند» مینامم، چون نسبت به قراردادهای کاغذی سنتی بسیار کاربردیتر هستند. هدف از این نامگذاری اشاره به هوش مصنوعی نبوده است. یک قرارداد هوشمند در واقع مجموعهای از تعهدات و پروتکلی برای پایبند ماندن به آنها است که به صورت دیجیتال ثبت شدهاند.
فعالیتهای این محقق الهامبخش دانشمندان و محققان بسیاری از جمله ویتالیک بوترین بود که بعدها بلاک چین اتریوم را ساخت. قبل از آنکه به نحوه ساخت قرارداد هوشمند را در شبکه اتریوم آموزش دهیم، لازم است شیوه عملکرد Ethereum و ساختار داخلی آن را بهتر بشناسیم.
توسعه اپلیکیشن غیر متمرکز در بلاک چین اتریوم چگونه ممکن است؟
پلتفرمهای بلاک چینی بستری مناسب برای ساخت و اجرای قرارداد هوشمند به توسعهدهندگان ارائه میدهند. یکی از این پلتفرمها اتریوم است که اجازه میدهد کد مدنظر خود را به شکل یک برنامه یا نرم افزار روی آن اجرا کنید. بلاک چین Ethereum ساختاری توزیعشده و غیر متمرکز دارد که اجرای پروژهها به کمک اسمارت کانترکت را ممکن میسازد.
ساخت ارز دیجیتال
در بلاک چین اتریوم هر کسی میتواند توکنی قابل معامله بسازد و به عنوان یک رمز ارز جدید از آن استفاده کند، و سپس با ساختن استخر نقدینگی در صرافیهای غیر متمرکز، امکان خرید ارز دیجیتال ساخته شده را برای دیگران ایجاد کند. توکنهای ساخته شده در پلتفرم Ethereum از یک API سکه استاندارد استفاده میکنند تا با هر والت اتریومی همخوانی داشته باشند.
توسعه سازمانهای مجازی
به کمک یک قرارداد هوشمند میتوانید در شبکه اتریوم سازمانهای بلاک چینی خود را توسعه دهید. همچنین میتوانید افرادی دیگر را به سازمان خود اضافه و امکان رای دادن را در آن ایجاد کنید. اعضای سازمان شما میتوانند درباره هر موضوع مهمی رایگیری کنند و اگر تعداد رایها به مقدار مشخصی برسد، قرارداد هوشمند به صورت خودکار آن را اجرا خواهد کرد.
ساخت اپلیکیشن غیر متمرکز
اتریوم به توسعهدهندگان اجازه میدهد اپلیکیشنهای غیر متمرکز ایمن و مقاوم در برابر خطا را طراحی و اجرا کنند که نیاز به واسطه را از بین میبرد.
تامین سرمایه
از قراردادهای هوشمند اتریوم حتی برای جذب سرمایه هم میتوان استفاده کرد. در این بلاک چین میتوانید یک اسمارت کانترکت با ضربالعجل تعریف کنید و بعد اگر به ضربالعجل نرسیدید، تمام رمز ارزهای جمع شده در قرارداد هوشمند بدون چون و چرا به سرمایه گذاران آن برگردانده میشوند.
اتریوم چطور قرارداد های هوشمند را اجرا میکند؟
قبل از آنکه به آموزش ساخت قرارداد هوشمند در بلاک چین اتریوم بپردازیم، ابتدا باید درک کنیم که اسمارت کانترکتها چطور در این شبکه اجرا میشوند. بنابراین بیایید ابتدا نگاهی به محیط اجرای آن بیندازیم.
ماشین مجازی اتریوم (EVM)
هدف ابتدایی خلق ماشین مجازی اتریوم این بود که برای قراردادهای هوشمند ساخته شده بر بستر این شبکه، یک محیط اجرای اختصاصی وجود داشته باشد. به بیان سادهتر، میتوانید EVM را ابررایانهای در نظر بگیرید که تمام قرارداد های هوشمند اتریوم را اجرا میکند.
همانطور که از نامش پیداست، ماشین مجازی اتریوم نه یک دستگاه فیزیکی، بلکه یک محیط مجازی است؛ به همین علت عملکرد EVM نیز به ماشینهای مجازی محدود است، به عنوان مثال EVM نمیتواند تماسهای تاخیردار در سطح اینترنت برقرار کند یا اعداد تصادفی و رندوم بسازد. بنابراین یک ماشین حالت ساده (Simple State) محسوب میشود. برنامهنویسی اپلیکیشن به زبان اسمبلی چندان عقلانی نیست، بنابراین اتریوم به یک زبان برنامهنویسی خاص برای EVM نیاز داشت.
هزینه گس (Gas)
در ماشین مجازی اتریوم، گس در حقیقت یک واحد شمارش برای کارمزد هر تراکنش در قرارداد های هوشمند است. هر پردازشی که در EVM انجام شود، مقداری گس لازم دارد. همچنین هر چقدر پردازش مدنظر سختتر باشد، گس اتریوم مورد نیاز برای اجرای قرارداد هوشمند نیز بیشتر میشود.
هزینه تراکنش = تعداد واحد گس استفاده شده * هزینه گس
سالیدیتی (Solidity)
سالیدیتی یک زبان برنامه نویسی قرارداد هوشمند در شبکه اتریوم است که بر بستر EVM طراحی شده و با توجه به استفاده از کلاس (Class) و متد (Method) در آن، شباهت زیادی به زبانهای برنامهنویسی شیگرا دارد. با زبان سالیدیتی میتوان تمام محاسبات مدنظر را به صورت دلخواه انجام داد، اما استفاده اصلی آن ارسال و دریافت توکن و وضعیت ذخیره رمز ارزها است. از نظر سینتکس، سالیدیتی تا حد زیادی از سی پلاس پلاس، پایتون و جاوا اسکریپت الهام گرفته است تا توسعهدهندگان خیلی راحت بتوانند آن را درک کنند.
اگر با زبان سالیدیتی آشنا باشید، برای نوشتن یک قرارداد هوشمند در اتریوم و استفاده بهینه از این آموزش نسبت به بقیه یک قدم جلوتر خواهید بود. اما شبکههای دیگری که از ماشین مجازی اتریوم استفاده نمیکنند برای قراردادهای هوشمند خود نیازی به این روند و ساختار ندارند و میتوان با زبانهای برنامه نویسی دیگر و به شکلهای دیگر اپلیکیشن خود را بسازند. به عنوان مثال ساخت قرارداد هوشمند در بلاک چین کاردانو با استفاده از هسکل، پلوتوس و مارلو انجام میشود.
قرارداد هوشمند (Smart Contract) چیست؟
قراردادهای هوشمند در حقیقت منطق ریاضیاتی یک کسب و کار یا پروتکلی هستند که تمام تراکنش های درون بلاک چین بر اساس آنها اجرا میشوند. هدف عمومی یک قرارداد هوشمند کسب اطمینان از اجرای موفق شرایط قراردادی آن است که از جمله این شرایط میتوان به ساخت توکنی اتریومی اشاره کرد. باید قرارداد هوشمندی توسعه دهیم که بر اساس آن تمام محاسبات توکن اجرایی میشوند.
اسمارت کانترکت یک حقیقت یک اسکریپت مستقل نوشته شده به زبان سالیدیتی است که با JSON کامپایل و بعد در آدرسی مشخص روی شبکه بلاک چین ارسال و راهاندازی میشود. درست همانطور که لینک پیوند URL را فراخوانی میکنیم، میتوانیم قراردادهای هوشمند ارسال شده به آدرسی مشخص را نیز فراخوانی و اجرا کنیم.
قرارداد هوشمند در یک پایگاه داده غیر متمرکز ذخیره میشود و هزینه این ذخیرهسازی بر اساس فضای مورد نیاز کد آن تعیین میگردد. همچنین میتوان Smart Contract را مجموعهای از کدهای ذخیرهشده در شبکه بلاک چین توصیف کرد که همه عوامل دخیل در آن ملزم به اجرای قوانین و شرایط تعیینشده توسط کد هستند.
در این مطلب میخواهیم نحوه ساخت یک قرارداد هوشمند اتریومی را با استفاده از زبان برنامهنویسی سالیدیتی توضیح دهیم، بنابراین لازم است که ابتدا بدانیم Solidity چیست. سالیدیتی یک زبان شبیه به جاوا اسکریپت است که به صورت خاص برای نوشتن قراردادهای هوشمند توسعه داده شده. برنامههای نوشتهشده به این زبان برنامه نویسی از مفاهیم کتابخانه، وراثت و انواع تعاریف متغیر پشتیبانی میکنند. کامپایلر سالیدیتی کد نوشته شده را به بایتکد قابل خواندن توسط EVM تبدیل میکند و بعد آن بایتکد برای اجرا به عنوان یک تراکنش به شبکه اتریوم ارسال میشود.
پیشنیازهای ساخت قرارداد هوشمند در شبکه اتریوم چیست؟
اولین قدم در مسیر ساخت و اجرای اسمارت کانترکت در اتریوم این است که یک کیف پول سازگار برای این کار نصب کنید. در این مطلب ما از افزونه کیف پول متامسک (MetaMask) برای آموزش استفاده میکنیم. توجه داشته باشید که برای ساخت و اجرای قرارداد هوشمند در بلاک چین اتریوم به ارز بومی این شبکه در والت خود احتیاج خواهید داشت. البته ما در این آموزش از ارز اتر آزمایشی رایگان استفاده میکنیم، اما برای خرید و فروش اتریوم با نماد ETH میتوانید از بیشتر صرافیهای معتبر همچون بیت 24 استفاده کنید.
والت متامسک هم به عنوان مرورگر و هم کیف پول ارز دیجیتال قابل استفاده است و اجازه میدهد کاربران بدون نیاز به دانلود بلاک چین یا نصب نرم افزارهای اختصاصی، قراردادهای هوشمند و اپلیکیشن های غیر متمرکز مدنظر خود را اجرا کنند. تنها لازم است که به وب سایت رسمی متامسک یا صفحه افزونه MetaMask در مرورگر کروم بروید و آن را دانلود و نصب کنید، سپس یک کیف پول بسازید و مقداری ارز دیجیتال اتر در آن ذخیره کنید.
البته والت متامسک در حال حاضر برای مرورگرهای Firefox ،Brave و Edge نیز قابل دانلود است. پس از دانلود افزونه یا نصب اپلیکیشن آن، به سادگی میتوانید یک والت قدیمی را به کمک عبارت بازیابی در آن وارد کنید یا یک والت جدید بسازید. توجه داشته باشید که برای اجرای قرارداد هوشمند و حتی پیشرفت در این آموزش، به مقداری ارز دیجیتال اتریوم در کیف پول خود نیاز دارید. البته در زمان تست میتوانید مقداری اتر مجازی رایگان به کیف پولتان اضافه کنید و نیازی به صرف هزینه نیست.
مراحل توسعه یک قرارداد هوشمند در اتریوم چیست؟
پس از دانلود و نصب و فعال سازی کیف پول متامسک، باید چند مرحله مهم را پشت سر بگذارید تا آماده ساخت قرارداد هوشمند در اتریوم شوید. گفتنی است که ین فرآیند برای شبکههای دیگر متفاوت است و باید از والت دیگری استفاده کنید. به عنوان مثال برای ساخت قرارداد هوشمند در شبکه سولانا به جای متامسک از کیف پول فانتوم استفاده میشود.
آموزش ساخت والت در متامسک
پس از نصب کیف پول MetaMask، در نوار بالا سمت راست مرورگر روی شکلک آن بزنید تا وارد صفحه جدید شوید. روی گزینه Create Wallet بزنید و با شرایط و قوانین مشخص شده موافقت کنید. در مرحله بعد یک رمز عبور تعیین میکند و سپس عبارت بازیابی 12 واژهای والت به شما نشان داده میشود. این عبارت را در محلی امن و غیر دیجیتال ذخیره کنید و هرگز آن را با کسی به اشتراک نگذارید. گفتنی است که اگر کسی این عبارت بازیابی را به دست بیاورد، میتواند به راحتی تمام کیف پول رمز ارزی شما را خالی کند.
قدم بعد این است که مطمئن شوید در شبکه اصلی اتریوم هستید. اگر کنار گزینه Main Ethereum Network تیک است، یعنی در جای درستی هستید.
انتخاب یکی از شبکههای آزمایشی
در کیف پول متامسک میتوانید یکی از شبکههای آزمایشی یا تست را نیز انتخاب کنید. برای یادگیری نحوه ساخت قرارداد هوشمند در بلاک چین اتریوم بهتر است از یکی از شبکههای تست زیر استفاده کنید.
- شبکه تست رابستن (Robsten Test Network)
- شبکه تست کووان (Kovan Test Network)
- شبکه تست رینکبی (Rinkeby Test Network)
- شبکه تست گورلی (Goerli Test Network)
شبکههای ذکر شده در بالا صرفا برای تست هستند و اترهای این شبکهها ارزش مادی ندارد.
اضافه کردن اتر آزمایشی به والت
در صورتی که میخواهید در شبکههای تست به آزمایش و یادگیری نوشتن قرارداد های هوشمند اتریوم بپردازید، باید مقداری اتر آزمایشی به کیف پول خود اضافه و به عنوان هزینه گس استفاده کنید. به عنوان مثال اگر از شبکه Robsten استفاده میکنید، پس از انتخاب آن مشاهده میکنید که در والت شما 0 اتر موجودی هست. برای اضافه کردن اتر آزمایشی روی گزینه Deposit بزنید و بعد در بخش Test Faucet گزینه Get Ether را انتخاب کنید.
برای انجام واریزی باید روی Request One Ether From The Faucet بزنید و 1 ETH به والت شما اضافه میشود. گفتنی است که در شبکه آزمایشی هر تعداد که دوست داشته باشید میتوانید اتر رایگان بگیرید (چون ارزش مادی آن در عمل صفر است).
به عنوان مثال، ما 1 اتر به کیف پول خود اضافه کردهایم.
پس از اینکه اترهای آزمایشی مد نظر را به والت خود اضافه کردید، حال میتوانید به کمک محیط توسعه یکپارچه Remix مشغول نوشتن یک قرارداد هوشمند اتریوم به زبان سالیدیتی شوید.
محیط توسعه Remix برای نوشتن قرارداد هوشمند به زبان سالیدیتی (Solidity)
برای نوشتن کد سالیدیتی خود از محیط توسعه یکپارچه ریمیکس (Remix) استفاده میکنیم. میتوان گفت ریمیکس از آنجا که قابلیتهای متعددی دارد و همچنین تجربه توسعه کاملی ارائه میدهد، بهترین گزینه برای نوشتن قراردادهای هوشمند محسوب میشود. حتی ساخت قرارداد هوشمند در بایننس اسمارت چین نیز مثل اتریوم به کمک ریمیکس بسیار راحتتر میشود و روندی یکسان با آن دارد. البته گفتنی است که ریمیکس معمولا برای نوشتن قراردادهای نسبتا کوچک استفاده میشود. از قابلیتهای Remix میتوان به موارد زیر اشاره کرد:
- هشدار دادن درباره هزینه گس، کد ناامن، تکرار نام متغیرها و امکان ثابت بودن تابعها
- هایلایت کردن سینتکس و ارورها
- توابع با شیهای وب3
- تحلیل استاتیک
- اشکالیاب یکپارچه
- محیط تست و توسعه یکپارچه
- ارسال مستقیم به Mist یا MetaMask
بیایید با مراجعه به وب سایت رسمی ریمیکس به آدرس remix.ethereum.org کد یک اسمارت کانترکت را بنویسیم.
ساخت یک فایل با فرمت sol.
مرورگر ریمیکس را باز کنید و روی گزینه + در نوار بالا سمت چپ بزنید تا یک فایل با فرمت sol. بسازید.
کد نمونه قرارداد هوشمند برای ساخت توکنهای ERC20
فایل ERC20.sol یک قالب معمول و استاندارد برای توکنهای ERC20 است.
[js]
pragma solidity ^0.4.0;
import “./ERC20.sol”;
contract myToken is ERC20{
mapping(address =>uint256) public amount;
uint256 totalAmount;
string tokenName;
string tokenSymbol;
uint256 decimal;
constructor() public{
totalAmount = 10000 * 10**18;
amount[msg.sender]=totalAmount;
tokenName=”Mytoken”;
tokenSymbol=”Mytoken”;
decimal=18;
}
function totalSupply() public view returns(uint256){
return totalAmount;
}
function balanceOf(address to_who) public view
returns(uint256){
return amount[to_who];
}
function transfer(address to_a,uint256 _value) public
returns(bool){
require(_value<=amount[msg.sender]);
amount[msg.sender]=amount[msg.sender]-_value;
amount[to_a]=amount[to_a]+_value;
return true;
}
}
[/js]
یکی از نسخههای کامپایلر را در ریمیکس انتخاب کنید تا کد قرارداد هوشمند اتریوم با زبان سالیدیتی کامپایل شود.
سوار کردن قرارداد هوشمند روی بلاک چین
با کلیک روی گزینه Deploy در پنجره سمت راست وب سایت Remix، قرار داد هوشمن خود را روی شبکه آزمایشی اتریوم ارسال کنید و منتظر بمانید تا تراکنش انجام شود.
پس از پایان موفقیتآمیز تراکنش، آدرس قرارداد هوشمند در سمت راست پنجره ریمیکس قابل مشاهده خواهد بود. در ابتدا تمام توکن ERC20 در والت یک کاربر قرار خواهند گرفت که نقش فرستنده اصلی توکنها را بر عهده خواهد داشت.
برای مشاهده توکنهای درون والت خود، به پنجره متامسک بروید، روی گزینه Add Token بزنید و آدرس اسمارت کانترکت خود را وارد و تایید کنید. پس از وارد کردن آدرس میتوانید تمام توکنها را در کیف پول خود ببینید.
مراحل آزمایش کردن یک قرارداد هوشمند در اتریوم
- سعی کنید تمام متدهای قرارداد هوشمند خود همچون Transfer ،Total Supply و Balance را یک بار در شبکه آزمایشی اجرا کنید. این متدها در منوی سمت راست پنجره Remix قابل مشاهده هستند و میتوانید از همانجا اجرایشان کنید.
- سعی کنید مقداری از توکنها را به آدرسهای اتریومی والتهای دیگر منتقل کنید و بعد با متد Balance مقدار دارایی آن کیف پول را ببینید.
- سعی کنید با استفاده از متد Total Supply تمام موجودی توکنها را مشاهده کنید.
مراحل ارسال و راهاندازی یک قرارداد هوشمند در اتریوم
- برای اجرای زنده قرارداد هوشمند خود، با کیف پول متامسک به شبکه اصلی اتریوم متصل شوید.
- مقداری ETH واقعی به والت خود اضافه کنید.
- حال دوباره قرارداد هوشمند خود را درست مثل شبکه آزمایشی با استفاده از Remix روی بلاک چین ارسال کنید.
- وقتی قرارداد هوشمند با موفقیت روی بلاک چین ثبت شود، به وب سایت Etherscan.io بروید و آدرس قرارداد هوشمند خود را مشاهده کنید.
- روی قرارداد هوشمند خود کلیک کنید. در این قسمت باید با کلیک روی Verify The Contract، کد قرارداد هوشمند را تایید کنید.
- کد اسمارت کانترکت خود را کپی کنید و به اتراسکن بروید. همان نسخه کامپایلری که در Remix انتخاب کرده بودید را دوباره انتخاب و کد خود را کامپایل کنید.
- اگر در ریمیکس Optimization را انتخاب کرده بودید، اینجا هم این گزینه را روی Yes قرار دهید، در غیر این صورت No را انتخاب کنید.
- روی Verify بزنید.
- اگر مشکلی پیش نیاید، پس از چند دقیقه کد قرارداد شما روی بلاک چین به صورت زنده اجرا و تایید میشود.
- حال میتوانید متدهای قرارداد هوشمند خود را در اتر اسکن نیز اجرا کنید.
ابزارهای لازم برای ساخت قرارداد هوشمند در اتریوم چه هستند؟
در آخرین بخش به معرفی چند مورد از نرم افزارها و APIهای الزامی در فرآیند طراحی، ساخت و اجرای اسمارت کانترکتها در بلاک چین اتریوم میپردازیم.
- Truffle: ترافل یک فریمورک توسعه اتریومی است که به توسعهدهندگان اجازه میدهد قراردادهای هوشمند خود را بنویسند و آزمایش کنند. ترافل با زبان جاوا اسکریپت نوشته شده است و یک کامپایلر برای زبان برنامه نویسی سالیدیتی دارد. همچنین یک کتابخانه جاوا اسکریپت به نام Truffle Contract در آن هست که ایمپورت کردن قراردادهای هوشمند را ممکن میکند.
- Web3.js: یک API جاوا اسکریپت اتریومی است که به کمک RPC با شبکه Ethereum ارتباط برقرار میکند.
- Visual Studio Code: یک ویرایشگر کد کاربردی.
- Ganache CLI: یک کلاینت عملیاتی اتریومی در فریمورک ترافل که همچنین به نام TestRPC شناخته میشود.
- Parity: یک کلاینت ایمن و سریع اتریومی که با آن میتوان حسابها و توکنهای این شبکه را مدیریت کرد.
- Node.js: یک محیط اجرای جاوا اسکریپت که برای برنامه نویسی سمت سرور استفاده میشود. برای آزمایش کاربرد قراردادهای هوشمند شبکه اتریوم در عین ایمن بودن، به Node.js نیاز است. البته در کنار Node.js باید حتما یک نرم افزار مدیریت بسته همچون Yarn نیز نصب کنید.
سخن پایانی
در این مطلب به طور جامع نحوه ساخت یک قرارداد هوشمند بر بستر شبکه اتریوم را توضیح و آموزش دادیم. شبکه Ethereum اولین بلاک چینی بود که مفهوم قرارداد هوشمند و اپلیکیشن غیر متمرکز را در این حوزه معرفی و همهگیر کرد. هماکنون نیز به لطف محبوبیت و افزایش قیمت اتریوم در بازار ارز دیجیتال، تعداد توسعهدهندگانی که با استفاده از زبان سالیدیتی بر بستر شبکه Ethereum اپلیکیشن میسازند، از تمام رقبای آن بیشتر است، اما به خاطر هزینه بسیار بالای تراکنشها در اتریوم، بسیاری از مشتاقان این فضا در حال کوچ به سمت شبکههای سریعتر و ارزانتر همچون سولانا، بایننس اسمارت چین و کاردانو هستند؛ بیت 24 آموزش ساخت قرارداد هوشمند در بلاک چینهای رقیب اتریوم را نیز ارائه داده است.
تهیه شده در بیت 24