برای مدیریت دسترسی با Access Control در سالیدیتی، استفاده از الگوهای «Access Control» بسیار مهم است. این الگوها به شما اجازه می‌دهند تا دسترسی به بخش‌های مختلف قرارداد را به صورت کنترل‌ شده مدیریت کنید. در ادامه چند روش رایج برای پیاده‌سازی کنترل دسترسی در Solidity را توضیح می‌دهم:

1. استفاده از Ownable

راهکار معمول و ساده برای مدیریت دسترسی، استفاده از قرارداد Ownable از کتابخانه OpenZeppelin است. این قرارداد به شما اجازه می‌دهد که مالکیت قرارداد را به یک شخص خاص تخصیص دهید. مالک قرارداد می‌تواند عملیات‌های حساس را انجام دهد.

مثال:

// SPDX-License-Identifier: MIT
pragma solidity ^.8.;

import "@openzeppelin/contracts/access/Ownable.sol";

contract MyContract is Ownable {
    function sensitiveFunction() public onlyOwner {
        // فقط مالک می‌تواند این عملیات را انجام دهد
    }
}

2. استفاده از Roles

گاهی نیاز دارید که دسترسی‌ها را به چندین کاربر اختصاص دهید. این کار می‌تواند با استفاده از نقشه‌ها و نقش‌های مختلف انجام شود.

مثال:

// SPDX-License-Identifier: MIT
pragma solidity ^.8.;

contract AccessControl {
    mapping(address => bool) private admins;

    modifier onlyAdmin() {
        require(admins[msg.sender], "Not an admin");
        _;
    }

    function addAdmin(address account) public onlyAdmin {
        admins[account] = true;
    }

    function removeAdmin(address account) public onlyAdmin {
        admins[account] = false;
    }

    function sensitiveFunction() public onlyAdmin {
        // فقط ادمین‌ها می‌توانند این کار را انجام دهند
    }
}

آموزش سالیدیتی

3. استفاده از کتابخانه OpenZeppelin’s AccessControl

این روش به شما امکان می‌دهد نقش‌های پیچیده‌تری را پیاده‌سازی کنید. با دسترسی‌های متنوع می‌توانید گروه‌های مختلف با دسترسی‌های متفاوت تعیین کنید.

مثال:

// SPDX-License-Identifier: MIT
pragma solidity ^.8.;

import "@openzeppelin/contracts/access/AccessControl.sol";

contract MyContract is AccessControl {
    bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
    bytes32 public constant USER_ROLE = keccak256("USER_ROLE");

    constructor() {
        _setupRole(ADMIN_ROLE, msg.sender);
        _setRoleAdmin(USER_ROLE, ADMIN_ROLE);
    }

    function addUser(address account) public {
        grantRole(USER_ROLE, account);
    }

    function sensitiveFunction() public onlyRole(ADMIN_ROLE) {
        // فقط کاربران با نقش ADMIN_ROLE می‌توانند
    }
}

نکات مهم:

  • مدیریت نقش‌ها: اطمینان حاصل کنید که نقش‌ها متناسب با کارکردهای مورد نظرتان تعریف شده‌اند.
  • کنترل مالکیت: انتقال مالکیت و دسترسی باید با دقت فراوان انجام شود تا از نفوذ و حملات احتمالی جلوگیری شود.
  • بازبینی امنیتی: پس از پیاده‌سازی کنترل‌های دسترسی، کدهای خود را به دقت بررسی کنید و از ابزارهای امنیتی استفاده کنید.

مدیریت دسترسی با Access Control در سالیدیتی و این الگوها به شما کمک می‌کنند تا دسترسی‌ها را به شکل ایمن و قابل مدیریت در پروژه‌های Solidity خود پیاده‌سازی کنید.