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، ابزاری قدرتمند برای مدیریت و سازماندهی دادهها در قراردادهای هوشمند خود به دست آوردهاید. استفاده هوشمندانه از این دانش شما را برای ساخت برنامههای غیرمتمرکز قوی و کارآمد مجهز خواهد کرد.
🔸 این مقاله،از مقالات ترجمه شده از سالیدیتی آکادمی است برای خواندن مقاله اصلی میتوانید به لینک زیر مراجعه کنید:
🔸 شما میتوانید برای خواندن ادامه مقالات ترجمه شده این آکادمی به سالیدیتی آکادمی مراجعه کنید.
مطلبی دیگر از این انتشارات
روز 6/100 - درک immutability در سالیدیتی: ساخت قراردادهای هوشمند قابل اعتماد
مطلبی دیگر از این انتشارات
روز ۱/۱۰۰ -کشف پتانسیلهای سالیدیتی: هنر «Hello world»
مطلبی دیگر از این انتشارات
روز ۷/۱۰۰ - بررسی خواندن و نوشتن State variable در سالیدیتی