آموزش مپینگ ها در سالیدیتی

آموزش مپینگ ها (Mappings) در سالیدیتی

در زبان های برنامه نویسی مختلف، ساختارهایی مانند HashMap، Associative Array یا Map وجود دارند که به شما اجازه می‌دهند یک مقدار را به یک کلید خاص اختصاص دهید. در سالیدیتی نیز ساختاری مشابه به نام mapping وجود دارد. ما هم از واژه “مپینگ” استفاده می‌کنیم چون این همان کلیدواژه‌ای است که سالیدیتی از آن استفاده می‌کند.

تعریف اولیه mapping در سالیدیتی

در مثال بالا، با استفاده از mapping، یک عدد (کلید) را به عددی دیگر (مقدار) نگاشت می‌کنیم. از آنجایی که متغیر myMapping عمومی (public) تعریف شده، کامپایلر به‌صورت خودکار یک تابع دسترسی (getter) برای آن تولید می‌کند. بنابراین، می‌توانید با وارد کردن کلید مورد نظر، مقدار متناظر را دریافت کنید.

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

نکته شگفت‌انگیز اول: کلیدهای تنظیم نشده خطا ایجاد نمی‌کنند

اگر به mapping با کلیدی که هنوز مقداردهی نشده دسترسی پیدا کنید، با خطا مواجه نمی‌شوید. در عوض، مقدار پیش فرض (zero value) نوع داده مربوطه برگردانده می‌شود.

در مثال زیر، اگر عددی را وارد کنید که هنوز تنظیم نشده باشد، مپینگ مقدار false را برمی‌گرداند.

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

مپینگ‌ ها در توکن‌ های ERC20

در قراردادهای ERC20 نیز از mapping برای ذخیره تعداد توکن‌ های هر کاربر استفاده می‌شود.

البته این پیاده‌ سازی امنیت ندارد چون هرکسی می‌تواند هر تراکنشی را انجام دهد، اما در آموزش‌های بعدی این موضوع اصلاح خواهد شد.

بر خلاف تصور عموم، توکن‌ های ERC20 در کیف‌ پول‌ ها ذخیره نمی‌شوند. آن‌ها فقط یک عدد صحیح (uint256) در یک قرارداد هوشمند هستند که به آدرس شما نسبت داده شده‌اند.

برای نمونه، می‌توانید قراردادهای زیر را ببینید:

نکته شگفت‌انگیز دوم: مپینگ‌ ها فقط در فضای ذخیره‌ سازی (Storage) تعریف می‌شوند

این ممکن است یک محدودیت بسیار عجیب به نظر برسد، اما مپینگ‌ ها نمی‌توانند درون یک تابع تعریف شوند و این به نحوه عملکرد ماشین مجازی اتریوم (EVM) مربوط می‌شود. بلاکچین‌ ها به طور کلی HashMap را به دلیل زمان اجرای غیرقابل پیش‌بینی‌شان دوست ندارند. کد زیر نامعتبر است:

نکته شگفت‌انگیز سوم: امکان پیمایش (iteration) روی مپینگ‌ ها وجود ندارد

در سالیدیتی راهی برای پیمایش کلید های یک مپینگ وجود ندارد، زیرا هر مقدار کلیدی از نظر فنی معتبر تلقی می‌شود و فقط در صورت مقداردهی نشده بودن، مقدار پیش‌فرض را بازمی‌گرداند. به همین دلیل نمی‌توان از حلقه for روی مپینگ استفاده کرد.

نکته شگفت انگیز چهارم: مپینگ‌ ها را نمی‌توان از توابع برگرداند

در سالیدیتی، نمی‌توان مپینگ‌ ها را مستقیماً از توابع بازگرداند، حتی اگر تابع view باشد. کد زیر نامعتبر است:

به این مطلب امتیاز دهید

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

دوره آموزش پروژه محور طراحی وب سایت پزشک یاب با بوت استرپ
  • انتشار: ۱۰ اردیبهشت ۱۴۰۴

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

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

مشاهده همه

نظرات

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