کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

الگوی برداشت در سالیدیتی

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

pragma solidity ^0.5.0;

contract Test {
   address payable public richest;
   uint public mostSent;

   constructor() public payable {
      richest = msg.sender;
      mostSent = msg.value;
   }
   function becomeRichest() public payable returns (bool) {
      if (msg.value > mostSent) {
         // Insecure practice
         richest.transfer(msg.value);
         richest = msg.sender;
         mostSent = msg.value;
         return true;
      } else {
         return false;
      }
   }
}

قرارداد فوق می تواند در حالت غیر قابل استفاده ارائه شود زیرا باعث می شود که غنی ترین قرارداد با شکست تابع بازگشتی مواجه شود. وقتی تابع Fallback یا تابع بازگشتی از کار بیفتد، تابع BecomeRichest() نیز از کار می افتد و قرارداد برای همیشه به تعویق درمیاید. برای کاهش این مشکل، می توانیم از الگوی برداشت استفاده کنیم.

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

pragma solidity ^0.5.0;

contract Test {
   address public richest;
   uint public mostSent;

   mapping (address => uint) pendingWithdrawals;

   constructor() public payable {
      richest = msg.sender;
      mostSent = msg.value;
   }
   function becomeRichest() public payable returns (bool) {
      if (msg.value > mostSent) {
         pendingWithdrawals[richest] += msg.value;
         richest = msg.sender;
         mostSent = msg.value;
         return true;
      } else {
         return false;
      }
   }
   function withdraw() public {
      uint amount = pendingWithdrawals[msg.sender];
      pendingWithdrawals[msg.sender] = 0;
      msg.sender.transfer(amount);
   }
}
1402/01/21 730
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...