簡體   English   中英

如何檢測將在Web3js中失敗的事務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM