آموزش تابع Receive در سالیدیتی

تابع Receive در سالیدیتی چیست؟

در دنیای قراردادهای هوشمند اتریوم، گاهی اوقات نیاز داریم یک قرارداد تنها برای دریافت مستقیم اتر (Ether) مورد استفاده قرار گیرد، بدون اینکه داده ای همراه تراکنش ارسال شود یا تابع مشخصی صدا زده شود. در چنین شرایطی، زبان برنامه نویسی سالیدیتی تابعی ویژه به نام receive ارائه می‌دهد. این تابع زمانی اجرا می‌شود که تراکنشی بدون دیتا به آدرس قرارداد ارسال شود.

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

آموزش تابع Receive در سالیدیتی

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

نکات مهم درباره تابع receive:

  • برخلاف توابع معمول، تابع receive بدون کلیدواژه function تعریف می‌شود، زیرا یکی از توابع خاص سالیدیتی مانند constructor است.

  • این تابع فقط با سطح دسترسی external قابل تعریف است، به این معنا که تنها از بیرون از قرارداد قابل فراخوانی است.

تا اینجای آموزش، برای قابل فراخوانی بودن توابع از بیرون قرارداد، از public استفاده می‌کردیم. اما external به این معنی است که تابع فقط از بیرون قرارداد قابل صدا زدن است، نه از داخل خودش.
برای سادگی در آموزش، فعلاً از public استفاده می‌کنیم ولی در ادامه تفاوت دقیق بین public و external را بررسی خواهیم کرد.
با این حال، زبان Solidity فقط اجازه می‌دهد تابع receive از نوع external باشد.

این تابع باید حتماً payable باشد. اگر کلمه کلیدی payable را حذف کنید و قرارداد را کامپایل کنید، با خطا مواجه می‌شوید. چرا؟ چون تابع receive وظیفه دریافت مستقیم اتر را دارد و برای این کار باید payable باشد.

حالا سوال اینجاست: چطور یک تابع دیگر می‌تواند اتر به این تابع بفرستد؟

حالا این کد را در Remix وارد کنید تا عملکردش را بررسی کنید.

می‌بینید که این روش خیلی تمیزتر است — خبری از abi.encode یا موارد پیچیده دیگر نیست.

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

ممکن است این موضوع کمی عجیب به نظر برسد که یک «فراخوانی تابع» به یک کیف پول انجام می‌شود، در حالی که کیف پول هیچ تابعی ندارد. این رفتار ناشی از conventions (روال های قراردادی) در شبکه اتریوم است که در ابتدا ممکن است گیج‌کننده به نظر برسد.

آنچه باید به خاطر داشته باشید این است که:

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

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

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

دوره آموزش طراحی وب سایت مدرسه با PHP و MySql
  • انتشار: ۱۵ اردیبهشت ۱۴۰۴

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

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

مشاهده همه

نظرات

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