引言
隨着區塊鏈技術的日趨成熟,更多企業開始探索區塊鏈的實際使用場景。HyperLedger Fabric(下稱Fabric),由Apache社區開發的開源的,企業級的,帶權限的分布式賬本平台,被廣泛應用於學術研究和企業應用領域。其查詢技術是使用和開發Fabric不可或缺的一項功能模塊,但由於區塊鏈技術的去中心化特性,其查詢機制的設計和常規分布式系統存在較大差異,並且存在一定的技術理解門檻。目前官方文檔或相關資料對查詢章節的描述通常與其它技術(如系統部署,更新等)一同描述,沒有單獨對查詢進行描述,或缺乏原理層面的系統描述,難以理解和運用。本文較為詳細的描述Fabric查詢的設計原理,可作為生產和開發中系統設計的參考依據。
文章分為4個部分。首先介紹於查詢相關的Fabric基礎名詞概念,接着介紹Fabric的經歷的各查詢過程以及查詢對象的存儲結構,最后通過描述區塊鏈的系統結構以描述Fabric的一種特殊查詢機制——跨鏈查詢。
基本概念[1]
- 節點(Peer):一個維護一個賬本的網絡實體。節點會運行鏈碼容器以實現對賬本的讀寫操作。節點由Fabric內的成員持有和維護。
- 通道(Channel):在Fabric中,通道是私有區塊鏈,可實現數據隔離和保證機密性。部署在一個通道內的賬本由通道中的所有節點之間共享,並且交易方必須通過通道進行身份驗證才能與通道內節點進行交互。
- 鏈碼(Chaincode):在Fabric中,鏈碼即智能合約。一個鏈碼就是由客戶端應用程序調用的代碼,它可以通過事務(Transaction)改變通道的狀態。在Fabric中,用戶不能直接訪問通道,只能通過鏈碼改變通道的狀態。
- 組織(Organization):節點以組織的身份加入通道,一個組織可以有一個或多個節點。
查詢過程

在Fabric中,查詢過程涉及區塊鏈五層協議[2]中的應用層,合約層和存儲層。其查詢過程如圖所示。當用戶需要執行查詢操作時,首先在合約層編寫用戶鏈碼,一份完整的用戶鏈碼應包含對多個對事務的讀寫函數,每個讀寫函數由判斷邏輯和系統鏈碼組成。系統鏈碼由Fabric封裝了更改通道記錄的函數,包括處理事務的驗證鏈碼(VSCC)和查詢事務的查詢系統鏈碼(QSCC)。對於查詢系統鏈碼,截止2.2版本,Fabric已經實現了K-V查詢,范圍查詢和溯源查詢三種基本功能,以及區塊鏈中特有的跨鏈碼查詢和跨通道查詢功能。由用戶編寫的用戶鏈碼會被分別部署在Fabric的各個節點上,並向節點上的更下一層存儲層查詢用戶請求數據。當鏈碼部署完畢后,查詢者可以通過調用RESTAPI以HTTP協議方式向節點請求調用鏈碼,或者可以將RESTAPI封裝為基於去中心化的存儲的應用程序。
查詢對象

如圖所示,我們可以查詢對象分解為文件系統的數據庫兩層架構。文件系統記錄以區塊的鏈式結構記錄數據的存儲信息,每個區塊包含記錄當前區塊信息的區塊頭和元數據,以及若干事務組成的區塊體。為了加速查詢或實現特定查詢功能,Fabric將區塊信息分類提取存儲在KV數據庫中。目前,Fabric支持LevelDB [3]和CouchDB [4]兩種數據庫。
- 狀態數據庫:維護最新的KV狀態,這些狀態會根據最新的區塊事物進行修改。狀態數據庫支持基於鍵的查詢,組合鍵值對查詢和鍵范圍查詢。
- 鍵歷史索引:記錄鍵的值歷史變更狀態,用於溯源查詢。
- 塊索引:存儲塊對應的Hash值和塊在文件系統中的位置;存儲塊編號與其在文件系統中的位置;存儲事務ID與其在文件系統中的位置。通過以上三種方式實現對區塊和事務的快速定位。
特殊查詢機制
在實際運用中可能出現不同業務的交叉應用場景,對於傳統分布式系統而言,這代表單次查詢可能設計多個數據庫的交互。由於Fabric采用賬本的形式記錄數據,並且應用與賬本的交互通過鏈碼實現,跨數據庫查詢在Fabric中轉變為跨鏈碼查詢。為了更好的理解鏈碼間的交互查詢機制,我們需要先了解Fabric中鏈碼,組織,信道和節點的關系。下圖展示了查詢角度下,Fabric中各模塊的簡化交互方式。

模塊交互遵守以下規則:
- 鏈碼部署在節點上,且只有已部署鏈碼節點才能請求讀寫通道數據。
- 節點以組織的形式加入通道,一個節點只能加入一個組織,但一個組織可以同時加入多個通道。
- 每個通道中相同的鏈碼共同維護一份完整的的交易狀態視圖,不同鏈碼之間信息不共享,不同通道之間的鏈碼信息不共享。
基於上述規則,Fabric的跨鏈碼和跨通道通信需要由節點完成。在節點部署的用戶鏈碼中通過調用系統鏈碼實現跨鏈碼調用。在同一節點上,若部署了同通道內的鏈碼(如Peer3在Channel1的Chaincode1和Chaincode2),Fabric允許直接在用戶鏈碼中調用和修改目標鏈碼維護的視圖。若鏈碼處於不同通道中(如Peer3在Channel1的Chaincode1和在Channel2的Chaincode2),若當前節點所在組織同時加入了鏈碼所在通道,並且部署了需要跨通道交互的的鏈碼,Fabric雖然也提供跨鏈碼調用,但只能返回調用結果,不能對調用目標進行更改。
參考文獻
[1] Hyperledger Fabric [G/OL] https://hyperledger-fabric.readthedocs.io/en/latest/glossary.html
[2] 袁勇, 王飛躍. 區塊鏈技術發展現狀與展望.[J] 自動化學報 42.4 (2016): 481-494
[3] LevelDB [G/OL] https://github.com/google/leveldb
[4] CouchDB [G/OL] https://couchdb.apache.org/
