Solidity
等待交易被探勘並獲得結果的正確方法是什麼?
我正在使用 react 為我的 dApp 編寫前端,並這樣做是為了(嘗試)通過非同步
sendTransaction
呼叫更新 react 的狀態:var thisJS = this web3.eth.sendTransaction({from: adminAccount, to: contractAddress, value: web3.toWei(funds,"ether")}, function(error, result) { if (error) { console.error(error) } else { console.log("Send transaction successful " + result) const contractFunds = web3.fromWei(web3.eth.getBalance(contractAddress),"ether").toString() thisJS.setState({contractFunds: contractFunds}) } })
這似乎並不像我希望的那樣有效,因為響應
setState
呼叫不會(通常)反映合約地址上的新資金。我一定做錯了什麼 - 等待交易被探勘以便我可以正確更新反應狀態的正確方法是什麼?
使用過濾器來觀察變化。例如,在這種情況下,您可以:
web3.eth.filter('latest', function(error, result){ if (!error) { thisJS.setState({contractFunds: web3.fromWei(web3.eth.getBalance(contractAddress),"ether").toString()}) } else { console.error(error) } });
注意:您可能會想要
.stopWatching
在某個時候(可能在componentWillUnmount()
)
我創建了一個Gist輪詢節點,直到交易被探勘:
web3.eth.getTransactionReceiptMined = function (txnHash, interval) { var transactionReceiptAsync; 間隔=間隔?間隔:500; transactionReceiptAsync = 函式(txnHash,解析,拒絕){ 嘗試 { var 收據 = web3.eth.getTransactionReceipt(txnHash); 如果(收據 == null){ 設置超時(函式(){ transactionReceiptAsync(txnHash,解決,拒絕); }, 間隔); } 別的 { 解決(收據); } } 捕捉(e){ 拒絕(e); } }; if (Array.isArray(txnHash)) { var 承諾 = []; txnHash.forEach(函式(oneTxHash){ promises.push(web3.eth.getTransactionReceiptMined(oneTxHash, interval)); }); 返回 Promise.all(promises); } 別的 { return new Promise(function (resolve, reject) { transactionReceiptAsync(txnHash,解決,拒絕); }); } };
但是,如果它需要超過 50 個塊,我注意到它會失敗。