如何从 web3.eth.Contract.MyMethod.estiamteGas 解析 "Internal error"

How to resolve "Internal error" from web3.eth.Contract.MyMethod.estiamteGas

我从 Express 服务器调用 estimateGas 到私有 Hyperledger Besu 链,昨天一切正常,但今天当我 运行 使用相同的方法时,它 returning “错误:返回错误:内部错误”。从昨天到今天,代码没有任何变化,我什至不知道从哪里开始进行故障排除。

这就是错误的程度,没有给出更多的描述,在谷歌搜索了几个小时后,我没有找到任何可以帮助的东西。堆栈跟踪指向 web3 节点模块中的错误处理程序文件。

代码(出于安全原因省略实际方法和参数):

            console.log("Estimating Gas");
            let gas = await this.myContract.methods
                .myMethod(
                    address,
                    uint256,
                    address,
                    address,
                    uint256
                )
                .estimateGas({ from: address });
            console.log("This call will probably take " + gas + " gas");

预期行为: return 估计气体量

实际行为: 记录第一条消息,但是从 estimateGas 方法中捕获了 returns 内部错误,并且永远不会进入第二条消息

有谁知道我如何检索更具体的错误或如何修复它?

这可能是您的 web3 提供商的问题,但更可能的选择是执行 myMethod() 会导致交易恢复 - 这就是它可能抛出错误的原因。

您可以将方法封装在 try/catch 块中以捕获错误消息。

try {
    let gas = await this.myContract.methods
        .myMethod(
            address,
            uint256,
            address,
            address,
            uint256
        )
        .estimateGas({ from: address });
} catch (err) {
    console.log(err);
}

它可以 return 一个特定的还原消息,您可以使用定义此消息的 require() 语句根据您的 Solidity 代码进行验证。

或者它 return 是通用的“所需气体超出限额”,这可能是由任何失败的 require/assert 条件、throwrevert 语句,或尝试进行无效操作(例如自 Solidity 0.8 以来算术运算期间的整数溢出)。如果它是通用消息,您将需要调试合约变量值、return 它可能正在调用的外部合约的值等。