توابع Function در سالیدیتی Solidity
توابع در سالیدیتی چیست؟
توابع در سالیدیتی در واقع مجموعهای از کدها هستند که دارای قابلیت استفاده مجدد در هر نقطه از برنامه هستند که به طور کلی باعث صرفهجویی در استفاده بیش از حد از حافظه (memory) میشوند و همچنین زمان اجرای یک برنامه را کاهش میدهند.
ایجاد یک تابع نیاز به نوشتن چندباره کدهای مشابه را کاهش میدهد. با کمک Function ها در سالیدیتی (functions solidity)، یک برنامه را میتوان به تعداد زیادی کد کوچک تقسیم کرد تا درک و مدیریت آن برنامه راحتتر و بهتر انجام شود.
قبل از مطالعه کامل مقاله “توابع Functions در سالیدیتی” پیشنهاد میکنیم مقالات دیگر حوزه آموزش برنامه نویسی سالیدیتی را هم مطالعه کنید.
نحوه ایجاد توکن ERC721 با قرارداد هوشمند
انواع داده ها و متغیرها در سالیدیتی (solidity)
کتابخانه ها (Library) در قراردادهای هوشمند Solidity
گس فی GAS FEE در شبکه اتریوم چیست؟
استفاده از Import در سالیدیتی Solidity
انواع حافظه در قرارداد هوشمند سالیدیتی
چگونگی تعریف (Definition) یا اعلان (Declaring) توابع در سالیدیتی
برای اینکه بتوانید از یک تابع استفاده کنید، باید آن را در سالیدیتی تعریف کنید. رایجترین راه برای تعریف یا اعلان یک تابع در سالیدیتی طبق مراحل زیر انجام میشود.
- استفاده از کلمه کلیدی function
- به دنبال آن آوردن یک نام تابع منحصربهفرد
- آوردن فهرستی از پارامترهای حاوی نام و نوع داده پارامتر (که ممکن است خالی باشد)
- مقدار برگشتی (return value) یک تابع اختیاری است اما در سالیدیتی، نوع بازگشتی (return_type) تابع در زمان اعلان تعریف میشود.
- و یک بلوک دستور که در براکتها قرار میگیرد.
Syntax اصلی یک تابع به شکل زیر است:
1 2 3 |
function function-name(parameter-list) scope returns(return_type) { // بدنه ی تابع } |
مثال زیر تابعی به نام getResult را تعریف میکند که هیچ پارامتری ندارد. میتوانید این کد را در ریمیکس امتحان کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Test { // تعریف تابعی برای // برگرداندن جمع 2 عدد function getResult() public pure returns(uint){ // تعریف // local variables uint num1 = 1; uint num2 = 2; uint result = num1 + num2; return result; } } |
مثالی دیگر از اعلان Function ها در سالیدیتی
به کد مثال زیر دقت کنید:
1 |
function name(uint x, uint y) public view returns (uint, unit) {} |
ممکن است این تابع به نظر طولانی بیاید، برای درک بهتر اجزای تابع، آن را به قطعات کوچکتر تبدیل کرده ایم که توضیحات هر جز را در جدول زیر مشاهده میکنید.
توضیحات | اجزای تابع |
برای اعلان تابع، باید از کلمه کلیدی function استفاده کنیم. این جز نشاندهنده شروع تابع نیز هست. | function |
نامی معنادار و منحصربه فرد که برای تابع خود در نظر میگیریم. در سایر بخشهای قراردادمان هم ممکن است آن را به کار ببریم. | name |
Uint نوع داده برای دو متغیر با نامهای x و y است. این تابع دو پارامتر به نام x و y را پذیرفته است، که به تابع منتقل میکنیم
تا ارزیابی شده و یک نتیجه را بدهد. |
uint x, uint y |
نشاندهنده سطح دسترسی (Visibility) است، public مشخص میکند تابع برای قراردادهای دیگر قابل دسترسی و مشاهده است. | public |
رفتار تابع را نشان میدهد، View مشخص میکند تابع فقط خواندنی است و وضعیت بلاک چین را تغییر نمیدهد. | view |
خروجی برای بازگشت پس از اجرای تابع است. خروجی این تابع دو عنصر Uint خواهد بود. | returns |
چگونگی فراخوانی (Calling) توابع در سالیدیتی
یک تابع میتواند تابع دیگری را در همان قرارداد (در داخل) و یا در یک قرارداد متفاوت (در خارج) فراخوانی کند. یک تابع زمانی فراخوانده میشود که کاربر بخواهد آن تابع را اجرا کند. در زبان برنامه نویسی سالیدیتی، این عمل به راحتی با نوشتن نام تابعی که باید فراخوانی شود، انجام میشود. پارامترهای مختلف را میتوان به تابع در هنگام فراخوانی ارسال کرد، پارامترهای متعددی را میتوان با جدا کردن با کاما به یک تابع ارسال کرد.
کد زیر، مثالی از فراخوانی توابع در سالیدیتی است، آن را در ریمیکس امتحان کنید تا با نحوه کار string در سالیدیتی نیز آشنا شوید.
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 |
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Test { // تعریف تابعی برای // برگرداندن جمع 2 عدد // string یه شکل function getResult() public pure returns(string memory) { // تعریف // local variables uint num1 = 1; uint num2 = 2; uint result = num1 + num2; return toString(result); } // uint تعریف تابعی برای تبدیل // string به function toString(uint _i) internal pure returns (string memory) { // اگر ورودی تابع صفر بود // صفر را برمیگرداند string if (_i == 0) { return "0"; } // متغیری موقتی // string برای محاسبه طول uint j = _i; // متغیری برای // string نگه داری طول uint length; // چرخه ای برای // string برای محاسبه طول while (j != 0) { length++; j /= 10; } // نعریف ارایه ی جدید از بایت ها bytes memory newLength = new bytes(length); // متغیری برای // پر کردن ارایه بایت ها uint k = length; // چرخه ای برای تبدیل // هر رقم از ورودی تابع // ASCII به معادل while (_i != 0) { k -= 1; newLength[k] = byte(uint8(48 + _i % 10)); _i /= 10; } // برگرداندن ورودی // string به شکل return string(bstr); } } |
پارامترهای (Parameters) Function ها در سالیدیتی
همانطور که گفتیم، امکان ارسال پارامترهای مختلف در زمان فراخوانی یک تابع وجود دارد. یک تابع میتواند چندین پارامتر را بگیرد که با کاما از هم جدا شده اند.
در مثال زیر از یک تابع toString استفاده شده است، این تابع یک پارامتر گرفته است.
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 |
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Test { function getResult(uint num1, uint num2) public pure returns(string memory){ uint result = num1 + num2; return toString(result); } function toString(uint _i) internal pure returns (string memory) { if (_i == 0) { return "0"; } uint j = _i; uint length; while (j != 0) { length++; j /= 10; } bytes memory newLength = new bytes(length); uint k = length; while (_i != 0) { k -= 1; bstr[k] = byte(uint8(48 + _i % 10)); _i /= 10; } return string(newLength); } } |
دستور Return توابع در سالیدیتی
دستور بازگشت (return statement) یک دستور یا عبارت اختیاری است که توسط solidity ارائه میشود. این آخرین دستور تابع است که برای برگرداندن مقادیر از توابع استفاده میشود. در سالیدیتی بیشتر از یک مقدار را میتوان از یک تابع برگرداند. برای برگرداندن مقادیر تابع، انواع دادههای مقادیر بازگشتی باید در اعلان تابع تعریف شوند.
اگر میخواهید مقداری را از یک تابع برگردانید، این مورد ضروری است. این دستور باید آخرین عبارت در یک تابع باشد.
در زبان برنامه نویسی سالیدیتی یک تابع میتواند چندین مقدار را نیز برگرداند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Test { // تعریف تابعی برای برگردادن // نتیجه ضرب و جمع دو عدد function getResult() public pure returns(uint, uint){ // تعریف // local variables uint a = 1; uint b = 2; uint mul = a * b; uint sum = a + b; return (mul, sum); } } |
انواع توابع در سالیدیتی
در سالیدیتی دو نوع تابع وجود دارد که به ترتیب زیر است :
- توابعی که ایجاد کننده تراکنش در بلاک چین هستند. (مانند تابع بازگشتی Fallback Function)
- توابعی که ایجاد کننده تراکنش در بلاک چین نیستند. (مانند توابع view و pure)
برای درک بهتر، کد قرارداد زیر که MyFirstContract نام دارد را در محیط ریمیکس امتحان کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract MyFirstContract { // تعریف // state variable string private name; // تعریف تابعی برای // name برای ست کردن function setName(string memory newName) public { name = newName; } // تعریف تابعی برای // name گرفتن function getName () public view returns (string memory) { return name; } } |
تابع بازگشتی Fallback Function چیست؟
این تابع یکی از انواع توابع در سالیدیتی است که نقشی مهم و حیاتی برای ایجاد و اجرای قراردادهای هوشمند دارد. این تابع را میتوان با ویژگیهای زیر تعریف کرد :
- این تابع هیچ نامی ندارد.
- این تابع وقتی کاربر تابعی را فراخوانی کند که در دسترس نیست، اجرا میشود.
- در هر قرارداد هوشمند فقط یکبار میتوان این تابع را تعریف کرد.
- این تابع باید قابل پرداخت (payable) علامتگذاری شود تا بتوان اتر دریافت کرد.
- این تابع باید خارجی (external) علامتگذاری شود.
تابع بازگشتی Fallback Function را با استفاده از هر دو دستور زیر و در هر دو بدون استفاده از کلمه کلیدی function میتوان اعلام کرد.
- fallback () external [payable]
- fallback (bytes calldata _input) external [payable] returns (bytes memory _output)
جمع بندی
مانند هر زبان برنامه نویسی پیشرفته دیگری، Solidity نیز از تمام ویژگیهای لازم برای نوشتن کدهای مدولار با استفاده از توابع پشتیبانی میکند. توابع در سالیدیتی گروهی از کدها هستند که میتوان آنها را چندین بار و در هر نقطهای از برنامه اجرا کرد و به این ترتیب در حافظه و زمان اجرای برنامه صرفهجویی کرد.
منابع معتبر مرتبط:
https://www.geeksforgeeks.org/solidity-functions
https://medium.com/@yangnana11/solidity-function-types-4ad4e5de6d56
مطالب زیر را حتما مطالعه کنید
بررسی رفتار توابع View و Pure در سالیدیتی Solidity
توابع Payable در قراردادهای هوشمند Solidity
سالیدیتی Solidity چیست؟
سطح دسترسی Visibility در سالیدیتی Solidity
انواع حافظه در قرارداد هوشمند سالیدیتی
استفاده از Import در سالیدیتی Solidity
8 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
این مطلب حرف نداشت
مطلب به درد بخوری بود
مثل همیشه عالی و کاربردی
چطوری می تونم باهاتون ارتباط بر قرار کنم؟
خیلی محتوای کامل و عالی بود
منابع این مطلب کجاست؟
خیلی ممنون از توضیحات خوبتون
خیلی محتوای خوبی بود مهندس