mapping در قرارداد هوشمند سالیدیتی
سلام دوستان عزیز سالیدیتی کد امیدواریم حالتون خوب باشه! در این مقاله قصد داریم تا صفر تا صد mapping در سالیدیتی رو بررسی کنیم.اگر با سالیدیتی آشنایی ندارید حتما مقاله سالیدیتی چیست را مطالعه کنید. همچنین ما در مقاله ای جداگانه به بررسی دقیق درآمد برنامه نویسی بلاکچین و سالیدیتی پرداختیم که پیشنهاد می کنیم اگر قصد فعالیت در این حوزه را دارید حتما آن مقاله را هم مطالعه کنید. mapping در قرارداد هوشمند دقیقا مانند dictionary در پایتون و یا map در جاوا اسکریپت است. مپینگ در سالیدیتی این امکان را به شما می دهد تا داده هایی را که قصد دارید استفاده کنید با استفاده از رابطه جفت کلید به ارزش ذخیره کنید. در مورد mapping چند نکته مهم وجود دارد که باید حتما توجه کنید :
- برای جستجوی سریع فوق العاده عمل می کنند
- mapping ها طول ندارند
- بهطور پیشفرض نمیتوانید یک mpping را تکرار کنید.
- به منظور تکرار یک mapping، باید از ترکیبی از mappingهااستفاده کنید و کلیدها را در یک آرایه ذخیره کنید.
- شما نمی توانید اندازه یک mpping را تعیین یا بدست آورید.
- از mpping فقط می توان برای متغیرهای حالتی که به عنوان انواع مرجع ذخیره سازی عمل می کنند استفاده کرد.
- نقشه ها با سینتکس “mapping(keyType => valueType)” ایجاد می شوند و مانند هر نوع متغیر دیگری در Solidity تعریف می شوند.
تعریف mapping در سالیدیتی
برای درک بهتر مپینگ به مثال زیر توجه کنید :
Mapping (key => value) public myMapNAME;
در مپینگ کلید ها (Valid Key) می توانند از نوع String یا byte باشند که به uint، bool یا address ترجمه می شود و از همچنین مقادیر یا Valid value ها می توانند از هر نوعی باشند و محدودیتی ندارند.
نمونه mapping در سالیدیتی
در ادامه با ایجاد یک قرارداد ساده نحوه استفاده از mapping را نشان می دهیم. برای درک بهتر این موضوع بهتر است همزمان شما هم با استفاده از remix یک قرارداد هوشمند ایجاد کنید و مثال های این مقاله را پیاده سازی کنید.
pragma solidity ^0.8.0;
//Sample contract is an example
contract SampleContract {
//nothing is defined in this contract
}
ابتدا همانطور که در بالا مشاهده می کنید یک قرارداد هوشمند تعریف می کنیم.
در ادامه با تعریف mapping در قرارداد هوشمند یک مقدار عددی را در یک کلید ذخیره می کنیم و همچنین یک تابع برای ذخیره داده ها روی mapping ایجاد می کنیم.
pragma solidity ^0.8.0;
//Sample contract
contract SampleContract {
//state variable
//added a map that takes an address "key" and a number "value"
//the name of the map is called myMap
mapping (address => uint) public myMap;
//this function sets a value to a specific address
//the data is saved to myMap on the block chain
function set(address _addr, uint _i) public {
myMap[_addr] = _i;
}
}
مثال Mapping در سالیدیتی
برای درک بهتر mapping در سالیدیتی بیایید مثالی را بررسی کنیم فرض کنید قصد داریم لیست دانشجویان یک کلاس را که شامل نام و شماره دانشجویی می شود ذخیره کنیم. برای اینکار باید mapping را به شکل زیر تعریف کنیم :
pragma solidity ^0.8.4;
contract MyContract {
mapping(uint => string) public names;
}
برای تست این قرارداد می توانید با اضافه کردن داده های پیش فرض آن را در IDE تست کنید :
constructor() public {
names[101] = "akbar";
names[102] = "Sara";
names[103] = "john";
}
}
خواندن یک item در mapping
برای این که بتوانیم داده های موجود در mapping را دریافت کنیم از یک تابع به شکل زیر استفاده می کنیم.
pragma solidity ^0.8.0;
//Sample contract
contract SampleContract {
//state variable
//added a map that takes an address "key" and a number "value"
//the name of the map is called myMap
mapping (address => uint) public myMap;
//this function sets a value to a specific address
//the data is saved to myMap on the block chain
function set(address _addr, uint _i) public {
// Update the value at this address
myMap[_addr] = _i;
}
//this function gets a value from a specific address in the map
//If a value was not set the function will return the default value of 0.
function get(address _addr) public view returns (uint) {
return myMap[_addr];
}
}
حذف یک item از mapping
برای حذف مقادیر در mapping می توانیم به شکل زیر عمل کنیم.
pragma solidity ^0.8.0;
//Sample contract
contract SampleContract {
//state variable
//added a map that takes an address "key" and a number "value"
//the name of the map is called myMap
mapping (address => uint) public myMap;
//this function deletes a value from the map and sets it to the default value of 0
function remove(address _addr) public {
delete myMap[_addr];
}
}
mapping های تو در تو
mapping در قرارداد هوشمند یک مرحله دیگر هم دارد و آن هم مپینگ تو در تو است. در mapping تو در تو یک کلید به یک مپینگ متصل می شود. مپینگ های تو در تو به شکل زیر تعریف می شوند:
mapping (address => mapping (address => uint256)) public myMap;
کاربردهای مپینگ تو در تو بسیار زیاد است و شما می توانید در موقعیت های مختلف از آن استفاده کنید. قرارداد زیر یک mapping تو در تو را نمایش می دهد.
pragma solidity ^0.7.6;
contract allowance {
//mapping an address to another mapping. This is a one to many relationship
mapping(address => mapping(address => uint)) public allowance;
//this function returns the allowance/amount that the owner permissioned to the spender
function get(address _addrOwner, address _addrSpender) public view returns (uint) {
return allowance[_addrOwner][_addrSpender];
}
//this function sets the amount of allowance the owner gives to the spender
function set(address _addrOwner, address _addrSpender, uint _amt) public {
allowance[_addrOwner][_addrSpender] = _amt;
}
//this function removes the spenders allowance
function remove(address _addrOwner, address _addrSpender) public {
delete allowance[_addrOwner][_addrSpender];
}
}
در آخر
امیدواریم این مقاله مفید بوده باشه اگر نکته ای در این مقاله گفته نشده و یا اگر سوالی در مورد mapping در سالیدیتی دارید هم در بخش نظرات بنویسید.
دیدگاهتان را بنویسید