AI & ML; Python Programmer And Interested In Decentralized World
روز ۱۲/۱۰۰ - کاوش در قدرت mapping در سالیدیتی
خوش آمدید به مقاله دوازدهم از مجموعه #100DaysOfSolidity! در این مقاله، به دنیای mappings در زبان برنامهنویسی سالیدیتی خواهیم پرداخت. mapping ها یکی از ساختارهای بنیادین داده در سالیدیتی هستند که به توسعهدهندگان امکان میدهند تا زوجهای قدرتمند key-value برای ذخیره و بازیابی کارآمد دادهها ایجاد کنند. ما به بررسی نحو، ویژگیها و کاربرد mappingها به همراه مثالهای عملی برای بهبود درک شما خواهیم پرداخت. پس بیایید شروع کنیم و قدرت mappingها را در سالیدیتی کشف کنیم!

مفهوم mapping
در زبان برنامهنویسی سالیدیتی، mappingها با استفاده از سینتکس mapping(keyType => valueType) ایجاد میشوند. keyType میتواند هر نوع داده داخلی مانند address، bytes، string و یا حتی یک قرارداد دیگر باشد. از طرف دیگر، valueType میتواند هر نوعی، از جمله یک mapping دیگر یا یک آرایه باشد. mappingها روشی کارآمد برای مرتبط کردن مقادیر با کلیدهای منحصر به فرد و بازیابی آسان آنها در زمانهای بعدی ارائه میکنند.
ایجاد یک mapping ساده
در ابتدای این آموزش، به عنوان مقدمه، به بررسی یک نمونه ساده از نگاشت میپردازیم به کد زیر دقت کنید:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract Mapping {
// Mapping from address to uint
mapping(address => uint) public myMap;
function get(address _addr) public view returns (uint) {
// Mapping always returns a value.
// If the value was never set, it will return the default value.
return myMap[_addr];
}
function set(address _addr, uint _i) public {
// Update the value at this address
myMap[_addr] = _i;
}
function remove(address _addr) public {
// Reset the value to the default value.
delete myMap[_addr];
}
}در این قرارداد Mapping، یک Mapping به نام myMap تعریف شده است که آدرسها (address) را به اعداد صحیح بدون علامت (uint) نگاشت میکند. تابع get به ما امکان میدهد مقدار مرتبط با یک آدرس خاص را بازیابی کنیم. اگر مقدار قبلاً برای آن آدرس تنظیم نشده باشد، مقدار پیشفرض uint که 0 است را برمیگرداند. تابع set مقدار را در یک آدرس مشخص بهروزرسانی میکند و تابع remove مقدار را به مقدار پیشفرض بازنشانی میکند.
مپینگ تو در تو (Nested mapping)
ـMappings زمانی که به صورت تو در تو استفاده شوند، قدرت بیشتری پیدا میکنند. برای درک بهتر این مفهوم، به مثالی از Mappings تو در تو میپردازیم:
contract NestedMapping {
// Nested mapping (mapping from address to another mapping)
mapping(address => mapping(uint => bool)) public nested;
function get(address _addr1, uint _i) public view returns (bool) {
// You can get values from a nested mapping
// even when it is not initialized
return nested[_addr1][_i];
}
function set(address _addr1, uint _i, bool _boo) public {
nested[_addr1][_i] = _boo;
}
function remove(address _addr1, uint _i) public {
delete nested[_addr1][_i];
}
}در قرارداد NestedMapping، یک سیستم ذخیرهسازی دو سطحی به نام nested تعبیه شده است. در این سیستم، هر آدرس (address) به یک سیستم ذخیرهسازی دیگر مرتبط میشود که در آن، هر عدد صحیح بدون علامت (uint) به یک مقدار درست یا غلط (bool) نگاشت میشود. این کار، سازماندهی اطلاعات را به گونهای کارآمد و منظم امکانپذیر میکند و به شما اجازه میدهد تا به سرعت به مقادیر مورد نظر خود بر اساس آدرس و شاخص عدد صحیح دسترسی پیدا کنید.
تحلیل قراردادهای هوشمند
حال، به بررسی دقیق رفتار و عملکرد قراردادهای هوشمند ارائه شده میپردازیم.
قرارداد Mapping:
این قرارداد نمونهای از کاربرد پایه mappingها را نشان میدهد. این قرارداد شامل سه تابع است:
1. تابع get: این تابع یک آدرس به نام _addr به عنوان ورودی دریافت میکند و مقدار عدد صحیح بدون علامت مربوط به آن آدرس را که در مپینگ myMap ذخیره شده است، بازمیگرداند. اگر هیچ مقداری برای آن آدرس در مپینگ وجود نداشته باشد، مقدار پیشفرض uint که 0 است بازمیگرداند.
2. تابع set: به کاربران اجازه میدهد تا مقدار را در یک آدرس خاص _addr در نگاشت myMap بهروزرسانی کنند. این تابع یک عدد بدون علامت _i را به عنوان مقدار جدید دریافت میکند و آن را به آدرس مربوطه اختصاص میدهد.
3. تابع remove: با استفاده از تابع remove، کاربران میتوانند مقدار مربوط به آدرس مشخص شده _addr در نگاشت myMap را بازنشانی کنند. این تابع مقدار را حذف کرده و آن را به مقدار پیشفرض uint که 0 است، بازنشانی میکند.
قرارداد NestedMapping:
قرارداد NestedMapping نحوه استفاده از mappingهای تو در تو را نشان میدهد. این شامل سه تابع است:
- تابع get: این تابع یک آدرس (
_addr1) و یک عدد صحیح بدون علامت (_i) را به عنوان پارامتر دریافت کرده و مقدار بولئینی مرتبط با نگاشت تو در تو (nested) را برمیگرداند. حتی اگر نگاشت تو در تو مقداردهی نشده باشد، سالیدیتی مقدار پیشفرضboolکهfalseاست را برمیگرداند. - تابع set: تابع
setبه کاربران امکان میدهد مقدارboolرا در نگاشت تو در تو (nested) بهروزرسانی کنند. این تابع یک آدرس (_addr1)، یک عدد صحیح بدون علامت (_i) و یک مقدارbool(_boo) را به عنوان ورودی دریافت میکند و مقدارboolرا به آدرس و اندیس صحیح مربوطه اختصاص میدهد. - تابع remove: تابع
removeمقدارboolرا در یک آدرس خاص (_addr1) و عدد صحیح بدون علامت (_i) در نگاشت تو در تو (nested) حذف میکند. مقدار حذفشده به مقدار پیشفرضboolکهfalseاست، بازنشانی میشود.
نتیجهگیری
در این مقاله، به بررسی قدرت مپینگها (Mappings) در زبان برنامهنویسی سالیدیتی پرداختیم. نحوه ایجاد mapping ساده و همچنین استفاده از mapping های تو در تو برای ساختارهای داده پیچیدهتر را فرا گرفتیم. مپینگ ها روشی کارآمد و انعطافپذیر برای ذخیرهسازی و بازیابی اطلاعات در قراردادهای سالیدیتی ارائه میکنند و به همین دلیل، ابزاری ضروری برای توسعه قراردادهای هوشمند به شمار میروند.
به خاطر داشته باشید که ساختارهای نگاشت (mappings) قابل پیمایش نیستند، به این معنی که برای دسترسی به مقادیر آنها، باید کلید دقیق را مشخص کنید. علاوه بر این، هنگام کار با ساختارهای نگاشت، مهم است که مقادیر پیش فرض را مدیریت کنید تا در مواردی که مقادیر به طور صریح تنظیم نشده اند، رفتار صحیح تضمین شود.
با تسلط بر "مفاهیم مپینگ" در زبان برنامهنویسی Solidity، ابزاری قدرتمند برای مدیریت و سازماندهی دادهها در قراردادهای هوشمند خود به دست آوردهاید. استفاده هوشمندانه از این دانش شما را برای ساخت برنامههای غیرمتمرکز قوی و کارآمد مجهز خواهد کرد.
🔸 این مقاله،از مقالات ترجمه شده از سالیدیتی آکادمی است برای خواندن مقاله اصلی میتوانید به لینک زیر مراجعه کنید:
🔸 شما میتوانید برای خواندن ادامه مقالات ترجمه شده این آکادمی به سالیدیتی آکادمی مراجعه کنید.
مطلبی دیگر از این انتشارات
۲/۱۰۰ - ساخت اولین برنامهتان با سالیدیتی: یک راهنمای گامبهگام 👷♂️💻
مطلبی دیگر از این انتشارات
روز ۹/۱۰۰ - تسلط بر گس و کارمزد گس در تراکنشهای اتریوم: راهنمای جامع
مطلبی دیگر از این انتشارات
روز ۱۰/۱۰۰ - Solidity If/else و راهنمای جامع گزارههای شرطی در زبان سالیدیتی