Javascript
乙太幣 - 以批處理模式獲取歷史區塊。時間戳
我正在嘗試建構一個簡單的數據庫表,其中包含
block.number
並block.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_getBlockByHash
和eth_getBlockByNumber
(都在provider.getBlock
幕後使用)。對於您的案例來說,這絕對是非常慢的。您可以執行自己的節點來加快速度。如果您不想這樣做,可以使用我現在想到的一些技巧:
- 如果鍊是乙太坊主網或 xDai,Dune Analytics 已經在 SQL 上索引了整個區塊鏈,你可以編寫查詢來提取你想要的。但是要以 csv 格式導出數據,他們會收取訂閱費。
- 否則有一種非常hacky的方法,您可以使用TheGraph的索引器。你可以創建一個非常簡單的子圖,它只儲存一個
Block
包含塊號和時間戳的子圖。索引器完成索引後,您可以使用 GraphQL 查詢數據並寫入數據庫。