【区块链】走进web3的世界-合约交互中的异常/边界处理

news2025/1/16 20:01:03

在以太坊智能合约中,异常处理是一个非常重要的问题,因为任何一个函数调用都有可能导致异常。常见的异常包括函数调用失败、无效参数、内部错误等。

        在 Solidity 中,可以使用 require、assert 和 revert 等关键字来处理异常。这些关键字可以用于检查输入参数、状态变量和函数调用的返回值,并在发生异常时抛出异常。

        今天我们主要从前端的角度来进行异常处理,这样可以保证我们交互的正常进行。

1、工程目录划分,更好的管理我们web3脚本

    

让我们的代码更加清晰明了

  • web3中与智能合约交互使用的是ABI,他是我们和智能合约交互的通道,可以将ABI通过命名统一管理,方便后续维护;
  • 在与智能合约交互的过程中,需要调用ABI的接口,以及通过web3.js/ethers.js等web3的一些库进行钱包连接,获取地址等操作,可以将其放入web3的文件夹中进行统一管理。

ABI(Application Binary Interface)是一种接口规范,用于描述不同模块之间的通信方式和数据格式。在以太坊智能合约中,ABI 用于描述智能合约的接口,包括合约地址、函数名、函数参数和返回值等。

2、前端在合约交互中的异常处理

在web3的脚本中,我们需要通过try{} catch {}将异常抛出,常见的异常情况包含:

  • 钱包连接异常;
  • 区块链交互付费过程中拒绝支付;
  • rpc不对,交互异常;
  • 调用合约报错(不存在方法、传参不对等);
  • 还有很多很多......

3、以下是一些常见的异常处理方式

3.1、try{} catch {}捕获抛出异常


/**
  * 域名是否可注册
  * @param domainName domainName without .bnb
  * @returns boolean, if no error
  */
 static async isDomainAvailable(domainName: String): Promise<any> {
    try {
        const isAvailable = await BnbDomainUtils.registrarControllerContractReadOnly.available(domainName)
        return isAvailable
    } catch (error) {
        console.log(error);
        return false
    }
}

3.2、检查交易是否成功

        在向智能合约发送交易时,需要检查交易是否成功。可以使用 Web3.js 提供的 send 方法,该方法会返回一个 Promise 对象,可以在 then 方法中获取交易的哈希值,并在 catch 方法中处理异常。


myContract.methods.myFunction().send({ from: myAddress })
  .then((receipt) => {
    // 处理交易成功的情况
  })
  .catch((error) => {
    // 处理交易失败的情况
  });

3.3、捕获智能合约函数调用异常

        在调用智能合约的函数时,可能会出现异常,例如传入的参数无效、状态不满足要求等。可以使用 Web3.js 提供的 call 方法,该方法会返回一个 Promise 对象,可以在 then 方法中获取函数的返回值,并在 catch 方法中处理异常。


myContract.methods.myFunction(myArg).call()
  .then((result) => {
    // 处理函数调用成功的情况
  })
  .catch((error) => {
    // 处理函数调用失败的情况
  });

3.4、处理 MetaMask 异常

        在使用 MetaMask 与智能合约交互时,可能会出现用户未授权、交易被拒绝等异常。可以使用 MetaMask 提供的 ethereum 对象,该对象包含了与钱包交互的 API。


if (window.ethereum) {
  try {
    await window.ethereum.enable();
    // 处理用户已授权的情况
  } catch (error) {
    // 处理用户未授权的情况
  }
} else {
  // 处理用户未安装 MetaMask 的情况
}

3.5、使用事件监听器

        在智能合约中,可以使用事件来通知前端某些状态的变化。可以在智能合约中定义事件,然后在前端使用 Web3.js 监听事件的触发。

        通过使用事件监听器,前端可以实时获取智能合约的状态变化,从而更加及时地处理异常情况。


// Solidity 中定义事件
event Transfer(address indexed from, address indexed to, uint256 value);

// 前端中监听事件
myContract.events.Transfer()
  .on('data', (event) => {
    // 处理事件触发的情况
  })
  .on('error', (error) => {
    // 处理事件监听失败的情况
  });

3.6、限制交易的 gas 量

        在向智能合约发送交易时,可以指定交易的 gas 量。如果 gas 不足,交易会失败,并回滚交易。可以在前端限制交易的 gas 量,从而确保交易能够成功执行。

        通过限制交易的 gas 量,前端可以避免交易失败的情况。


const gasLimit = 250000;
myContract.methods.myFunction().send({ from: myAddress, gas: gasLimit })
  .then((receipt) => {
    // 处理交易成功的情况
  })
  .catch((error) => {
    // 处理交易失败的情况
  });

3.7、处理网络异常

        在与智能合约交互时,可能会遇到网络异常,例如网络延迟、断开等。可以在前端使用 Web3.js 提供的 setProvider 方法设置网络 provider,从而确保交互的稳定性。

        通过设置网络 provider,前端可以避免网络异常的情况。


// 1、使用web3
const provider = new Web3.providers.HttpProvider('https://ropsten.infura.io/v3/YOUR-PROJECT-ID');
const web3 = new Web3(provider);

// 2、使用ethers
const provider = new ethers.providers.JsonRpcProvider(process.env.READ_ONLY_RPC)
new ethers.Contract(
    contractAddress,
    Abi,
    provider
)

总之,在与智能合约交互时,需要仔细处理异常,以保证交易的正确性和可靠性。可以使用 Web3.js 和 MetaMask 提供的 API 来处理异常。

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

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

相关文章

第一章 序言:Pytorch在自然语言处理中的应用

01 序言&#xff1a;Pytorch在自然语言处理中的应用 目录01 序言&#xff1a;Pytorch在自然语言处理中的应用1. PyTorch简介2. 自然语言处理3. PyTorch在自然语言处理中的应用3.1 文本分类3.2 情感分析3.3 机器翻译4. 结论1. PyTorch简介 首先&#xff0c;我们需要介绍一下PyT…

WINDOWS消息

WINDOWS消息 Unit01消息队列 01消息队列概念 消息队列是用于存放消息的队列消息在队列中先进先出所有窗口程序都有消息队列程序&#xff08;GetMessage&#xff09;可以从队列中获消息 02消息队列分类 系统消息队列&#xff1a;由系统维护的消息队列&#xff08;这个队列非…

Qt的内存管理机制

QObject的parent设置为null 1.如果构造时直接指定了null&#xff0c;当前实例不会有父对象存在&#xff0c;Qt也不能自动析构该实例&#xff0c;除非实例超出作用域导致析构函数被调用&#xff0c;使用deletelater()函数&#xff0c;不建议使用delete 2.如果指定了parent&#…

关于电商商品数据API接口列表,你想知道的(详情页、Sku信息、商品描述、评论问答列表)

目录 一、商品数据API接口列表 二、商品详情数据API调用代码item_get 三、获取sku详细信息item_sku 四、获得淘宝商品评论item_review 五、数据说明文档 进入 一、商品数据API接口列表 二、商品详情数据API调用代码item_get <?php// 请求示例 url 默认请求参数已经URL…

数据结构-插入排序

一.概要 插入排序是一种基于比较的排序算法&#xff0c;其基本思想是将待排序的元素插入到已排序的序列中&#xff0c;形成新的有序序列。 插入排序算法的过程如下&#xff1a; 将待排序序列分为两部分&#xff1a;已排序部分和未排序部分&#xff1b; 初始时&#xff0c;已…

C++string类的详细使用方法

String类的详细使用 文章目录String类的详细使用初始化扩容空间resize与reserve扩容长度获取插入与删除函数运算符插入append插入assign字符串截取push_back尾插erase删除replase替换swap交换pop_back尾删substr截断字符串功能copy拷贝find查找rfind反向查找find_first_of匹配查…

三路快排(基于三指针单趟排序的快速排序)+快排时间复杂度再分析

目录 一.前言 二. 三路快排 &#x1f60d;算法思想: &#x1f60d;算法实现步骤: &#x1f60d;三指针单趟排序的实现:​ &#x1f60d;非递归快排完全体: &#x1f914;与C标准库里的快排进行对比测试: 三.快排时间复杂度再分析 一.前言 http://t.csdn.cn/mz8dghttp://…

SolidWorks2020安装教程

破解文件及步骤 和 安装包 hf&#xff1a;SolidWorks2020 即可 &#xff08;我的推广 共中号&#xff09; Before installation, block the outgoing Internet access by means of Windows Firewall or cord plug. Check .NET Framework 3.5 and 4.0 are installed. If .NET …

Hive安装与操作

目录 环境 数据 实验步骤与结果 &#xff08;1&#xff09;环境启动 &#xff08;2&#xff09;Hive基本操作 环境 Hadoop集群开发环境、mysql、Hive环境 数据 course.txt、sc.txt、student.txt 实验步骤与结果 &#xff08;1&#xff09;环境启动 ①执行命令&#xf…

JVM的内存结构(超详细附加大厂面试题)

内存结构 1、什么是 JVM &#xff1f; 1&#xff09;定义 Java Virtual Machine &#xff0c;Java 程序的运行环境&#xff08;Java 二进制字节码的运行环境&#xff09;。 2&#xff09;好处 一次编译&#xff0c;处处执行 自动的内存管理&#xff0c;垃圾回收机制 数组下…

结构重参数化宇宙(Re-parameterization Universe)

文章目录0. 前言1. Re-parameterization Universe1.1 RepVGG1.2. RepOptimizer2. 应用参考资料0. 前言 一方面&#xff0c;大量研究表明&#xff0c;多分支网络架构的性能普遍优于单分支架构&#xff1b;另一方面&#xff0c;相比多分支架构&#xff0c;单分支架构更有利于部署…

windows系统管理_windows server 2016 用户管理

用户账户的概述 **计算机用户账户&#xff1a;**由将用户定义到某一系统的所有信息组成的记录,账户为用户或计算机提供安 全凭证&#xff0c;包括用户名和用户登陆所需要的密码&#xff0c;以及用户使用以便用户和计算机能够登录到网络并 访问域资源的权利和权限。不同的身份拥…

自动控制原理模拟卷2

自动控制原理模拟题二 Question1 电炉温度控制系统原理如下图所示,分析系统保持电炉温度恒定的工作过程,指出系统的被控对象、被控量及各部件的作用,并画出系统方块图。 解: 电炉使用电阻丝加热,并要求保持炉温恒定,图中采用热电偶来测量电炉温并将其转换为电压信号,将…

Android 新版 Logcat 操作小技巧

新版的Android Studio中启用了新的 Logcat&#xff0c;有些小技巧这里介绍一下&#xff1a; 文章目录1. Logcat启动2. Logcat 搜索1. 搜索当前包名下的日志&#xff1a;2. 添加日志级别3. 添加标签4. 标签字段5. 排除字段6. 使用正则表达式7. 使用正则表达式排除8. 使用age截取…

初识C语言 ——“C Primer Plus”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是读一本好书&#xff0c;这一本书的名字就叫做《C Primer Plus》&#xff0c;那么&#xff0c;又回到了我们的初识C语言阶段啦&#xff0c;保证零基础都能看懂噢&#xff0c;下面&#xff0c;让我们进入C语言的…

app抓包实战

文章目录一、抓包原理二、常用应用场景三、过滤四、重发五、修改请求六、断点&#xff08;BreakPoint&#xff09;一、抓包原理 二、常用应用场景 解决移动端接口测试 解决接口测试过程中检查传参错误问题 mock测试&#xff08;虚拟的对象代替正常的数据、后端接口没有开发完成…

XXL-JOB分布式任务调度平台搭建以及和SpringBoot整合应用

1 前言 XXL-JOB 是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 可以前往 Gitee 地址进行下载使用&#xff1a; https://gitee.com/xuxueli0323/xxl-job.g…

计算机网络考试复习——第三章 3.1 3.2

本章考试范围为3.1 3.2 3.3 3.4 首先明确数据链路层在网络中是在物理层的上面从下网上看是在第二层&#xff0c;在数据链路层传输的单位是帧。 网络中的主机、路由器等都必须实现数据链路层&#xff0c;局域网中的主机、交换机等都必须实现数据链路层。 数据链路层的地位&am…

Win10 下编译 OpenCV 4.7.0详细全过程,包含xfeatures2d

在Win10下编译 OpenCV 4.7.0过程中&#xff0c;踩了几个坑&#xff0c;这里记录下来&#xff0c;供大家参考。 1. 下载源文件 GitHub上下载OpenCV 4.7.0源文件&#xff0c;及opencv_contrib-4.7.0&#xff0c;如果不方便下载&#xff0c;以下是百度网盘链接&#xff0c;有需要…

maven将jar包添加到本地仓库

第一步&#xff1a;下载需要添加的jar包 可以在maven库中查找下载&#xff0c;也可以在对应官网下载 maven库网址&#xff1a;https://mvnrepository.com/ 找到对应版本的jar包下载 第二步&#xff1a;将下载的jar包放到指定位置&#xff08;位置自己指定&#xff09;&#xf…