【问题标题】:How to resolve "Internal error" from web3.eth.Contract.MyMethod.estiamteGas如何从 web3.eth.Contract.MyMethod.estiamteGas 解决“内部错误”
【发布时间】:2021-08-08 02:32:58
【问题描述】:

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

这就是错误的程度,没有提供更多描述性信息,在谷歌搜索了几个小时后,我没有找到任何可以帮助的信息。堆栈跟踪指向 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");

预期行为: 估计回油量

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

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

【问题讨论】:

    标签: ethereum web3js


    【解决方案1】:

    这可能是您的 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);
    }
    

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

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

    【讨论】:

    • 当注释掉估计的gas时,后续的sendSignedTransaction会恢复。这样就解决了我内部错误的大谜团。谢谢!
    • 我知道为什么该特定事务正在恢复,但是,我希望进行的另一个调用会恢复,并且 web3.eth.handleRevert 不适用于 sendSignedTransaction。您知道如何从已签名的交易中获取还原原因吗?
    • 您应该能够从exception.data[txHash].reason 获得还原原因(如果有的话)。有关代码示例,请参阅我的 other answer。
    • 尝试这样做时,我收到以下错误: Promise 处未处理的拒绝:Promise { TypeError: Cannot convert undefined or null to object at Function.keys () 返回的错误似乎成为一个字符串而不是一个对象。它嵌入了一个对象,但我还没有找到访问它的方法。
    • 看来您没有正确处理承诺,但我无法在没有代码示例的情况下对其进行调试,并且 cmets 不是很好的地方。请针对代码示例提出一个单独的问题(这是一个一般的 JS 代码问题,与 web3 或智能合约无关)。
    猜你喜欢
    • 2021-12-23
    • 2023-03-25
    • 1970-01-01
    • 2014-06-04
    • 2019-02-18
    • 1970-01-01
    • 2022-10-08
    • 2023-01-09
    • 1970-01-01
    相关资源
    最近更新 更多