آموزش ساختارها در سالیدیتی

در این آموزش با مفهوم ساختارها (Structs) در سالیدیتی آشنا می‌شوید و یاد می‌گیرید چطور با استفاده از آن‌ها داده های مرتبط را به‌صورت منظم در قراردادهای هوشمند ذخیره و مدیریت کنید.

ساختارها در سالیدیتی چیست؟

در سالیدیتی، ساختارها (Structs) ابزاری برای گروه بندی متغیرهای مرتبط در قالب یک نوع داده ترکیبی هستند. با استفاده از ساختارها می‌توان داده هایی از انواع مختلف مانند عدد، رشته، آدرس و… را در کنار یکدیگر قرار داد و آن‌ها را به صورت منظم و قابل مدیریت نگه داشت. این قابلیت به ویژه زمانی کاربرد دارد که نیاز به ذخیره اطلاعات پیچیده تری مانند مشخصات کاربران، سفارش ها یا داده های تراکنش باشد.

استفاده از ساختارها نه تنها کد شما را خواناتر می‌کند، بلکه باعث کاهش تکرار و افزایش بهره وری در توسعه قراردادهای هوشمند نیز می‌شود. برای مثال، به جای نگهداری نام و موجودی کاربر در دو mapping جداگانه، می‌توان هر دو را در یک struct قرار داد و آن struct را با آدرس کاربر در یک mapping ذخیره کرد. ساختارها همچنین می‌توانند در آرایه ها و mapping ها استفاده شوند و به شکل مؤثری داده ها را دسته بندی کنند.

آموزش ساختارها در سالیدیتی

ساختارها در سالیدیتی عملکردی مشابه زبان C دارند. همانطور که گفتیم آن ها چندین متغیر را در یک نوع داده مرکب گروه‌بندی می‌کنند که می‌تواند برای سازمان‌دهی داده ها و ایجاد ساختارهای داده ای پیچیده تر بسیار مفید باشد.

در اینجا نحوه تعریف یک ساختار در Solidity آمده است:

متغیر myFoo یک متغیر عمومی از نوع ساختار Foo است که هر دو مقدار uint256 a و uint256 b را ذخیره می‌کند. همان‌طور که می‌بینید، اگر آن را در Remix مستقر کنیم، myFoo چنین مقداری را بازمی‌گرداند:

برای ارسال یک ساختار در Remix به تابعی که یک ساختار را به عنوان آرگومان می‌پذیرد (که در ادامه بیشتر درباره آن صحبت خواهیم کرد)، آن را به شکل زیر رمزگذاری (encode) کنید:

تابعی که در این مثال مطرح شده، ساختار Foo بالا را می‌گیرد که شامل دو متغیر uint256 است. ممکن است فرمت کردن آن مانند یک آرایه کمی گیج‌کننده به نظر برسد، اما روش کار همین است.

برای ایجاد یک نمونه جدید از Foo در Solidity، به‌سادگی مقادیر را در ساختار Foo قرار دهید:

  • Foo(a,b)

برای دسترسی یا اختصاص مقدار به هر متغیر مجزا در ساختار myFoo، از نگارش نقطه‌ای استفاده کنید:

  • myFoo.a
  • myFoo.b

چرا از ساختارها در سالیدیتی استفاده می‌کنیم؟

فرض کنید یک قرارداد سپرده داریم که نام سپرده گذار و موجودی او را ذخیره می‌کند. Struct ها در چنین مواردی ساختاردهی کد را ساده‌تر و قابل‌فهم‌تر می‌کنند.

در قرارداد بالا، نام و موجودی سپرده گذار در دو ساختار داده ای mapping جداگانه ذخیره می‌شوند.

متغیر آدرس در هر دو mapping برای نام و موجودی msg.sender تکرار شده است، و به همین دلیل کارایی مناسبی ندارد.

اینجاست که ساختارها (structs) به کار می‌آیند. ما می‌توانیم هر دو مقدار نام و موجودی را در یک متغیر struct ثبت کرده و آن را فقط در یک mapping کلید-مقدار ذخیره کنیم، به این شکل:

می‌بینید چقدر مفید است؟ این کار باعث تمیزتر و بهینه تر شدن کد شما می‌شود.

چگونه از ساختارها در سالیدیتی استفاده کنیم؟

ساده است، در ادامه یک مثال آورده شده است:

اگر بخواهید struct Foo را به عنوان آرگومان به تابعی پاس بدهید یا از آن به عنوان مقدار برگشتی استفاده کنید، باید چند قانون را رعایت کنید:

  • ساختارهایی که به عنوان آرگومان ارسال می‌شوند باید به صورت memory تعریف شوند.

  • ساختارهایی که به عنوان خروجی تابع برمی‌گردند نیز باید به صورت memory تعریف شوند. به این صورت:

نکته مهم این است که ساختارها در سالیدیتی نمی‌توانند شامل عضوی از نوع خودشان باشند. به عنوان مثال، این کار مجاز نیست:

آرایه ها و Mapping ها در سالیدیتی

ساختارها در سالیدیتی را می‌توان به عنوان نوع مقدار در آرایه ها و Mapping ها استفاده کرد. برای مثال، می‌توانید یک آرایه داینامیک از نمونه های Foo به این صورت ایجاد کنید:

arrayFoo یک آرایه از نمونه‌های Foo است:

همچنین می‌توانید یک mapping ایجاد کنید که کلیدهای آن آدرس ها و مقادیر آن نمونه هایی از Foo باشند:

تا اینجا باید واضح باشد که چه اتفاقی در حال افتادن است. ما یک mapping از address ⇒ struct Foo داریم به نام mappingFoo.

برای اختصاص دادن یک نمونه از Foo به یک mapping آدرسی، به این صورت عمل می‌کنیم:

و برای ویرایش آن:

مثال دنیای واقعی

یک کاربرد عملی‌تر می‌تواند در یک سیستم بلیت باشد. ما یک قرارداد BuyTickets داریم که هر بلیت را با قیمت ۰.۰۱ اتر می‌فروشد. هر آدرس نمی‌تواند بیشتر از ۱۰ بلیت خریداری کند و ما تابعی داریم که اطلاعات بلیت های یک آدرس را نمایش می‌دهد.

ما می‌توانستیم از NFT برای بلیت ها استفاده کنیم، اما اگر کاربران قرار نیست بلیت ها را به یکدیگر انتقال دهند، این کار بیش از حد لازم (overkill) خواهد بود.

5/5 - (1 امتیاز)

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

دوره صفر تا صد آموزش بین المللی لینوکس
  • انتشار: ۱۹ اردیبهشت ۱۴۰۴

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

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

مشاهده همه

نظرات

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