معرفی قراردادهای هوشمند
آخرین ویرایش: @bghad1(opens in a new tab), ۳ اردیبهشت ۱۴۰۳
قراردادهای هوشمند چه هستند؟
«قرارداد هوشمند» به سادگی برنامه ای است که بر روی زنجیره بلوکی اتریوم اجرا می شود. مجموعه ای از کد (توابع آن) و داده ها (وضعیت آن) است که در یک آدرس خاص در زنجیره بلوکی اتریوم قرار دارد.
قراردادهای هوشمند نوعی حساب اتریوم هستند. این بدین معنی است که آن ها میتوانند موجودی(دارایی) داشته باشند و تراکنش به آن ها ارسال شود. با این حال آنها توسط یک کاربر کنترل نمی شوند، در عوض در شبکه مستقر می شوند و طبق برنامه اجرا می شوند. سپس حسابهای کاربر میتوانند با ارسال تراکنشهایی که تابعی تعریف شده در قرارداد هوشمند را اجرا میکند، با یک قرارداد هوشمند تعامل کنند. قراردادهای هوشمند می توانند قوانینی را مانند یک قرارداد معمولی تعریف کنند و به طور خودکار آنها را از طریق کد اجرا کنند. قراردادهای هوشمند را نمی توان به طور پیش فرض حذف کرد و تعامل با آنها غیر قابل برگشت است.
پیش نیاز ها
اگر تازه شروع کرده اید یا به دنبال معرفی کمتر تخصصی هستید، معرفی قراردادهای هوشمند را توصیه می کنیم.
مطمئن شوید که بخشهای حسابها، تراکنشها و ماشین مجازی اتریوم را پیش از ورود به دنیای قراردادهای هوشمند خوانده باشید.
یک دستگاه فروش دیجیتال
همانطور که توسط Nick Szabo(opens in a new tab) توضیح داده شده است، شاید بهترین استعاره برای یک قرارداد هوشمند، یک دستگاه فروش خودکار باشد. با ورودی های مناسب، خروجی مشخصی تضمین می شود.
برای دریافت یک خوراکی از دستگاه فروش خودکار:
1money + snack selection = snack dispensed
این منطق در ماشین فروش برنامه ریزی شده است.
یک قرارداد هوشمند، مانند یک دستگاه فروش خودکار، منطق در آن برنامه ریزی شده است. مثالی ساده از یک دستگاه فروش خودکار اگر قرارداد هوشمندی به زبان سالیدیتی بود:
1pragma solidity 0.8.7;23contract VendingMachine {45 // Declare state variables of the contract6 address public owner;7 mapping (address => uint) public cupcakeBalances;89 // When 'VendingMachine' contract is deployed:10 // 1. set the deploying address as the owner of the contract11 // 2. set the deployed smart contract's cupcake balance to 10012 constructor() {13 owner = msg.sender;14 cupcakeBalances[address(this)] = 100;15 }1617 // Allow the owner to increase the smart contract's cupcake balance18 function refill(uint amount) public {19 require(msg.sender == owner, "Only the owner can refill.");20 cupcakeBalances[address(this)] += amount;21 }2223 // Allow anyone to purchase cupcakes24 function purchase(uint amount) public payable {25 require(msg.value >= amount * 1 ether, "You must pay at least 1 ETH per cupcake");26 require(cupcakeBalances[address(this)] >= amount, "Not enough cupcakes in stock to complete this purchase");27 cupcakeBalances[address(this)] -= amount;28 cupcakeBalances[msg.sender] += amount;29 }30}نمایش همهکپی
قراردادهای هوشمند می توانند جایگزین واسطه ها در بسیاری از صنایع شوند، مانند اینکه چگونه یک دستگاه فروش خودکار نیاز به کارمند فروشنده را برطرف می کند.
بدون نیاز به مجوز
هر کسی می تواند یک قرارداد هوشمند بنویسد و آن را در شبکه مستقر کند. فقط باید یاد بگیرید که چگونه در زبان قرارداد هوشمند کدنویسی کنید، و اتر کافی برای اجرای قرارداد خود داشته باشید. پیاده سازی یک قرارداد هوشمند از نظر فنی یک تراکنش است، بنابراین باید کارمزد خود را مانند وقتی که نیاز به پرداخت کارمزد برای انتقال ساده اتر دارید، پرداخت کنید. با این تفاوت که،کارمزد پیادهسازی یک قرارداد هوشمند بسیار بالاتر است.
اتریوم دارای زبانهای مناسب برای توسعهدهندگان برای نوشتن قراردادهای هوشمند است:
- Solidity
- Vyper
با این حال، آنها باید قبل از استقرار آنها کامپایل شوند تا ماشین مجازی اتریوم بتواند قرارداد را تفسیر و ذخیره کند. اطلاعات بیشتر دربارهی کامپایل کردن
ترکیب پذیری
قراردادهای هوشمند در اتریوم عمومی هستند و می توان آنها را به عنوان APIهای باز در نظر گرفت. این بدان معناست که می توانید قراردادهای هوشمند دیگری را در قرارداد هوشمند خود فرا بخوانید تا آنچه ممکن است را تا حد زیادی گسترش دهید. قراردادها حتی می توانند قراردادهای دیگری را مستقر کنند.
دربارهی ترکیب پذیری قرارداد هوشمند بیشتر یاد بگیرید.
محدودیتها
قراردادهای هوشمند به تنهایی نمی توانند اطلاعات مربوط به رویدادهای "دنیای واقعی" را دریافت کنند زیرا نمی توانند اطلاعاتی از منابع خارج زنجیره دریافت کنند. این بدین معنیست که نمیتوانند به اتفاقات دنیای واقعی پاسخ دهند. این بر اساس طراحی است. تکیه بر اطلاعات خارجی می تواند اجماع را که برای امنیت و تمرکززدایی مهم است، به خطر بیندازد.
اما، برنامه های روی زنجیره باید بتوانند از اطلاعات خارج زنجیره استفاده کنند. راه حل آن اوراکل ها هستند که اطلاعات خارج زنجیره را جمع میکنند و در اختیار قراردادهای هوشمند میگذارند.
یکی دیگر از محدودیت های قراردادهای هوشمند، حداکثر اندازه قرارداد است. یک قرارداد هوشمند می تواند حداکثر 24 کیلوبایت باشد وگرنه گاز آن تمام می شود. با استفاده از الگوی الماس(opens in a new tab) میتوان این موضوع را دور زد.
قراردادهای چند امضایی
قراردادهای Multisig (چند امضایی) حسابهای قرارداد هوشمندی هستند که برای اجرای یک تراکنش به چندین امضای معتبر نیاز دارند. این مورد برای اجتناب از نقاط شکست منفرد برای قراردادهایی که مقادیر قابل توجهی اتر یا توکنهای دیگر دارند، بسیار مفید است. همچنین چند امضاییها مسئولیت اجرای قرارداد و مدیریت کلید را بین چندین طرف تقسیم میکند و از گم شدن یک کلید خصوصی که منجر به از دست دادن غیرقابل برگشت سرمایه میشود، جلوگیری میکنند. به این دلایل، قراردادهای چند امضایی را میتوان برای مدیریت ساده DAO استفاده کرد. چند امضاییها برای اجرا به N امضا از M امضای قابل قبول ممکن (که N ≤ M و M > 1) نیاز دارند. معمولاً از N = 3، M = 5
و N = 4، M = 7
استفاده میشود. یک چندامضایی 4/7 به چهار امضا از هفت امضای معتبر ممکن نیاز دارد. این بدان معناست که حتی اگر سه امضا از بین برود، وجوه هنوز قابل بازیابی هستند. در این مورد نیز به این معناست که اکثریت دارندگان کلید باید توافق و امضا کنند تا قرارداد اجرا شود.
منابع قرارداد هوشمند
قراردادهای OpenZeppelin - کتابخانهای برای توسعه قراردادهای هوشمند ایمن.
- openzeppelin.com/contracts/(opens in a new tab)
- گیت هاب(opens in a new tab)
- تالار گفتگو(opens in a new tab)