الگو Pull over Push
ارسال اتر به آدرس دیگری در شبکه اتریوم شامل اتصال به گیرنده است. این تماس خارجی ممکن است به دلایل مختلفی با شکست مواجه شود. اگر این آدرس دریافت کننده در قالب یک قرارداد باشد، می تواند یک تابع بازگشتی را پیاده سازی کند که به سادگی می تواند پس از فراخوانی یک استثنا ایجاد کند. یکی دیگر از دلایل عدم موفقیت این تماس، تمام شدن بنزین است. یعنی زمانی که نیاز به تماس های خارجی زیادی در یک فراخوانی یک تابع باشد، این اتفاق می افتد. به عنوان مثال، زمانی که یک برد از یک شرط برنده چندگانه ارسال می شود. بنابراین توسعه دهندگان باید از این اصل ساده پیروی کنند “به تماس های خارجی برای اجرای بدون خطا اعتماد نکنید”. البته در بیشتر موارد این مشکلی نیست، زیرا در نهایت این مسئولیت دریافت کننده است که از دریافت پول خود اطمینان حاصل کند و اگر نتواند پول خود را دریافت کند، فقط ضرر می کند. در این مقاله به بررسی خواهیم پرداخت مدل Pull Push بیایید به صورت کریپتو پرداخت کنیم.
مدل Pull Push در کریپتو
در رابطه با مدل Pull over Push می توان گفت که وقتی آدرسی از طریق روش انتقال قادر به دریافت اتر نباشد (مثلاً زمانی که تابع بازگشت باید به گاز ارسال شود) و جای بالاترین پیشنهاد را بگیرد، قرارداد در حالت غیر قابل حل خواهد بود. هر تلاش جدیدی برای پیشنهاد بالاترین پیشنهاد فعلی منجر به انتقال اتر به خط 10 و ایجاد یک استثنا می شود. به همین دلیل، ارائه بیش از حد برای رهبر فعلی غیرممکن می شود.
مشکل بالقوه دیگری هنگام تلاش برای ارسال اتر به چندین گیرنده با یک فراخوانی یک تابع ایجاد می شود. به این معنا که تنها یکی از انتقالها باید از کار بیفتد تا بتوانید تمام انتقالهایی را که قبلاً رخ دادهاند، برگردانید یا از اجرای ترانزیشنهای بعدی جلوگیری کنید. یک تکنیک ویژه برای غلبه بر این محدودیت ها پیشنهاد شده است که هر تماس خارجی را جدا می کند و خطر شکست را از قرارداد به کاربر منتقل می کند. از آنجا که نقل و انتقالات جدا هستند، هیچ قرارداد یا منطق انتقال دیگری نباید به اجرای موفقیت آمیز آنها متکی باشد.
قابلیت کاربرد
مدل Pull over Push را می توان در شرایط زیر استفاده کرد:
– چندین انتقال اتر را با یک فراخوانی یک تابع مدیریت کنید
– اجتناب از خطر مرتبط با انتقال اتر
– انگیزه ای برای کاربران وجود دارد که خودشان با استخراج اتر کار کنند.
شرکت کنندگان و همکاری ها
مدل Pull over Push شامل سه شرکت کننده است. در ابتدا، فرآیند به عنوان اولین شرکت کننده توسط نهاد مسئول شروع انتقال (به عنوان مثال خود قرارداد یا مالک قرارداد) آغاز می شود. سپس، به عنوان شرکتکننده دوم، قرارداد هوشمند مسئول ردیابی همه موجودیها میشود. گیرنده پرداخت، به عنوان یک شخص ثالث، صرفاً وجوه خود را از طریق تراکنش دریافت نمی کند، بلکه باید فعالانه درخواست برداشت کند تا فرآیند را از سایر منطق پرداخت و قرارداد جدا کند.
پیاده سازی
مدل Pull Push برای جداسازی همه تماسهای خارجی از یکدیگر و منطق قرارداد، خطر انتقال اتر را به کاربر منتقل میکند و همچنین به کاربران اجازه میدهد مبلغ مشخصی را برداشت کنند که در غیر این صورت باید ارسال شود. نقشه برداری یکی از اجزای اصلی این پیاده سازی است که وظیفه ردیابی مانده های معوق کاربران را بر عهده دارد. بنابراین به جای انتقال واقعی اتر از قرارداد به گیرنده، تابعی فراخوانی می شود که می تواند یک ورودی به کارت اضافه کند و واجد شرایط بودن کاربر برای برداشت مبلغ مشخص شده را نشان دهد.
اگر کارت قبلاً دارای سابقه ای برای آن آدرس باشد، مبلغ به آدرس موجود اضافه می شود. سپس کاربر مسئول برداشت وجه با صدور یک تراکنش برداشت هوشمند از قرارداد است که از مدل تعامل اثر چک برای بهروزرسانی موجودی قبل از انتقال واقعی اتر استفاده میکند.
نتایج استفاده از مدل Pull over Push
استفاده از مدل Pull over Push مزایا و معایب متعددی دارد. به عنوان مثال، مدل Pull over Push برای کاهش مشکلات Solidity هنگام ارسال اتر (مخصوصاً زمانی که چندین انتقال همزمان اتفاق میافتد) بسیار مؤثر است. در واقع، انتقال ناموفق منجر به بازگشت موفقیت آمیز عملیات نمی شود، زیرا جداسازی تابع انتقال مستعد خطا در این مدل انجام می شود. همچنین با توجه به استفاده از این مدل، اطمینان از دریافت اتر بر عهده کاربر درخواست کننده می باشد.
یکی از پیامدهای منفی این مدل را می توان به مراحل اضافی مورد نیاز برای تکمیل تراکنش ها اشاره کرد. تعامل با قراردادی که از برداشت به جای پرداخت مستقیم استفاده می کند، کاربران را ملزم به ارسال تراکنش درخواست برداشت می کند که یک تراکنش اضافی است. در نتیجه، این منجر به نیازهای گاز بیشتر و هزینه های تراکنش بالاتر و همچنین آسیب قابل توجهی به تجربه کاربر می شود. کاربران نباید بیش از حد لازم با یک قرارداد هوشمند تعامل داشته باشند زیرا کاربران، به ویژه کاربران بی تجربه، مستعد اشتباه هستند.
این مدل تنها در صورتی باید مورد استفاده قرار گیرد که همه شرکت کنندگان انگیزه قوی برای برداشت وجه داشته باشند. به عنوان مثال، طبق گزارش یکی از صاحبان قرارداد هوشمند، بیش از 10 درصد از کاربران در مدت 7 روزی که به آنها داده شده، وجوه خود را از قرارداد برداشت نکرده اند. در غیر این صورت، مصرف کنندگان ممکن است به هیچ وجه از قرارداد استفاده نکنند یا آن را رقیب بدانند. اگر چشم پوشی به سادگی بی فایده و بسیار پیچیده است. استفاده از مدل Pull over Push می تواند به عنوان مصالحه ای بین راحتی و امنیت برای کاربران تلقی شود. قبل از پیادهسازی این مدل، باید مدیریتپذیری کاهش تجربه کاربر را ارزیابی کنید و همچنین بررسی کنید که آیا استفاده هوشمندانه از مدل انتقال امن اتر ممکن است برای رد هر گونه آسیبپذیری کافی باشد یا خیر.
کاربردهای شناخته شده
قرارداد PullPayment از OpenZeppelin، یکی از نمونههای استفاده رایج یک الگوی فشار بکشید که به طور کلی قرارداد قالب را اجرا می کند. یک پیاده سازی تخصصی تر را می توان در قرارداد BlockParty یافت، که قراردادی برای مدیریت سپرده حضور و غیاب برای رویدادهای رایگان است. کاربران تنها در صورت حضور در رویدادی که در آن ثبت نام کرده اند، سپرده خود را پس می گیرند. شرکتکنندگان همچنین میتوانند پس از تأیید حضور مالک قرارداد از طریق یک تراکنش حاوی آدرس اتریوم، درخواست برداشت را ارسال کنند.