簡而言之:區塊鏈索引是指 從區塊鏈中提取原始資料,將其轉換為結構化格式,並儲存於針對快速查詢進行優化的資料庫中的過程。區塊鏈的設計初衷在於安全性與不可篡改性,而非用於搜尋。若未進行索引,即使是「顯示此錢包的所有轉帳紀錄」這類簡單問題,也必須從創世區塊開始掃描每個區塊,這在大規模應用時實屬不切實際。 索引器透過建立可查詢的資料庫來解決此問題,使應用程式能夠即時存取鏈上資料。
簡單的解釋
區塊鏈是僅能追加的帳本。它們非常擅長以防篡改的順序記錄交易,但在回答關於這些交易的問題時卻表現極差。其中沒有內建的「搜尋」功能,也沒有 SQL 查詢。僅靠標準的 RPC 方法,根本無法執行「找出過去 30 天內涉及此地址的所有 ERC-20 轉帳」這類查詢。
透過 RPC 端點可用的原始工具,其設計上本就相當基礎。您可以根據區塊編號擷取特定區塊;可以根據雜湊值擷取特定交易;也可以取得特定區塊中的帳戶餘額。但您無法跨區塊搜尋、依據條件篩選、彙總資料,或將鏈上不同部分的資訊進行關聯。 若要找出來自特定錢包的所有交易,您必須擷取所有曾產生的區塊,從每個區塊中提取所有交易,檢查發送者或接收者是否與目標地址匹配,並彙整符合條件的交易。在以太坊上,這意味著必須掃描超過 2,000 萬個區塊;在 Solana 上,則意味著必須掃描數十億個時槽。若未進行索引,這不僅速度緩慢,甚至在任何合理的時間框架內都根本無法實現。
區塊鏈索引透過執行一個持續從節點讀取新區塊的流程來解決此問題:該流程會解碼原始資料(交易、事件日誌、狀態變更、追蹤紀錄),將其轉換為結構化記錄,並將這些記錄寫入具備適當索引的資料庫中。一旦資料存入資料庫,您的應用程式即可使用 SQL 或 GraphQL 等熟悉的工具進行查詢,並在不到一秒的時間內獲得回應。
索引的運作原理
索引處理流程遵循「萃取、轉換、載入」(ETL)模式。在萃取階段,索引器會連線至區塊鏈節點,並讀取原始區塊資料。這些資料包含區塊標頭、交易、交易收據(其中包含事件日誌),以及可選的追蹤資料(用於記錄合約間的內部呼叫)。索引器會依序處理區塊,從設定的起始區塊開始,並依區塊鏈歷史順序逐步推進。
在轉換階段,索引器會將原始資料解碼為具有意義的結構。例如,原始事件日誌會以包含主題雜湊值和資料欄位的十六進位字串形式編碼。索引器會利用智慧合約的 ABI(應用程式二進位介面)將其解碼為帶有名稱參數和正確資料類型的、可供人類閱讀的事件。 一則原始的「轉帳」事件日誌,便會轉化為包含「發送方」地址、「接收方」地址、代幣數量及合約地址的結構化記錄。轉換階段還能計算衍生數據,例如計算轉帳當下的美元價值、按代幣彙總交易量,或追蹤累計餘額。
在載入階段,結構化記錄會寫入資料庫,無論是 PostgreSQL、MongoDB、Snowflake、Elasticsearch 或其他儲存系統。資料庫會在應用程式將進行查詢的欄位(例如錢包地址、代幣合約、時間戳記和區塊編號)上建立索引,從而實現對整個資料集的快速查詢和複雜查詢。
一旦索引器追上區塊鏈的末端,它便會切換至即時模式,在每個新區塊產生時立即進行處理,並即時插入相應的記錄。如此一來,資料庫便能與區塊鏈的即時狀態保持同步。
組織重整問題
區塊鏈索引工作中最具挑戰性的環節之一,便是處理鏈重組。當區塊鏈的規範鏈發生變更時,便會發生鏈重組,這通常是因為在相同高度產生了相互競爭的區塊,而網路最終收斂至一個與您的索引器最初處理的分叉不同的分叉上。當這種情況發生時,您的索引器已經處理過的區塊將不再是規範鏈,而任何源自這些區塊的記錄也都將變得不正確。
一個穩健的索引器必須能偵測重組操作、回滾受影響的記錄,並重新處理正確的區塊。若未能妥善處理重組操作,將導致資料庫中出現「幽靈交易」(即存在於舊分支但未出現在新分支中的交易)、遺漏的交易(即存在於新分支但未包含在舊分支中的交易),以及狀態不正確的情況。對於金融應用程式而言,此類資料損毀是絕對無法接受的。
重組處理為索引建置流程增添了相當大的複雜性。索引器需要追蹤哪些區塊已處理完畢、將其所見的區塊鏈與已儲存的資料進行比對、偵測差異,並乾淨俐落地執行回滾。這正是開發團隊選擇採用託管式索引解決方案,而非從頭開始建置自訂索引器的主要原因之一。
索引方法
The Graph 是最廣泛採用的去中心化索引協定。開發者會建立「子圖(subgraphs)」,這些配置檔案用來定義應監控哪些智慧合約、應監聽哪些事件,以及如何將事件資料映射至可查詢的資料結構。稱為「索引器(Indexers)」的獨立節點營運者負責運作處理基礎架構,並透過 GraphQL 端點處理查詢。 The Graph 非常適合處理標準用例,例如查詢 DeFi 協議資料、NFT 所有權歷史紀錄以及 DAO 治理活動。其限制包括延遲(子圖更新未必是即時的)、模式缺乏彈性(變更模式通常需要重新部署並重新同步),以及對去中心化網路可用性的依賴。
自訂索引器讓團隊能完全掌控其資料管道,但需要投入大量工程資源。建置生產級的自訂索引器,意味著必須編寫區塊導入邏輯、事件解碼、資料庫架構設計、重組處理、錯誤復原、監控以及擴展基礎架構。對於具有特殊資料需求的大規模應用程式而言,這項投資或許值得;但對多數團隊來說,這代表著需耗費數個月的工程時間,而這些時間本可投入於其核心產品開發上。
「推送式串流」是一種較新的方法,透過將經過篩選的區塊鏈資料直接傳送至您的儲存系統,從而簡化索引建立流程,讓您無需自行建置和維護資料擷取層。與其讓您的索引器從節點擷取資料,串流服務會將您確切需要的資料推送至您的資料庫、Webhook 或資料倉儲。
Quicknode 如何推動區塊鏈索引技術
QuicknodeStreams是專為區塊鏈資料索引而設計的解決方案。 Streams 提供基於推送的資料管道,可將原始或經過篩選的區塊鏈資料直接傳送至您指定的目標位置,包括 PostgreSQL、Snowflake、Amazon S3、Azure Storage 以及 webhooks。您無需建置和維護 RPC 輪詢基礎架構來從區塊鏈中擷取資料,只需根據所需的網路、資料集(區塊、交易、收據、追蹤紀錄)以及可選的 JavaScript 篩選器來配置一個 Stream,其餘工作將由 Quicknode 處理。
Streams 依照最終性順序傳送資料,並提供「精確一次」的傳送保證,這意味著您的資料庫能與標準區塊鏈保持一致,而無需您的程式碼來管理區塊排序或去重。內建的重新組織處理機制會自動偵測區塊鏈重新組織,並傳送修正資料包,因此您的索引資料始終能反映區塊鏈的真實狀態。 針對歷史資料,Streams 的回填功能可讓您將任何範圍的過往區塊填入資料庫,同步速度最高可比傳統基於 RPC 的索引管道快七倍,同時提供與即時串流相同的篩選與傳送保證。
Quicknode 還發布了一份使用 Streams 建置區塊鏈索引器的逐步指南,示範如何從配置到查詢,建立一個由 PostgreSQL 支援並具備 REST API 的完整 ERC-20 轉帳索引器。對於需要更複雜資料處理的團隊,Streams 可與 Quicknode Functions 整合,在串流資料管道之上實現無伺服器式的資料轉換、豐富化及自動化。
索引與原始 RPC 之間有何區別?
原始 RPC 與索引功能分別用於解答不同類型的問題。RPC 專為點查閱與寫入操作而設計:擷取此區塊、讀取此餘額、發送此交易。索引功能則專為搜尋與分析而設計:某個錢包的所有轉帳紀錄、各代幣的總交易量、某個收藏集的所有權歷史紀錄。下表對比了這兩者,以便您針對不同任務選擇合適的工具。
維度 | 原始 RPC | 索引資料庫 |
|---|---|---|
最擅長 | 點讀與交易提交 | 搜尋、篩選與彙總 |
查詢語言 | JSON-RPC 方法 | SQL 或 GraphQL |
歷史掃描 | 緩慢地,一區塊一區塊地 | 快速、經預處理且已建立索引 |
若要針對這兩者進行深入比較,請參閱《RPC 與索引的比較》;若要了解其底層的請求模型,請參閱《RPC 請求如何運作》。
建立索引後,可以進行哪些類型的查詢?
一旦資料被索引至結構化資料庫中,那些在原始 RPC 環境下無法實現的查詢,便變得輕而易舉。您可以列出某個地址的所有交易紀錄、追蹤 NFT 的完整所有權歷史、彙總各代幣每日的交易量、根據持倉量對錢包進行排名,或是跨多個合約進行事件關聯。這些正是驅動儀表板、區塊鏈瀏覽器及分析產品的關鍵查詢。關於為何在未建立索引的情況下這些查詢如此困難,請參閱「查詢區塊鏈資料」一文。
索引與串流是如何協同運作的?
串流與索引是互補的層級。串流是一種傳輸機制,能在新區塊和事件發生時即時將其推送至您的基礎架構;而索引則是將這些傳入的資料組織成可查詢的儲存庫。現代常見的架構會使用串流管線將記錄送入已建立索引的資料庫,從而徹底消除脆弱的輪詢層。請參閱「何謂區塊鏈資料串流」以及「輪詢與串流的比較 」,了解資料最初是如何傳送到索引器的。
索引器是如何補入歷史資料的?
「回填」是指在切換至即時資料之前,將過去的區塊填入資料庫的過程。 一套完善的資料管線應從選定的歷史區塊開始,沿著區塊鏈向前處理,並在抵達鏈尖時無縫過渡至即時資料,使歷史記錄與即時記錄共用同一套資料結構。若執行得當,回填的速度遠比透過原始 RPC 重新掃描區塊鏈快得多。請參閱「如何存取歷史區塊鏈資料」以及「即時與歷史區塊鏈資料的權衡」以了解相關取捨。
常見問題
為什麼我不能直接使用 RPC 來取代索引功能呢?
RPC 非常適合用於擷取特定的區塊、交易或餘額,但無法在區塊鏈上進行搜尋、篩選或彙總。若要透過 RPC 回答「此錢包的所有轉帳」這類問題,就必須逐一掃描數百萬個區塊,這在實務上並不可行。建立索引可將這些資料預先處理並儲存至資料庫中,如此一來,相同的查詢便能透過單一查詢獲得結果。
什麼是子圖?
子圖(subgraph)是 The Graph 所採用的配置方式,用以定義應索引哪些合約與事件,以及如何將其映射至可查詢的 GraphQL 模式。這是建立索引的一種常見方式,非常適合標準的 DeFi、NFT 及治理數據;不過,與自訂或基於串流的管道相比,它在即時延遲與模式靈活性之間可能需要權衡取捨。
索引器如何處理區塊鏈重組?
一個穩健的索引器能偵測到規範鏈發生變更時,會回滾源自孤立區塊的記錄,並重新處理正確的記錄。若缺乏此機制,您的資料庫將會累積幻影交易或遺漏的交易。受管管線會透過傳送修正資料包,自動處理區塊鏈重組。如需背景資訊,請參閱「何謂區塊鏈重組」。
我應該自行開發索引器,還是使用託管服務呢?
建立自訂索引器雖能提供完全的控制權,但需自行處理資料導入、解碼、資料結構設計、重組處理、監控及擴展等作業,這通常需要數月時間。託管式管線會為您處理資料擷取、排序、重組及傳輸等作業,因此多數團隊只需配置服務,並將工程資源集中於核心產品上,便能更快投入生產環境。
已建立索引的區塊鏈資料可以儲存於哪些資料庫中?
索引資料通常會儲存於 PostgreSQL、MongoDB、Snowflake、Elasticsearch 或 Amazon S3 等物件儲存服務中,具體取決於您是否需要交易型查詢、全文搜尋或大規模分析。串流處理管線可將記錄直接傳送至這些目標位置。若需端到端的教學指南,《建構者指南》將逐步介紹常見的索引模式。
延伸閱讀
如何使用 Streams 建置區塊鏈索引器— Quicknode 指南
Streams 入門指南— Quicknode 文件
區塊鏈資料回填— Quicknode 文件
透過區塊鏈 ETL 掌握 Web3 資料— Quicknode 部落格