حتما تا به حال موقع کار کردن با سرویس‌های DeFi یا DEXها متوجه موضوعی با عنوان Token Allowance یا Approval شدید

حتما تا به حال موقع کار کردن با سرویس‌های DeFi یا DEXها متوجه موضوعی با عنوان Token Allowance یا Approval شدید. در استاندارد ERC-20 یا مشتقات اون مثل BEP-20 پیش‌بینی شده که پیش از انجام تبادل توکن بین کیف پول کاربر و Smart Contract نیاز به Approve کردن اجازه تبادل آن اسمارت کانترکت با کیف پول توسط کاربر و تعیین سقف یا حد (Limit) برای آن تبادلی که قرار است انجام بشه باشه. بنابراین در حالت معمول هر دستور برداشت توکن که یک Smart Contract بخواهد اجرا کند، یا به بیان صحیح‌تر هر مقدار توکنی که بخواهید در یک Smart Contract دیپازیت کنید، قبل از انجام عملیات انتقال نیاز به Approve شدن موجودی آدرس شما به همراه سقف مقدار تراکنش برای آن Smart Contract داره و انتقال بدون انجام Approve امکان‌پذیر نیست. نکته مهم اینه که Approve کردن را نباید با Confirm کردن یک تراکنش در کیف پول اشتباه بگیرید. آنچه که از Confirm کردن یک تراکنش در کیف پول می‌شناسیم صرفا یک اکشن جهت اطمینان از تصمیم کاربر در سمت کلاینت یا کیف پول است و ارتباطی با شبکه بلاکچین ندارد و یک جور تاییدیه قبل از قرار گرفتن تراکنش روی بلاکچین است. ما روی بلاکچین چیزی تحت عنوان Confirm کردن تراکنش توسط کاربر نداریم بنابراین اگر کیف پول‌ها مرحله پرسش از کاربر برای اطمینان یافتن از صحت تراکنش را حذف کنند، تراکنش باز هم انجام خواهد شد. تنها چیزی که در ارتباط کیف پول با Smart Contract با ماهیت گرفتن تاییدیه از کاربر داریم همان Approval یا Token Allowance است که اهمیت زیادی دارد اما توجه کمی به آن می‌شود.

❔ آیا Approve کردن یک Smart Contract می‌تواند برای امنیت موجودی کیف پول ما مشکل‌ساز شود؟

پاسخ کوتاه: بله.

برای تشریح این موضوع نیازه کمی وارد جزئیات فنی بشیم. Approve کردن را تابعی تصور کنید که ورودی آن سقف یا حد (Limit) تعامل اسمارت کانترکت با موجودی یک توکن در کیف پول شماست و خروجی یا نتیجه آن اجازه دادن به آن Smart Contract برای دسترسی به موجودی آن توکن در کیف شما تا سقف Limit مشخص شده است. مثلا تصور کنید من ۲۵۰۰۰ عدد از توکن A در کیف پول خودم دارم، اگر به میزان ۱۰۰ عدد توکن A از موجودی کیف خودم رو برای استفاده یک قرارداد هوشمند Approve کنم، اون اسمارت‌کانترکت می‌تونه تا سقف ۱۰۰ توکن A بدون نیاز به Approve مجدد با کیف پول من تعامل داشته باشه و اگر سقف پر بشه نیاز به Approve مجدد داره. از آنجایی که هر بار Approve کردن توسط کاربر نیاز به پرداخت کارمزد یا Gas به شبکه داره و یک مرحله به کارهایی که کاربر باید انجام بده اضافه می‌کنه و هزینه تمام شده تراکنش رو دو برابر می‌کنه، رایج است که سرویس‌های DeFi یا DEXها برای بهبود تجربه کاربری اقدام به تایید بی‌نهایت یا Infinite Approval می‌کنن. یعنی در اولین ارتباط یا تعامل با Smart Contractهای سرویس‌هایی مثل Uniswap یا Sushi یا بسیاری سرویس‌های دیگه شما یک بار Approve با سقف بی‌نهایت انجام می‌دین و بعد از اون نیازی به Approve مجدد وجود نداره. اینجاست که اگر اون اسمارت‌کانترکت به مشکل بخوره یا بهش نفوذ بشه یا به عمد دسترسی‌هایی داخلش تعریف شده باشه، بدون حد و سقف به موجودی توکن‌هایی که Approve بی‌نهایت کردید دسترسی خواهند داشت و این کار رو برای هکرها بسیار راحت می‌کنه. این موضوع مهمی است که بسیاری از آن بی‌اطلاع هستند.

با آگاهی نسبت به این موضوع، دانستن چند نکته ضروری است:

۱- هر Smart Contract رو به کیف پول خودتون متصل نکنید. ممکنه شما به اون قرارداد هوشمند تاییدیه بی‌نهایت بدین و فراموش کنید و بعدها با مشکل مواجه بشین. اگر از صحت عملکرد یک پروژه و قراردادهای هوشمند آن اطلاع ندارید هرگز Wallet خودتون رو بهش Connect نکنید.

۲- از سرویس‌های زیر برای اینکه متوجه بشین آدرس کیف‌تون به چه Smart Contractهایی متصل هست و چه مقدار سقف براشون تعیین شده استفاده کنید. این سرویس‌ها شناخته شده و مطمئن هستند با این وجود اگر هدفتون فقط تست یا یادگیری است با کیف‌پول اصلی خودتون کانکت نشوید.

https://debank.com/approve

https://app.unrekt.net/


۳- سعی کنید در صورت ارتباط با یک اسمارت‌کانترکت (مثلا انجام Swap یا Stake در یک DEX) با استفاده از سرویس‌های بالا یا از طریق خود کیف پولتون دسترسی‌شون رو Revoke کنید تا اگر زمانی به مشکل امنیتی برخوردند، موجودی کیف شما در خطر نباشه. شخصاً هرچند وقت یک بار این موارد رو چک می‌کنم که مطمئن بشم ناخواسته به قرارداد هوشمندی دسترسی بیش از حد مورد نیاز نداده باشم.

@cryptobyalireza