Smart Contracts Solidity

تفاوت توابع Pure و View در سالیدتی

0
Please log in or register to do it.

سلام به همگی دوستان و همراهان آقای مبتدی!

در این مقاله سعی دارم تفاوت توابع Pure و View در Solidity رو به زبان خیلی ساده بهتون آموزش بدم.

تفاوت توابع Pure و View در زبان برنامه نویسی سالیدتی (Solidity) – Arian Hosseini – Blockchain Development

منظور از توابع Pure و View چی هست؟

ببینید به صورت خیلی ساده، زمانی که شما برای یک تابع از modifier (مادیفایر) view استفاده میکنید، دارید به سالیدتی میگید که این تابع قرار نیست هیچ چیزی در state کانترکت رو تغییر بده!

در نتیجه توابع View توابعی هستند که به شما و سالیدتی این اطمینان رو میدن که state قرارداد هوشمند رو به هیچ عنوان تغییر نخواهند داد زمانی که شما تابع رو صدا می‌زنید،

که قاعدتا باعث میشه توابع view صرفا توابع `read-only` باشند و دیگه یک Transaction نزنند و gas fee هم پرداخت نشه، به این شکل بسیار بهینه تر هست.

نکته:‌ توابع Getter به صورت پیش‌فرض در سالیدتی به عنوان توابع view تعریف شده‌اند.

اما زمانی که شما برای یک تابع از modifier (مادیفایر) pure استفاده ‌میکنید، دارید به Solidity میگید که این تابع قرار نیست هیچ چیزی در state کانترکت رو نه تغییر بده و همچنین نه چیزی بخونه!

No Reading, No Modifying 🙂 این رو بخاطر داشته باشید!

چی شد؟ ببینید خیلی ساده یک تابع pure این اطمینان رو به شما میده که وقتی شما اون رو call میکنید، اون تابع نه چیزی از state میخونه و نه چیزی رو در state تغییر میده (یا به اصصلاح modify میکنه)

دقیقا تفاوت pure و view در همین هست.

عموما توابع pure برای برگردوندن یک calculation استفاده میشن، ساده تر یعنی اینکه فقط با پارامتر ها و local variable هایی که داخلشون هست کار میکنند و اصلا کاری با state ندارند؛ هرکاری میکنند داخل خودشون هست و تمام.

نکته:‌ اگر احیانا متوجه منظور من از “خوندن از state” نشدید، در واقع این به معنای خوندن state variable ها هست، تمام متغیر هایی که در state قرارداد هوشمند شما تعریف شدند.

به همین سادگی 🙂

حالا بریم واضح تر داخل کد بررسی کنیم،

مثال؛

قرارداد هوشمند زیر رو در نظر بگیرید: (کاری به visibility و … نداشته باشید)

contract MyContract {
    uint value;
  
    function setValue(uint _value) external {
        value = _value;
    }

  
    function getValue() external view returns(uint) {
        // value = 2022;
        return value;
    }


    function getNewValue() external pure returns(uint) {
        return 3 + 3;
    }

}

همونطور که مشاهده میکنید، متغیر value یک state variable هست که به صورت پیش فرض هم هیچ مقداری براش ست نشده،

به تابع setValue دقت کنید، این تابع فقط و فقط برای ست کردن یک مقداری که داره state رو تغییر میده استفاده شده، درسته؟ یک مقداری رو به عنوان پارامتر دریافت میکنه و اون رو به عنوان مقدار value ست میکنه!

پس داره چیکار میکنه؟؟ دقیقا، داره state رو تغییر میده، درست میگم یا نه؟

پس وقتی state رو تغییر میده، در نتیجه نمیتونه یک تابع pure یا view باشه، چون مهم ترین قانون این `Modifier` هارو زیر پا گذاشته، اینکه نباید چیزی در state کانترکت تغییر پیدا بکنه (modify بشه!)

خب حالا به تابع `getValue` دقت کنید، که وظیفش return کردن مقدار متغیر value هست، دارم چی میگم؟ return کردن مقدار متغیر value، پس وقتی داره مقدار متغیر رو return میکنه، یعنی داره مقدارش رو میخونه! در نتیجه این باید یک تابع view باشه، ما از کلمه کلیدی view در ساختار تعریفی تابع استفاده میکنیم، چرا؟‌ چون از اونجایی که این تابع قرار فقط همین کار به خصوص رو انجام بده، بهمون این اطمینان رو میده که بعد از call کردنش، صرفا قرار مقداری از state رو بخونه و قرار نیست چیزی رو modify کنه یا …

سوال: آیا ما میتونستیم برای این تابع از مادیفایر pure استفاده کنیم؟

خودتون چی فکر میکنید؟! قاعدتا خیر، چون توابع ‍pure حق ندارن مقداری از state بخونن، اما این تابع داره مستقیما مقدار متغیر value رو از state میخونه و اون رو return میکنه، پس نمیتونه pure باشه.

خیلی هم عالی، حالا بریم تابع `getNewValue` رو بررسی کنیم؛

همونطور که ممکنه تا به الان متوجه شده باشید، این تابع تنها وظیفش return کردن جمع دو عدد ۳ هست (یک calculation) درسته؟ به نظر شما آیا این تابع مقداری رو در state تغییر می‌دهد؟ آیا مقداری رو از state میخونه؟ پاسخ هر دو سوال خیر هست 🙂

در نتیجه باید به عنوان یک تابع pure اون رو تعریف کنیم! به همین راحتی…

کمااینکه شما میتونید این تابع `getNewValue‍` رو هم به عنوان یک تابع view تعریف کنید، اما IDE به شما یک warning میده که بهتر هست از pure استفاده کنید در این تابع، چرا؟ چون view بلاخره یک چیزی رو از state میخونه ولی این تابع خیر، pure ها فقط با پارامتر هایی که بهشون پاس داده میشن و local variable های داخل scope خودشون کار میکنند.

نتیجه گیری نهایی:

این مبحث، بسیار ساده هست و با چندبار تمرین کردن و مثال زدن برای خودتون، قطعا به خوبی بهش مسلط خواهید شد.

امیدوارم که این مقاله آموزشی بهتون کمک کرده باشه! خوشحال میشم نظراتتون رو بدونم، قطعا این مقاله به مرور زمان به کمک شما عزیزان تکمیل تر و اشکالاتش رفع خواهد شد!

مرسی از اینکه تا آخر با من همراه بودید.

بررسی منو go در vscode

Reactions

فعلا کسی لایک نکرده

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *