Solidity 函数修饰符 (Modifier)
在 Solidity 中,函数修饰符(Modifier) 是一种用于增强函数行为的可重用代码块。它们可以在函数执行前后自动执行特定的逻辑,常用于权限控制、输入验证、防止重入等场景,从而提高代码的模块化和可读性。
内置修饰符
Solidity 本身提供了一些内置修饰符,通常用于控制函数的可见性或行为:
- 可见性修饰符:
public:合约内外均可调用。private:仅当前合约内部可调用。internal:当前合约及派生合约内部可调用。external:仅外部可调用(内部调用需使用this.f())。
- 状态可变性修饰符:
view:承诺不修改状态(可读取状态)。pure:承诺既不读取也不修改状态(纯计算)。payable:允许函数接收以太币。
- 其他修饰符:
virtual:标记函数/修饰符可被重写。override:显式重写父合约的函数/修饰符。abstract:标记合约包含未实现的函数。
自定义修饰符
使用 modifier 关键字定义自定义修饰符,并在函数声明中通过修饰符名引用。
基本语法
modifier onlyOwner() {
require(msg.sender == owner, "Not owner");
_; // 占位符,表示被修饰函数的代码将在此处插入
}
function changeOwner(address newOwner) public onlyOwner {
owner = newOwner;
}
_;是占位符,代表被修饰函数体的插入位置。- 可以在
_;前后编写代码,实现'前置'或'后置'逻辑。
带参数的修饰符
修饰符可以接受参数,增强灵活性。
modifier minAmount(uint amount) {
require(msg.value >= amount, "Insufficient payment");
_;
}
function deposit() public payable minAmount(1 ether) {
// 存款逻辑
}
执行顺序
当一个函数应用多个修饰符时,执行顺序为:修饰符按声明顺序依次执行,每个修饰符内的代码在遇到 _; 时暂停,并进入下一个修饰符或函数体。
modifier mod1() {
// 前置代码 A
_;
// 后置代码 A
}
modifier mod2() {
// 前置代码 B
_;
// 后置代码 B
}
function foo() public mod1 mod2 {
// 函数体
}
执行顺序:
mod1的前置代码 Amod2的前置代码 B- 函数体
mod2的后置代码 Bmod1的后置代码 A

