حتما شنیده اید که میگویند ارزهای دیجیتال اصطلاحا "بدون نیاز به اعتماد" (trustless) هستند. این جمله درست است زیرا در بستر بلاکچین شما نیاز به اعتماد به اشخاص یا ارگان ها ندارید و تنها چیزی که به آن اعتماد میکنید «کد» است و کدهای کامپیوتری هرگز دروغ نمیگویند یا خیانت نمیکنند!
به عنوان مثال برای اینکه به عملکرد بیت کوین پی ببرید لازم نیست به کسی اعتماد کنید تا برای شما آن را توضیح دهد، خودتان میتوانید کد منبع باز (open source) بیت کوین را بخوانید و صحت عملکرد آن را چک کنید.
در فضای کریپتو تنها جایی که شما نیاز به اعتماد دارید، صرافیهای متمرکز هستند که ممکن است هک شوند یا از عمد از اموال شما سواستفاده کنند.
در بستر اتریوم «قراردادهای هوشمند» (smart contracts) همین ویژگی "بدون نیاز به اعتماد به فرد خاصی" را دارند و میتوان از آنها برای تضمین یک معامله غیر قانونی (که طرفین معامله به یکدیگر اعتماد ندارند) بهره برد.
قراردادهای هوشمند یک قطعه کد هستند که در بلاکچین مشخصی (مثلا اینجا اتریوم) اجرا میشوند.
قراردادهای هوشمند چند ویژگی جالب دارند که آنها را بسیار محبوب کرده است :
قراردادهای هوشمند به زبان برنامه نویسی سالیدیتی (Solidity) نوشته میشوند و سپس در بلاکچین اتریوم آپلود میشوند.
برای نوشتن کد یک قرارداد هوشمند برای انجام معامله غیر قانونی مان از این دو ویژگی قراردادهای هوشمند بهره میبریم :
1) کد قراردادهای هوشمند شفاف است و پس از آپلود در بلاکچین قابل تغییر نیست و حتی مالک آن نمیتواند آن را دستکاری کند.
2) قراردادهای هوشمند قابلیت ارسال و دریافت اتریوم (و دیگر توکن ها) را دارند.
تضمین غیر نقدی : در دنیای سنتی هنگامی که میخواهید معامله انجام دهید از طرف مقابل "تضمین" میگیرید. این تضمین میتواند قرارداد محضری یا چک یا هرچیز دیگر باشد به عنوان مثال بانک برای اینکه به شما وام دهد از شما تضمین غیر نقدی (تعهد، امضا، سند ملک) میگیرد. اما تضمین در دنیای سنتی فقط به وسیله اعتماد به شخص سوم (دولت، قوه قضاییه، غیره) حاصل میشود.
در دنیای کریپتو انجام معامله با تضمین غیر نقدی ممکن نیست پس باید راهکار دوم را بررسی کنیم :
تضمین نقدی : یه راهکار دیگر برای انجام معامله تضمین نقدی است. در این حالت یک واسطه بین خریدار و فروشنده قرار میگیرد که پول را از خریدار میگیرد اما فورا آن را به فروشنده نمیدهد و نزد خود نگه میدارد. هرگاه خریدار تایید کرد که کالا را صحیح و سالم دریافت کرده است، فرد واسط مبلغ کالا را به حساب فروشنده واریز میکند (و البته کارمزد خود را برمیدارد). میتوان دیجیکالا و باسلام را نمونه های خوبی از آن دانست. این فروشگاه ها پول را از خریدار میگیرند اما بعد از اینکه کالا به دست خریدار رسید آن را به حساب فروشنده واریز میکنند و اگر خریدار شکایتی داشت تا زمان حل شدن مسئله پول را نزد خود نگه میدارند.
خیلی خب. فرض کنید با یک فروشنده قطعات نظامی تحریمی در یک قاره دیگر ارتباط گرفته اید و میخواهید یک سری قطعات از او بخرید اما اصلا به او اعتماد ندارید که هیچ پولی برایش واریز کنید همچنین او نیز اصلا به شما اعتماد ندارد که بدون دریافت کامل مبلغ چیزی برایتان ارسال کند و هیچ شخص سومی هم نیست که هردوی شما به او اعتماد داشته باشید.
ایده اصلی این است که : (مبلغ کالا = P)
1) قبلا از انجام معامله خریدار مبلغی بیشتر از مبلغ کالا را (مثلا 2 برابر یا 2P) به یک قرارداد هوشمند واریز کند.
2) فروشنده هم مبلغی را (مثلا برابر مبلغ کالا یا P) به همان آدرس کانترکت (قرارداد) واریز کند.
3) سپس قرارداد هوشمند این مبالغ را قفل کند و تا پایان معامله به هیچ وجه قابل برداشت نباشد.
4) حالا فروشنده کالا را برای خریدار ارسال میکند.
5) خریدار پس از دریافت کالا (و درصورت رضایت) یک پیام برای قرارداد هوشمند ارسال میکند که کالا را دریافت کرده است.
6) قرارداد مبالغ تضمین را به خریدار و فروشنده برمیگرداند و پول فروشنده را هم به او میدهد. یعنی از 3P موجودیای که دارد 2P به فروشنده میدهد و P به خریدار برمیگرداند.
در این سیستم :
در این سناریو هر دو طرف معامله تشویق میشوند که معامله را به نحو احسنت انجام دهند و دست از پا خطا نکنند زیرا که اگر چنین کاری کنند علاوه بر مبلغ تضمین طرف مقابل، مبلغ تضمین خودشان هم از بین میرود.
هرچند در این سیستم اگر شما خیانت کنید طرف مقابل بیشتر از خودتان آسیب خواهد دید اما به این دلیل که خودتان هم ضرر میکنید، این مشوق وجود دارد که هرکس به تعهداتش پایبند باشد.
چند نکته فنی :
برای نوشتن چنین قراردادی باید به زبان برنامه نویسی سالیدیتی (solidity) مسلط باشید. یک نمونه از چنین قرارداد هوشمندی در ادامه قرار داده شده که بتوانید از آن ایده بگیرید یا حتی میتوانید آن را مستقیما کپی کنید و در بلاکچین آپلود کنید و معامله غیر قانونی خود را پیش ببرید!
در مثال زیر قرارداد باید توسط فروشنده ساخته شود. فروشنده هنگامی که میخواهد قرارداد را بسازد مبلغ معامله را هم به آن واریز میکند و سپس خریدار با فراخوانی تابع confirmPurchase مبلغ تضمین خود را واریز میکند و در لحظه مبالغ قفل میشوند.
پس از اتمام معامله خریدار با فراخوانی تابع confirmReceived دریافت خود را تایید میکند و تنها پس از آن است که فروشنده میتواند با فراخوانی تابع refundSeller پول خود را دریافت کند.
منبع کد : Solidity Documentation
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.4; contract Purchase { // P = price value uint public P; address payable public seller; address payable public buyer; enum State { Created, Locked, Release, Inactive } // The state variable has a default value of the first member, `State.created` State public state; modifier condition(bool condition_) { require(condition_); _; } /// Only the buyer can call this function. error OnlyBuyer(); /// Only the seller can call this function. error OnlySeller(); /// The function cannot be called at the current state. error InvalidState(); /// The provided value has to be even. modifier onlyBuyer() { if (msg.sender != buyer) revert OnlyBuyer(); _; } modifier onlySeller() { if (msg.sender != seller) revert OnlySeller(); _; } modifier inState(State state_) { if (state != state_) revert InvalidState(); _; } event Aborted(); event PurchaseConfirmed(); event ItemReceived(); event SellerRefunded(); // seller send ETH with the contract creation transaction constructor() payable { seller = payable(msg.sender); P = msg.value; } /// Abort the purchase and reclaim the ether. /// Can only be called by the seller before /// the contract is locked. function abort() external onlySeller inState(State.Created) { emit Aborted(); state = State.Inactive; // We use transfer here directly. It is // reentrancy-safe, because it is the // last call in this function and we // already changed the state. seller.transfer(address(this).balance); } /// Confirm the purchase as buyer. /// Transaction has to include `2 * P` ether. /// The ether will be locked until confirmReceived /// is called. function confirmPurchase() external inState(State.Created) condition(msg.value == (2 * P)) payable { emit PurchaseConfirmed(); buyer = payable(msg.sender); state = State.Locked; } /// Confirm that you (the buyer) received the item. /// This will release the locked ether. function confirmReceived() external onlyBuyer inState(State.Locked) { emit ItemReceived(); // It is important to change the state first because // otherwise, the contracts called using `send` below // can call in again here. state = State.Release; buyer.transfer(P); } /// This function refunds the seller, i.e. /// pays back the locked funds of the seller. function refundSeller() external onlySeller inState(State.Release) { emit SellerRefunded(); // It is important to change the state first because // otherwise, the contracts called using `send` below can call in again here. state = State.Inactive; seller.transfer(2 * P); } }
اکنون فقط نیاز دارید تا کد بالا را در بلاکچین آپلود کرده و از آن استفاده کنید (احتیاط: آپلود یک قرارداد هوشمند در بلاکچین اتریوم ممکن است کارمزد زیادی ببرد).
آموزش آپلود قرارداد هوشمند در بلاکچین اتریوم با استفاده از کیف پول MyEtherWallet
امیدوارم از این آموزش لذت برده باشید.