02.27 技術指南丨如何在HyperLedger Fabric上實現鏈下存儲

本文作者Deeptiman Pattnaik是一名開發工程師,從事各種軟件開發項目:Android,Go,Node.js,MongoDB,PHP,JavaScript Beacon,虛擬現實,增強現實。

在本文中,我將嘗試解釋Hyperledger Fabric中鏈下(OffChain)存儲的重要性以及offchaindata應用,該應用是構建用於演示使用Hyperledger Fabric的Go編程語言進行鏈下存儲的實現。

技术指南丨如何在HyperLedger Fabric上实现链下存储

鏈上(OnChain)和鏈下(OffChain)交易

任何區塊鏈平臺中的交易流都在兩個不同的層中執行。涉及到區塊鏈網絡中的分佈式分類帳的交易被視為鏈上交易,而在區塊鏈外部執行並存儲到任何集合數據庫(例如CouchDB,StateDB)中的交易被視為鏈下交易。

區塊鏈不僅僅是存儲解決方案

區塊鏈技術的概念是存儲大量數據,並能夠為每個交易提供當前狀態。區塊鏈網絡將為分佈式賬本數據中執行的任何更改維護交易歷史記錄日誌。這種技術將區塊鏈與傳統的數據庫存儲技術區分開來,傳統的數據庫存儲技術僅設計為以有組織的方式存儲數據。

鏈上交易問題

通常,鏈上交易需要更長的時間才能執行完成。由於網絡中等待執行的大量交易隊列,區塊鏈性能開始下降,並且花費的交易時間更長。在區塊鏈中的鏈上交易期間,業務和存儲空間都涉及大量成本。

鏈上存儲計算

IBM已進行分析以確定涉及存儲空間的大量成本。(來源:https://www.ibm.com/downloads/cas/RXOVXAPM)

事實因素

  • 比特幣每個區塊存儲1400筆交易。
  • 超級賬本區塊的大小為1 MB,每個區塊有1000筆交易。
  • 每個區塊鏈交易的大小為5 KB,可產生205 TPS(每秒的交易數)
  • 每TPS的存儲量計算

通過比較公司每天平均工作8小時和每年240天的平均時間來進行交易計算。

(1 TPS / 1000 TB)* 1024 KB * 3500秒/小時* 8小時/天* 240天/年 = 每年每筆交易的數據為7,077,888 KB=6,912 MB = 6.75 GB = 0.00659 TB /交易/年

區塊鏈的鏈上財務成本

IBM還提供了超級賬本(Hyperledger)和以太坊等非授權區塊鏈的平均企業級成本。

IBM Hyperledger的每月費用為$ 1000,每個活動節點的額外費用為$ 1000,因此每月總費用為$ 6000。

每筆交易的成本是:比特幣為1.30美元,以太坊每筆交易為0.25美元。

在非許可式區塊鏈中,每次交易成本將根據加密貨幣的當前價值而變化。

Hyperledger等基於權限的區塊鏈的成本將隨著節點數量的增加而變化。

因此,與交易成本相比,不應將所有非交易數據(例如圖片,視頻,PDF和其他文檔)存儲在區塊鏈分類賬中。

鏈下交易解決方案

鏈下交易不會在存儲空間中為每個節點存儲交易。 願意存儲特定交易的一方可以使用鏈下存儲。 鏈下交易提高了計算效率,這種計算是在鏈下執行的,是確定性的而非共識的。

鏈下存儲的設計實現

有許多鏈下數據庫可與Hyperledger Fabric集成以存儲交易明細。 我構建的offchaindata應用使用CouchDB作為鏈下存儲。 將運行一個GRPC事件偵聽器,該偵聽器作為GRPC客戶端連接偵聽對等方。

因此,事件偵聽器將每個區塊的KVWriteSet值處理到鏈下存儲區(CouchDB)中。 MapReduce技術用於從CouchDB存儲中查詢鏈下數據。

GitHub:https://github.com/Deeptiman/offchaindata

什麼是MapReduce?

MapReduce是一種編程模型,旨在在大型集群上並行處理大量數據。

MapReduce有兩個功能:

  • 映射——它提供了某些文檔集合的密鑰值對列表。
  • 減少——它具有一組較小的密鑰值對,可處理集合中的多個節點。

CouchDB使用MapReduce技術來過濾所有收集文檔。 在下面的示例中,我們將看到MapReduce如何用於一種User模型。

User模型

<code>type SampleUser struct { Email string `json:"email"` Name string `json:"name"` Age string `json:"age"` Country string `json:"country"` } /<code>

CouchDB中的文檔收集

技术指南丨如何在HyperLedger Fabric上实现链下存储

存儲在CouchDB中的用戶詳細信息

因此,我們將創建一個MapReduce函數來查詢集合中的電子郵件。

為電子郵件配置MapReduce

<code>curl -X PUT http://127.0.0.1:5990/offchaindb/_design/emailviewdesign/ -d '{"views":{"emailview":{"map":"function(doc) { emit(doc.email,1);}", "reduce":"function (keys, values, combine) {return sum(values)}"}}}' -H 'Content-Type:application/json'/<code>

輸出:<code> {"ok": true, "id":"_design/emailviewdesign", "rev": "1-f34147f686003ff5c7da5a5e7e2759b8"}/<code>

使用參數

設計視圖:emailviewdesign

MapReduce視圖:

<code>{ "views": { "emailview": { "map": "function(doc) { emit(doc.email,1);}", "reduce": "function (keys, values, combine) {return sum(values)}" } } } /<code>查詢減少功能可計算電子郵件總數<code> curl -X GET http://127.0.0.1:5990/offchaindb/_design/emailviewdesign/_view/emailview?reduce=true/<code>輸出

<code>{"rows":[ {"key":null,"value":7} ]}/<code>

查詢地圖功能列出所有電子郵件 <code> curl -X GET http://127.0.0.1:5990/offchaindb/_design/emailviewdesign/_view/emailview?group=true/<code>

輸出

<code>{"rows":[ {"key":"[email protected]","value":1}, {"key":"[email protected]","value":1}, {"key":"[email protected]","value":1}, {"key":"[email protected]","value":1}, {"key":"[email protected]","value":1}, {"key":"[email protected]","value":1}, {"key":"[email protected]","value":1} ]}/<code>

因此,MapReduce以這種方式工作。 我們還可以為其他節點創建MapReduce函數,以從CouchDB查詢

結論

所有查詢都在鏈下存儲空間中執行,並且完全忽略了鏈上分類帳。 就查詢大量數據而言,這提高了計算效率。 執行鏈下查詢不涉及交易成本,因為類似的鏈上查詢具有較高的交易成本。 在公有區塊鏈的情況下,鏈下存儲還可以用於存儲敏感的私有數據,因為並非區塊鏈網絡中的所有參與者都知道用於存儲數據的附加獨立存儲層。

因此,這是瞭解任何區塊鏈網絡中鏈下存儲的重要用例的概述。 請檢查Github上的鏈下數據應用程序並分享您的反饋。


分享到:


相關文章: