آنچه در این مقاله میخوانید [پنهانسازی]
استفاده از الگوهای دیزاین پترن در قراردادهای هوشمند میتواند به خوانایی، قابلیت استفاده مجدد، و نگهداری بهتر کد کمک کند. در اینجا چند الگوی طراحی متداول و نحوهی استفاده از آنها در قراردادهای هوشمند ارائه میشود.
سرفصل های مقاله
۱. الگوی Singleton
توضیح: این الگو تضمین میکند که فقط یک نمونه از یک قرارداد وجود داشته باشد و یک نقطه دسترسی جهانی به آن ارائه دهد.
استفاده: این الگو معمولاً برای توسعه قراردادهایی که باید وضعیت جهانی را مدیریت کنند، مانند قراردادهای مدیریت توکن یا قراردادهای احراز هویت، به کار میرود.
pragma solidity ^.8.;
contract Singleton {
static Singleton instance;
constructor() {
require(instance == address(), "Contract already deployed.");
instance = this;
}
function getInstance() public view returns (address) {
return instance;
}
}
۲. الگوی Factory
توضیح: این الگو به توسعهدهندگان اجازه میدهد تا چندین نمونه از یک قرارداد را با استفاده از یک تابع تولید کنند.
استفاده: الگوی Factory برای ایجاد قراردادهای توکن یا سایر انواع قرارداهای مشابه بسیار مفید است.
pragma solidity ^.8.;
contract Token {
string public name;
string public symbol;
constructor(string memory _name, string memory _symbol) {
name = _name;
symbol = _symbol;
}
}
contract TokenFactory {
Token[] public tokens;
function createToken(string memory _name, string memory _symbol) public {
Token newToken = new Token(_name, _symbol);
tokens.push(newToken);
}
}
۳. الگوی Proxy
توضیح: الگوی Proxy به شما این امکان را میدهد که یک قرارداد را به صورت جداگانه (پروکسی) تغییر دهید، در حالی که وضعیت آن قرارداد بدون تغییر باقی میماند.
استفاده: این الگو بخصوص در اپلیکیشنهای بزرگ که نیاز به ارتقاء و تغییر دارند، مفید است.
pragma solidity ^.8.;
contract Proxy {
address public implementation;
constructor(address _implementation) {
implementation = _implementation;
}
fallback () external {
(bool success, ) = implementation.delegatecall(msg.data);
require(success, "Delegate call failed.");
}
}
۴. الگوی Pausable
توضیح: این الگو به قرارداد اجازه میدهد تا در صورت وجود شرایط خاصی، اجرای توابع را متوقف کند (غیرفعال کند).
استفاده: برای مواردی که نیاز به توقف موقت توابع قرارداد وجود دارد، مانند امنیت در صورت بروز حملات.
pragma solidity ^.8.;
contract Pausable {
bool public paused;
modifier whenNotPaused() {
require(!paused, "Contract is paused.");
_;
}
function pause() public {
paused = true;
}
function unpause() public {
paused = false;
}
}
۵. الگوی Ownable
توضیح: این الگو به یک قرارداد اجازه میدهد تا یک مالک مشخص داشته باشد که دسترسی ویژهای به برخی توابع داشته باشد.
استفاده: مفید برای قراردادهایی که نیاز به دسترسی کنترلشده دارند.
pragma solidity ^.8.;
contract Ownable {
address public owner;
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "Caller is not the owner");
_;
}
function transferOwnership(address newOwner) public onlyOwner {
owner = newOwner;
}
}
نتیجه گیری
استفاده از الگوهای دیزاین پترن در قراردادهای هوشمند میتواند به صورت قابل توجهی کیفیت کد و نگهداری قراردادها را بهبود بخشد. این الگوها به توسعهدهندگان این امکان را میدهد که به سادگی قراردادها را گسترش داده و تغییر دهند و در عین حال از ثبات و امنیت قراردادهای خود اطمینان حاصل کنند.