انتقال توکن های قابل تعویض

  • 2022-09-26

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

اگر می خواهید کد تمام شده این آموزش Core را ببینید، می توانید آن را در پوشه 5. transfers بیابید.

مقدمه

تا این مرحله، شما یک قرارداد هوشمند FT ساده ایجاد کرده‌اید که به مالک اجازه می‌دهد تا کل عرضه توکن‌ها را برش دهد و اطلاعات مربوط به خود Fungible Token را مشاهده کند. علاوه بر این، قابلیت ثبت حساب‌ها و انتشار رویدادها را اضافه کرده‌اید. امروز، قرارداد هوشمند خود را گسترش خواهید داد تا به کاربران امکان انتقال و دریافت توکن های قابل تعویض را بدهید.

منطق انجام یک انتقال ساده کاملاً آسان است. فرض کنید بنجی می خواهد مایک 100 توکن قابل تعویض خود را انتقال دهد. قرارداد باید چند کار را انجام دهد:

  • بررسی کنید که آیا بنجی حداقل 100 توکن دارد یا خیر.
  • مطمئن شوید که بنجی در حال فراخوانی تابع است.
  • مطمئن شوید که مایک در قرارداد ثبت شده است.
  • 100 توکن از حساب بنجی خارج کنید.
  • 100 توکن در حساب مایک قرار دهید.

در این مرحله، شما آماده هستید تا ادامه دهید و تغییرات لازم را در قرارداد هوشمند خود انجام دهید.

اصلاحات در قرارداد

بیایید سفر خود را در فایل src/ft_core. rs شروع کنیم.

تابع انتقال

شما با پیاده سازی منطق ft_transfer که در فایل src/ft_core. rs یافت می شود شروع خواهید کرد. این تابع مقدار مشخص شده را با یک یادداشت اختیاری مانند "تولدت مبارک مایک!".

در اینجا باید به چند نکته توجه کرد.

ما یک متد جدید به نام assert_one_yocto() معرفی کرده‌ایم. این روش تضمین می‌کند که کاربر معامله را با یک کلید دسترسی کامل امضا می‌کند و به واریز دقیقاً 1 yoctoNEAR، کمترین مقدار ممکن نزدیک به $$ قابل انتقال است. از آنجایی که تابع انتقال به طور بالقوه دارایی های بسیار ارزشمندی را منتقل می کند، باید مطمئن شوید که هر کسی که این تابع را فراخوانی می کند یک کلید دسترسی کامل دارد.

ما یک روش intern_transfer را معرفی کرده‌ایم. این همه منطق لازم برای انتقال توکن ها به صورت داخلی را انجام می دهد.

توابع کمکی داخلی

اجازه دهید به سرعت به فایل ft-contract/src/internal. rs برویم تا بتوانید متد inside_transfer را که هسته اصلی این آموزش است، پیاده سازی کنید. این تابع پارامترهای زیر را خواهد گرفت:

  • sender_id : حسابی که سعی در انتقال توکن ها دارد.
  • reciver_id: حسابی که نشانه ها را دریافت می کند.
  • مقدار: مقدار FTS منتقل می شود.
  • یادداشت: یک یادداشت اختیاری که شامل می شود.

اولین کاری که می خواهید انجام دهید این است که اطمینان حاصل کنید که فرستنده به خودشان توکن ارسال نمی کند و آنها شماره مثبت می فرستند. پس از آن ، شما می خواهید نشانه ها را از مانده فرستنده خارج کرده و آنها را به تراز گیرنده واریز کنید. شما قبلاً منطق را برای واریز FTS با استفاده از عملکرد داخلی_دپوسیت نوشتید.

بیایید از منطق مشابه برای اجرای داخلی_ withdraw استفاده کنیم:

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

با استفاده از توابع داخلی_deposit و داخلی_ withdraw ، هسته اصلی عملکرد داخلی_transfer کامل است.

فقط یک کار دیگر وجود دارد که شما باید انجام دهید. هنگام انتقال نشانه ها ، باید به یاد داشته باشید که طبق استاندارد رویدادها یک ورود به سیستم را منتشر کنید:

اکنون که این کار به پایان رسیده است ، پرونده انتقال ساده انجام می شود! اکنون می توانید FT ها را بین کاربران ثبت شده منتقل کنید!

عملکرد تماس انتقال

در این بخش ، در مورد یک تابع جدید ft_transfer_call یاد خواهید گرفت. این کار FTS را به یک گیرنده منتقل می کند و همچنین در قرارداد گیرنده همه در همان معامله تماس می گیرد.

بیایید سناریوی زیر را در نظر بگیریم. یک حساب می خواهد FTS را برای انجام یک سرویس به یک قرارداد هوشمند منتقل کند. رویکرد سنتی انجام خدمات و سپس درخواست نشانه ها در دو معاملات جداگانه است. اگر گردش کار "انتقال و تماس" را که در یک معامله واحد پخته شده معرفی می کنیم ، این روند را می توان بسیار بهبود بخشید:

این عملکرد چندین کار را انجام می دهد:

  1. اطمینان حاصل می کند که تماس گیرنده دقیقاً 1 یوکت را برای اهداف امنیتی متصل می کند.
  2. نشانه ها را با استفاده از داخلی_ transfer که اخیراً نوشتید منتقل کنید.
  3. وعده ای برای تماس با روش ft_on_transfer در قرارداد گیرنده_ید ایجاد می کند.
  4. پس از پایان اجرای وعده ، عملکرد ft_resolve_transfer نامیده می شود.

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

هنگام تماس با FT_ON_TRANSFER ، این قرارداد چند توکن را باز می گرداند که باید فرستنده اصلی را بازپرداخت کند.

این برای چند دلیل مهم است:

  1. اگر گیرنده را بیش از حد FTS ارسال کنید و قرارداد آنها می خواهد مبلغ اضافی را بازپرداخت کند.
  2. در صورت هراس منطقی ، همه نشانه ها باید به فرستنده بازپرداخت شوند.

این منطق همه در عملکرد ft_resolve_transfer اتفاق می افتد:

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

سپس مقدار خالص نشانه های منتقل شده به گیرنده را برمی گردانید. اگر فرستنده 100 توکن را منتقل کند اما 20 نفر بازپرداخت شده اند ، این عملکرد باید 80 بازگردد.

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

استقرار قرارداد

بیایید یک زیر حساب جدید برای استقرار قرارداد ایجاد کنیم. از آنجا که این تغییرات فقط افزودنی و غیر دولتی است ، می توانستید یک مشکل پچ را به قراردادی که در بخش ذخیره سازی مستقر کرده اید نیز مستقر کنید. برای کسب اطلاعات بیشتر در مورد به روزرسانی قراردادها ، به بخش ارتقاء قرارداد در NFT Zero To Hero Tutorial مراجعه کنید.

ایجاد یک حساب فرعی

دستور زیر را اجرا کنید تا یک حساب زیر حساب اصلی خود را با مانده اولیه 25 در نزدیکی آن ایجاد کنید که از اصل به حساب جدید شما منتقل می شود.

در مرحله بعد ، شما می خواهید یک متغیر محیط را برای سهولت در توسعه صادر کنید:

با استفاده از اسکریپت ساخت ، قرارداد را همانطور که در آموزش های قبلی انجام دادید ، ایجاد کنید:

ثبت دیدگاه

مجموع دیدگاهها : 0در انتظار بررسی : 0انتشار یافته : ۰
قوانین ارسال دیدگاه
  • دیدگاه های ارسال شده توسط شما، پس از تایید توسط تیم مدیریت در وب منتشر خواهد شد.
  • پیام هایی که حاوی تهمت یا افترا باشد منتشر نخواهد شد.
  • پیام هایی که به غیر از زبان فارسی یا غیر مرتبط باشد منتشر نخواهد شد.