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

时间:2018-02-19 08:02:49

标签: ethereum solidity web3js web3

我刚刚与Remix IDE签订了一份相当复杂的合同。我现在将web3附加到前端但是当我调用应该失败的函数时,它们仍会在Metamask上进行。

在Remix中测试我的合同时,我经常点击并调用某些需要声明的函数,我知道这些函数会失败,只是为了确认合同状态是否正确记录。 Remix没有将事务发送到元掩码,而是输出错误消息,我也想自己处理事务错误。

如何查看我的合同电话,看它是否会失败。我必须使用预测气体的方法并以这种方式检测它,如果是这样的话?我目前的代码如下:

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

上面的代码捕获了拒绝元掩码确认作为错误,但是应该失败的事务将通过具有极高气体限制集的元掩码。函数callFunction在合约中没有参数但对区块链有影响所以它需要事务。函数的第一行是" require(state == 1);"我目前将合同设置为状态2,因此我预计交易会失败,我只想检测到它失败。

1 个答案:

答案 0 :(得分:4)

对于发布问题然后快速找到答案表示歉意,但我希望将来可以帮助某人。

为了确定事务是否会失败,我们必须调用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.");
        }
    });

[编辑]我事后回来帮助清理那些有类似问题的人的信息。下面讨论的所有信息都引用了以下link

创建合同对象后,您可以使用它的名称访问任何变量或函数。您还可以通过数组表示法访问这些成员,这在编写代码时不知道变量或函数的名称时很有用。

contract.foobar == contract["foobar"]

一旦有了函数对象(contract.foobar),就可以使用call,send或estimateGas。首先为函数提供所需的参数(像任何其他函数一样调用它)然后在返回的对象上使用call,send或estimateGas,同时提供选项回调函数

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