در این بخش از آموزش سالیدیتی، با مفاهیم پیشرفتهای آشنا میشویم که برای توسعه قراردادهای هوشمند پیچیده و حرفهای بر بستر بلاکچین اتریوم ضروری هستند. این موارد شامل ارثبری، اینترفیس و قراردادهای انتزاعی، کتابخانهها، مدیریت خطا و بهینهسازی گس (Gas Optimization) میشود. اگر به دنبال ارتقای مهارت خود در توسعه Web3 هستید، ادامه این مطلب را از دست ندهید.
سالیدیتی یک زبان شیگرا است و از مفهوم ارثبری (Inheritance) بهخوبی پشتیبانی میکند. این ویژگی به شما اجازه میدهد منطق مشترک را در یک قرارداد پایه تعریف کرده و سپس آن را در قراردادهای دیگر به ارث ببرید.
مثال:
// قرارداد پایه
contract Animal { function speak() public pure returns (string memory) { return "I am an animal"; }}// قرارداد مشتقشدهcontract Dog is Animal { function bark() public pure returns (string memory) { return "Woof!"; }}در مثال بالا، قرارداد Dog از Animal ارثبری میکند و میتواند به تابع speak() نیز دسترسی داشته باشد.
نکات مهم:
میتوان از چندین قرارداد بهصورت همزمان ارثبری کرد (Multiple Inheritance).
برای حل تعارض در ارثبری چندگانه از ترتیب تعریف استفاده میشود.
از super برای صدا زدن متدهای قرارداد پایه استفاده میشود.
در سالیدیتی، برای تعریف ساختارهای قابل توسعه و جداسازی لایهها از Interface و Abstract Contract استفاده میشود.
Interface
یک Interface فقط شامل امضای توابع است و هیچ پیادهسازی ندارد. از آن برای تعیین قراردادهایی استفاده میشود که باید توسط سایر قراردادها پیادهسازی شوند.
interface IToken {function transfer(address to, uint256 amount) external returns (bool);}
Abstract Contracts
قراردادهایی که دارای توابع تعریفشده بدون پیادهسازی هستند. نمیتوان آنها را مستقیماً دیپلوی کرد و باید توسط قراردادهای دیگر تکمیل شوند.
abstract contract Shape {function area() public view virtual returns (uint);}
کتابخانهها در سالیدیتی قراردادهایی هستند که برای استفاده مجدد از کد نوشته میشوند و قابل دیپلوی بهصورت مستقل هستند. کتابخانهها نمیتوانند وضعیت (state) ذخیره کنند.
مزایا:
کاهش هزینه گس
سازماندهی بهتر کد
جلوگیری از تکرار
مثال:
library Math {function add(uint a, uint b) internal pure returns (uint) {return a + b;}}contract Calculator {using Math for uint;function sum(uint x, uint y) public pure returns (uint) {return x.add(y);}}
در سالیدیتی از سه دستور برای مدیریت خطا استفاده میشود:
require: برای اعتبارسنجی ورودیها و شرایط پیششرط. اگر برقرار نباشد، تراکنش برگشت میخورد و گس باقیمانده بازگردانده میشود.
require(balance >= amount, "Insufficient balance");
revert: برای بازگرداندن تراکنش با پیام خطا در بخشهای پیچیدهتر.
if (someCondition) {revert("Something went wrong");}
assert: برای بررسی خطاهای منطقی برنامهنویس؛ استفاده نادرست از آن میتواند منجر به از بین رفتن گس شود.
assert(totalSupply >= balance);
بهینهسازی مصرف گس (Gas Optimization)
بهینهسازی مصرف گس به کاهش هزینههای اجرای قرارداد کمک میکند. برخی روشهای رایج شامل موارد زیر است:
بهترین شیوهها:
استفاده از uint256 به جای انواع کوچکتر برای جلوگیری از Padding.
ذخیره دادهها در حافظه (memory) بهجای وضعیت (storage) تا حد امکان.
فشردهسازی دادهها با Struct یا Bit Packing در صورت لزوم.
اجتناب از حلقههای سنگین در توابع on-chain.
استفاده از رویدادها (Events) به جای ذخیرهسازی در بلاکچین.
آشنایی با مفاهیم پیشرفته سالیدیتی مانند ارثبری، اینترفیسها، کتابخانهها، مدیریت خطا و بهینهسازی گس، پایهای محکم برای توسعه قراردادهای حرفهای فراهم میکند. رعایت این نکات باعث افزایش کارایی، امنیت و مقیاسپذیری قراردادهای هوشمند شما میشود.