انواع حافظه در قرارداد هوشمند سالیدیتی
انواع حافظه در سالیدیتی solidity
هر متغیری که در یک قرارداد هوشمند استفاده میشود و یا اعلان میشود، دارای یک مکان داده است. این مکان مشخص میکند که مقدار آن متغیر باید در کجا ذخیره شود. اهمیت یادگیری مکان داده یا انواع حافظه در قرارداد هوشمند سالیدیتی به این دلیل است که مقدار گس مصرفی در طول تراکنش بستگی به حافظهای دارد که در قرارداد هوشمند خود استفاده میکنید.
پس اگر میخواهید بهترین کار را انجام دهید و یک قرارداد هوشمند و کد بهینه بنویسید که از حداقل مقدار گس استفاده میکند، با این مقاله در توکن خان همراه باشید.
قبل از مطالعه کامل مقاله “انواع حافظه در سالیدیتی” پیشنهاد میکنیم مقالات دیگر حوزه دوره آموزش سالیدیتی را هم مطالعه کنید.
نحوه ایجاد توکن ERC721 با قرارداد هوشمند
انواع داده ها و متغیرها در سالیدیتی (solidity)
کتابخانه ها (Library) در قراردادهای هوشمند Solidity
گس فی GAS FEE در شبکه اتریوم چیست؟
استفاده از Import در سالیدیتی Solidity
وراثت در سالیدیتی Solidity Inheritance
انواع حافظه در سالیدیتی کدامند؟
انواع حافظه در سالیدیتی (Storage vs Memory in Solidity) به ترتیب زیر است:
-
Storage یا ذخیرهسازی
Storage محل ذخیره دادهها در بلاک چین است، این حافظه متغیرهای حالت را در خود ذخیره میکند که متغیرهایی دائمی هستند. این مکان داده یا حافظه که به فارسی ذخیرهسازی ترجمه میشود، دائمی است. دائمی بودن آن به این معنی است که دادههایی که داخل آن نگهداری میشوند به تمام توابع قرارداد دسترسی دارند.
برای درک بهتر این مورد از انواع حافظه در قرارداد هوشمند سالیدیتی، میتوانید آن را مانند هارد دیسک کامپیوتر در نظر بگیرید که دادهها به صورت دائمی در آن ذخیره میشوند. این حافظه خارج از تابع اعلان شده است، پس نیازی به اعلان “Storage” وجود ندارد. از این حافظه میتوان دادهها را خواند و همچنین در آن دادهها را نوشت.
Storage یک حافظه است که برای تمام توابع سالیدیتی قابل دسترسی است و ثابت، دائمی و پایا است. نکته مهم که در استفاده از این حافظه باید به یاد داشته باشید، این است که در مقایسه با حافظههای دیگر گرانتر است و گس زیادی مصرف میکند.
متغیرهای حالت و متغیرهای محلی ساختارها و آرایه همیشه به طور پیشفرض در Storage ذخیره میشوند.
-
Memory یا حافظه
Memory محل ذخیره دادههایی است که دائمی نیستند و در بلاک چین ذخیره نمیشوند. این حافظه، موقتی و ارزانتر از Storage است.
برای درک بهتر آن، میتوانید آن را مانند RAM کامپیوتر در نظر بگیرید که مکانی موقت برای ذخیره دادهها است و برای هر عملکرد جداگانه در نظر گرفته میشود. این حافظه موقتی، تنها در داخل تابع قابل دسترسی است. از این حافظه هم میتوان دادهها را خواند و هم میتوان در آن دادهها را نوشت.
معمولا از این حافظه برای ذخیره متغیرهای موقت برای محاسبه در حین اجرای تابع استفاده میشود. هنگامی که تابع اجرا میشود، محتویات آن حذف میشود.
Memory یک حافظه است که برای هر تابع در داخل قرارداد هوشمند سالیدیتی قابل دسترسی است و کوتاه مدت، موقتی و زودگذر است. آرگومانهای تابع در Memory نگهداری می شوند.
هر زمان که نمونه جدیدی از یک آرایه با استفاده از کلمه کلیدی” memory” ایجاد شود، یک کپی جدید از آن متغیر ایجاد میشود. تغییر مقدار آرایه نمونه جدید تاثیری بر آرایه اصلی ندارد.
-
Stack یا پشته
Stack یک حافظه است که EVM از آن برای بارگذاری متغیرها در حین اجرای قرارداد هوشمند استفاده میکند. این مکان داده یکی دیگر از انواع حافظه در سالیدیتی است و به فارسی پشته ترجمه میشود. از این حافظه برای ذخیره متغیرهای محلی کوچک و دادههای غیر پایدار استفاده میشود و دارای محدودیت اندازه است.
این حافظه، مکانی برای ذخیره اکثر متغیرهای محلی ایجاد شده در داخل یک تابع است. استفاده از Stack میزان گس بسیار کمی مصرف میکند و در بیشتر موارد رایگان است. اعلان این حافظه نیاز به دستوری خاص ندارد و هر متغیر در یک تابع در این حافظه ذخیره میشود.
-
Calldata
Calldata یک مکان داده یا حافظه برای ذخیره دادههای غیرقابل تغییر و غیر پایدار است. در این حافظه تمام مقادیر ارسال شده به تابع و دادههای یک تراکنش ذخیره میشود، همچنین این حافظه مکان پیشفرض پارامترهای توابع خارجی است (نه پارامترهای برگشتی).
حافظه Calldata یک حافظه تنها خواندنی Read-Only است و در آن نمیتوان دادهها را نوشت. این حافظه به یکی از انواع حافظه در سالیدیتی یعنی Memory شبیه است اما نسبت به آن گس کمتری مصرف میکند. با این وجود عدم امکان نوشتن دادهها در آن و قابل تغییر نبودن دادهها در آن نسبت به Memory، برای این نوع حافظه محدودیت محسوب میشود.
این حافظه تنها برای توابع خارجی یا محلی قابل دسترسی است و بنابر آنچه در مستندات سالیدیتی گفته شده است، بهتر است تا جای ممکن از این حافظه استفاده شود.
جمع بندی
هر تراکنش در EVM یا ماشین مجازی اتریوم، برای ما مقداری گس هزینه دارد. هر چه مصرف گس کمتر باشد، کد سالیدیتی قرارداد هوشمند بهتر است. مصرف گس در Memory در مقایسه با Storage بسیار کمتر است پس همیشه بهتر است از Memory برای انجام محاسبات میانی استفاده کنید و نتیجه نهایی را در Storage ذخیره کنید.
منابع معتبر مرتبط:
مطالب زیر را حتما مطالعه کنید
بررسی رفتار توابع View و Pure در سالیدیتی Solidity
توابع Payable در قراردادهای هوشمند Solidity
سالیدیتی Solidity چیست؟
سطح دسترسی Visibility در سالیدیتی Solidity
توابع Function در سالیدیتی Solidity
استفاده از Import در سالیدیتی Solidity
8 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
خیلی محتوای خوبی بود مهندس
مطلب بی نظیری بود
منابع این مطلب کجاست؟
خیلی سایت خوبی دارین
مطلب به درد بخوری بود
خیلی محتوای کامل و عالی بود
این مطلب حرف نداشت
مثل همیشه عالی و کاربردی