Skip to content
Solidity

Modifiers и контроль доступа

Переиспользование логики валидации через modifiers.

#modifier#access-control#security

Code

solidity
contract AccessControl {
    address public owner;
    mapping(address => bool) public admins;
    uint256 public pausedAt;

    modifier onlyOwner() {
        require(msg.sender == owner, "Only owner");
        _;
    }

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

    modifier whenNotPaused() {
        require(pausedAt == 0, "Paused");
        _;
    }

    // Reentrancy guard (prevents reentrancy attacks)
    uint256 private _status;
    modifier nonReentrant() {
        require(_status != 2, "Reentrant");
        _status = 2;
        _;
        _status = 1;
    }

    constructor() {
        owner = msg.sender;
        _status = 1;
    }

    function addAdmin(address a) external onlyOwner {
        admins[a] = true;
    }

    function criticalOp() external onlyAdmin whenNotPaused nonReentrant {
        // ... sensitive logic
    }

    function pause() external onlyOwner {
        pausedAt = block.timestamp;
    }
}