Transactions

如何使用 web3 js 按帳戶獲取交易?

  • July 6, 2021

我確定之前有人問過這個問題,但我沒有找到任何可以幫助我解決問題的結果。

如何獲取給定帳戶的交易(進出)?我使用nodejs和web3?

通過這一行,我得到了已發送交易的數量:

web3.eth.getTransactionCount(accounts[i])

因此,至少 web3 應該對帳戶活動有所了解。

有沒有簡單的方法來獲取我的賬戶交易?還是我錯過了什麼?我是否必須逐個塊地爬取整個區塊鏈來獲取我的交易?

簡單的交易不會被索引。因此,您要麼需要遍歷所有塊,使用某種鏈下索引(例如etherscan.io),要麼自己建構一個並使用它。

例如,您可以使用這種啟發式方法,而無需處理整個鏈

var myAddr = '0xbb9bc244d798123fde783fcc1c72d3bb8c189413';
var currentBlock = eth.blockNumber;
var n = eth.getTransactionCount(myAddr, currentBlock);
var bal = eth.getBalance(myAddr, currentBlock);
for (var i=currentBlock; i >= 0 && (n > 0 || bal > 0); --i) {
   try {
       var block = eth.getBlock(i, true);
       if (block && block.transactions) {
           block.transactions.forEach(function(e) {
               if (myAddr == e.from) {
                   if (e.from != e.to)
                       bal = bal.plus(e.value);
                   console.log(i, e.from, e.to, e.value.toString(10));
                   --n;
               }
               if (myAddr == e.to) {
                   if (e.from != e.to)
                       bal = bal.minus(e.value);
                   console.log(i, e.from, e.to, e.value.toString(10));
               }
           });
       }
   } catch (e) { console.error("Error in block " + i, e); }
}

它是如何工作的?

使用有關目前狀態的可用資訊(“來自”交易的數量和目前餘額),它及時回溯,直到找到至少這麼多“來自”交易,然後繼續回溯,直到餘額達到0.

固有的限制是不會找到帳戶注資之前的0 值交易。


另一方面,契約事件索引。因此,如果您正在開發智能合約,您可以利用它。

使用 web3 1.0.0 API:

web3.eth.getPastLogs({fromBlock:'0x0',address:'0x9e3319636e2126e3c0bc9e3134AEC5e1508A46c7'})
.then(res => {
 res.forEach(rec => {
   console.log(rec.blockNumber, rec.transactionHash, rec.topics);
 });
}).catch(err => console.log("getPastLogs failed", err));

或通過 JSON RPC eth_getLogs

這個腳本有一個getTransactionsByAccount. 您需要通過添加 web3 來修改它,例如 useweb3.eth.blockNumber而不是 just eth.blockNumber(它在 Geth 控制台中有效,因為 Geth 控制台包含 web3 對象)。

以上將給出簡單的交易,如何獲得合約內部交易需要更多的工作 。

除了@Tjaden 的評論,web3.eth.getTransactionCount(account)只給出了來自account.

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