Transactions

有沒有辦法獲得在不到 24 小時前進行首次交易的錢包?

  • September 7, 2022

有沒有辦法獲得在不到 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);
 });

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