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

这篇具有很好参考价值的文章主要介绍了【区块链】走进web3的世界-合约交互中的异常/边界处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

web3与智能合约交互,区块链,web3

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

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

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

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

    

web3与智能合约交互,区块链,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 来处理异常。文章来源地址https://www.toymoban.com/news/detail-703749.html

到了这里,关于【区块链】走进web3的世界-合约交互中的异常/边界处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 区块链合约交互 web3

    遵循ERC20规则, 钱包里可以有很多种类型的token:USDT,DFI,DFA 1.合约交互之前需要先判断是否仍允许purchasePool合约从账户(钱包里的账户) 中提取的ERC20dfaContract 这本合约里(DFA)的金额 await this.contract.ERC20dfaContract.methods.allowance(this.address,this.addressMap.AcceleratePool).call(); ERC20df

    2024年02月07日
    浏览(63)
  • 区块链-java对接web3合约

    本文章讲述了如何在合约已经部署并且能拿到合约abi文件的情况下,用java代码去进行调用合约 已经部署好的合约地址 编译合约后生成的abi文件  通过hardhat-build去编译 通过remix网站去编译获取(教程可自行百度查询) 引入web3的jar包 版本用最新的就行了 引入web3j-maven-plugin 将编

    2024年01月16日
    浏览(70)
  • 欢迎来到Web3.0的世界:Solidity智能合约安全漏洞分析

    智能合约是运行在区块链网络中的一段程序,经由多方机构自动执行预先设定的逻辑,程序执行后,网络上的最终状态将不可改变。智能合约本质上是传统合约的数字版本,由去中心化的计算机网络执行,而不是由政府或银行等中央集权机构执行。智能合约程序可以用Solidi

    2024年02月03日
    浏览(45)
  • 6.DApp-用Web3实现前端与智能合约的交互

    题记         用Web3实现前端与智能合约的交互,以下是操作流程和代码。 准备ganache环境         文章地址:4.DApp-MetaMask怎么连接本地Ganache-CSDN博客  准备智能合约          文章地址: 2.DApp-编写和运行solidity智能合约-CSDN博客 编写index.html文件          !DOCTYPE htm

    2024年02月08日
    浏览(40)
  • 使用web3.js连接Metamask钱包并完成合约交互

    Web3.js是一个用于与以太坊网络进行交互的JavaScript库。Metamask是一个以太坊钱包插件,可以在浏览器中创建和管理以太坊账户。本文将介绍如何使用web3.js库连接Metamask钱包,并完成与智能合约的交互。 Web3.js是一个用于与以太坊网络进行交互的JavaScript库。它提供了一些方法和功

    2024年03月16日
    浏览(51)
  • python 之 web3 与智能合约的交互、编译等使用

    一、背景 web3.py是一个用于与以太坊交互的 Python 库。 它常见于去中心化应用程序 (dapps)中,帮助发送交易、与智能合约交互、读取块数据以及各种其他用例。 最初的 API 源自Web3.js Javascript API,但后来不断发展以满足 Python 开发人员的需求和物质享受。 本人在合约审计于模糊

    2024年02月11日
    浏览(36)
  • Java与智能合约交互(Web3j)- write函数

    说在前头 Web3是一种新兴的网络概念,由于某些原因导致我们能够接触到的相关技术知识实在有限,每当我遇见技术瓶颈总是不能找到充足的资料,这也让我萌生了填补这片空白知识的冲动。 “Hello Web3” 这个专栏会尽力将我掌握的web3 知识分享给大家。如果分享的知识能帮助

    2023年04月08日
    浏览(73)
  • 区块链web3智能合约Solidity学习资源整理

    Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在以太坊虚拟机(EVM)上运行。 Solidity中文官方文档: https://solidity-cn.readthedocs.io/zh/develop/ https://learnblockchain.cn/docs/solidity/index.html 在线rem

    2024年03月19日
    浏览(73)
  • Web3区块链游戏:创造虚拟世界的全新体验

    随着区块链技术的不断发展,Web3区块链游戏正逐渐崭露头角,为玩家带来了全新的虚拟世界体验。传统游戏中的中心化结构和封闭经济体系已经被打破,取而代之的是去中心化的游戏环境和真实所有权的数字资产。本文将深入探讨Web3区块链游戏的特点、优势以及对玩家和游

    2024年02月21日
    浏览(42)
  • 赛联区块链培训:Web3的核心要素——区块链、加密资产、智能合约和预言机

    在2008年,中本聪发布了比特币白皮书,彻底颠覆了我们对数字化交易的概念,并首次提出了一种无需可信中间方的安全在线交易模式。中本聪写道:“需要基于加密证明,而非信任,来建立电子支付系统。” 智能合约被发明后,去中心化的互联网模式进入公众视野。如果说

    2024年02月07日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包