[英]How to detect a transaction that will fail in web3js
我最近剛剛完成了與Remix IDE的一項相當復雜的合同的工作。 我現在將web3附加到前端,但是當我調用應該失敗的函數時,它們仍會在Metamask上通過。
在Remix中測試我的合同時,我經常會單擊並調用某些要求有我所知道的語句的函數,這些語句僅能確認正確記錄了合同狀態。 Remix沒有將事務發送到metamask,而是輸出了錯誤消息,我也想自己處理事務錯誤。
我如何檢查我的合同通話以查看是否會失敗。 我必須使用預測氣體的方法並以這種方式進行檢測嗎?如果可以,怎么辦? 我當前的代碼如下:
contract.callFunction(function(error, result) {
if (!error) alert(result);
else alert(error);
}
上面的代碼捕獲了拒絕元掩碼確認為錯誤,但是應該失敗的事務通過設置了異常高的氣體限制進入元掩碼。 函數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.");
}
});
[編輯]我是在事實之后回來,以幫助為那些有類似問題的人清除信息。 下面討論的所有信息均引用以下鏈接 。
創建合同對象后,您可以使用其名稱訪問任何變量或函數。 您也可以通過數組表示法訪問這些成員,當在編寫代碼時不知道變量或函數的名稱時,此表示法很有用。
contract.foobar == contract["foobar"]
一旦有了函數對象(contract.foobar),就可以使用call,send或estimateGas。 在首先給函數提供所需的參數后(像其他函數一樣調用它),然后在提供選項和回調函數的同時對返回的對象使用call,send或estimateGas。
該回調函數有2個參數。 第一個是錯誤,如果沒有錯誤,它將是不確定的,第二個是調用,發送或估計Gas的結果。 調用和發送都將返回該函數的結果,而estimateGas始終返回一個數字,該數字顯示估計需要多少氣體。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.