如何检测将在 web3js 中失败的事务
How to detect a transaction that will fail in web3js
我最近刚刚完成了与 Remix IDE 的一项相当复杂的合同。我现在将 web3 附加到前端,但是当我调用应该失败的函数时,它们仍然会通过 Metamask。
在 Remix 中测试我的合约时,我经常单击并调用某些函数,这些函数具有我知道会失败的 require 语句,只是为了确认合约状态已正确记录。 Remix 没有将交易发送到 metamask 而是输出错误消息,我也想自己处理交易错误。
我如何检查我的合约调用是否会失败。我必须使用预测气体的方法并以这种方式检测它吗?如果是,如何检测?我当前的代码如下:
contract.callFunction(function(error, result) {
if (!error) alert(result);
else alert(error);
}
上面的代码将拒绝元掩码确认视为错误,但本应失败的交易会通过设置了高得离谱的气体限制的元掩码。函数 callFunction 在合约中,不带参数,但对区块链有影响,因此它需要交易。该函数的第一行是 "require(state == 1);",我目前将合同设置为状态 2,所以我预计交易会失败,我只是想检测它是否失败。
对于发布问题然后快速找到答案,我深表歉意,但我希望它对以后的人有所帮助。
为了查明交易是否会失败,我们必须调用 estimateGas() 并附加一个回调函数。我假设我们必须检查 gas 估计 returned 以预测它是否会失败,但这个过程变得相当简单。这是我最终成功 运行 函数的完整代码,同时捕获了两个最常见的错误案例。
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。在首先为函数提供它需要的参数(像调用任何其他函数一样调用它)之后,您可以在 returned 对象上使用 call、send 或 estimateGas,同时提供 options 和回调函数.
这个回调函数有两个参数。第一个是错误,如果没有错误,它将是未定义的,第二个是调用、发送或估计气体的结果。 Call 和 Send 都将 return 函数的结果,而 estimateGas 总是 return 一个显示估计需要多少 gas 的数字。
我最近刚刚完成了与 Remix IDE 的一项相当复杂的合同。我现在将 web3 附加到前端,但是当我调用应该失败的函数时,它们仍然会通过 Metamask。
在 Remix 中测试我的合约时,我经常单击并调用某些函数,这些函数具有我知道会失败的 require 语句,只是为了确认合约状态已正确记录。 Remix 没有将交易发送到 metamask 而是输出错误消息,我也想自己处理交易错误。
我如何检查我的合约调用是否会失败。我必须使用预测气体的方法并以这种方式检测它吗?如果是,如何检测?我当前的代码如下:
contract.callFunction(function(error, result) {
if (!error) alert(result);
else alert(error);
}
上面的代码将拒绝元掩码确认视为错误,但本应失败的交易会通过设置了高得离谱的气体限制的元掩码。函数 callFunction 在合约中,不带参数,但对区块链有影响,因此它需要交易。该函数的第一行是 "require(state == 1);",我目前将合同设置为状态 2,所以我预计交易会失败,我只是想检测它是否失败。
对于发布问题然后快速找到答案,我深表歉意,但我希望它对以后的人有所帮助。
为了查明交易是否会失败,我们必须调用 estimateGas() 并附加一个回调函数。我假设我们必须检查 gas 估计 returned 以预测它是否会失败,但这个过程变得相当简单。这是我最终成功 运行 函数的完整代码,同时捕获了两个最常见的错误案例。
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。在首先为函数提供它需要的参数(像调用任何其他函数一样调用它)之后,您可以在 returned 对象上使用 call、send 或 estimateGas,同时提供 options 和回调函数.
这个回调函数有两个参数。第一个是错误,如果没有错误,它将是未定义的,第二个是调用、发送或估计气体的结果。 Call 和 Send 都将 return 函数的结果,而 estimateGas 总是 return 一个显示估计需要多少 gas 的数字。