Mat*_*wig 1 ethereum solidity web3js web3-donotuse
我最近刚刚完成了与Remix IDE的一项相当复杂的合同的工作。我现在将web3附加到前端,但是当我调用应该失败的函数时,它们仍会在Metamask上通过。
在Remix中测试我的合同时,我经常会单击并调用某些包含要求语句的函数,这些语句我知道仅能确认正确记录了合同状态。Remix没有将事务发送到metamask,而是输出了一条错误消息,我也想自己处理事务错误。
我如何检查我的合同通话以查看是否会失败。我必须使用预测气体的方法并以这种方式进行检测吗?如果可以,怎么办?我当前的代码如下:
contract.callFunction(function(error, result) {
if (!error) alert(result);
else alert(error);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码捕获了拒绝元掩码确认为错误,但是应该失败的事务将通过设置了极高的气体限制的元掩码进入。函数callFunction在合同中,不带参数,但对区块链有影响,因此需要交易。该函数的第一行是“ require(state == 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.");
}
});
Run Code Online (Sandbox Code Playgroud)
[编辑]我是在事实之后回来,以帮助为那些有类似问题的人清除信息。下面讨论的所有信息均引用以下链接。
创建合同对象后,您可以使用其名称访问任何变量或函数。您还可以通过数组表示法访问这些成员,当在编写代码时不知道变量或函数的名称时,数组表示法将很有用。
contract.foobar == contract["foobar"]
Run Code Online (Sandbox Code Playgroud)
一旦有了函数对象(contract.foobar),就可以使用call,send或estimateGas。在首先给函数提供所需的参数后(像其他函数一样调用它),然后在提供选项和回调函数的同时对返回的对象使用call,send或estimateGas 。
该回调函数有2个参数。第一个是错误,如果没有错误,它将是不确定的,第二个是调用,发送或估计Gas的结果。调用和发送都将返回该函数的结果,而estimateGas始终返回一个数字,该数字显示估计需要多少气体。
| 归档时间: |
|
| 查看次数: |
1293 次 |
| 最近记录: |