我刚刚与Remix IDE签订了一份相当复杂的合同。我现在将web3附加到前端但是当我调用应该失败的函数时,它们仍会在Metamask上进行。
在Remix中测试我的合同时,我经常点击并调用某些需要声明的函数,我知道这些函数会失败,只是为了确认合同状态是否正确记录。 Remix没有将事务发送到元掩码,而是输出错误消息,我也想自己处理事务错误。
如何查看我的合同电话,看它是否会失败。我必须使用预测气体的方法并以这种方式检测它,如果是这样的话?我目前的代码如下:
contract.callFunction(function(error, result) {
if (!error) alert(result);
else alert(error);
}
上面的代码捕获了拒绝元掩码确认作为错误,但是应该失败的事务将通过具有极高气体限制集的元掩码。函数callFunction在合约中没有参数但对区块链有影响所以它需要事务。函数的第一行是" require(state == 1);"我目前将合同设置为状态2,因此我预计交易会失败,我只想检测到它失败。
答案 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总是返回一个数字,显示估计需要多少气体。