بررسی رفتار توابع View و Pure در سالیدیتی Solidity
توابع View و Pure در سالیدیتی Solidity
توابعی مانند payable، View و Pure در سالیدیتی توابعی هستند که مشخص کننده رفتار توابع هستند. تابعی که رفتار آن به صورت پیشفرض مشخص نشده باشد قادر خواهد بود تا وضعیت بلاک چین را بخواند و هم در آن تغییر ایجاد کند.
تابعی مانند View یک تابع فقط خواندنی است و وضعیت بلاک چین را تغییر نمیدهد و تابعی مانند Pure خواندنی نیست و وضعیت بلاک چین را هم تغییر نمیدهد. در این مقاله در توکن خان قصد داریم تا به بررسی رفتار توابع View و Pure در سالیدیتی (Pure and View in Solidity) بپردازیم، پس با ما همراه باشید.
قبل از مطالعه کامل مقاله “توابع View و Pure در سالیدیتی” پیشنهاد میکنیم مقالات دیگر حوزه دوره آموزش سالیدیتی را هم مطالعه کنید.
نحوه ایجاد توکن ERC721 با قرارداد هوشمند
انواع داده ها و متغیرها در سالیدیتی (solidity)
کتابخانه ها (Library) در قراردادهای هوشمند Solidity
گس فی GAS FEE در شبکه اتریوم چیست؟
استفاده از Import در سالیدیتی Solidity
انواع حافظه در قرارداد هوشمند سالیدیتی
معرفی تابع View در سالیدیتی
توابع view توابعی فقط خواندنی read-only هستند که با استفاده از آنها میتوان state variable ها یا همان متغیرهای وضعیتی، و یا سایر اطلاعات بلاکچین را(مثلاً global variableها) را خواند. در نتیجه از این نوع تابع، برای خواندن دادهها از بلاک چین میتوان استفاده نمود. در مثال زیر، تابع getResult به صورت view تعریف شده است و قرار است مقادیر متغیرهای num1 و num2 را از حافظه اسمارت کانترکت بخواند و در نهایت حاصل جمع و حاصلضرب این 2 عدد را به عنوان خروجی برگرداند.
ضمناً، برای درخواست اجرا شدن تابع view در سالیدیتی، نیازی به پرداخت هزینه ی گس فی وجود ندارد. ( به عنوان نکته، این را نیز بدانید: اگرچه گفتیم نیازی به پرداخت هزینه ای در تابع view سالیدیتی نیست، اما در اصل با استفاده از شبیه سازی ای که در بلاکچین صورت میگیرد، هزینه ای فرضی توسط ما پرداخت میشود. اما ما نیازی نداریم که پرداختی واقعی ای به عنوان گس فی داشته باشیم و همه چی بصورت اتوماتیک و درون خود سیستم، و بدون اطلاع ما انجام خواهد شد)
پس دقت داشته باشید که در موارد زیر از تابع view استفاده نمیشود:
- نوشتن state variable ها یا به روزرسانی وضعیت بلاک چین
- انتشار رویدادها(منظورمان همان emit کردن یک event میباشد)
- ایجاد یا تخریب کردن یک قرارداد با self destruct
- انتقال اتر
در مثال زیر، قرارداد Test یک تابع view برای محاسبه حاصلضرب و مجموع دو عدد صحیح بدون علامت تعریف میکند:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// کد سالیدیتی برای آشنایی با // تابع از نوع // view pragma solidity ^0.8.0; // تعریف قرارداد هوشمند contract Test { // تعریف // state variables uint public num1 = 2; uint public num2 = 4; // تعریف یک تابع فقط خواندنی یا // view function // برای محاسبه ضرب و همینطور // جمع 2 عدد function getResult() public view returns (uint product, uint sum) { product = num1 * num2; sum = num1 + num2; } } |
اجرای کد با یک کلیک: اجرای کد بالا در محیط ریمیکس
خروجی کدهای بالا مطابق با تصویر زیر است:
به عنوان نکته پایانی در خصوص تابع view در سالیدیتی، باید به این هم اشاره کنیم که هنگامی که یک state variable یا متغیر وضعیتی را در سالیدیتی به صورت public تعریف میکنیم، ماشین مجازی اتریوم (یا همان EVM) بصورت خودکار، یک تابع از نوع view برای متغیر مربوطه تعریف میکند که به آن getter function گفته میشود. به همین خاطر است که میتوانیم به راحتی مقدار ذخیره شده در متغیر مربوطه را مشاهده کنیم.
معرفی تابع Pure در سالیدیتی
در این بخش در بررسی رفتار توابع View و Pure در سالیدیتی، به معرفی توابع Pure میپردازیم. توابع Pure توابعی هستند که نه مقداری را از متغیرهای از نوع state variable میخوانند، و نه مقداری را بر روی بلاکچین مینویسند. پس با توجه به موردی که مطرح کردیم میتوانیم بفهمیم که توابع Pure از توابع view محدودتر هستند که نه عملیات خواندنی را انجام میدهند و نه تغییری در وضعیت بلاک چین میدهند. تنها در زمانی از توابع pure سالیدیتی استفاده میکنیم که بخواهیم یک عملیاتی را انجام داده و نتیجه ای را برگردانیم و از نتیجه ی برگشت داده شده(منظورم خروجی تابع است)، در جای دیگر(مثلاً در فانکشن دیگر) استفاده کنیم.
پس دقت داشته باشید که در موارد زیر از توابع pure استفاده نمیشود:
- خواندن متغیرهای حالت(همان state variableها) و یا خواندن دادهها از بلاک چین
- دسترسی به موجودیها
- و در نظر داشته باشید که توابی که قرار است عملیات call یا فراخوانی را انجام دهند، نمیتوانند از نوع pure باشند.
در مثال زیر، قرارداد Test یک تابع Pure برای محاسبه حاصلضرب و مجموع دو عدد تعریف میکند:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// کد سالیدیتی برای آشنایی با // تابع از نوع // Pure pragma solidity ^0.8.17; // تعریف قرارداد هوشمند contract Test { // تعریف یک تابع از نوع // pure // برای محاسبه ضرب و جمع 2 عدد // و برگرداندن مقدار آنها function getResult() public pure returns(uint product, uint sum){ uint num1 = 2; uint num2 = 4; product = num1 * num2; sum = num1 + num2; } } |
اجرای کد با یک کلیک: اجرای کد بالا در محیط ریمیکس
خروجی کدهای بالا مطابق با تصویر زیر است:
جمعبندی
در این مقاله به بررسی رفتار توابع View و Pure در سالیدیتی پرداختیم، که مشخص کننده رفتار تابع هستند. تابع view هنگامی که قرار است مقداری را از بلاکچین بخوانیم، و تابع Pure هنگامی که میخواهیم یک عملیات برایمان انجام شود و از نتیجه آن در تابع دیگری استفاده کنیم، استفاده میشوند.
برخی منابع معتبر مرتبط:
https://cryptomarketpool.com/pure-and-view-in-solidity-smart-contracts
https://www.geeksforgeeks.org/solidity-view-and-pure-functions
مطالب زیر را حتما مطالعه کنید
توابع Payable در قراردادهای هوشمند Solidity
سالیدیتی Solidity چیست؟
سطح دسترسی Visibility در سالیدیتی Solidity
توابع Function در سالیدیتی Solidity
انواع حافظه در قرارداد هوشمند سالیدیتی
استفاده از Import در سالیدیتی Solidity
7 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
کجا می تونم اطلاعات کاملتری درباره این موضوع پیدا کنم؟
تو منابع انگلیسی.
البته که اگر سوال خاصی داشته باشین میتونین همینجا مطرح کنین تا پاسخ رو خدمتتون بدیم.
شما پیج اینستا هم دارین؟
مطلب خوبی بود
چه مطلب خوبی
حرف نداشت👌🏻
خیلی سایت خوبی دارین