文章目录
- solidity的modifier修饰符
-
- 什么是modifier修饰符
- 定义修饰符
-
- onlyOwner示例
- [定义isOwner,确保只有 NFT 的所有者才能执行相应的操作](#定义isOwner,确保只有 NFT 的所有者才能执行相应的操作)
- 参考
solidity的modifier修饰符
什么是modifier修饰符
修饰器(modifier)是solidity特有的语法,类似于面向对象编程中的decorator,声明函数拥有的特性,并减少代码冗余。
Solidity 中关键字 modifier 用于声明一个函数修改器。当它作用于一个函数上,可以在函数执行前或后(依赖于具体实现)预先执行modifier中的逻辑。
结合现实场景中的应用。在一些敏感操作中,我们需要设定特定的权限才允许执行相关操作;再者我们可以利用函数修改器进行数据的校验;
常用于如:检查输入条件、权限控制、重入控制、防止重复初始化等场景。
定义修饰符
函数修改器的定义语法如下:
javascript
modifier 修改器名 {
条件体..
_;
}
function a() 修改器名 {
函数体..
}
函数修改器中有一行代码只有下划线 _ ,在实际执行中,我们可以将被修饰函数的代码视为下划线处的代码。即,下划线实际上帮我们标记了被modifier修饰函数的执行位置。
onlyOwner示例
javascript
pragma solidity >=0.8.0;
contract owned {
function owned() public { owner = msg.sender; }
address owner;
modifier onlyOwner {
require(msg.sender == owner, "Only owner can call this function.");
_;
}
function transferOwner(address _newO) public onlyOwner {
owner = _newO;
}
}
在这个示例中,onlyOwner修饰器用于限制只有合约所有者可以调用该函数。如果条件满足就继续往下走,不满足返回字符串"Not owner"。
"_;" 表示在执行修饰器之后将控制流交给被修饰函数的实际执行代码块。
定义isOwner,确保只有 NFT 的所有者才能执行相应的操作
javascript
modifier isOwner(
address nftAddress,
uint256 tokenId,
address spender
) {
IERC721 nft = IERC721(nftAddress);
address owner = nft.ownerOf(tokenId);
if (spender != owner) {
revert NotOwner();
}
_;
}
它接受三个参数:NFT 地址、NFT 的标识符和调用者地址,并在调用者不是 NFT 的所有者时回滚事务。这个修饰器的逻辑清晰简洁,可以有效地确保只有 NFT 的所有者才能执行相应的操作。
参考
[推荐,视频讲解清晰]【20】Solidity的modifier函数修改器