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