Solidity智能合约中的异常处理(error、require 和 assert)
Solidity 中的三种抛出异常方法:error、require 和 assert
在 Solidity 开发中,异常处理是确保智能合约安全性和正确性的关键步骤。Solidity 提供了三种主要方法来抛出异常:error、require 和 assert。本文将详细介绍这三种方法的用途、实现方式及其各自的特点,并对它们的 Gas 消耗进行比较。
目录
-
Solidity 中的异常处理
1.1 什么是异常?
1.2 异常处理的必要性
1.3 Solidity 异常的常见场景 -
error:自定义错误
2.1error的定义
2.2error的使用场景
2.3error的语法
2.4error的Gas消耗 -
require:前置条件检查
3.1require的作用
3.2require的语法
3.3require的常见使用场景
3.4require的 Gas 消耗 -
assert:不变量检查
4.1assert的作用
4.2assert的语法
4.3assert的使用场景
4.4assert的 Gas 消耗 -
三者的对比与最佳实践
5.1 功能对比
5.2 安全性对比
5.3 Gas 消耗对比 -
总结

1. Solidity 中的异常处理
1.1 什么是异常?
异常是指在程序运行过程中发生的不正常或意外的情况。在 Solidity 中,异常通常指程序遇到错误条件时的中断执行。
1.2 异常处理的必要性
在智能合约中,异常处理的目标是确保交易不会在有错误的情况下继续执行,以防止状态被意外更改或资金被错误转移。
1.3 Solidity 异常的常见场景
- 用户输入不合法(如溢出、负值等)
- 外部合约调用失败
- 合约逻辑中的不变量遭到破坏
- 资金不足或无法执行转账
2. error:自定义错误
2.1 error 的定义
error 是 Solidity 0.8.4 版本引入的新特性,允许开发者定义自定义错误。自定义错误为错误报告提供了更多的灵活性,并且能够节省 Gas。
2.2 error 的使用场景
自定义错误主要用于需要抛出特定的异常并提供更详细的错误信息的场景。它相比传统的异常处理方式,可以节省 Gas,尤其是在复杂合约中。
2.3 error 的语法
// 定义错误
error InsufficientBalance(uint requested, uint available);contract Token {function withdraw(uint amount) public {if (amount > address(this).balance)revert InsufficientBalance({requested: amount,available: address(this).balance});// 继续执行其他逻辑}
}
2.4 error 的Gas消耗
使用 error 定义自定义错误时,相比 require 和 assert,通常会节省更多的 Gas,尤其是当错误需要包含复杂数据时。由于错误消息不作为字符串存储,它的处理更加高效。
3. require:前置条件检查
3.1 require 的作用
require 用于在合约执行之前检查某些条件是否成立,通常用于验证输入参数或外部合约调用结果。
3.2 require 的语法
function transfer(address recipient, uint amount) public {require(amount <= balance, "Insufficient balance");// 执行转账
}
3.3 require 的常见使用场景
- 检查调用方是否具有足够的权限
- 验证输入数据的合法性
- 验证外部合约的返回值
3.4 require 的 Gas 消耗
require 语句会消耗一定的 Gas,但由于 require 在条件不满足时立即中断执行,未使用的 Gas 会被退还。因此,require 适合用于条件检查时。
4. assert:不变量检查
4.1 assert 的作用
assert 用于检查代码逻辑中的不变量,即程序在任何时候都应该满足的条件。如果 assert 失败,意味着代码中存在致命的错误。
4.2 assert 的语法
uint x = 0;function increment() public {x += 1;assert(x > 0); // 确保 x 永远大于 0
}
4.3 assert 的使用场景
- 用于捕捉代码中的严重错误,特别是不应该发生的逻辑错误。
- 检查合约中的状态是否在预期范围内。
4.4 assert 的 Gas 消耗
assert 失败时会消耗所有剩余的 Gas,因为它通常用来捕捉不可预见的严重错误。因此,应慎用 assert,只在关键性逻辑的检查中使用。
5. 三者的对比与最佳实践
5.1 功能对比
error提供了更灵活的错误报告机制,适合复杂错误处理。require适用于输入验证和外部合约结果检查。assert主要用于捕获不可预见的内部错误或逻辑漏洞。
5.2 安全性对比
error和require通常用于用户或合约交互时的错误检查。assert应用于确保内部逻辑的不变量,更多用于调试目的。
5.3 Gas 消耗对比
error:节省 Gas,尤其是复杂的错误处理。require:较为高效,未使用的 Gas 可退还。assert:在失败时消耗所有 Gas,应用场景更局限。
6. 总结
Solidity 提供了 error、require 和 assert 三种异常处理方式,每种方式都有其特定的应用场景。开发者应根据合约的实际需求和安全性要求,选择适合的异常处理机制。此外,Gas 消耗的比较也提示我们在大多数情况下,应优先使用 require 进行输入检查,使用 error 进行复杂错误处理,而 assert 应仅用于关键性的不变量检查。
相关文章:
Solidity智能合约中的异常处理(error、require 和 assert)
Solidity 中的三种抛出异常方法:error、require 和 assert 在 Solidity 开发中,异常处理是确保智能合约安全性和正确性的关键步骤。Solidity 提供了三种主要方法来抛出异常:error、require 和 assert。本文将详细介绍这三种方法的用途、实现方…...
True NAS禁用ipv6
在 TrueNAS Scale 中,禁用 IPv6 的方法如下:12 进入 System->Advanced->Sysctl,设置一个 sysctl 可调整变量 net.ipv6.conf.all.disable_ipv6,值为 1,以完全禁用 IPv6。\...
笔记整理—linux进程部分(2)使用fork创建进程
为什么要创建进程,首先每个程序的运行都需要一个进程;多进程实现宏观上的并行。 fork的原理,是进程的分裂生长模式。如果操作系统需要一个新的进程,那么就会以cp的方法得到一个新的进程,此时老的进程是父进程ÿ…...
在Python中实现多目标优化问题(6)
在Python中实现多目标优化问题 在Python中实现多目标优化,除了传统的进化算法(如NSGA-II、MOEA/D)和一些基于机器学习的方法外,还有一些新的方法和技术。这些新方法通常结合了最新的研究成果,提供了更高效的解决方案。…...
Java EE中的编码问题及解决方案
Java EE中的编码问题及解决方案 在Java EE开发中,处理字符编码是确保数据正确传输和显示的重要环节。不同的编码不一致会导致乱码,影响用户体验。本文将总结在Java EE中可能遇到的编码问题及其解决方案。 1. 输入数据编码问题 在表单提交时,…...
9月27日,每日信息差
第一、中国科学家团队在干细胞治疗领域取得重要突破,通过化学重编程技术成功制备出胰岛细胞,并用于移植治疗一名 1 型糖尿病患者,实现了临床功能性治愈。相关研究成果已发表在国际权威期刊《细胞》上。 第二、交通运输部公路局局长周荣峰在国…...
什么是 Angular 开发中的 Dumb components
Dumb components,在 Angular 开发中也被称为 Presentational components,它们的主要职责是通过展示数据和触发事件,把业务逻辑和 UI 表现分离开来。Dumb components 只通过 Input() 接收数据,Output() 向外发送事件,不…...
Docker 进入容器运行命令的详细指南
Docker 进入容器运行命令的详细指南 Docker 是一个开源的容器化平台,广泛应用于开发和生产环境中。它允许开发者打包应用程序及其依赖项到容器中,并能够在不同的平台上快速部署和运行。容器通常是独立且隔离的,但在开发、调试或维护过程中&a…...
如何禁止非真实用户的ip访问网站服务器
为了禁止非真实用户的IP访问网站服务器,可以采用多种技术手段和策略。以下是一些常用的方法: 1. 使用IP黑名单和白名单 黑名单:定期更新和维护一个IP黑名单,阻止已知的恶意IP地址或数据中心IP访问网站。白名单:对于特…...
探索SpringBoot:学科竞赛管理项目开发
2 相关技术简介 2.1Java技术 Java是一种非常常用的编程语言,在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中,Java的身影无处不在,并且拥有旺盛的生命力。Java的跨平台能力十分强大,只需一次编译,任…...
ultralytics yolo v8 示例:加载官方模型进行推理
Ultralytics YOLO 是计算机视觉和 ML 领域专业人士的高效工具。 安装 ultralytics 库: pip install ultralytics 实现代码如下: import cv2 from ultralytics import YOLO# 加载预训练的 YOLOv8n 模型 ckpt_dir "./ckpt/" # 模型缓存地址…...
【中间件学习】Nginx快速入门(为了配置一个项目)
-----------------------------本文章借鉴遇见狂神说--------------------------- 一、一个产品出现瓶颈?? 在一个产品刚刚上线的时候,并发量小,用户使用的少,所以在低并发的情况下,一个jar包启动应该就够…...
鸿蒙harmonyos next flutter通信之MethodChannel获取设备信息
本文将通过MethodChannel获取设备信息,以此来演练MethodChannel用法。 建立channel flutter代码: MethodChannel methodChannel MethodChannel("com.xmg.test"); ohos代码: private channel: MethodChannel | null nullthis.c…...
【笔记】原子结构的近代理论
近代原子结构理论的建立是从氢原子光谱得到启示的。 一、氢原子光谱与波尔理论 1.氢原子光谱 在装有两个电极的真空玻璃管内通入极少量高纯氢气,通高压电使之放电,管中发出的光束通过分光棱镜,得到分立的谱线,称为线状光谱。 发…...
【python】循环中断:break 和 continue
目录: while 循环的基础语法while 循环的基础案例while 循环的嵌套应用while 循环的嵌套案例for 循环的基础语法for 循环的嵌套应用循环中断:break 和 continue综合案例 学习目标: 掌握使用 continue 和 break 关键字控制循环 思考&#…...
WIFI密码默认显示
文章目录 需求分析遇到问题问题原因解决方案 需求 在进入设置,点击某一个wifi,连接wifi 界面,显示密码默认选中状态,效果如下 分析 在 WiFi密码被输入法挡住 中我们已经分析了整个流程,布局文件和控制中心。 结局系统设置WIFI连…...
Emiya 家今天的饭C++
题目: 样例解释: 【样例 1 解释】 由于在这个样例中,对于每组 i,j,Emiya 都最多只会做一道菜,因此我们直接通过给出烹饪方法、主要食材的编号来描述一道菜。 符合要求的方案包括: 做一道用烹饪方法 1、主要…...
Mybatis缓存机制(图文并茂!)
目录 一级缓存 需求我们在一个测试中通过ID两次查询Monster表中的信息。 二级缓存 案例分许(和上述一样的需求) EhCache第三方缓存 在了解缓存机制之前,我们要先了解什么是缓存: 缓存是一种高速存储器,用于暂时存储访问频繁的数据&…...
Git 工作区、暂存区和版本库
Git 工作区、暂存区和版本库 Git 是一个强大的版本控制系统,它帮助开发者管理代码历史,协作开发,以及跟踪和合并更改。为了更好地理解 Git 的工作流程,我们需要了解 Git 中的三个核心概念:工作区(Workspac…...
SSH 远程连接到 Linux 服务器上的 SQLite
通过 SSH 远程连接到 Linux 服务器上的 SQLite 数据库文件的流程,可以分为以下几个步骤: 通过 SSH 连接到远程 Linux 服务器。在远程服务器上执行 SQLite 命令行工具,操作数据库文件。在本地使用工具,通过 SSH 隧道间接访问远程的…...
BetterGI:解放双手的终极原神自动化助手,每天节省2小时游戏时间
BetterGI:解放双手的终极原神自动化助手,每天节省2小时游戏时间 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一…...
别再折腾了!STM32CubeMX+Keil 5+Proteus 8.9保姆级联调配置,一次搞定
STM32开发环境联调实战:从零搭建CubeMXKeilProteus高效工作流 第一次接触STM32开发时,我被各种工具链的配置折磨得焦头烂额——CubeMX生成的工程在Keil里报错、Proteus仿真时芯片毫无反应、Debug选项神秘消失...如果你也经历过这种绝望,这篇文…...
文献处理效率暴跌?NotebookLM Agent的3层语义理解架构,让PDF秒变可推理知识图谱!
更多请点击: https://intelliparadigm.com 第一章:文献处理效率暴跌?NotebookLM Agent的3层语义理解架构,让PDF秒变可推理知识图谱! 传统PDF阅读工具仅支持关键词检索与线性浏览,面对百页学术论文或跨领域…...
Perplexity接入Google Scholar的5大避坑指南:实测失效率下降87%的权威配置方案
更多请点击: https://intelliparadigm.com 第一章:Perplexity接入Google Scholar的整合背景与价值定位 学术信息检索正经历从“关键词匹配”向“语义理解可信溯源”的范式跃迁。Perplexity 作为基于大语言模型的实时问答引擎,其核心优势在于…...
C#项目实战:用StackExchange.Redis+RedisDesktopManager构建一个简易用户会话缓存系统
C#实战:基于StackExchange.Redis构建高可用会话缓存系统 在分布式系统架构中,会话管理始终是开发者需要解决的核心问题之一。传统ASP.NET的InProc会话模式在Web Farm环境下会面临一致性挑战,而SQL Server会话状态又难以满足高并发场景的性能…...
不止于下载:用Active-HDL给你的Lattice FPGA设计做个“体检”(功能仿真实战)
从功能仿真到可靠设计:Active-HDL在Lattice FPGA开发中的深度实践 当LED灯在你的FPGA开发板上如期闪烁时,那种成就感确实令人振奋。但作为经历过多次调试煎熬的工程师,我必须告诉你:能下载运行只是FPGA开发的起点,而非…...
从零构建RAG应用:LLM+向量数据库实战指南与调优心得
1. 从零到一:我的生成式AI学习路径与实战心得最近几年,生成式AI(Generative AI)的浪潮席卷了几乎所有行业,从能写代码的Copilot到能画图的Midjourney,再到能对话的ChatGPT,感觉一夜之间…...
从键值对到时序数据:FlashDB在智能家居传感器上的两种实战用法
从键值对到时序数据:FlashDB在智能家居传感器上的两种实战用法 清晨6点,卧室的温湿度传感器悄然启动。它需要在电池耗尽前完成三项任务:读取当前环境数据、检查预设报警阈值、通过LoRaWAN网络上传信息。当网络不稳定时,这些数据必…...
Sora 2 + After Effects 24.4终极联动教程:含LUT自动映射、运动追踪反哺、动态遮罩同步(附独家.jsx插件)
更多请点击: https://intelliparadigm.com 第一章:Sora 2与After Effects 24.4深度整合概览 Adobe After Effects 24.4 正式引入对 OpenAI Sora 2 模型输出格式的原生支持,标志着生成式视频工作流首次在专业后期平台中实现端到端闭环。该整…...
3分钟拯救你的B站缓存视频:m4s-converter让珍贵回忆永不消失
3分钟拯救你的B站缓存视频:m4s-converter让珍贵回忆永不消失 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否遇到过这样的困扰…...
