پرش به محتوا
آکادمی / کیف پول و امنیت دارایی / تأییدیهٔ توکن، قراردادهای مخرب و امضای کورکورانه
🏛 آکادمی📊 داشبورد من🔁 مرور 🧪 آزمایشگاه📖 اصطلاحات

🔐 دانشکدهٔ ۴ · انتقال امن و تعامل با قراردادها

تأییدیهٔ توکن، قراردادهای مخرب و امضای کورکورانه

Token approvals, malicious contracts & blind signing

سطح ۲ · مقدماتی (Elementary)⏱ ۳۰ دقیقه❓ ۹ سؤال در بانک
🎯 هدف آموزشی: بفهمید هر امضا و تأییدیه دقیقاً چه اجازه‌ای به یک قرارداد می‌دهد، تأییدیه‌های قدیمی را پیدا و لغو کنید و درخواست‌های امضای خطرناک را پیش از تأیید تشخیص دهید.
پیش‌نیازها: کارمزد شبکه و گس

📚 آموزش در سه سطح

از سطح ساده شروع کنید؛ اگر روشن بود، سطح بعد را بخوانید. سطح مناسب شما ذخیره می‌شود.

🌱 توضیح ساده

وقتی با یک صرافی غیرمتمرکز یا سایت DeFi کار می‌کنید، کیف پول اغلب پیش از هر کاری می‌پرسد: «به این قرارداد اجازه می‌دهید توکن‌های شما را خرج کند؟» این «تأییدیه» (Approval) است. تشبیه روزمره: مثل امضای یک دستور پرداخت دائمی در بانک است که به یک شرکت اجازه می‌دهد هر وقت خواست از حسابتان برداشت کند، تا سقفی که تعیین کرده‌اید یا حتی بدون سقف.

مشکل اینجاست که این اجازه پس از پایان کار شما خودبه‌خود باطل نمی‌شود. اگر ماه‌ها بعد آن قرارداد هک شود یا از اول قرارداد یک کلاهبردار بوده باشد، می‌تواند بدون هیچ امضای جدیدی از طرف شما، توکن‌ها را از کیفتان بیرون بکشد. به همین دلیل باید گاهی فهرست تأییدیه‌ها را مرور و موارد غیرلازم را «لغو» (Revoke) کنید.

قاعدهٔ ساده: هیچ پنجرهٔ امضایی را که نمی‌فهمید تأیید نکنید. «وصل کردن» کیف پول به یک سایت فقط آدرس شما را نشان می‌دهد؛ اما «امضا» یا «تأیید» می‌تواند اجازهٔ خرج بدهد. اگر سایتی بلافاصله پس از اتصال، امضایی با متن نامفهوم یا عدد عجیب می‌خواهد، دست نگه دارید.

📘 توضیح متوسط

در استاندارد ERC-20، تابع approve(spender, amount) به قرارداد spender اجازه می‌دهد تا سقف amount با تابع transferFrom توکن را از کیف شما منتقل کند. بسیاری از سایت‌ها برای اینکه کاربر هر بار کارمزد تأیید ندهد، مقدار «نامحدود» (بزرگ‌ترین عدد ۲۵۶ بیتی) درخواست می‌کنند. نتیجه این است که نه فقط موجودی امروز، بلکه هر مقداری از همان توکن که بعداً به کیف وارد شود هم در معرض خطر است. برای NFTها تابع setApprovalForAll همین نقش را برای کل یک مجموعه دارد.

برای دیدن و لغو تأییدیه‌ها می‌توانید از ابزارهایی مثل Revoke.cash یا بخش Token Approvals در Etherscan استفاده کنید. لغو یعنی ارسال تراکنش approve با مقدار صفر، پس خودش کارمزد گس دارد. ترتیب امن: ابتدا ابزار را از آدرس درست (نه از لینک تبلیغات یا پیام) باز کنید، تأییدیه‌های مربوط به قراردادهایی که دیگر استفاده نمی‌کنید یا نمی‌شناسید را لغو کنید، و روی شبکه‌های آزمایشی تمرین کنید.

«امضای مجوز» (Permit) طبق EIP-2612 روش دیگری برای همان اجازه است، اما بدون تراکنش: شما فقط یک پیام ساختاریافته را امضا می‌کنید و طرف مقابل بعداً آن را همراه تراکنش خودش به قرارداد توکن می‌دهد. چون هیچ تراکنشی از طرف شما ارسال نمی‌شود و گسی نمی‌پردازید، بسیاری از کاربران فکر می‌کنند «فقط امضا بوده و خطری ندارد»؛ در حالی که همین امضا می‌تواند کل موجودی آن توکن را واگذار کند. قراردادهای عمومی مثل Permit2 هم همین الگو را برای توکن‌هایی که قبلاً به آن‌ها تأیید داده‌اید گسترش می‌دهند.

🔬 توضیح تخصصی

«امضای کورکورانه» (Blind Signing) یعنی تأیید داده‌ای که محتوای آن برای شما قابل خواندن نیست: یک هش خام، داده‌های فراخوانی قرارداد به شکل هگز یا پیام‌هایی که کیف پول نمی‌تواند رمزگشایی کند. روش قدیمی eth_sign حتی اجازهٔ امضای هش دلخواه را می‌داد که می‌توانست یک تراکنش کامل باشد؛ به همین دلیل کیف‌های اصلی آن را محدود یا غیرفعال کرده‌اند. استاندارد EIP-712 پیام‌ها را ساختاریافته نمایش می‌دهد (نام قرارداد، spender، مقدار، مهلت) و «امضای شفاف» (Clear Signing) در کیف‌های سخت‌افزاری تلاش می‌کند همین جزئیات را روی صفحهٔ دستگاه نشان دهد.

«تخلیه‌گر کیف پول» (Wallet Drainer) نرم‌افزار آماده‌ای است که به کلاهبرداران فروخته یا اجاره داده می‌شود. سایت جعلی (مثلاً یک مینت NFT یا ایردراپ تقلبی) پس از اتصال، دارایی‌های کیف را می‌خواند و ارزشمندترین آن‌ها را با ترکیبی از approve، permit، setApprovalForAll یا یک تراکنش فریبنده هدف می‌گیرد. شبیه‌سازی تراکنش که برخی کیف‌ها انجام می‌دهند (نمایش تغییر موجودی پیش از امضا) کمک بزرگی است، اما مهاجمان گاهی رفتار قرارداد را در زمان شبیه‌سازی و اجرا متفاوت می‌کنند؛ پس شبیه‌سازی جایگزین فهم و جداسازی کیف‌ها نیست.

معماری دفاعی پیشنهادی: یک کیف «خزانه» (Vault) که هرگز به هیچ سایتی وصل نمی‌شود و فقط به آدرس‌های شناخته‌شده انتقال می‌دهد؛ یک کیف «عملیاتی» با موجودی محدود برای سایت‌های معتبر؛ و یک کیف «آزمایشی» (Burner) تقریباً خالی برای سایت‌های جدید. تأییدیه‌ها را با مقدار دقیق مورد نیاز بدهید، نه نامحدود. یادتان باشد که حتی کیف چندامضایی هم وقتی امضاکنندگان محتوای واقعی تراکنش را نمی‌بینند، در برابر امضای کورکورانه آسیب‌پذیر است؛ مثال این درس دقیقاً همین را نشان می‌دهد.

🌍 مثال واقعی: هک کیف سرد چندامضایی Bybit — ۲۱ فوریهٔ ۲۰۲۵

در ۲۱ فوریهٔ ۲۰۲۵ صرافی Bybit اعلام کرد هنگام انتقال معمول از یکی از کیف‌های سرد چندامضایی اتریوم (مبتنی بر Safe) به کیف گرم، مهاجمان کنترل آن کیف را به دست گرفتند و حدود ۴۰۰ هزار ETH و توکن‌های وابسته، به ارزش حدود ۱٫۵ میلیارد دلار در آن زمان، خارج شد. تحقیقات بعدی نشان داد رابط کاربری Safe{Wallet} که امضاکنندگان استفاده می‌کردند دستکاری شده بود: صفحه یک انتقال عادی نشان می‌داد، اما دادهٔ واقعی‌ای که امضا شد، منطق قرارداد کیف را به قرارداد مهاجم تغییر می‌داد.

FBI در ۲۶ فوریهٔ ۲۰۲۵ این حمله را به گروه مرتبط با کرهٔ شمالی نسبت داد. درس فنی رویداد این است که کلیدها لو نرفته بودند و چندامضایی هم کار کرده بود؛ امضاکنندگان معتبر، دادهٔ نامعتبری را که درست نمی‌دیدند امضا کردند. بررسی مستقل دادهٔ تراکنش روی صفحهٔ دستگاه و با ابزار جداگانه، دقیقاً همان لایه‌ای است که در اینجا شکست خورد.

🔤 واژگان تخصصی

تأییدیهٔ توکن (Token approval / allowance)

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

مثال: تأیید ۱۰۰ USDC برای قرارداد یک صرافی غیرمتمرکز پیش از معاوضه.

لغو تأییدیه (Revoke)

صفر کردن سقف مجاز یک قرارداد با ارسال تراکنش جدید؛ کارمزد گس دارد.

مثال: لغو تأییدیهٔ نامحدود قدیمی برای یک پروتکل که دیگر از آن استفاده نمی‌کنید.

امضای مجوز (Permit signature (EIP-2612))

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

مثال: پنجرهٔ امضایی با عنوان Permit که spender، value و deadline را نشان می‌دهد.

امضای کورکورانه (Blind signing)

امضای داده‌ای که کاربر یا دستگاه نمی‌تواند محتوای معنادار آن را نمایش دهد.

مثال: کیف سخت‌افزاری فقط یک هش طولانی نشان می‌دهد و می‌پرسد «تأیید؟».

تخلیه‌گر کیف پول (Wallet drainer)

کیت نرم‌افزاری مخرب که روی سایت جعلی نصب می‌شود و با درخواست امضاها و تأییدیه‌های فریبنده دارایی کیف را خارج می‌کند.

مثال: سایت مینت تقلبی که پس از اتصال، setApprovalForAll برای ارزشمندترین مجموعهٔ NFT کاربر درخواست می‌کند.

دادهٔ ساختاریافتهٔ قابل خواندن (EIP-712 typed data)

قالب استاندارد پیام برای امضا که فیلدها را با نام و نوع نمایش می‌دهد تا کاربر بفهمد چه چیزی را امضا می‌کند.

مثال: نمایش «spender: 0x…، value: 1000، deadline: …» به جای یک رشتهٔ هگز.

🔑 نکات کلیدی

  • اتصال کیف فقط آدرس را نشان می‌دهد؛ امضا و تأیید است که می‌تواند اجازهٔ خرج بدهد.
  • تأییدیهٔ نامحدود همهٔ موجودی فعلی و آیندهٔ آن توکن را در معرض خطر قرار می‌دهد تا وقتی لغو شود.
  • امضای Permit بدون گس و تراکنش است اما می‌تواند به اندازهٔ approve خطرناک باشد.
  • چیزی را که نمی‌خوانید یا نمی‌فهمید امضا نکنید؛ امضای کورکورانه حتی کیف سرد و چندامضایی را بی‌دفاع می‌کند.
  • کیف خزانه را هرگز به سایت وصل نکنید و برای سایت‌های جدید کیف آزمایشی تقریباً خالی به کار ببرید.

⚠️ اشتباهات رایج

  • تأیید پیش‌فرض «نامحدود» در هر سایت؛ اشتباه است چون اگر قرارداد بعداً هک شود، همهٔ موجودی آن توکن قابل برداشت است.
  • تصور اینکه امضای پیام بدون گس بی‌خطر است؛ اشتباه است چون Permit و پیام‌های مشابه می‌توانند اجازهٔ خرج بدهند.
  • باز کردن ابزار لغو تأییدیه از لینک ارسالی در تلگرام یا توییتر؛ اشتباه است چون نسخه‌های جعلی همین ابزارها برای تخلیهٔ کیف ساخته می‌شوند.
  • وصل کردن کیف اصلی به سایت ایردراپ یا مینت ناشناس؛ اشتباه است چون یک امضای فریبنده کافی است تا ارزشمندترین دارایی‌ها از دست برود.

🛠 تمرین عملی: تمرین تأیید و لغو روی تست‌نت

  1. در کیف پول آزمایشی (هرگز کیف اصلی) روی شبکهٔ Sepolia مقداری ETH آزمایشی از یک فوست بگیرید.
  2. در یک برنامهٔ آزمایشی روی Sepolia (یا قرارداد توکن آزمایشی) یک تأییدیه با مقدار محدود بدهید و پنجرهٔ امضا را با دقت بخوانید: spender، مقدار و شبکه را یادداشت کنید.
  3. تأییدیه را در بخش Token Approvals مرورگر Sepolia یا ابزار لغو تأییدیه پیدا و لغو کنید و کارمزد لغو را بنویسید.
  4. سه درخواست امضای فرضی (یک پیام ورود متنی، یک Permit و یک هش خام) را بنویسید و برای هر کدام تصمیم بگیرید: تأیید یا رد، با دلیل.

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

🧪 باز کردن ابزار مربوط

🔒 در هیچ تمرینی از سرمایهٔ واقعی، عبارت بازیابی (Seed Phrase)، کلید خصوصی یا اتصال کیف پول اصلی استفاده نکنید.

📝 آزمون تطبیقی

هر بار ۵ سؤال از بانک ۹ سؤالی این درس انتخاب می‌شود؛ سؤال‌هایی که قبلاً اشتباه زده‌اید زودتر برمی‌گردند. حدنصاب قبولی ۸۰٪ (۴ از ۵) است و درس بعد با قبولی باز می‌شود.

✍️ پرسش تشریحی

تفاوت «اتصال کیف»، «امضای پیام»، «Permit» و «تراکنش approve» را توضیح دهید و یک روال شخصی برای تصمیم‌گیری دربارهٔ هر درخواست امضا بنویسید.

بعد از نوشتن، پاسخ خود را با این معیارها بسنجید

خودارزیابی: هر نکته‌ای را که پاسخ شما به‌روشنی پوشش داده علامت بزنید.

🤖 دستیار آموزشی

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

📎 منابع مطالعاتی

🏁 معیار تسلط بر این درس: بتوانید برای هر درخواست امضا بگویید چه اجازه‌ای می‌دهد، تأییدیه‌های یک آدرس را در مرورگر بلاک‌چین پیدا و لغو کنید و نشانه‌های تخلیه‌گر و امضای کورکورانه را تشخیص دهید.

داده‌ها به‌صورت خودکار از کانال Coin_Kurd، Binance، CoinGecko و alternative.me به‌روز می‌شوند.