به صورت پیشفرض در زبان سالیدیتی فانکشن ها به صورت public هستند. یعنی اگر مشخص نشود که فانکشن public است یا private به صورت پیشفرض سالیدیتی آن را public در نظر می گیرد و هر شخصی می تواند این فانکشن را فراخوانی کند.
گاهی لازم است یک فانکشن فقط توسط بقیه فانکشن های درون contract فراخوانی شود. در این مواقع باید فانکشن را به صورت private تعریف کرد. به مثال زیر دقت کنید:
همانطور که مشاهده می کنید توسط کلید واژه private در انتهای تعریف فانکشن این فانکشن به صورت private تعریف شد و حالا فقط توسط خود contract قابل فراخوانی است. معمولا به صورت توافقی توسعه دهندگان سالیدیتی اول اسم فانکشن های private را با خط تیره شروع می کنند.
مانند بقیه زبان های برنامه نویسی برای برگرداندن نتیجه عملیات درون یک فانکشن از return استفاده می شود. در سالیتی تایپ برگشتی فانکشن ها هم باید مشخص شوند. در مثال زیر تایپ خروجی فانکشن string تعریف شده است. به مثال زیر دقت کنید:
در فانکشن فوق هیچ متغیری تغییر نکرده. فقط مقدار یک متغیر از contract برگردانده شده و این مقدار دست خوش هیچ تغییری نشده است. به این فانکشن ها فانکشن های view می گویند. یعنی فقط اطلاعات را می خوانند. در واقع باید فانکشن فوق را به صورت زیر تعریف کرد:
گاهی فانکشن ها در سالیدیتی به هیچ متغیری از contract وابسته نیستند. نه متغیر های contract را تغییر می دهند و نه می خوانند. در واقع فقط یک سری پارامتر دریافت می کنند و یک سری عملیات را روی آن دریافتی ها انجام می دهند. در سالیدیتی به این نوع فانکشن ها pure گفته می شود. به مثال زیر دقت کنید . این یک فانکشن pure است و به صورت pure نیز تعریف شده:
همان طور که مشاهده می کنید فانکشن multiply فوق فقط با متغیر های دریافتی خودش یعنی متغیر a و متغیر b کار می کند و هیچ عملیات خواندن و یا نوشتن روی بقیه متغیر های contract ندارد. لذا به صورت pure تعریف شده است.
نکته: در سالیدیتی لازم نیست pure بودن یا view بودن فانکشن ها توسط ما تشخیص داده شوند. خوشبختانه کامپایلر سالیدیتی و IDE ها به ما warning می دهند و ما متوجه می شویم.
فانکشن Keccak256 یک hash فانکشن از نوع SHA3 است و در سالیدیتی از پیش تعریف شده است. این فانکشن ورودی را تبدیل به یک عدد ۲۵۶ بیتی هگزا دسیمال تصادفی تبدیل می کند.در واقع یک تغییر کوچک در ورودی باعث یک تغییر بزرگ در خروجی می شود. ورودی این تابع باید حتما به صورت bytes باشد. یعنی در واقع هر پارامتری که به این فانکشن به عنوان ورودی پاس داده می شود باید pack شود.
به مثال زیر دقت کنید:
همانطور که مشاهده می کنید با یک تغییر کوچک در ورودی (aaaab تبدیل به aaaac) حاصل خروجی کاملا متفاوت است. در مثال فوق از فانکشن Keccak256 استفاده شده تا یک عدد سودو کد تصادفی ساخته شود که در ساخت برنامه های dApp اتریوم بسیار کاربردی است.
گاهی لازم است data type ها را به هم تبدیل کرد. به مثال زیر دقت کنید:
در کد فوق حاصل ضرب a در b یک uint است نه uint8. در نتیجه چون نتیجه حاصل ضرب در متغیر c ( که از نوع uint8 تعریف شده است) ریخته شده است برنامه خطا می دهد. برای رفع خطا می توانیم تایپ b را به uint8 تغییر دهیم. کافیست از فانکشن uint8 استفاده کنیم و متغیر b را برای آن ارسال کنیم تا تغییر تایپ یا type casting صورت بگیرد.
امیدوارم این قسمت مفید واقع شده باشه برای شما.قسمت های جدید به زودی آپلود می شوند.
لطفا قسمت های قبلی یعنی قسمت اول و قسمت دوم را هم مطالعه کنید.
اگر دوست داشتید من را در لینکدین دنبال کنید. ممنونم