Web3js

如何使用 web3 獲取給定契約的所有日誌?

  • February 6, 2020

這個答案filter.get未被棄用時有效,但現在我不確定如何使用訂閱做同樣的事情 -web3.eth.subscribe在我創建訂閱後聽到新事件並對其採取行動,但我不確定如何獲取舊事件。

試試這個(用 web3.js v1.2.1 測試):

async function getPastLogs(address, fromBlock, toBlock) {
   if (fromBlock <= toBlock) {
       try {
           const options = {
               address  : address,
               fromBlock: fromBlock,
               toBlock  : toBlock
           };
           return await web3.eth.getPastLogs(options);
       }
       catch (error) {
           const midBlock = (fromBlock + toBlock) >> 1;
           const arr1 = await getPastLogs(address, fromBlock, midBlock);
           const arr2 = await getPastLogs(address, midBlock + 1, toBlock);
           return [...arr1, ...arr2];
       }
   }
   return [];
}

...

const latest = await web3.eth.getBlock("latest");
const logs = await getPastLogs(yourContractAddress, 1, latest);

您可以通過替換1為您的合約創建區塊號來進一步優化這一點。

web3.eth.getPastLogs 在此處查看有關功能的更多資訊。

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