3分钟Solidity: 4.6 函数修饰符

34 阅读1分钟

如需获取本内容的最新版本,请参见 Cyfrin.io 上的函数修饰符(代码示例)

修饰符是在函数调用之前和/或之后可以运行的代码。

修饰符可用于:

  • 限制访问
  • 验证输入
  • 防止重入攻击
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract FunctionModifier {
    // 我们将使用这些变量来演示如何使用修饰符。
    address public owner;
    uint256 public x = 10;
    bool public locked;

    constructor() {
        // 将交易发送者设置为合约的所有者。
        owner = msg.sender;
    }

    // 检查调用者是否为合约所有者的修饰符
    modifier onlyOwner() {
        require(msg.sender == owner, "Not owner");
        // 下划线是一个特殊字符,仅在函数修饰符内部使用,它告诉Solidity执行剩余的代码。
        _;
    }

    //修饰符可以接受输入。这个修饰符会检查传入的地址是否为零地址。
    modifier validAddress(address _addr) {
        require(_addr != address(0), "Not valid address");
        _;
    }

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

    // 修饰符可以在函数之前和/或之后调用。
    // 此修饰符可防止函数在执行期间被重复调用。
    modifier noReentrancy() {
        require(!locked, "No reentrancy");

        locked = true;
        _;
        locked = false;
    }

    function decrement(uint256 i) public noReentrancy {
        x -= i;

        if (i > 1) {
            decrement(i - 1);
        }
    }
}

Remix Lite 尝试一下

solidity-function_modifier


END