【solidity】函数修饰器(Function Modifiers)

news/2024/11/23 22:56:46/

修饰符可用于以声明方式更改函数的行为。例如,您可以使用修饰符在执行函数之前自动检查条件。

检查调用者权限

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;contract Owned {address public owner;uint256 public account;constructor() {owner = msg.sender;account = 0;}function updateAccount(uint256 _account) public {if(msg.sender == owner) {account = _account;}}
}

在Owned合约中,通过构造函数指定了owner为合约调用者地址,同时updateAccount方法中添加了if判断,如果当前合约调用者是部署合约的人地址,则正确修改全局变量account值,如果不是,则不能修改(此过程不会报错)。虽说这种方法可以达到目的,但有多个方法需要的话,代码复用率是非常低的。使用函数修饰器就很方便地解决这个问题,通过关键字modifier定义。

 modifier onlyOwner {require(msg.sender == owner, "Only owner can call this function.");_;}function updateAccount(uint256 _account) public onlyOwner {     account = _account;}

在定义onlyOwner出现的特殊符号 `_`,是使用该修饰器的函数体插入位置。 ‘_’符号可多次出现,替换成对应的函数体即可。

如果owner满足要求,则执行相关函数,若不满足,则抛出错误信息(如下图)。

 

修饰器传参

假如还有个需求,当我在调用updateAccount方法修改account值时,必须确保修改的值大于1000才行。那么此时我们再添加个修饰器,不过这个有点特殊,它带了参数。

    modifier validAccount(uint256 _account) {require(_account > 1000, "Invalid account, should be greater than 1000!");_;}function updateAccount(uint256 _account) public onlyOwner validAccount(_account) {     account = _account;}

否则报错,提示信息如下:

 

一个函数可能要做多种检查,多个修饰器以空格分隔来应用于函数,并按呈现的顺序进行检验。 

修饰器不能隐式访问或更改它们修改的函数参数和返回值。它们的值只能在调用时显式传递给它们。从修饰器或函数体显式返回仅保留当前修饰符或函数体。返回变量被赋值,控制流在修饰器中的 ‘_’ 之后继续执行。

修饰器执行顺序 

最后呢,出个迷惑题给你们解决。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;contract modifierTest {address public owner;uint256 public a; // (1)最终a的值是多少???constructor() {owner = msg.sender;}function test(uint num) public checkPara(num) returns(uint256) {a = 10;return a; // (2)返回的a是多少???}modifier checkPara(uint number) {a = 1;_;a = 100;}
}

有兴趣的同学可以尝试编译部署下,看看答案是不是自己心中所想的一样。

参考:Contracts — Solidity 0.8.11 documentation 

           solidity教材配套视频讲解(里边有迷惑题的详细解答哦!)     


http://www.ppmy.cn/news/883747.html

相关文章

ModifyStyle()调用不起作用

现象&#xff1a;在使用WTL做CListBox子类化时&#xff0c;使用 ModifyStyle(0, LBS_OWNERDRAWFIXED)不起作用; 原因&#xff1a;并不是所有的风格都可以动态利用ModifyStyle/ModifyStyleEx()函数增加和去除&#xff0c;有些风格比如 LBS_HASSTRINGS | LBS_OWNERDRAWFIXED| LB…

$(...).modal is not a function的解决办法

最近在练习ssm框架的时候遇到了一个小问题&#xff0c;无法识别bootstrap.min.js的modal方法&#xff0c;控制台报错$(...).modal is not a function。 于是测试测试了一下 发现可以正常弹框&#xff0c;然后又检查了id是不是写错了&#xff0c;也没写错。突然没了头绪。为什么…

user-modify

最近入职开始工作了&#xff0c;碰到一个很有意思的问题&#xff0c;后端传回来的文章内容<a>标签内的内容可以编辑。 很不理解&#xff0c;我从后端取到的数据这该怎么改呢。 问了同事&#xff08;导师&#xff09;&#xff0c;让我试试contenteditable属性&#xff0c;…

missing modality

THE MODALITY FOCUSING HYPOTHESIS: TOWARDS modal-general的知识是对于cross modality KD决定性的。 想要解决的问题是&#xff1a;crossmodal KD是否总是有效的&#xff1f; 文章通过实验证明即使多模态teacher能够取得更好的结果&#xff0c;但cross蒸馏过后的student mod…

This old-style function definition is not preceded by a prototype

文章目录 Introwarning 及解决 截屏知其然&#xff0c;却不知其所以然 Intro 在 Xcode 14 中随意写了几个C命令行程序&#xff0c;编译运行OK。 但是有以下两种报错&#xff1a; This old-style function definition is not preceded by a prototype This function declarati…

关于ModifyStyleEx无效的问题

在做MFC时&#xff0c;有时候我们需要显示选择一个项目&#xff0c;比如需要标记所选择的图片控件。我们可以用这个函数&#xff1a; BOOLModifyStyleEx ( DWORD dwRemove, DWORD dwAdd, UINT nFlags ) 或者 BOOLModifyStyle ( DWORD dwRemove, DWORD dwAdd, UINT nF…

ModifyStyle

CWnd::ModifyStyle 1.作用 : 调用这个函数修改窗口的风格 2.函数原型: BOOL ModifyStyle ( DWORD dwRemove, DWORD dwAdd, UINT nFlags0 ); 3.参数含义: dwRemove 指定修改时要删除的窗风格。 dwAdd 指定修改时将要增加的窗口风格。 nFlags 该参数将被传给SetWindowPos&#x…

关于ModifyStyle ModifyStyleEx修改自定义控件的问题

继承于MFC控件&#xff0c;比如CStatic CEdit等等&#xff0c;在自定义代码中许多人反映无法更改控件的外观属相&#xff0c;这是因为大部分人没有通知主窗体自定义控件的外观更改了&#xff0c;可以使用下列代码进行更改&#xff1a; ModifyStyle(WS_BORDER,0,SWP_DRAWFRAME);…