如何使用ethers.js获取以太坊交易的状态错误提示消息
ethers.js获取交易失败revert错误消息的方案
底层逻辑
EVM的交易回执仅存储
status状态位标识交易成功/失败,不会留存Solidity执行revert时返回的自定义错误字符串。区块浏览器展示的错误消息是平台侧对失败交易在对应执行块高重新模拟调用后解析得到的结果。
实现步骤
你可以通过ethers模拟重放失败交易的方式拿到错误消息,代码实现如下:
ethers v5版本
const ethers = require('ethers'); // 替换为自己使用的RPC节点地址 const provider = new ethers.providers.JsonRpcProvider('RPC_NODE_URL'); const getTxRevertReason = async (txHash) => { // 1. 获取链上交易原始数据 const tx = await provider.getTransaction(txHash); if (!tx.blockNumber) return '交易尚未上链'; try { // 2. 用和原交易完全一致的参数、对应块高模拟执行调用 await provider.call( { from: tx.from, to: tx.to, data: tx.data, value: tx.value, gasLimit: tx.gasLimit, gasPrice: tx.gasPrice }, tx.blockNumber ); } catch (err) { // 3. 解析返回的revert错误 return err.reason || '无法解析未知错误'; } // 交易没有失败返回空 return null; } // 调用示例 const reason = await getTxRevertReason('目标交易哈希'); console.log(reason);
ethers v6版本
v6版本的错误返回结构有调整,修改catch部分的解析逻辑即可:
catch (err) { return err.info?.error?.message || err.reason || '无法解析未知错误'; }
补充说明
- 如果合约用了自定义错误类型,你需要传入对应合约的ABI才能解析出可读的错误内容
- 部分RPC节点不支持历史块高的call调用,遇到这种情况需要切换支持archive功能的RPC节点
内容的提问来源于stack exchange,提问作者Hassaan
相关产品推荐
相关产品推荐

