有沒有辦法獲得在不到 24 小時前進行首次交易的錢包?
有沒有辦法獲得在不到 24 小時前進行首次交易的錢包?
我正在尋找一種方法來篩選在過去 24 小時內進行過首次交易的所有地址。有沒有辦法做到這一點?**例如,**如果我有兩個錢包,一個 100 天前,一個 20 天前,但今天都進行了第一筆交易,他們應該出現。
我知道我在問一個與此類似的問題,但我沒有 50 位代表需要發表評論:如何獲取“新鮮”錢包的地址列表?.
上麵類似問題的答案似乎只過濾了過去 24 小時內有 1 筆交易的地址,但這並不一定意味著它是該賬戶的第一筆交易。
謝謝大家!
我回答了你的其他問題。是的,我發布的解決方案保證您將獲得在過去 24 小時內完成 1 筆交易的錢包/地址。
該
web3.eth.getTransactionCount
函式計算一個地址曾經發送過的所有交易,不是在那個區塊,而是永遠,即使是最近的交易。因此,例如,如果我們首先檢查最後 10 個區塊,並且我們看到在該區塊進行了第一次交易的交易,但它還在最近的區塊中進行了另一筆交易,web3.eth.getTransactionCount
則將顯示多於 1 個交易並且它將被排除在外,這正是我們想要的。您是否需要獲取過去 24 小時內僅進行過 1 筆交易的乙太坊區塊鏈中的所有地址?我在另一個答案中提出的解決方案是正確的。另外,我只檢查了大約 24 小時前開采的區塊。要檢查從 24 小時前開采的區塊到目前區塊的所有地址,您需要從 24 小時前開采的區塊循環到目前區塊,在它們之間逐塊檢查並檢查所有交易並檢查
web3.eth.getTransactionCount
每個交易tx.from
地址。例如,這將是一個完整的解決方案(可能很慢,因為它將檢查大約 5000 個塊,並且對於每個塊,它將檢查其所有交易。我不確定 Infura 是否會讓您提出這麼多請求):
請記住
<yourInfuraKey>
用您自己的 infura 密鑰替換。const Web3 = require("web3"); const web3 = new Web3( "wss://rinkeby.infura.io/ws/v3/72033898e71b4d2e9874b5a9c12d1cb6" ); /** * A new block is mined about every 15 seconds. We can assume that 4 blocks are mined every minute. * 4 block multiplied by 60 minutes yields the number of blocks mined in an hour (240). * 240 multiplied by 24 hours yields the number of blocks mined in the last 24 hours (5760). * We can use this as an approximation to know what block was mined 24 hours ago and sync. */ const blockMinedWithin24Hours = 4 * 60 * 24; const alreadyProcessed = {}; console.log("blockMinedWithin24Hours: ", blockMinedWithin24Hours); async function getFreshAddressesMined24HoursAgo() { const latestBlockNumber = await web3.eth.getBlockNumber(); const freshAddresses = []; let targetBlockNumber = latestBlockNumber - blockMinedWithin24Hours; while (targetBlockNumber < latestBlockNumber) { const block = await web3.eth.getBlock(targetBlockNumber); console.log("Processing block.number: ", block.number); console.log("Renaming blocks: ", latestBlockNumber - targetBlockNumber); for (let i = 0; i < block.transactions.length; i++) { const txHash = block.transactions[i]; const tx = await web3.eth.getTransaction(txHash); // Caching the tx.from address to avoid processing it multiple times it case it has sent more transactions. if (alreadyProcessed[tx.from]) { continue; } const txCount = await web3.eth.getTransactionCount(tx.from); // If this address has only made one transaction, then it's a fresh address. if (txCount === 1) { const record = { address: tx.from, firstTransactionAtBlock: block.number, }; freshAddresses.push(record); console.log("-----------------------"); console.log("record: ", record); console.log("-----------------------"); } } targetBlockNumber++; } return freshAddresses; } getFreshAddressesMined24HoursAgo() .then((freshAddresses) => { console.log("freshAddresses: ", freshAddresses); }) .catch((error) => { console.log("Error: ", error); });