Solidity智能合约中的异常处理(error、require 和 assert)

news2024/11/19 2:30:05

Solidity 中的三种抛出异常方法:errorrequireassert


在 Solidity 开发中,异常处理是确保智能合约安全性和正确性的关键步骤。Solidity 提供了三种主要方法来抛出异常:errorrequireassert。本文将详细介绍这三种方法的用途、实现方式及其各自的特点,并对它们的 Gas 消耗进行比较。


目录

  1. Solidity 中的异常处理
    1.1 什么是异常?
    1.2 异常处理的必要性
    1.3 Solidity 异常的常见场景

  2. error:自定义错误
    2.1 error 的定义
    2.2 error 的使用场景
    2.3 error 的语法
    2.4 error 的Gas消耗

  3. require:前置条件检查
    3.1 require 的作用
    3.2 require 的语法
    3.3 require 的常见使用场景
    3.4 require 的 Gas 消耗

  4. assert:不变量检查
    4.1 assert 的作用
    4.2 assert 的语法
    4.3 assert 的使用场景
    4.4 assert 的 Gas 消耗

  5. 三者的对比与最佳实践
    5.1 功能对比
    5.2 安全性对比
    5.3 Gas 消耗对比

  6. 总结

在这里插入图片描述

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 定义自定义错误时,相比 requireassert,通常会节省更多的 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 安全性对比

  • errorrequire 通常用于用户或合约交互时的错误检查。
  • assert 应用于确保内部逻辑的不变量,更多用于调试目的。

5.3 Gas 消耗对比

  • error:节省 Gas,尤其是复杂的错误处理。
  • require:较为高效,未使用的 Gas 可退还。
  • assert:在失败时消耗所有 Gas,应用场景更局限。

6. 总结

Solidity 提供了 errorrequireassert 三种异常处理方式,每种方式都有其特定的应用场景。开发者应根据合约的实际需求和安全性要求,选择适合的异常处理机制。此外,Gas 消耗的比较也提示我们在大多数情况下,应优先使用 require 进行输入检查,使用 error 进行复杂错误处理,而 assert 应仅用于关键性的不变量检查。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2166509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

心觉:如何重塑高效学习的潜意识(2)明白你为什么这么学,才能学得更好

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作181/1000天 上一篇文章我们讲了系统化学习和边学边用两种方法的优缺点 为什么有些人喜欢这种而不是那种 他们的底层心理逻辑不一…

智能识别猫猫

鸡蛋饼是什么猫 今天&#xff0c;有一位爱猫人士找到了我&#xff1a;“9月25日啦&#xff0c;炉石传说重新开服了&#xff01;” 我&#xff1a;“哦&#xff01;我知道这个&#xff0c;你是说&#xff0c;我现在该去领金卡了吗&#xff1f;” 爱猫人士&#xff1a;“不&am…

VMware下Ubuntu找不到共享文件夹

在VMware的设置中已经设置了共享文件夹&#xff0c;在Ubuntu系统中找不到&#xff0c;参考了网上其他的文章&#xff0c;发现还是不能解决问题&#xff0c;无意中尝试了一小步&#xff0c;没想到成功解决了&#xff0c;在这里记录一下。 1&#xff09;首先查询本机的gid 2&…

聚焦Llama新场景和AR眼镜,扎克伯格用AI赋能元宇宙,Meta Connect 2024开发者大会直播约起...

作者&#xff1a;十九 编辑&#xff1a;十九&#xff0c;李宝珠 北京时间 9 月 26 日凌晨 1 点&#xff0c;Meta Connect 2024 开发者大会即将举行&#xff0c;马克扎克伯格将聚焦 AI 和元宇宙&#xff0c;向大家分享 Llama 模型的更多潜在应用&#xff0c;并介绍 Meta 最新产品…

2024年汉字小达人区级自由报名备考冲刺:最新问题和官模题练一练

今天是2024年第十一届汉字小达人的区级自由报名活动的第二天。 我们继续回答几个关于汉字小达人的最新问题&#xff0c;做几道2024年官方模拟题&#xff0c;帮助孩子们少走弯路&#xff0c;再冲刺一般&#xff0c;更精准地备考2024年汉字小达人。 【温馨提示】本专题在比赛期…

芯科科技2024年Works With开发者大会登陆上海,物联网和人工智能的变革性融合带来无限精彩

谷歌、三星等生态大厂将带来重磅演讲和圆桌讨论&#xff0c;亦可切身体验多样化无线技术实作 中国&#xff0c;北京 – 2024年9月25日 – 安全、智能无线连接技术领域的全球领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;&a…

MySQL InnoDB MVCC读写逻辑分析与调测

目标 1、构建MVCC读写场景 2、gdb调试MVCC过程&#xff0c;输出流程图&#xff08;函数级别调用过程&#xff09; 前提 准备1 打开服务端 查询mysqld进程号 线程树 打开客户端&#xff0c;想创建几个事务号就打开几个客户端 准备2 数据库mvcc&#xff0c;两个表test和stu…

JVM(HotSpot):虚拟机栈(JVM Stacks)之线程问题排查方法

文章目录 前言一、CPU占用过大二、程序运行很长时间没有结果三、总结 前言 本篇讲的排查都是基于Linux环境的。 一、CPU占用过大 这个一般是出现了死循环导致的。 1、先用top命令查看占用CPU的进程ID top2、再用ps命令查看对应的线程 就看一查看到对应的线程id ps H -eo …

王道考研视频——操作系统笔记

操作系统第一章&#xff01;入门 王道考研视频——操作系统笔记&#xff0c;第一部分&#xff0c;操作系统的概念和体系结构 0.0 课程白嫖指南_哔哩哔哩_bilibili0.0 课程白嫖指南是王道计算机考研 操作系统的第1集视频&#xff0c;该合集共计84集&#xff0c;视频收藏或关注UP…

openkylin介绍及其特点和优势

openKylin&#xff08;开放麒麟&#xff09;openKylin&#xff08;开放麒麟&#xff09; 社区是在开源、自愿、平等和协作的基础上&#xff0c;由基础软硬件企业、非营利性组织、社团组织、高等院校、科研机构和个人开发者共同创立的一个开源社区&#xff0c;致力于通过开源、开…

51单片机应用开发---keil 创建一个新工程并用Protues 8仿真(以点亮LED为例)

实现目标 1、掌握keil V5软件 创建一个新工程&#xff1b; 2、具体目标&#xff1a;1.会新建一个工程&#xff1b;2.编程实现点亮开发板的LED1. 一、新建工程步骤 1.1 在桌面上新建一个名字为 LED的文件夹 1.2 双击打开Keil uVision5 软件&#xff0c;点击 Project —>…

HTML和CSS中的浮动以及边框塌陷解决方案(内置练习及答案)

一、浮动概述 在HTML和CSS中&#xff0c;“浮动”&#xff08;Float&#xff09;是一种布局技术&#xff0c;它允许元素脱离其正常的文档流&#xff0c;向左或向右移动&#xff0c;直到它的外边缘碰到包含框或另一个浮动元素的边缘。浮动元素仍然保持块级盒模型的特性&#xff…

【GUI设计】基于图像分割的GUI系统(6),matlab实现

博主简介&#xff1a; 如需获取设计的完整源代码或者有matlab图像代码项目需求/合作&#xff0c;可联系主页个人简介提供的联系方式或者文末的二维码。博客内容有疑问可联系沟通&#xff08;博主邮箱&#xff1a;3249726188qq.com&#xff09;。 ~~~~~~~~~~~~~~~~~~~~~~~…

【ComfyUI】减少连线的节点——cg-use-everywhere

源码&#xff1a;https://github.com/chrisgoringe/cg-use-everywhere 介绍&#xff1a;一组节点&#xff0c;允许数据“广播”到一些或所有未连接的输入端。大大减少了链接混乱。 【秋葉aaaki】comfyui一键运行包 夸克网盘&#xff1a;https://pan.quark.cn/s/64b808baa960 …

PMP--二模--解题--131-140

文章目录 反例14.敏捷–角色–教练/项目经理–仆人式领导–职责–核心工作–消除障碍&#xff1b;–作用–促进合作&#xff08;关键字&#xff1a;合作&#xff0c;一起解决问题&#xff09;--不是出现“合作”就一定选131、 [单选] 一个项目经理被分配到一个针对客户的分析项…

【网络安全】网络基础第一阶段——第三节:网络协议基础---- VLAN、Trunk与三层交换技术

目录 一、交换机 1.1 交换机定义 1.1.1 交换机 1.2 工作原理 1.2.1 数据帧的转发 1.2.2 交换机处理数据帧的三种行为 1.2.3 交换机通信 二、虚拟局域网&#xff08;VLAN&#xff09; 2.1 虚拟局域网简介 2.1.1 为什么需要VLAN 2.1.2 广播域的分割与VLAN的必要性 2.…

【Linux】权限管理——专治不会设置权限而头疼

&#x1f680;个人主页&#xff1a;小羊 &#x1f680;所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言一、Linux权限管理1.1 Linux用户类型1.2 文件类型和访问权限1.3 文件访问权限的相关设置方法1.3.1 更改文…

vue2加载本地html文件

实现方法&#xff1a; 1、在public文件夹下创建static文件夹&#xff0c;static文件夹下放置需要展示的html文件&#xff0c;有没有static都没问题&#xff0c;需要在public文件夹下 <div style"width: 100%"><!--静态html资源--><div class"t…

C语言⾃定义类型:结构体

目录 前言 1. 结构体类型的声明 1.1 结构的声明 1.2 结构体变量的创建和初始化 1.3 结构的特殊声明 1.4 结构的⾃引⽤ 2.结构体内存对齐 2.1 对⻬规则 实例讲解 2.2 为什么存在内存对⻬&#xff1f; 2.3 修改默认对⻬数 3. 结构体传参 4. 结构体实现位段 4.1 什么…

H7-TOOL脱机烧录增加国产3PEAK混合信号单片机TPS32和富芮坤FR8008,FR8003和FR2012支持

支持单路&#xff0c;1拖4和1拖16脱机烧录 3PEAKS思瑞浦混合信号单片机TPS32M支持 1、在线烧录&#xff0c;脱机烧录均正常。 2、注意事项&#xff1a;推荐使用整片擦除。 在线烧录&#xff1a; 脱机烧录&#xff1a; 接线效果&#xff1a; 富芮坤FR8008x支持&#xff0c;支…