آنچه در این مقاله می‌خوانید [پنهان‌سازی]

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

تعریف msg.sender

msg.sender یک متغیر جهانی در سالیدیتی است که نشان‌دهنده آدرس آنتیوی که با قرارداد هوشمند تماس می‌گیرد، می‌باشد. این متغیر به‌طور خودکار توسط محیط اجرای قرارداد قرار داده می‌شود و به توسعه‌دهندگان این امکان را می‌دهد تا منبع تماس را شناسایی کنند.

کاربردهای msg.sender

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

  2. اجرای تابع خاص: بسیاری از قراردادهای هوشمند با شرایط خاصی برای فراخوانی توابع طراحی شده‌اند. به‌عنوان مثال، ممکن است بخواهید تنها آدرس‌های خاصی مجاز به استفاده از یک تابع خاص باشند. در این شرایط، می‌توانید msg.sender را با آدرس‌های مجاز مقایسه کنید.

  3. مدیریت اعتبار: زمانی که یک کاربر یا برنامه‌ی غیرمتمرکز (DApp) می‌خواهد یک تراکنش خاص را انجام دهد، می‌توانید با استفاده از msg.sender اطمینان حاصل کنید که فقط کاربر مورد نظر اجازه اجرای آن تراکنش را دارد.

آموزش سالیدیتی + 5 پروژه عملی

مثال عملی

برای درک بهتر مفهوم msg.sender، به یک قرارداد هوشمند ساده زیر توجه کنید:

pragma solidity ^.8.;

contract SimpleStorage {
    address public owner;

    constructor() {
        owner = msg.sender;
    }

    function setOwner(address newOwner) public {
        require(msg.sender == owner, "Only owner can change the owner.");
        owner = newOwner;
    }
}

در این مثال:

  • در سازنده قرارداد، msg.sender به‌عنوان مالک قرارداد ذخیره می‌شود.
  • در تابع setOwner، از msg.sender برای اطمینان از این که تنها مالک قرارداد می‌تواند صاحب جدیدی تعیین کند، استفاده می‌شود.

نکات مهم

  • عدم تغییر msg.sender: یک نکته مهم در ارتباط با msg.sender این است که این متغیر نمی‌تواند تغییر کند و همواره آدرس فرستنده را نشان می‌دهد.

  • فراخوانی قرارداد دیگر: زمانی که یک قرارداد هوشمند دیگر از طریق call یا delegatecall به قرارداد شما فراخوانی می‌شود، msg.sender آدرس قرارداد فراخوانی‌کننده را نشان می‌دهد، نه آدرس کاربر واقعی.

نتیجه‌ گیری

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