Skip to content

Latest commit

 

History

History
118 lines (83 loc) · 3.91 KB

File metadata and controls

118 lines (83 loc) · 3.91 KB

函数修饰符

函数修饰符是在 Solidity 中为了简化代码而引入的一个功能。

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

它们可以被用来修改函数的行为。

  • 限制访问
  • 验证输入
  • 防止重入攻击

例如,可以使用函数修饰符来验证调用者是否有足够的权限来执行某个特定的操作。这样就避免了在每个需要权限验证的函数中重复编写相同的代码。

语法

函数修饰符由关键字 modifier 开始,后跟修饰符名称和代码块。如果修饰符需要参数,则需要在修饰符名称后添加括号。

以下是一个简单的函数修饰符示例:

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

contract FunctionModifier {  // 定义了名为 FunctionModifier 的智能合约
    address public owner;
    uint public x = 10;
    bool public locked;

    constructor() {
        owner = msg.sender;
    }

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

    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(uint i) public noReentrancy {
        x -= i;

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

在上面的例子中,我们定义了一个名为 onlyOwner 的函数修饰符。当被此修饰符修饰的函数被调用时,它将首先验证调用者是否等于合约的所有者地址。如果不是,则抛出一个错误。

注意,在修饰符中使用 _ 执行被修饰函数的原始代码。这相当于在被修饰函数中插入修饰符的代码块。

多个修饰符

可以为单个函数定义多个修饰符。在这种情况下,它们的执行顺序与它们在函数定义中出现的顺序相同:

function someFunction() public onlyOwner anotherModifier {
  // code that can only be called by the contract owner and with the condition of the another modifier
}

内置修饰符

Solidity 提供了一些内置的函数修饰符,例如 pureview。这些修饰符用于声明一个函数只读取状态或不更改状态。这样做可以让 Solidity 编译器进行一些优化,并且使代码更加清晰。

以下是 pureview 修饰符的示例:

function multiply(uint a, uint b) public pure returns (uint) {
  return a * b;
}

function getBalance(address account) public view returns (uint) {
  return account.balance;
}

在上面的示例中,我们使用了 pure 修饰符来声明 multiply 函数不会修改合约状态。同样,我们也使用了 view 修饰符来声明 getBalance 函数只读取合约状态。

自定义修饰符

除了使用内置的修饰符,您还可以创建自己的修饰符。这可以通过编写一个函数,在函数头部添加 modifier 关键字并定义修饰符的行为来实现。

以下是一个自定义修饰符的示例:

modifier onlyBefore(uint _time) {
  require(block.timestamp < _time, "Function can only be called before specified time");
  _;
}

function someFunction() public onlyBefore(someTimestamp) {
  // code that can only be called before someTimestamp
}

在上面的示例中,我们定义了一个名为 onlyBefore 的自定义修饰符。此修饰符将验证当前块时间是否早于函数参数中指定的时间戳。如果是,则执行原始代码。

总结

函数修饰符是 Solidity 中一种有用的功能,可以用来修改函数的行为,例如权限检查或状态访问。您可以使用内置的修饰符,也可以创建自己的修饰符来满足特定的需求。