Contract-Development

如何獲取交易狀態(以程式方式,而不是 etherscan)?

  • February 24, 2022

當我從 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);
   }
 });}

引用自:https://ethereum.stackexchange.com/questions/73189