عماد
عماد
خواندن ۹ دقیقه·۱ سال پیش

راهنمای فنی ساخت یک قرارداد هوشمند برای انجام معاملات غیرقانونی

در معاملات غیر قانونی، طرفین به یکدیگر اعتماد ندارند.
در معاملات غیر قانونی، طرفین به یکدیگر اعتماد ندارند.

حتما شنیده اید که میگویند ارزهای دیجیتال اصطلاحا "بدون نیاز به اعتماد" (trustless) هستند. این جمله درست است زیرا در بستر بلاکچین شما نیاز به اعتماد به اشخاص یا ارگان ها ندارید و تنها چیزی که به آن اعتماد میکنید «کد» است و کدهای کامپیوتری هرگز دروغ نمیگویند یا خیانت نمیکنند!

به عنوان مثال برای اینکه به عملکرد بیت کوین پی ببرید لازم نیست به کسی اعتماد کنید تا برای شما آن را توضیح دهد، خودتان میتوانید کد منبع باز (open source) بیت کوین را بخوانید و صحت عملکرد آن را چک کنید.

در فضای کریپتو تنها جایی که شما نیاز به اعتماد دارید، صرافی‌های متمرکز هستند که ممکن است هک شوند یا از عمد از اموال شما سواستفاده کنند.

در بستر اتریوم «قراردادهای هوشمند» (smart contracts) همین ویژگی "بدون نیاز به اعتماد به فرد خاصی" را دارند و میتوان از آنها برای تضمین یک معامله غیر قانونی (که طرفین معامله به یکدیگر اعتماد ندارند) بهره برد.

قرارداد هوشمند چیست؟

قراردادهای هوشمند یک قطعه کد هستند که در بلاکچین مشخصی (مثلا اینجا اتریوم) اجرا میشوند.

ipleaders.in
ipleaders.in

قراردادهای هوشمند چند ویژگی جالب دارند که آنها را بسیار محبوب کرده است :

  • پس از اینکه یک قرارداد هوشمند در بلاکچین آپلود میشود دیگر کد آن قابل تغییر نیست (مگر آنکه در کد اولیه شرایط خاصی برای آپدیت شدن قرارداد اندیشیده شود)
  • کد تمامی قراردادهای هوشمند اتریوم شفاف است و شما میتوانید کد آنها را بخوانید و از صحت عملکرد قرارداد مطمئن شوید.
  • قراردادهای هوشمند همچنین مانند یک والت اتریوم عمل میکنند و قابلیت ارسال و دریافت اتریوم را دارند.
  • قراردادهای هوشمند میتوانند با یکدیگر ارتباط برقرار کنند.
  • با قراردادهای هوشمند میتوان به راحتی و ظرف چند دقیقه یک توکن (token) در شبکه اتریوم ساخت.

قراردادهای هوشمند به زبان برنامه نویسی سالیدیتی (Solidity) نوشته میشوند و سپس در بلاکچین اتریوم آپلود میشوند.

اطلاعات قرارداد هوشمند تتر در سایت etherscan.io ، میتوانید تعداد کل توکن عرضه شده و تعداد کل هولدرهای توکن را ببینید. همچنین در پایین عکس آدرس قرارداد هوشمند تتر نوشته شده که در صفحه مربوط به آن میتوانید خودتان کد قرارداد هوشمند تتر را به زبان سالیدیتی بخوانید.
اطلاعات قرارداد هوشمند تتر در سایت etherscan.io ، میتوانید تعداد کل توکن عرضه شده و تعداد کل هولدرهای توکن را ببینید. همچنین در پایین عکس آدرس قرارداد هوشمند تتر نوشته شده که در صفحه مربوط به آن میتوانید خودتان کد قرارداد هوشمند تتر را به زبان سالیدیتی بخوانید.

برای نوشتن کد یک قرارداد هوشمند برای انجام معامله غیر قانونی مان از این دو ویژگی قراردادهای هوشمند بهره میبریم :

1) کد قراردادهای هوشمند شفاف است و پس از آپلود در بلاکچین قابل تغییر نیست و حتی مالک آن نمیتواند آن را دستکاری کند.

2) قراردادهای هوشمند قابلیت ارسال و دریافت اتریوم (و دیگر توکن ها) را دارند.

ایده گرفتن "تضمین" برای حسن انجام معامله

تضمین غیر نقدی : در دنیای سنتی هنگامی که میخواهید معامله انجام دهید از طرف مقابل "تضمین" میگیرید. این تضمین میتواند قرارداد محضری یا چک یا هرچیز دیگر باشد به عنوان مثال بانک برای اینکه به شما وام دهد از شما تضمین غیر نقدی (تعهد، امضا، سند ملک) میگیرد. اما تضمین در دنیای سنتی فقط به وسیله اعتماد به شخص سوم (دولت، قوه قضاییه، غیره) حاصل میشود.

در دنیای کریپتو انجام معامله با تضمین غیر نقدی ممکن نیست پس باید راهکار دوم را بررسی کنیم :

تضمین نقدی : یه راهکار دیگر برای انجام معامله تضمین نقدی است. در این حالت یک واسطه بین خریدار و فروشنده قرار میگیرد که پول را از خریدار میگیرد اما فورا آن را به فروشنده نمیدهد و نزد خود نگه میدارد. هرگاه خریدار تایید کرد که کالا را صحیح و سالم دریافت کرده است، فرد واسط مبلغ کالا را به حساب فروشنده واریز میکند (و البته کارمزد خود را برمیدارد). میتوان دیجیکالا و باسلام را نمونه های خوبی از آن دانست. این فروشگاه ها پول را از خریدار میگیرند اما بعد از اینکه کالا به دست خریدار رسید آن را به حساب فروشنده واریز میکنند و اگر خریدار شکایتی داشت تا زمان حل شدن مسئله پول را نزد خود نگه میدارند.

ایده نوشتن یک قرارداد هوشمند برای انجام خودکار فرآیند تضمین نقدی

خیلی خب. فرض کنید با یک فروشنده قطعات نظامی تحریمی در یک قاره دیگر ارتباط گرفته اید و میخواهید یک سری قطعات از او بخرید اما اصلا به او اعتماد ندارید که هیچ پولی برایش واریز کنید همچنین او نیز اصلا به شما اعتماد ندارد که بدون دریافت کامل مبلغ چیزی برایتان ارسال کند و هیچ شخص سومی هم نیست که هردوی شما به او اعتماد داشته باشید.

ایده اصلی این است که : (مبلغ کالا = P)

1) قبلا از انجام معامله خریدار مبلغی بیشتر از مبلغ کالا را (مثلا 2 برابر یا 2P) به یک قرارداد هوشمند واریز کند.

2) فروشنده هم مبلغی را (مثلا برابر مبلغ کالا یا P) به همان آدرس کانترکت (قرارداد) واریز کند.

3) سپس قرارداد هوشمند این مبالغ را قفل کند و تا پایان معامله به هیچ وجه قابل برداشت نباشد.

4) حالا فروشنده کالا را برای خریدار ارسال میکند.

5) خریدار پس از دریافت کالا (و درصورت رضایت) یک پیام برای قرارداد هوشمند ارسال میکند که کالا را دریافت کرده است.

6) قرارداد مبالغ تضمین را به خریدار و فروشنده برمیگرداند و پول فروشنده را هم به او میدهد. یعنی از 3P موجودی‌ای که دارد 2P به فروشنده میدهد و P به خریدار برمیگرداند.

در این سیستم :

  • اگر فروشنده بخواهد خیانت کند و کالا را ارسال نکند : مبلغ تضمینی که به قرارداد هوشمند واریز کرده برای همیشه از دست میرود.
  • اگر خریدار بخواهد خیانت کند و پس از دریافت کالا ، پیام "تایید دریافت" را به قرارداد ارسال نکند، مبلغ تضمینی که به قرارداد هوشمند واریز کرده برای همیشه از دست میرود.

در این سناریو هر دو طرف معامله تشویق میشوند که معامله را به نحو احسنت انجام دهند و دست از پا خطا نکنند زیرا که اگر چنین کاری کنند علاوه بر مبلغ تضمین طرف مقابل، مبلغ تضمین خودشان هم از بین میرود.

  • پرسش : اگر فروشنده به تعهد خود عمل نکند و کالا را ارسال نکند هرکس چقدر ضرر میکند ؟ پاسخ : خریدار به اندازه 2P و فروشنده به اندازه P ضرر میکنند.
  • پرسش : اگر خریدار به تعهد خود عمل نکند و پس از دریافت کالا ، پیام "تایید دریافت" را به قرارداد ارسال نکند، هرکس چقدر ضرر میکند ؟ پاسخ : خریدار به اندازه P و فروشنده به اندازه 2P ضرر خواهند کرد.

هرچند در این سیستم اگر شما خیانت کنید طرف مقابل بیشتر از خودتان آسیب خواهد دید اما به این دلیل که خودتان هم ضرر میکنید، این مشوق وجود دارد که هرکس به تعهداتش پایبند باشد.

چند نکته فنی :

  • مبلغی که خریدار و فروشنده به قرارداد ارسال میکنند هم میتواند از جنس یک توکن باشد و هم میتواند اتریوم باشد. برای راحتی بیشتر در کدی که در ادامه مقاله قرار داده شده از اتریوم برای مبلغ تضمین استفاده شده است (خریدار و فروشنده باید با نوسانات قیمتی اتریوم، طی مدت معامله کنار بیایند).
  • منظور از ارسال پیام "تایید دریافت کالا" توسط خریدار، فراخواندن یک تابع (function) در قرارداد هوشمند توسط خریدار است. این کار با اپلیکیشن های معمول کیف پول ارز دیجیتال (مثلا تراست والت) ممکن نیست و طرفین باید تا حدی دانش برنامه نویسی داشته باشند.
  • اگر به هر دلیل خریدار یا فروشنده به توافق نرسند، پول‌ها تا ابد در قرارداد هوشمند قفل خواهد ماند.
  • تنها بعد از اینکه هم خریدار و هم فروشنده مبالغ تضمین را به آدرس قرارداد هوشمند ارسال کردند، قرارداد مبالغ را قفل میکند. اگر مثلا خریدار پولش را فرستاد اما فروشنده هرگز پولی به آدرس قرارداد نفرستاد، خریدار میتواند پولش را پس بگیرد.

چگونه چنین قراردادی را روی بلاکچین ایجاد کنیم؟

برای نوشتن چنین قراردادی باید به زبان برنامه نویسی سالیدیتی (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

امیدوارم از این آموزش لذت برده باشید.

قرارداد هوشمندارز دیجیتالسالیدیتی
شاید از این پست‌ها خوشتان بیاید