Solidity自定义错误处理的合约实现

目录

一、通用需求

二、自定义错误处理合约需求

三、实现过程中的困难

地址

msg.sender

错误处理(Custom error handling)

revert 抛出的自定义错误类型

异常消息数据类型为 bytes

try catch

数字类型转字符串

uint256(numberType).toString()

Strings.toString(numberType)

选择子(Selector)

调试方法

require()

断言(assert)

四、源码

五、总结


一、通用需求

开源协议标识符:MIT

Solidity 编译器版本:不小于 0.8.16

二、自定义错误处理合约需求

Solidity文件名:CustomErrorDemo.sol

依赖的第三方solidity库:

import "@openzeppelin/contracts/utils/Strings.sol";

import "solidity-bytes-utils/contracts/BytesLib.sol";

合约名:CalleeContract、CallerContract

合约原型:

error NoPermission(address owner, address caller);

contract CalleeContract {

address owner;

uint8 calledTimes = 0;

constructor() {}

function callContract(address caller) public returns (uint8) {}

}

contract CallerContract {

CalleeContract calleeContract;

constructor(address calleeContractAddress) {}

function callContract() public returns (string memory returnString, bytes memory encodedErrorData) {}

}

  • NoPermission:自定义错误类型,参数为所有者地址,调用者地址。

  • CalleeContract.owner:被调用合约CalleeContract的成员变量,表示合约的拥有者,即谁部署的合约。

  • CalleeContract.calledTimes:被调用合约CalleeContract的成员变量,表示合约成员函数callContract被成功调用的次数。

  • CalleeContract.constructor:被调用合约CalleeContract的构造函数,记录部署合约的外部账户地址为。

  • CalleeContract.callContract:被调用合约CalleeContract的成员函数,如果函数的调用者不是合约所有者,则抛出自定义错误NoPermission,错误中包含合约的所有者、函数的调用者信息;如果函数的调用者是合约所有者,则将成员变量calledTimes的值加1。

  • CallerContract.calleeContract:调用合约CallerContract的成员变量,表示被调用合约。

  • CallerContract.constructor:调用合约CallerContract的构造函数,将参数calleeContractAddress转换为CalleeContract类

    型并赋值给成员变量calleeContract,

  • CallerContract.callContract:调用合约CallerContract的成员函数。

    此函数调用被调用合约的成员函数CalleeContract.callContract,参数为调用此函数的调用者地址。如果此函数的调用者是被调用合约CalleeContract的所有者,则根据CalleeContract.callContract函数的返回值得到5CalleeContract.callContract函数被成功调用的次数,并返回字符串” Success: calledTimes = X”,其中X为CalleeContract.callContract函数返回的被成功调用的次数;如果此函数的调用者不是被调用合约CalleeContract的所有者,则分析捕获到异常的底层数据,比较底层数据中的选择子是否等于NoPermission错误类型的选择子,相等则返回字符串” Failed: NoPermission owner = Y, caller = Z”,其中Y为所捕获异常底层数据中所携带的CalleeContract合约拥有者owner十六进制串表示的地址,Z为所捕获异常底层数据中所携带的此函数调用者caller十六进制串表示的地址,若不等于NoPermission错误类型的选择子则返回字符串”Failed: Other error.”

注:

1、合约代码中只能使用 penzeppelin 的 String 库提供的方法将整型值转换为字符串。

2、合约代码中只能使用 solidity-bytes-utils 的 BytesLib 提供的方法获取 bytes 类型的片段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值