توابع در سالیدیتی یکی از ارکان اصلی ساختار قرارداد هوشمند هستند. با استفاده از آنها میتوان عملیات مختلفی را اجرا کرد، دادهها را تغییر داد یا فقط اطلاعات را خواند. در این بخش با تعریف توابع، سطوح دسترسی، modifiers، توابع view و pure، و استفاده از events آشنا میشوید.
در سالیدیتی، توابع بخش اجرایی قرارداد هستند و با کلیدواژه function تعریف میشوند.
ساختار کلی:
function functionName(type param1, type param2) public returns (type) {// Logic}
مثال ساده:
function sum(uint a, uint b) public pure returns (uint) {return a + b;}
در مثال بالا:
sum نام تابع است.public سطح دسترسی است.pure نشان میدهد تابع فقط محاسبه انجام میدهد و دادهای را تغییر نمیدهد.returns (uint) یعنی مقدار خروجی از نوع uint است.
سطوح دسترسی توابع (Visibility)
توابع در سالیدیتی میتوانند سطوح مختلفی از دسترسی داشته باشند:
public : قابل دسترسی برای همه (داخلی و بیرونی)
private : فقط از داخل همین قرارداد قابل فراخوانی است
internal : از داخل همین قرارداد یا قراردادهای ارثبر قابل استفاده است
external : فقط از خارج از قرارداد قابل فراخوانی است
مثال:
function updateData() public { ... }function _calculate() private { ... }function internalHelper() internal { ... }function callFromOutside() external { ... }
Modifiers بلاکهایی از کد هستند که قبل از اجرای توابع اجرا میشوند. برای مثال، بررسی اینکه آیا کاربر مجاز به انجام یک عملیات هست یا نه.
تعریف و استفاده:
modifier onlyOwner() {require(msg.sender == owner, "Not authorized");_;}function withdraw() public onlyOwner {// logic}
در این مثال:modifier onlyOwner بررسی میکند که فقط صاحب قرارداد تابع را اجرا کند._ محل اجرای تابع اصلی پس از بررسی modifier است.
Modifiers در کنترل دسترسی، جلوگیری از حملههای امنیتی (مثل reentrancy) و مدیریت منطق قبل یا بعد از تابع بسیار مفیدند.
view و pureبرای مشخص کردن اینکه تابع با دادههای بلاکچین کار میکند یا نه، از این دو نوع استفاده میکنیم:
view: توابعی که فقط داده را میخوانند و آن را تغییر نمیدهند.
function getBalance() public view returns (uint) {return balance;}
pure: توابعی که نه دادهای میخوانند و نه تغییر میدهند. فقط محاسبه انجام میدهند.
function multiply(uint x, uint y) public pure returns (uint) {return x * y;}
نکته: این دو نوع تابع هیچ هزینه گسی (gas) برای کاربر ندارند، مگر اینکه تراکنش ارسال شود.
رویدادها مکانیزمی برای ثبت اتفاقات مهم در بلاکچین هستند که توسط کیفپولها یا برنامههای وب (dApp) مانیتور میشوند.
تعریف رویداد:
event Transfer(address indexed from, address indexed to, uint amount);
فراخوانی رویداد:
function send(address to, uint amount) public {// logic...emit Transfer(msg.sender, to, amount);}
مزایا:
لاگهای ثبتشده در بلاکچین را فراهم میکنند.
امکان مانیتورینگ تراکنشها توسط اپلیکیشنها و ناظران.
کمک به شفافسازی رفتار قرارداد.
indexed در تعریف رویداد به جستجوی آسانتر رویدادها در بلاکچین کمک میکند.
در این بخش با مفاهیم حیاتی زیر آشنا شدیم:
- نحوه تعریف و استفاده از توابع در سالیدیتی
- سطوح دسترسی توابع (public، private، internal، external)
- استفاده از modifiers برای کنترل دسترسی و منطق اضافی
- توابع view و pure برای خواندن یا محاسبه بدون تغییر وضعیت
- کاربرد events برای ثبت و دنبالکردن فعالیتهای قرارداد
درک عمیق این مفاهیم پایه، شرط لازم برای توسعه قراردادهای حرفهای، ایمن و مقیاسپذیر در بلاکچین است.