深入理解 Solidity 修饰符(Modifier):功能、应用与最佳实践
1. 什么是修饰符(Modifier)?
1.1 修饰符的定义
在 Solidity 中,修饰符(Modifier)是一种用于更改函数行为的关键字。它们可以用于控制函数的执行条件、添加前置检查、简化重复逻辑等。修饰符在函数执行之前执行一段代码,只有当修饰符的条件满足时,函数才会继续执行。修饰符的使用可以有效提高代码的可读性和可维护性。
1.2 修饰符的语法
修饰符的基本语法使用 modifier 关键字来声明,然后在修饰符中定义所需的逻辑。使用 _ 表示函数主体将在修饰符逻辑执行后继续执行。
modifier onlyOwner() {require(msg.sender == owner, "Not the contract owner");_;
}
在上面的例子中,onlyOwner 修饰符确保只有合约的拥有者才能执行使用此修饰符的函数。_ 表示修饰符通过检查后,函数的主体将继续执行。
2. 修饰符的应用场景
2.1 权限控制
修饰符最常见的应用场景是权限控制。例如,在一个去中心化应用(DApp)中,只有特定角色(如管理员或合约拥有者)可以执行某些敏感操作,如资金管理、合约升级等。
modifier onlyAdmin() {require(msg.sender == admin, "Not an admin");_;
}function updateSettings() public onlyAdmin {// 只有管理员可以调用该函数
}
通过使用 onlyAdmin 修饰符,我们可以确保只有 admin 地址能够调用 updateSettings 函数。
2.2 状态检查
修饰符还可以用于检查合约的状态,确保只有在合适的条件下才能执行某些操作。例如,防止在非活跃状态下执行某些函数。
modifier isActive() {require(active == true, "Contract is not active");_;
}function withdraw() public isActive {// 只有当合约处于活跃状态时,才能进行提现操作
}
在此例中,isActive 修饰符确保合约在活跃状态下执行 withdraw 函数。
2.3 输入参数验证
修饰符可以用于验证函数的输入参数。例如,检查传入的数值是否在合理范围内。
modifier validAmount(uint256 amount) {require(amount > 0, "Amount must be greater than zero");_;
}function deposit(uint256 amount) public validAmount(amount) {// 确保存款金额大于零
}
通过 validAmount 修饰符,我们可以防止无效的 amount 值进入函数逻辑。
3. 如何编写自定义修饰符?
3.1 编写基本修饰符
编写自定义修饰符时,通常会遵循以下步骤:
- 定义修饰符名称。
- 在修饰符内部编写条件检查逻辑。
- 使用
_表示在检查通过后执行函数主体。
modifier onlyOwner() {require(msg.sender == owner, "You are not the owner");_;
}
3.2 带参数的修饰符
修饰符还可以接收参数,从而更加灵活地控制函数的行为。例如,下面的修饰符接收一个 address 参数,并检查调用者是否与指定地址匹配。
modifier onlyAddress(address _address) {require(msg.sender == _address, "Unauthorized address");_;
}function specialFunction(address _allowedAddress) public onlyAddress(_allowedAddress) {// 只有指定的地址可以调用此函数
}
带参数的修饰符允许我们在不同场景下灵活应用逻辑。
4. 多个修饰符的组合使用
4.1 修饰符的链式调用
Solidity 允许多个修饰符同时作用于一个函数。多个修饰符会按照从左到右的顺序依次执行。
modifier onlyOwner() {require(msg.sender == owner, "Not the owner");_;
}modifier isActive() {require(active == true, "Contract is not active");_;
}function closeContract() public onlyOwner isActive {// 合约只能由拥有者关闭,并且合约必须是活跃状态
}
在这个例子中,closeContract 函数要求调用者必须是合约拥有者,并且合约必须处于活跃状态。只有两个条件都满足时,函数主体才会执行。
4.2 修饰符的执行顺序
修饰符的执行顺序非常重要。多个修饰符会依次执行,并在通过所有条件后才执行函数主体。因此,修饰符的顺序直接影响函数的执行逻辑。
5. 修饰符在 Solidity 开发中的最佳实践
5.1 避免重复代码
修饰符可以有效避免代码的重复。例如,权限控制逻辑通常会在多个函数中使用,将这些逻辑抽象为修饰符可以减少代码重复,提高代码的可维护性。
modifier onlyOwner() {require(msg.sender == owner, "Not the contract owner");_;
}function setOwner(address newOwner) public onlyOwner {owner = newOwner;
}function withdrawFunds() public onlyOwner {// 只有拥有者才能提取资金
}
通过将权限检查逻辑抽象为 onlyOwner 修饰符,我们可以在多个函数中复用这一逻辑。
5.2 使用适当的错误信息
在修饰符中抛出异常时,应该使用简明清晰的错误信息。这可以帮助调用者快速了解问题所在,并便于调试。例如:
modifier onlyOwner() {require(msg.sender == owner, "You must be the contract owner to execute this function");_;
}
5.3 避免过多修饰符
尽管修饰符可以提高代码可读性,但过度使用修饰符可能会导致代码过于复杂,难以追踪函数的执行逻辑。因此,修饰符的数量应保持适中,并根据需要合理使用。
6. 修饰符与函数修饰符的区别
6.1 修饰符与函数修饰符
在 Solidity 中,除了自定义的修饰符外,函数修饰符(如 public、private、view、pure)也用于控制函数的可见性和行为。虽然它们的作用不同,但都可以改变函数的执行逻辑。
修饰符示例:
modifier onlyOwner() {require(msg.sender == owner, "Not the contract owner");_;
}function updateData() public onlyOwner {// 使用 onlyOwner 修饰符
}
函数修饰符示例:
function getBalance() public view returns (uint256) {// view 函数不会修改合约状态
}
修饰符侧重于检查条件和控制函数执行,而函数修饰符则定义了函数的行为(如是否修改状态)。
7. 结论
Solidity 中的修饰符是一种强大的工具,能够帮助开发者编写更加简洁、可读性高的代码。通过使用修饰符,可以有效地管理权限控制、状态检查、输入验证等逻辑。虽然修饰符具有许多优点,但开发者应注意不要过度使用,以免导致代码复杂化。在实际项目中,合理设计修饰符将为智能合约的开发带来更高的灵活性和安全性。
相关文章:
深入理解 Solidity 修饰符(Modifier):功能、应用与最佳实践
1. 什么是修饰符(Modifier)? 1.1 修饰符的定义 在 Solidity 中,修饰符(Modifier)是一种用于更改函数行为的关键字。它们可以用于控制函数的执行条件、添加前置检查、简化重复逻辑等。修饰符在函数执行之前…...
YOLO11项目实战1:道路缺陷检测系统设计【Python源码+数据集+运行演示】
一、项目背景 随着城市化进程的加速和交通网络的不断扩展,道路维护成为城市管理中的一个重要环节。道路缺陷(如裂缝、坑洞、路面破损等)不仅影响行车安全,还会增加车辆的磨损和维修成本。传统的道路缺陷检测方法主要依赖人工巡检…...
怎么屏蔽统计系统统计到的虚假ip
屏蔽统计系统中的虚假IP是保护网站分析数据准确性的重要措施。以下是一些有效的策略和步骤,可以帮助您过滤掉虚假IP: 1. 识别虚假IP的特征 了解虚假IP的常见特征可以帮助您识别和屏蔽它们: 短时间内高频率访问:虚假IP可能会在短…...
前端开发设计模式——策略模式
目录 一、策略模式的定义和特点 1.定义: 2.特点: 二、策略模式的实现方式 1.定义策略接口: 2.创建具体策略类: 3.定义上下文类: 三、策略模式的应用场景 1.表单验证场景: 2.动画效果切换场景&…...
SysML案例-潜艇
DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>>...
车辆重识别(2020NIPS去噪扩散概率模型)论文阅读2024/9/27
[2] Denoising Diffusion Probabilistic Models 作者:Jonathan Ho Ajay Jain Pieter Abbeel 单位:加州大学伯克利分校 摘要: 我们提出了高质量的图像合成结果使用扩散概率模型,一类潜变量模型从非平衡热力学的考虑启发。我们的最…...
基于深度学习的任务序列中的快速适应
基于深度学习的任务序列中的快速适应是指模型在接连处理不同任务时,能够迅速调整和优化自身以适应新任务的能力。这种能力在动态环境和多任务学习中尤为重要,旨在减少训练时间和资源需求。以下是这一主题的关键要素: 1. 快速适应的背景 动态…...
虚拟机三种网络模式详解
在电脑里开一台虚拟机,是再常见不过的操作了。无论是用虚拟机玩只有旧版本系统能运行的游戏,还是用来学习Linux、跑跑应用程序都是很好的。而这其中,虚拟机网络是绝对绕不过去的。本篇文章通俗易懂的介绍了常见的虚拟网络提供的三种网络链接模…...
[leetcode]674_最长连续递增序列
给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l < i < r,都有 nums[i] < nums[i 1] &am…...
【无人机设计与技术】四旋翼无人机,UAV仿真,轨迹跟踪PID控制
摘要 本文探讨了四旋翼无人机(UAV)在轨迹跟踪中的PID控制仿真方法。通过设计三轴方向的PID控制器,调节无人机的姿态与位置,使其能够准确跟踪预设轨迹。本文使用MATLAB/Simulink进行了建模与仿真,验证了PID控制算法在无…...
回归预测|基于卷积神经网络-支持向量机的数据回归预测Matlab程序CNN-SVM 卷积提取特征与原始特征进行融合预测
回归预测|基于卷积神经网络-支持向量机的数据回归预测Matlab程序CNN-SVM 卷积提取特征与原始特征进行融合预测 文章目录 一、基本原理原理流程总结 二、实验结果三、核心代码四、代码获取五、总结 回归预测|基于卷积神经网络-支持向量机的数据回归预测Matlab程序CNN-SVM 卷积提…...
javaScript基础知识汇总
一、基础语法 1、区分大小写:无论是变量、函数名还是操作符,都区分大小写。 2、标识符:就是变量、函数、属性或函数参数的名称。标识符可以由一个或多个字符构成,但需要满足以下条件: 第一个字符必须是一个字母、下…...
《动手学深度学习》笔记2.2——神经网络从基础→进阶 (参数管理-每层的权重/偏置)
目录 0. 前言 正文:参数管理 1. 参数访问 1.1 [目标参数] 1.2 [一次性访问所有参数] 1.3 [从嵌套块收集参数] 2. 参数初始化 2.1 [内置初始化] 2.2 [自定义初始化] 2.3 [参数绑定-共享参数] 3. 小结(第2节) 4. 延后初始化 (原书第…...
双端之Nginx+Php结合PostgreSQL搭建Wordpress
第一台虚拟机:安装 Nginx 更新系统包列表: sudo apt update安装 Nginx及php扩展: sudo apt install nginx php-fpm php-pgsql php-mysqli -y启动 Nginx 服务: sudo systemctl start nginx检查 Nginx 是否正常运行: xdg-open http://localhost注意:终端命令打开网址 …...
Another redis desktop manager使用说明
Another redis desktop manager使用说明 概述界面介绍图示说明连接界面设置界面查看操作日志主界面信息进入redis-cli控制台更多 概述 Another Redis Desktop Manager是一个开源的跨平台 Redis 客户端,提供了简洁易用的图形用户界面(GUI)&am…...
【git】配置 Git 的换行符处理和安全性||安装 Ruby
配置 Git 的换行符处理和安全性: git config --global core.autocrlf input:这个设置确保在提交代码时,Git 会将 CRLF(Windows 的换行符)转换为 LF(Unix 的换行符),但在检出代码时不…...
VMware ESXi 8.0U3b macOS Unlocker OEM BIOS 2.7 Dell HPE 定制版 9 月更新发布
VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 Dell HPE 定制版 9 月更新发布 VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版 ESXi 8.0U3 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、IEIT SYSTEMS (浪潮信息)、Cisco …...
Unity 代码裁剪(Strip Engine Code)
文章目录 0.IL2CPP 打包运行闪退问题1.什么是代码裁剪2.为什么要使用代码裁剪3.代码裁剪设置与级别4.强制保留代码4.1 使用[Preserve]标签4.2 使用Link.xml文件 5.Strip中遇到的问题及解决方法6.注意事项 0.IL2CPP 打包运行闪退问题 Google Play要求从2019年8月1日起apk必须支…...
单目3d重建DUSt3R 笔记
目录 DUSt3R 三维重建 报错RecursionError: maximum recursion depth exceeded in comparison 报错 numpy.core.multiarray failed to import 报错Numpy is not available 解决 升级版mast3r 速度变慢 修改了参数设置脚本: 测试效果 操作技巧 DUSt3R 三维重…...
AI驱动TDSQL-C Serverless 数据库技术实战营-与AI的碰撞
目录 一、简介 二、实验介绍 三、结果展示 四、实操指导 4.1 系统设计 4.2 环境搭建(手把手教程) 4.3 应用构建 4.4 效果展示 4.5 踩坑避雷总结 五、清理资源 5.1 删除TDSQL-C Serverless 5.2 删除 HAI 算力 六、实验总结归纳 一、简介 本…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
