Ethereum 如何在web3js中检测将失败的事务

Ethereum 如何在web3js中检测将失败的事务,ethereum,solidity,web3js,web3,Ethereum,Solidity,Web3js,Web3,我最近刚刚完成了与RemixIDE签订的一份相当复杂的合同。我现在将web3连接到前端,但是当我调用应该失败的函数时,它们仍然在Metamask上运行 当在Remix中测试我的契约时,我经常点击并调用某些函数,这些函数需要一些语句,我知道这些语句无法确认契约状态被正确记录。Remix没有将事务发送到metamask,而是输出了一条错误消息,我也想自己处理事务错误 我如何检查我的合同呼叫,看它是否会失败。我必须使用预测气体并以此方式检测的方法吗?如果是,怎么做?我目前的代码如下: contract

我最近刚刚完成了与RemixIDE签订的一份相当复杂的合同。我现在将web3连接到前端,但是当我调用应该失败的函数时,它们仍然在Metamask上运行

当在Remix中测试我的契约时,我经常点击并调用某些函数,这些函数需要一些语句,我知道这些语句无法确认契约状态被正确记录。Remix没有将事务发送到metamask,而是输出了一条错误消息,我也想自己处理事务错误

我如何检查我的合同呼叫,看它是否会失败。我必须使用预测气体并以此方式检测的方法吗?如果是,怎么做?我目前的代码如下:

contract.callFunction(function(error, result) {
    if (!error) alert(result);
    else alert(error);
}

上面的代码捕捉到拒绝metamask确认是一个错误,但应该失败的事务将通过metamask,并设置了极高的气体限制。函数callFunction在合同中,不接受任何参数,但对区块链有影响,因此需要交易。函数的第一行是requireretreat==1;我的合同目前设置为状态2,因此我预计交易会失败,我只想检测它是否失败。

我很抱歉发布了一个问题,然后很快找到了答案,但我希望这对将来的人有所帮助

为了确定事务是否会失败,我们必须调用estimateGas并附加回调函数。我假设我们必须检查返回的气体估计值,以便预测它是否会失败,但这个过程相当简单。下面是我在捕获两种最常见错误情况的同时成功运行函数的完整代码

    contract.nextState.estimateGas(function(error, result) {
        if (!error) {
            contract.nextState(function(error, result) {
                if (!error) {
                    alert("This is my value: " + result);
                } else {
                    if (error.message.indexOf("User denied") != -1) {
                        alert("You rejected the transaction on Metamask!");
                    } else {
                        alert(error);
                    }
                }
            });
        } else {
            alert("This function cannot be run at this time.");
        }
    });
[编辑]事后我会回来帮助那些有类似问题的人整理信息。下面讨论的所有信息都参考了以下内容

创建契约对象后,可以通过使用其名称访问任何变量或函数。您还可以通过数组表示法访问这些成员,这在编写代码时变量或函数的名称未知时非常有用

contract.foobar == contract["foobar"]
一旦有了函数object contract.foobar,就可以使用call、send或estimateGas。在首先给出函数所需的参数后,可以像调用任何其他函数一样调用它,然后在提供选项和回调函数的同时对返回的对象使用call、send或estimateGas


此回调函数接受2个参数。第一个是错误,如果没有错误,它将是未定义的,第二个是调用、发送或estimateGas的结果。Call和Send都将返回函数的结果,而estimateGas总是返回一个数字,显示估计需要多少汽油。

我很抱歉发布了一个问题,然后很快找到了答案,但我希望这对以后的人有所帮助

为了确定事务是否会失败,我们必须调用estimateGas并附加回调函数。我假设我们必须检查返回的气体估计值,以便预测它是否会失败,但这个过程相当简单。下面是我在捕获两种最常见错误情况的同时成功运行函数的完整代码

    contract.nextState.estimateGas(function(error, result) {
        if (!error) {
            contract.nextState(function(error, result) {
                if (!error) {
                    alert("This is my value: " + result);
                } else {
                    if (error.message.indexOf("User denied") != -1) {
                        alert("You rejected the transaction on Metamask!");
                    } else {
                        alert(error);
                    }
                }
            });
        } else {
            alert("This function cannot be run at this time.");
        }
    });
[编辑]事后我会回来帮助那些有类似问题的人整理信息。下面讨论的所有信息都参考了以下内容

创建契约对象后,可以通过使用其名称访问任何变量或函数。您还可以通过数组表示法访问这些成员,这在编写代码时变量或函数的名称未知时非常有用

contract.foobar == contract["foobar"]
一旦有了函数object contract.foobar,就可以使用call、send或estimateGas。在首先给出函数所需的参数后,可以像调用任何其他函数一样调用它,然后在提供选项和回调函数的同时对返回的对象使用call、send或estimateGas


此回调函数接受2个参数。第一个是错误,如果没有错误,它将是未定义的,第二个是调用、发送或estimateGas的结果。Call和Send都将返回函数的结果,而estimateGas总是返回一个数字,显示估计需要多少气体。

如果您能详细描述一下代码的作用,那就太好了。是否有错误!==“未定义”意味着交易中会有错误?@NicSzer我希望你能找到解决问题的方法,如果你没有,希望我对答案的编辑能有所帮助。我喜欢谷歌最有可能引导你提出我的问题,我个人讨厌在谷歌上发现一个不能完全回答我问题的问题,所以我为信息的缺乏道歉。您的错误是正确的,未定义意味着存在n个错误
这不是一个错误。如果错误不是未定义的,则它是包含错误信息的对象。感谢您编辑您的答案并添加更多详细信息@MatthewLudwigI正在使用web3 2.x,因为Metamask在默认情况下注入了这一点。它似乎没有。方法。知道我该如何预测电话是否会失败吗?谢谢@MatthewLudwig。谢谢你的回答。刚刚添加了我的解决方案。轮询并不理想,但对我来说是可行的:如果您能更详细地描述一下代码的作用,那就太好了。是否有错误!==“未定义”意味着交易中会有错误?@NicSzer我希望你能找到解决问题的方法,如果你没有,希望我对答案的编辑能有所帮助。我喜欢谷歌最有可能引导你提出我的问题,我个人讨厌在谷歌上发现一个不能完全回答我问题的问题,所以我为信息的缺乏道歉。您的错误是正确的,未定义表示没有错误。如果错误不是未定义的,则它是包含错误信息的对象。感谢您编辑您的答案并添加更多详细信息@MatthewLudwigI正在使用web3 2.x,因为Metamask在默认情况下注入了这一点。它似乎没有。方法。知道我该如何预测电话是否会失败吗?谢谢@MatthewLudwig。谢谢你的回答。刚刚添加了我的解决方案。投票并不理想,但对我来说很有效: