Solidity

等待交易被探勘並獲得結果的正確方法是什麼?

  • October 27, 2016

我正在使用 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 個塊,我注意到它會失敗。

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