跳至主要內容

區塊鏈資料回填 –Streams

更新於
2026年7月20日

回填是指檢索區塊鏈歷史資料,以填充資料庫、分析過往趨勢或審計交易的過程。無論您是需要從創世區塊開始對整條鏈進行索引,還是僅需追蹤過去 24 小時的活動,高效地檢索歷史資料都是一項關鍵的基礎設施挑戰。

Streams 透過一鍵式範本、伺服器端篩選、批次處理與壓縮選項,以及保證將資料傳送至您指定的目標位置,讓資料回填變得簡單。 您無需編寫複雜的腳本來輪詢 RPC 端點,只需配置一個 Stream、設定區塊範圍,並可選擇套用篩選器以僅擷取所需Streams 資料可靠且大規模地Streams 至您的目標位置(例如:Webhook、S3、PostgreSQL、Azure Storage 等)。

為何要使用Streams 回填?

Streams 基礎架構方面的事務,例如重試、區塊排序及錯誤處理,讓您能專注於應用程式的資料邏輯。

特色說明
篩選器您可以在傳送資料前,透過篩選器在伺服器端對資料進行處理與轉換。請使用 解碼 EVM 收據 用於十六進位解碼、建立自訂有效載荷,以及透過以下方式進行除錯: console.log().
批次處理與壓縮您可以設定 資料集批次大小 (例如 10-100),以每筆請求批次處理多個區塊。您也可以啟用 壓縮格式:「gzip」目的地設定.
鍵值儲存系統您可以儲存觀察清單, ABIs,或設定值,並透過以下方式在篩選器中存取這些值: qnLib 方法。您也可以透過 REST API 管理數值。
REST API您可以Streams REST API 以程式方式建立、更新、暫停及刪除Streams 。
多鏈每個 Stream 針對一條鏈/網路。您可以Streams 執行多個 Stream,以進行多鏈資料補全。請參閱「支援的鏈」。
即時轉換您可以省略 end_range 在回填完成後繼續串流。您可以使用 elastic_batch_enabled 在處理端自動縮小批次大小,並 與尖端保持距離 以減少 組織重整 頻率。

回填成本估算

回填歷史區塊鏈資料會根據處理的區塊數量,並採用網路資料集乘數,來消耗 API 信用點數。Streams 與 RPCStreams 同一個 API 信用點數池。

在開始之前,請使用API 信用額度計算器來估算您的補足成本。該計算器會顯示:


  • 填補可用歷史區塊所需的 API 積分總數
  • 每個區塊的積分數取決於您所選的資料集和網路
  • 哪些網路支援回填功能?(例如,Solana 目前並不支援回填)

如何進行資料回填


  1. 請選擇您的區塊鏈和網路。請參閱Streams 支援的區塊鏈清單。

  2. 設定您的區塊範圍。您可以選擇從創世區塊開始,或從特定區塊高度開始。至於結束區塊,您可以設定為特定高度,或選擇連續串流模式以持續接收新區塊。

  3. 請選擇您的資料集。 Streams 多種資料集,例如區塊附收據的區塊交易日誌等。請選擇符合您使用情境的資料集。有關特定區塊鏈的資料集,請參閱下方的「依生態系統補填資料」。

  4. 套用篩選條件可選)。使用伺服器端篩選功能,以縮小您想要接收的資料範圍。

  5. 選擇您的目的地。設定您希望將資料傳送至何處,例如Webhooks、S3、PostgreSQL 等。請參閱「目的地」文件以獲取更多詳細資訊。

  6. 請在「串流」設定頁面中檢查連線狀態,並傳送測試資料,以確保所有設定皆正確無誤。

  7. 開始直播。

不確定該選擇哪種設定嗎?

請參閱下方的「回填技巧」,了解有關批次處理、壓縮及效能優化的建議。

依生態系統分類的補充資料

Streams 為任何生態系統(包括Ethereum、Bitcoin、Solana 等)補填資料。由於各生態系統的資料結構與格式各不相同,請在下方選擇您的生態系統,以查看該鏈專屬的資料集、範例篩選條件及回應結果。


Ethereum EVM 鏈

Streams 多條 EVM 鏈,包括Ethereum、Base、Arbitrum 及BNB Smart Chain。所有 EVM 鏈皆採用相似的架構與資料結構,因此篩選條件與資料包格式在各鏈上通常相同,但可能存在某些特定於各鏈的差異。

解碼 EVM 資料

在使用 EVM 相容鏈時,您可以透過 解碼 EVM 收據 函式。此實用工具以原始交易收據及您的合約 ABI 作為輸入,將原始十六進位資料轉換為人類可讀的格式。

解碼過程會自動:


  • 將交易日誌中的事件簽名與提供的 ABI 進行比對。
  • 根據參數的類型(位址、整數、字串等)進行解碼。
  • 以帶有名稱參數的結構化資料形式傳回 解碼日誌 物件。

進一步了解此功能:解碼 EVM 資料

可用的資料來源

對於Ethereum、Base、Arbitrum 和BNB Smart Chain 等 EVM 鏈,您可以使用以下資料集來進行資料回填。

如需完整的 JSON 規格及各資料集的詳細資訊,請參閱「資料來源」文件。

資料來源說明
區塊由 eth_getBlockByNumber 函式所回傳的區塊物件陣列
附收據的區塊一個包含複合資料集的物件陣列,其中包含由 `eth_getBlockByNumber` 和 `eth_getBlockReceipts` 函式所傳回的區塊與收據
交易一組交易物件的陣列,其形式與區塊資料中的「transactions」陣列所呈現的一致
日誌一組由日誌物件組成的陣列,其形式與交易收據中「logs」陣列內的呈現方式相同
收據一個陣列的陣列,每個陣列都包含由 eth_getBlockReceipts 返回的收據物件
追蹤 (debug_trace)由 debug_traceBlock 回傳的追蹤資料陣列之陣列
軌跡 (trace_block)由 trace_block 回傳的追蹤資料陣列之陣列
附收據的區塊 + debug_trace一個包含複合資料集的物件陣列,其中包含來自 debug_traceBlock 的區塊、收據和追蹤記錄
附收據的區塊 + trace_block一個包含複合資料集的物件陣列,其中包含來自 trace_block 的區塊、收據和追蹤記錄

資料來源的可用性因鏈而異。部分資料集(特別是 Traces)可能並非在所有 EVM 網路中皆受支援。請參閱「資料來源」頁面以查看最新的支援對照表。

範例:ERC-20 代幣轉帳

以下範例函式會篩選一組交易,透過檢查輸入資料中的 轉帳 方法簽名。


// Chain: Ethereum
// Dataset: Transactions
// Test with block: 23977403

type Payload struct {
Data [][]Tx `json:"data"`
Metadata map[string]interface{} `json:"metadata"`
}
type Tx struct {
Hash string `json:"hash"`
From string `json:"from"`
To string `json:"to"`
Input string `json:"input"`
BlockNumber string `json:"blockNumber"`
}

func Filter(qn *qn.QNContext, payload Payload) interface{} {
// The standard ERC-20 transfer(address,uint256) method signature
const transferMethodID = "0xa9059cbb"

var filteredTransactions []map[string]interface{}

// Loop through all blocks in the batch (data is [][]tx: outer = block, inner = txs)
for _, transactions := range payload.Data {
for _, tx := range transactions {
// Ensure the input carries a full transfer(address,uint256) call:
// "0x" + 4-byte selector + two 32-byte words = 138 hex chars.
if !strings.HasPrefix(tx.Input, transferMethodID) || len(tx.Input) < 138 {
continue
}

// Decode the 'to' address (skip selector + left-padding)
toAddress := "0x" + tx.Input[34:74]
// Decode the 'value' (amount) from the trailing 32-byte word.
// uint256 can exceed int64, so convert hex → decimal without math/big.
amount := hexToDecimal(tx.Input[74:])

filteredTransactions = append(filteredTransactions, map[string]interface{}{
"txHash": tx.Hash,
"fromAddress": tx.From,
"toAddress": toAddress,
"amount": amount,
"tokenContract": tx.To,
"blockNumber": tx.BlockNumber,
})
}
}

// Return nil if no transfers were found — skips delivery to your destination
// (API credits are still consumed based on blocks processed).
if len(filteredTransactions) == 0 {
return nil
}
return map[string]interface{}{"transactions": filteredTransactions}
}

// hexToDecimal converts an arbitrary-length hex string (with or without a "0x"
// prefix) to its decimal string form, safe for full uint256 values.
func hexToDecimal(hexStr string) string {
hexStr = strings.TrimPrefix(strings.ToLower(hexStr), "0x")
hexStr = strings.TrimLeft(hexStr, "0")
if hexStr == "" {
return "0"
}

// digits holds the decimal value little-endian (least-significant first).
digits := []int{0}
for _, c := range hexStr {
v, err := strconv.ParseInt(string(c), 16, 32)
if err != nil {
return "0"
}
carry := int(v)
for i := 0; i < len(digits); i++ {
cur := digits[i]*16 + carry
digits[i] = cur % 10
carry = cur / 10
}
for carry > 0 {
digits = append(digits, carry%10)
carry /= 10
}
}

var sb strings.Builder
for i := len(digits) - 1; i >= 0; i-- {
sb.WriteByte(byte('0' + digits[i]))
}
return sb.String()
}

其他資源

回填技巧

分批作業以加快回填速度

預設情況下Streams 每次Streams 一個區塊。針對歷史資料的補傳作業,增加批次大小(例如每次傳送 10 或 100 個區塊)可降低開銷並加快資料匯入速度。請根據目標系統的容量,在 Streams 設定中調整此參數。

若您持續進行即時串流,建議考慮使用Elastic Batch來自動調整批次大小。

效能優化

「篩選」(僅傳輸您所需的数据)與「壓縮」(以優化數據傳輸)結合使用,可提升大規模回填作業的效能。


提示

如果您的篩選器傳回 null, 不會將任何資料傳送至您的目的地(以減少不必要的資料量)。注意:Streams 根據處理的區塊數量Streams API 配額,無論是否進行過濾。

除錯篩選器

在開發過程中,請透過篩選函式進行記錄以進行除錯。記錄會顯示在「串流篩選器編輯器」中「結果」分頁旁邊的「記錄」分頁中。

在 JavaScript 中,請使用 console.log(). 在 Go 語言中,請使用 fmt.Println — 其輸出內容記錄於 日誌 將 `tab` 視為資訊級別的日誌,它會自動將物件(地圖、切片、結構體)格式化為字串,因此您可以直接記錄有效載荷。

以下 Go 範例假設一個 有效載荷 在您的篩選器中已宣告了 struct(請參閱上方的範例)。在 篩選 該簽名會導致解釋器回報一則容易引起誤解的 常數定義迴圈 發生錯誤,因此請確保已定義該結構體。


func Filter(qn *qn.QNContext, payload Payload) interface{} {
fmt.Println("Data:", payload.Data)
fmt.Println("Metadata:", payload.Metadata)

// ... rest of your filter
}

使用原始資料進行測試

在編寫新篩選器時,您可以從 Stream 配置使用者介面下載特定測試區塊的原始資料。這有助於您在編寫篩選器邏輯之前,先了解確切的資料包結構。

安全性與驗證

Streams 每次傳送Streams 一個安全憑證,您可以藉此驗證請求是否源自Quicknode。您還可以在目標設定中配置自訂標頭。關於 Webhook 目標的實作細節,請參閱《如何驗證傳入的Streams 訊息》。