【solidity】函数修饰器(Function Modifiers)
修饰符可用于以声明方式更改函数的行为。例如,您可以使用修饰符在执行函数之前自动检查条件。
检查调用者权限
// 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教材配套视频讲解(里边有迷惑题的详细解答哦!)
【solidity】函数修饰器(Function Modifiers)相关推荐
- python中的函数修饰器
python中的函数修饰器 – @wrapper 简介 类似于C#的属性.Java的注解,python也有对应的修饰符.从Python2.7和Python3开始,提供了以'@'为标示的修饰符,可以在模 ...
- python 函数修饰器 父类_手把手教你学python第十四讲(函数装饰器,super用法和时间处理)...
文中有些字在图中是因为每篇文章最多100张图片,我把有的小图片和文字一起截图了,文中所有的引用都会标出原文网址,除此以外都是作者原创. 有时候会在文章最前或者最后补充一些知识或者把前面说的有问题的地方 ...
- python 函数修饰器 父类_Python函数嵌套、回调函数、闭包、装饰器和类
markdown内容:Python函数嵌套.回调函数.闭包.装饰器和类 一级标题:主要描述内容 二级标题:各个内容 三级标题:重要概念 一.函数嵌套 1.1.作用域和嵌套函数 LEGB查找规则的 E, ...
- python函数修饰器_Python函数装饰器指南
Python 具有强大的功能和富有表现力的语法.我最喜欢的装饰之一.在设计模式的上下文中,装饰器动态更改方法或类功能,而不必直接使用子类.当您需要扩展功能,但不想修改原函数时,这是理想的选择.我们可以 ...
- Solidity语言学习笔记————20、函数修饰符
函数修饰符(Function Modifiers) 修饰符可以用来轻松改变函数的行为,比如在执行的函数之前自动检查条件.他们可继承合约的属性,也可被派生的合约重写. pragma solidity ^ ...
- python修饰符作用_python函数修饰符@的使用
python函数修饰符@的作用是为现有函数增加额外的功能,常用于插入日志.性能测试.事务处理等等. 创建函数修饰符的规则: (1)修饰符是一个函数 (2)修饰符取被修饰函数为参数 (3)修饰符返回一个 ...
- python3 修饰器_【python3】修饰器简单理解
### 修饰器干嘛的,有什么作用 比如说A现在已经写好了一个项目,但是现在B接管了这个项目,B需要对项目中的某个函数进行修改,一个一个修改然后复制,粘贴?这时候修饰器就开始大显身手了.修饰器可以避免许 ...
- python修饰器执行步骤_Python修饰器学习总结
1.大总结,修饰器就是把被修饰的函数作为一个参数传入修饰器函数.格式如下 @修饰器函数 def 函数 修饰器函数是要至少套一个函数的,即: def xxx def yyy ... return yyy ...
- solidity modifier函数修改器 智能合约开发知识浅学(三)
环境说明: Ide:在线remix Solidity IDE 语言:solidity solidity 版本号:0.4.20 Tip:如果一点都不懂的建议从头开始看 运行结果截图我不赘述,所有合约代码 ...
最新文章
- hdu 2295 Radar(二分+DLX)
- Linux 小知识点
- idea new对象后自动补全_IDEA的quot;奇淫巧技quot;
- psql where里有自定义函数慢_使用gplearn自定义特征自动生成模块
- ApacheCN Pandas 教程集
- 孙鑫-MFC笔记十一--动态链接库
- NIS 报错No such map passwd.byname. Reason: Can't bind to server which serves this domain
- python列表题目_python4_list应用的练习题
- RD与RT MPLS
- 定时刷新页面 html,js实现定时刷新页面的代码
- 向量叉乘意义amp;amp;NYOJ68三点顺序
- MAVEN打包时没有将src/main/cache文件夹打到到WAR包中
- 计算机右键菜单太多,鼠标右键菜单选项太多:清理多余菜单选项的方法
- 智能网联汽车云控系统第5部分:平台服务场景规范
- MySQL基本数据类型
- 华为电脑和手机一碰传_体验华为“一碰传”高科技,实现手机和电脑互传文件...
- sublime text3设置快捷键在浏览器中打开
- 网络基本功(二十四):Wireshark抓包实例分析TCP重传
- Java程序员必知必会之JVM运行时数据区
- 浩辰3D软件中应用程序菜单如何使用?
热门文章
- 使用isolinux制作Linux启动光盘
- 简述计算机桌面背景更换的流程,苹果电脑桌面壁纸怎么更换【详细步骤】
- 各保险公司所使用的业务系统
- 条件概率、全概率、先验概率、后验概率
- 【Acwing提高】DP·背包
- SEO面试题与面试攻略
- SSM框架的介绍与搭建
- 按照黑马教程学习javaWeb出现Property ‘dataSource‘ is requir报错HTTP Status 500 – Internal Server Error——解决方案
- [Python]游戏编程--人工智能1
- 腾讯云服务器公网6M带宽实际下载/上传速度详细解释