آموزش msg.sender و address(this) در سالیدیتی

آموزش msg.sender و address(this) در سالیدیتی

مثال قبلی مان از یک توکن ERC20 بد را به خاطر دارید؟

دوباره در این مورد صحبت میکنیم:

در این کد، هیچ راهی برای تشخیص اینکه چه کسی تابع را فراخوانی کرده وجود ندارد.

راه‌حل: استفاده از msg.sender

خوشبختانه سالیدیتی مکانیزمی برای تشخیص فراخواننده تابع ارائه می‌دهد: msg.sender. این ویژگی، آدرس فرد یا قرارداد فراخواننده تابع را بازمی‌گرداند.

به مثال زیر در Remix توجه کنید:

این تابع آدرسی را بازمی‌گرداند که با آن در حال تست در Remix هستید.

حال آدرس تست را از منوی کشویی “ACCOUNT” تغییر دهید و دوباره تابع را اجرا کنید. خواهید دید که آدرس برگشتی تغییر می‌کند.

با ترکیب msg.sender با یک شرط if می‌توانید به آدرس های خاصی دسترسی ویژه بدهید. مثلاً اگر بخواهید فقط آدرس پیش‌فرض در Remix بتواند تغییراتی ایجاد کند:

در کد بالا، کاربران می‌توانند موجودی خود را ببینند (چون balances عمومی است)، اما فقط بانکدار (banker) اجازه تغییر موجودی‌ها را دارد.

بهبود: امکان انتقال توسط کاربر

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

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

اگر کاربر بیش از موجودی خود انتقال دهد چه می‌شود؟

اگر از سالیدیتی نسخه ۰.۸.۰ یا بالاتر استفاده می‌کنید، چنین تراکنشی شکست می‌خورد (revert می‌شود). زیرا امکان ندارد یک عدد بدون علامت (unsigned integer) را به‌گونه‌ای کم کنید که منفی شود.

tx.origin؛ و چرا نباید از آن استفاده کنید

سالیدیتی یک ویژگی دیگر هم دارد به نام tx.origin که مشابه msg.sender عمل می‌کند. اما نباید از آن استفاده کنید، مگر در شرایط خاص. دلایل امنیتی آن را فعلاً مطرح نمی‌کنیم، اما نکته مهم این است:

به‌هیچ‌وجه از tx.origin در منطق‌های احراز هویت استفاده نکنید.

address (this)؛ شناسایی آدرس خود قرارداد

هر قرارداد هوشمند می‌تواند آدرس خودش را بشناسد. به‌سادگی از address(this) استفاده می‌کنیم:

با تست این کد در Remix، خواهید دید که آدرس بازگشتی، آدرس خود قرارداد است.

5/5 - (2 امتیاز)

راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.

دوره آموزش طراحی فروشگاه اینترنتی بدون کد نویسی در 8 ساعت
  • انتشار: ۹ اردیبهشت ۱۴۰۴

دسته بندی موضوعات

آخرین محصولات فروشگاه

مشاهده همه

نظرات

بازخوردهای خود را برای ما ارسال کنید