سطح دسترسی Visibility در سالیدیتی Solidity
سطح دسترسی در سالیدیتی
یکی از قابلیتها در زبان برنامهنویسی سالیدیتی و دیگر زبانهای شیگرا، این است که میتوانید این موضوع که چه کسی به توابع و متغیرهای حالت در قرارداد هوشمند شما دسترسی دارد و چگونه با آنها تعامل میکند را کنترل کنید. این مفهوم تحت عنوان سطح دسترسی Visibility در سالیدیتی (Function Visibility in Solidity) شناخته میشود.
آشکار بودن یا Visibility یک تابع را میتوان روی چهار حالت خارجی (external)، عمومی (public)، داخلی (internal) یا خصوصی (private) تنظیم کرد. برای متغیرهای حالت هم سه اصلاح کننده Visibility امکانپذیر است که عمومی، داخلی یا خصوصی هستند، کلمه کلیدی external برای متغیرهای حالت کاربرد ندارد. در این مقاله در توکن خان، قصد داریم به بررسی بیشتر سطح دسترسی Visibility در سالیدیتی و کاربرد آن بپردازیم.
قبل از مطالعه کامل مقاله “سطح دسترسی Visibility در سالیدیتی” پیشنهاد میکنیم مقالات دیگر حوزه آموزش سالیدیتی را هم مطالعه کنید.
نحوه ایجاد توکن ERC721 با قرارداد هوشمند
انواع داده ها و متغیرها در سالیدیتی (solidity)
کتابخانه ها (Library) در قراردادهای هوشمند Solidity
گس فی GAS FEE در شبکه اتریوم چیست؟
استفاده از Import در سالیدیتی Solidity
انواع حافظه در قرارداد هوشمند سالیدیتی
انواع سطح دسترسی Visibility در سالیدیتی
Visibility برای محدود کردن سطح دسترسی به متغیرها و توابع در برنامههای Solidity شما ضروری است. هنگام تعیین سطح دسترسی Visibility در سالیدیتی برای استفاده، همیشه باید از اصل حداقل امتیاز استفاده کنید. یعنی فقط به اندازهای که لازم است Visibility را اختصاص دهید و نه بیشتر.
Visibility یک کلاس، متد یا یک متغیر در واقع چگونگی دسترسی به آن را به ما اعلام میکند. انواع Visibility در سالیدیتی به ترتیب زیر است:
-
External یا خارجی
توابع خارجی را فقط میتوان از خارج از قراردادی که در آن اعلان (declare) شده است فراخوانی (call) کرد.
-
Public یا عمومی
همه طرفین در داخل و خارج از قرارداد میتوانند به توابع و متغیرهای عمومی دسترسی داشته باشند. وقتی وضعیت Visibility مشخص نشده باشد، Visibility پیشفرض یک تابع، Public است.
به بیان دیگر، متغیر توسط قرارداد و سایر قراردادهای هوشمند قابل دسترسی است.
-
Internal یا داخلی
توابع و متغیرهای اعلان شده با کلمه کلیدی Internal فقط از داخل قراردادی که در آن اعلان شده اند قابل دسترسی هستند، اگرچه میتوان از قراردادهای مشتق شده (قراردادهای فرزند) هم به آنها دسترسی داشت. هنگامی که وضعیت Visibility مشخص نشده باشد، متغیرهای حالت دارای مقدار پیش فرض Internal هستند.
به بیان دیگر، متغیر فقط با قراردادی که در آن تعریف شده و زیر کلاسهای آن قابل استفاده است.
-
Private یا خصوصی
توابع اعلان شده با کلمه کلیدی Private فقط از داخل قراردادی که در آن
اعلان شده اند قابل دسترسی هستند. توابع خصوصی همچنین تنها توابعی هستند که نمیتوانند توسط توابع دیگر به ارث برسند.
این نکته را هم باید یادآوری کنیم که تنظیم کردن یک تابع یا متغیر بر روی Private یا خصوصی، آن را در بلاک چین غیرقابل مشاهده نمیکند. بلکه این حالت فقط دسترسی آنها را به توابع داخل قرارداد محدود میکند.
به بیان دیگر، متغیر فقط در قراردادی که تعریف شده قابل دسترسی است. تلاش برای دسترسی به آن خارج از این قرارداد یک خطای کامپایل میدهد.
مثالی برای visibility متغیر حالت در سالیدیتی
برای تعریف سطح دسترسی Visibility در سالیدیتی برای یک متغیر حالت، کافی است نام متغیر را قبل از اصلاح کننده visibility قرار دهید.
همانطور که در کد نمونه زیر نشان داده شده است :
1 2 3 |
// سالیدیتی نوع داده // قیل از سطح دسترسی تعریف می شود uint public number; |
مثالی برای visibility تابع در سالیدیتی
مثال کد Solidity زیر تمام مفاهیمی که در بخشهای بالا گفتیم را دوباره اجرا میکند:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0; // تعریف قرارداد هوشمند contract A{ // تعریف // state variables uint public num1; uint private num2; uint internal num3; // تعریف تابع عمومی برای محاسبه جمع دو عدد function f1() public view returns (unit){ uint sum = num1 + num2; return sum; } // تعریف تابع عمومی برای محاسبه جمع دو عدد function f2() private view returns(uint){ uint sum = num2 +num3; return sum; } // تعریف تابع عمومی برای محاسبه جمع دو عدد function f3() internal view returns(uint){ uint sum = num1 +num3; return sum; } } // تعریف تابع عمومی برای محاسبه تفریق دو عدد function f4() external view returns(uint){ uint sub = num2 +num2; return sub; } // تعریف تابعی جدید برای // f2 فراخوانی تابع خصوصی function callF2() public view returns(uint){ uint Num2 = f2(); return Num2; } } contract B { // A تعریف یک نمونه جدید از قرارداد A a = new A(); // تعریف تابعی جدید برای // f1 فراخوانی تابع عمومی function callF1() public view returns(uint){ uint Num1 = a.f1(); return Num1; } // تعریف تابعی جدید برای // f4 فراخوانی تابع خارجی function callF4() public view returns(uint){ uint Num4 = a.f4(); return Num4; } } // A از C ارث بری قرارداد contract C is A { // تعریف تابعی جدید برای // f3 فراخوانی تابع داخلی function callF3() public view returns(uint){ uint Num3 = A.f3(); return Num3; } } |
جمع بندی
سطح دسترسی Visibility در سالیدیتی، میزان دسترسی به متغیرها و توابع موجود در برنامهها و پایگاه داده شما را تعیین میکند. وجود این اصلاح کنندههای سطح دسترسی Visibility برای محافظت از قراردادهای هوشمندی که میتوانند دادهها و رفتار یک قرارداد معین را ببینند، ضروری هستند. سالیدیتی دارای سه سطح دسترسی Visibility برای متغیرهای حالت و چهار سطح دسترسی Visibility برای توابع است.
در نهایت، به عنوان یک توسعهدهنده سالیدیتی مهم است که بدانید؛ سطح دسترسی Visibility در دو حالت private یا internal فقط دسترسی قراردادهای دیگر به دادههای قرارداد شما را محدود میکند. با این حال، دادهها همچنان در بلاک چین به صورت عمومی قابل مشاهده هستند.
منابع معتبر مرتبط:
https://medium.com/coinmonks/visibility-in-solidity-e758a4739c95
https://www.alchemy.com/overviews/solidity-function-visibility
مطالب زیر را حتما مطالعه کنید
بررسی رفتار توابع View و Pure در سالیدیتی Solidity
توابع Payable در قراردادهای هوشمند Solidity
سالیدیتی Solidity چیست؟
توابع Function در سالیدیتی Solidity
انواع حافظه در قرارداد هوشمند سالیدیتی
استفاده از Import در سالیدیتی Solidity
8 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
خیلی ممنون از توضیحات خوبتون
ایا مشاوره هم دارین برای خرید ارز؟ قیمت مشاورتون چقدره؟
موضوعات solidity یکی از موضوعات موردعلاقه منه
مطلب خوبی بود همکار گرامی
واقعا ارزش وقت گذاشتن داشت
من یکی از کاربران دائمی سایت شما هستم
مثل همیشه عالی و کاربردی
خیلی محتوای خوبی بود مهندس