خلق قراردادهای هوشمند با قراردادهای هوشمند

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

0 107

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

  1. تولید قرارداد خرید از راه دور امن برای هر فروش جدید.
  2. به او گفته شود که قراردادهای خرید از راه دور امن که او ایجاد کرده کجا هستند.
  3. امکان داشته باشد تا بر هریک از آن‌ها، وضعیت آن و هویت خریداران نظارت کند.

این مقاله در خصوص مورد ۱ و ۲ صحبت می‌کند. مورد ۳ را می‌توان با وارد کرد ABI قرارداد خرید از راه دور امن در یک کیف پول اتریوم مانند Mist انجام داد. من می‌توانم یک DApp بسازم که این کار را انجام دهد! اما این مقاله بر مورد ۱ و ۲ تمرکز می‌کند.

منطق تجاری

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

StartEscrow

جان تمایل دارند یا ویجتی را به مبلغ ۲ اتر خریداری کند، پس پیتر تابع ()newPurchase از StartEscrow را اجرا می‌کند. این کار یک قرارداد خرید جدید ایجاد می‌کند. پیتر می‌تواند نشانی این قرارداد را ببیند و آن را در یک مرورگر بلاک قرار دهد تا پیشرفت آن را ببیند. او نشانی این قرارداد تازه ایجاد شده خرید را به جان می‌دهد که می‌تواند سپس از آن استفاده کند.

StartEscrow

سالی (Sally) از راه می‌رسد و می‌خواهد ویجتی را به مبلغ ۴ اتر بخرد. پیتر مجدد تابع () newPurchaseرا اجرا می‌کند. این کار یک قرارداد خرید جدید ایجاد می‌کند.

StartEscrow

در پایان تراکنش قرارداد خرید، پیتر از خریداران ETH دریافت می‌کند.

StartEscrow

اجرا

StartEscrow در Remix IDE اینگونه اجرا می‌شود.

با کپی کردن کد StartEscrow.sol در Remix، می‌توانید StartEscrow را پیاده کنید. [Deploy] را فشار داده و این قرارداد هوشمند را پیاده کنید.

StartEscrow

با فرض این که پیتر قصد دارد تا ویجتی به مبلغ ۲ اتر بفروشد، 2ETH را وارد کرده و [newPurchase] را فشار دهید. این کار یک قرارداد خرید جدید ایجاد می‌کند.

StartEscrow

حال، با فرض این که پیتر قصد دارد تا ویجتی را به مبلغ ۴ اتر بفروشد، 4ETH را وارد کرده و [newPurchase] را فشار دهید. این کار یک قرارداد خرید جدید دیگر ایجاد می‌کند.

StartEscrow

برای این که بیابید تاکنون چند قرارداد خرید ایجاد شده است، بر روی [getContractCount] کلیک کنید.

StartEscrow

برای این که آدرس قراردادها، مثلا قرارداد اول را پیدا کنید، در seePurchase عدد ۰ را وارد کرده و بر روی [call] کلیک کنید. آدرس قرارداد خرید را کپی کنید.

StartEscrow

اکنون در نقش خریدار یعنی جان قرار می‌گیریم. جان Remix IDE خود را باز کرده، نشانی قرارداد خرید را وارد کرده و بر روی [At Address] کلیک می‌کند. او بر روی [seller] کلیک می‌کند تا نشانی پیتر را بیابد. (نکته: این نشانی قرارداد نیست، نشانی پیتر است).

سپس او ۲ ETH را وارد کرده و بر روی confirmPurchase کلیک می‌کند تا تایید کند که او این ویجت را خریداری می‌کند.

StartEscrow

توجه کنید که این قرارداد خرید اکنون ۴ ETH دارد، ۲ ETH از جان و ۲ ETH از پیتر.

StartEscrow

جان با کلیک بر روی [confirmReceived] تایید می‌کند که ویجت‌ها را از پیتر دریافت کرده است.

StartEscrow

Etherscan را چک کنید. ۱ ETH به جان و ۲ ETH به پیتر منتقل شده است.

ETH

تغییرات در قرارداد خرید

من تغییرات کوچکی در قرارداد اولیه خرید از راه دور امن ایجاد کردم. این چیزی است که تغییر دادم.

 

من پارامتر address contractSeller را به constructor اضافه کردم تا پس از تکمیل فرآیند خرید، قرارداد خرید نشانی فردی را که باید ۲ ETH به او ارسال کند را بداند. من تصمیم گرفتم که پرداخت ETH به صاحب قرار انجام شود و ETH در قرارداد نگهداری نشود.

StartEscrow

یک قرارداد خرید جدید در StartEscrow به این شکل ایجاد می‌شود.

newPurchase قابل پرداخت است، پس برای احضار آن باید ETH ارائه کنید. به طور مشخص، مقادیر ETH زوج هستند، چرا که خرید از راه دور امن این‌گونه الزام می‌کند. با این کار یک قرارداد خرید جدید ایجاد می‌شود و مقدار ETH دریافتی توسط newPurchase و همچنین آدرس msg.sender (شخصی که قرارداد StartEscrow را اجرا کرده است) در آن قرار می‌گیرد. قرارداد خرید ایجاد شده به یک آرایه قرارداد هدایت شده و نشانی قرارداد در متغیر lastContractAddress ذخیره می‌شود.

پس هر بار که شما با اعطای چند ETH به آن یک تابع() newPurchase جدید اجرا می‌کنید، یک قرارداد خرید جدید ایجاد می‌شود.

این گونه می‌توانید آدرس قرارداد خرید جدیدی را که راه‌اندازی کرده‌اید، به دست آورید.

 

تنها موقعیت قرارداد خرید در آرایه را مشخص کنید و seePurchase آدرس آن را به شما اعلام می‌کند.

این مقاله بر اساس نمونه کد برای اجرای یک قرارداد هوشمند از یک قرارداد هوشمند دیگر توسط راب هیچنز (Rob Hitchens) در StackExchange نوشته شده است.

شاید از این مطالب هم خوشتان بیاید.

ارسال پاسخ

آدرس ایمیل شما منتشر نخواهد شد.