انواع توابع در سالیدیتی
سلام دوستان سالیدیتی کد با توابع در سالیدیتی آشنایی دارید ؟!!! در این مقاله قصد داریم تا انواع توابع در سالیدیتی را بررسی کنیم. اگر با سالیدیتی آشنایی ندارید پیشنهاد می کنیم ابتدا مقالات آموزش جامع سالیدیتی و یا سالیدیتی چیست را ببینید. همانطور که احتمالا می دانید سالیدیتی محبوب ترین زبان برنامه نویسی بلاکچین است و این روز ها جزو پر درآمد ترین مهارت های حوزه برنامه نویسی در دنیا شناخته می شود ما در مقاله ای به صورت مفصل درآمد برنامه نویسی سالیدیتی و بلاکچین را بررسی کرده ایم که پیشنهاد می کنیم حتما آن مقاله را نیز مطالعه کنید اما اگر از قبل با این مهارت پولساز آشنایی دارید همراه ما باشید تا توابع بازگشتی سالیدیتی را بررسی کنیم. این توابع اهمیت ویژه ای در برنامه نویسی سالیدیتی دارند.
تابع بازگشتی (Fallback Function)
زبان سالیدیتی ویژگی های منحصر به فردی دارد که این زبان را از برخی زبان های برنامه نویسی بلاکچین مثل Serpent و Mutan جدا می کند. solidity از متغیر های پیچیده و ساختار های سلسله مراتبی دلخواه پشتیبانی می کند. در عین حال این زبان شباهت های زیادی به زبان C++ دارد که یادگیری و درک آن را برای کسانی که قصد یادگیری سالیدیتی به عنوان اولین زبان برنامه نویسی را دارند آسان می کند. سالیدیتی نیز مانند خیلی از زبان های برنامه نویسی دارای متغیر،توابع، عملیات های حسابی و دیگر مفاهیم پر کاربرد است.
یکی از مهمترین توابع در Solidity که قصد داریم بررسی کنیم تابع بازگشتی (Fallback Function) است.
تابع بازگشتی در سالیدیتی (Fallback Function) چیست؟
به طور کلی تابع بازگشتی در برنامه نویسی به تابعی گفته می شود که خودش را فراخوانی می کند و به همین دلیل است که به آن بازگشتی می گویند چون دائما در حال فراخوانی خودش است تا زمانی که شرط خاصی برقرار شود.
تابع بازگشتی در solidity زمانی اجرا می شود که قرارداد هوشمند اتر را بدون داده اضافه دریافت کند و یا تابعی را فراخوانی کنیم که در قرارداد وجود ندارد. برای اینکه قرارداد شما اتر را دریافت کند و به کل موجودی قرارداد اضافه شود، باید یک تابع بازگشتی وجود داشته باشد و باید به عنوان قابل پرداخت اعلام شود. اگر این تابع وجود نداشته باشد، قرارداد نمی تواند اتر را دریافت کند و یک استثنا ایجاد می کند. اگر این تابع را ندارید و قرارداد اتر دریافت می کند، برای فرستنده بازگردانده می شود.
یک قرارداد می تواند یک تابع بدون نام داشته باشد. این تابع نمی تواند هیچ آرگومانی داشته باشد، نمی تواند چیزی را برگرداند و باید به صورت external تعریف شود. این تابع زمانی اجرا می شود که هیچ یک از توابع دیگر با شناسه تابع داده شده مطابقت نداشته باشد (یا هیچ داده ای در پیام تراکنش ارائه نشده باشد).
مانند هر تابع Solidity دیگر، تابع بازگشتی می تواند تا زمانی که گس کافی برای انجام تراکنش وجود داشته باشد، عملیات پیچیده را اجرا کند.
با توجه به تعاریف تابع بازگشتی در سالیدیتی ویژگی هایی دارد
ویژگی های تابع بازگشتی:
- نمی تواند نام داشته باشد.
- هیچ ورودی و خروجی نمی تواند داشته باشد
- باید به عنوان external اعلام شود
- برای دریافت اتر باید به عنوان Payable اعلام شود
- 2300 گس از Transfer و Send دریافت می کند و در هنگام استفاده از روش Call می تواند گس بیشتری دریافت کند
توابع بازگشتی در سالیدیتی تنها می تواند به مقدار کمی گس در دسترس (2300 gwei) تکیه کند که فضای کمی برای انجام هر عملیات دیگری به جز ثبت اولیه ایجاد می کند. عملیات زیر بیشتر از سهمیه گس 2300 گس مصرف می کند.
- در صورتی که هیچ یک از توابع مخالف با شناسه تابع مطابقت نداشته باشد. به عبارتی دیگر اگر شناسه تابع با هیچ یک از عملکردهای موجود در قرارداد هوشمند مطابقت نداشته باشد
- در صورتی که هیچ داده ای همراه با فراخوانی تابع ارائه نشده باشد
- زمانی که قرارداد اِتر ، ساده و بدون داده باشد
البته در باید به این نکته توجه کنید که توابع بازگشتی در سالیدیتی برای دریافت اتر و اضافه کردن آن به موجودی قرارداد باید به عنوان “قابل پرداخت یا Payable ” نشانه گذاری شوند و همچنین این تابع هیچ چیزی را بر نمی گرداند و هیچ آرگومانی نیز ندارد در نتیجه به صورت external نیز تعریف میگردد.
پس همانطور که در بالا اشاره شد در هر قرارداد حداکثر یک تابع بازگشتی می تواند وجود داشته باشد و مثل دیگر توابع در solidity زمانی می تواند اجرا شود که گس کافی به آن ارسال شده باشد. همچنین از ویژگی های تابع بازگشتی در سالیدیتی این است که نهایتا ۲۳۰۰ گس می تواند دریافت کند در نتیجه نمی تواند عملیات هایی که نیاز به گس بیشتری دارند را اجرا کند.
توابع بازگشتی در سالیدیتی به عنوان یک سوپاپ امنیتی عمل می کنند چرا که توابع بازگشتی در صورتی اجرا می شوند که یک قرارداد خاص ، اِتر را بدون هیچ داده دیگری مرتبط با تراکنش دریافت کند. این طراحی پیش فرض معقول است و موجب محافظت از کاربران می شود.
مثالی از توابع بازگشتی در سالیدیتی Solidity
تکه کد زیر مثالی از تابع بازگشتی در سالیدیتی است :
pragma solidity ^0.5.12;
// contract with fallback function
contract A {
uint n;
function set(uint value) external {
n = value;
}
function() external payable {
n = 0;
}
}
// contract to interact with contract A
contract example {
function callA(A a) public returns (bool) {
// calling a non-existing function
(bool success,) = address(a).call(abi.encodeWithSignature("setter()"));
require(success);
// sending ether to A address payable
payableA = address(
uint160(address(a))
);
return (payableA.send(2 ether));
}
}
تابع payable در سالیدیتی
یکی دیگر از توابع در سالیدیتی تابع payable است یا همان تابع قابل پرداخت در سالیدیتی.
زمانی که می خواهید یک قرارداد هوشمند بنویسید لازم است تا مطمئن شوید که پول به قزارداد و خارج از آن فرستاده می شود. payable این کار را برای شما به انجام می رساند. هر تابع در سالیدیتی با این اصلاح کننده به شما ضمانت می دهد که تابه می تواند اتر را بفرستد و بگیرد. این تابع می تواند تراکنش های اتری که صفر نباشند را پردازش نماید؛ اما هر تراکنش با اتر صفر را قبول نمی کند. به علاوه چنانچه تابعی را جهت پردازش کردن تراکنش ها خواستار هستید، اما واژه کلیدی قابل پرداخت را وارد نکردید تراکنش به خود به خود رد می شود
سالیدیتی کد را در اینستاگرام دنبال کنید
دیدگاهتان را بنویسید