Javascript

乙太幣 - 以批處理模式獲取歷史區塊。時間戳

  • June 25, 2021

我正在嘗試建構一個簡單的數據庫表,其中包含block.numberblock.timestamp從給定的塊號開始。

這可以通過使用 ethers.js 庫的以下 JS 程式碼輕鬆完成:

const loadEthBlocks = async (fromBlock, toBlock) => {
   for (let i = fromBlock; i <= toBlock; i++) {
       const block = await provider()
          .getBlock(i)
       // store record into database
   }
}

但是,這會為每個塊生成一個請求(當使用 Alchemy 或 Infura 時,這是一個障礙)。經過一些測試,將 2 個塊儲存到 PostgreSQL 數據庫中需要 1 秒,因此對於幾百萬條記錄是不可行的。

我想知道是否有辦法以批量模式檢索一系列塊,其中至少包含塊號和塊時間戳,然後進行批量數據載入(而不是每個請求一個記錄)。

如果我們可以在下面的函式中定義一個起始塊並檢索時間戳,那就太好了,但是這個監聽器只返回從最新塊開始的塊號:

provider.on("block", (blockNumber) => {
   // Emitted on every block change
})

任何人都面臨與可擴展解決方案相同的問題?

Ethers 僅使用乙太坊節點公開的JSON RPC API 。由於您需要block.timestamp,因此唯一允許這樣做的兩種方法是eth_getBlockByHasheth_getBlockByNumber(都在provider.getBlock幕後使用)。對於您的案例來說,這絕對是非常慢的。

您可以執行自己的節點來加快速度。如果您不想這樣做,可以使用我現在想到的一些技巧:

  • 如果鍊是乙太坊主網或 xDai,Dune Analytics 已經在 SQL 上索引了整個區塊鏈,你可以編寫查詢來提取你想要的。但是要以 csv 格式導出數據,他們會收取訂閱費。
  • 否則有一種非常hacky的方法,您可以使用TheGraph的索引器。你可以創建一個非常簡單的子圖,它只儲存一個Block包含塊號和時間戳的子圖。索引器完成索引後,您可以使用 GraphQL 查詢數據並寫入數據庫。

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