Contract-Development
如何獲取交易狀態(以程式方式,而不是 etherscan)?
當我從 javascript webapp 與智能合約互動時遇到問題。確認狀態後我可以正確執行交易,但失敗時我無法得到任何錯誤響應。
myfunction.myTrans.sendTransaction( { from: web3.eth.accounts[0], gas: gas, gasPrice:gasPrice, to:contractaddress, value:web3.toWei(document.getElementById("price").value, "ether") }, function (error, result) { if (!error) { console.log(result); } else { console.log("transaction error"); console.log(error); } })
當我在 Metamask 上收到錯誤並且我可以在 EtherScan 中看到它時,我在程式碼中沒有收到任何錯誤響應。我只有在一切正常(交易確認)時才會得到結果。
關於如何管理交易錯誤的任何想法?
提前致謝!
您可以使用
try
..catch
結構來擷取錯誤和異常:try { await myfunction.myTrans.sendTransaction({ from: web3.eth.accounts[0], gas: gas, gasPrice:gasPrice, to:contractaddress, value:web3.toWei(document.getElementById("price").value, "ether") }); } catch(error) { console.log(error.message); }
當交易發出時,交易被發送到一個節點進行探勘並添加到一個塊中。發出交易後,如果交易結構正確填寫了必要的欄位,交易雜湊將立即返回。如果給定的交易結構有任何錯誤,比如地址設置不正確,就會返回錯誤。這些事情將發生在您給定程式碼的一部分(如下)
function (error, result) { if (!error) { console.log(result); } else { console.log("transaction error"); console.log(error); } }
要獲取狀態(成功/失敗),您可以使用過濾器查看最新塊是否添加了您的交易(收到的交易雜湊)。當交易添加到新區塊時,會觸發 watch 的回調,您將使用eth.getTransactionReceipt(txHash)找到狀態
過濾器/手錶連結web3js filter-watch
可能會使用以下程式碼片段。
function (err, result) { if (err) { console.error(err); return; } var txhash = result; var filter = web3.eth.filter('latest'); filter.watch(function(error, result) { var receipt = web3.eth.getTransactionReceipt(txhash); if (receipt && receipt.transactionHash == txhash) { console.log("TransactionStatus ", receipt.status); } });}