《Solidity笔记》修饰器modifier

119 阅读1分钟

Solidity 中的修饰器(modifier)是一种用于在函数执行前或执行后自动添加逻辑的高级特性,有助于减少代码重复并提高可读性和安全性。

1. 定义修饰器

修饰器通过 modifier 关键字定义,内部的 _ 代表被修饰函数的执行位置。

示例:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract ModifierExample {
    address public owner;

    constructor() {
        owner = msg.sender;
    }

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

    function changeOwner(address newOwner) public onlyOwner {
        owner = newOwner;
    }
}

2. 使用修饰器

修饰器可在函数定义中调用,并且可以堆叠使用。

示例:

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

modifier validAddress(address _address) {
    require(_address != address(0), "Invalid address");
    _;
}

function changeOwner(address newOwner) public onlyOwner validAddress(newOwner) {
    owner = newOwner;
}

3. 应用场景

3.1 访问控制

确保只有特定账户可以调用某些函数。

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

3.2 输入验证

验证函数输入参数。

modifier validAmount(uint256 amount) {
    require(amount > 0, "Amount must be greater than zero");
    _;
}

3.3 状态检查

确保在特定状态下调用函数。

enum ContractState { Active, Paused, Closed }
ContractState public state;

modifier whenNotPaused() {
    require(state != ContractState.Paused, "Contract is paused");
    _;
}

4. 总结

修饰器是 Solidity 中强大的工具,通过合理使用修饰器,可以实现访问控制、输入验证和状态检查,提升智能合约的安全性和可维护性。