Hyperledger Fabric private data是1.2版本引入的新特性,fabric private data是利用旁支資料庫(SideDB)來保存若干個通道成員之間的私有數據,從而在通道之上又提供了一層更靈活的資料保護機制。本文將介紹如何在鏈碼開發中使用fabric private data。
fabric private data利用SideDB來保存私有數據,相當於在通道之上又提供了一層更細粒度的數據隱私保護機制。本文將介紹fabric private data的引入目的、基本概念與應用場景。
什麼是fabric private data?
目前在Hyperledger Fabric中實現資料隱私的方法是使用通道。但官方並非孤立為了實現資料的隱私保護而在大型網路中創建大量通道,因為這會帶來額外的開銷,例如管理策略、鏈碼版本以及成員服務提供(MSP)等。在一個通道中,所有的資料要不是公開的,就是私有的。因此如果你想要將資產轉給通道外的成員會很麻煩。這就是Hyperledger Fabric引入私人交易的原因。 farbic private data允許基於策略建立私有資料集,來定義通道中的哪些成員可以存取資料。可以簡單地透過新增策略來管理fabric private data。這使得可以將某些資料僅對部分成員公開。
考慮Hyperledger Fabric的marbles範例。所有的marble數據都可以公開,除了其持有人以及價格信息,這兩個數據是不能對別人公開的,價格不應該被別人了解。可能你需要追蹤這個數據,因為你需要驗證在銷售marble的人是否是真正的持有者。一個假想的marble審計公司可以作為你的合夥人來驗證這一點。如果你使用通道,那麼所有的你的行為將記錄在帳本狀態中,而任何人都可以看到。
fabric private data是如何解決上述問題的?
在上圖中,第一個集合,Channel Read-Write Sets」是沒有引入fabric private data時的架構,每一個交易都記錄其狀態和歷史。
第二個集合,private state partition 1則顯示了在兩個分屬不同機構的節點之間的一個共享私有狀態。這個狀態是根據預先的策略在節點間複製得到的。
第三個集合,private state partition 2&3則顯示了fabric private data的真正為例。資料集可以被某些成員忽略。這表示你可以為每一個marble賣家和稽核者單獨設立私有資料集。這些資料集允許增加一些額外的數據,主要的資料還是保存在主狀態和帳本中。
被授權的節點將可以看得到在主帳本上的資料哈希,以及在私有資料庫中的真實資料。未授權的節點將不會同步私有資料庫,只能看到在主帳本上的資料雜湊。由於哈希是不可逆的,因此這些未授權的節點無法看到真實的資料。
從更高的層面看,fabric private data解決的問題看起來是這樣:
##fabric private data用例
我們使用Hyperledger Fabric中經典的fabcar案例來展示如何使用私有資料集。initLedger函數將在我們的資料集中創建10輛新車。所有的這些車輛可以被網路中的任何人查看。現在讓我們建立一個私人資料庫,而這個資料將只與我們持有的另一個成員車庫共用。fabric private data資料集配置
我們首先需要一個資料集設定檔collections_config.json,它包含了私有資料集名稱和存取策略。存取策略類似於背書策略,這允許我們使用已經存在的策略邏輯,例如OR、AND等。[ { "name": "carCollection", "policy": "OR ('Org1MSP.member','Org2MSP.member')", "requiredPeerCount": 0, "maxPeerCount": 3, "blockToLive":1000000 } ]
修改鏈碼以支援fabric private data
下面是原始的createCar函數:async createCar(stubHelper: StubHelper, args: string[]) { const verifiedArgs = await Helpers.checkArgs<any>(args[0], Yup.object() .shape({ key: Yup.string().required(), make: Yup.string().required(), model: Yup.string().required(), color: Yup.string().required(), owner: Yup.string().required(), })); let car = { docType: 'car', make: verifiedArgs.make, model: verifiedArgs.model, color: verifiedArgs.color, owner: verifiedArgs.owner }; await stubHelper.putState(verifiedArgs.key, car); }要把資料加入私人資料集carCollection,我們需要指定目標資料集:
await stubHelper.putState(verifiedArgs.key, car, {privateCollection: 'carCollection'});接下來,要查詢車輛的話,我們也需要指定目標私有資料集:
async queryPrivateCar(stubHelper: StubHelper, args: string[]) { const verifiedArgs = await Helpers.checkArgs<any>(args[0], Yup.object() .shape({ key: Yup.string().required(), })); const car = await stubHelper.getStateAsObject(verifiedArgs.key, {privateCollection: 'carCollection'}); if (!car) { throw new NotFoundError('Car does not exist'); } return car; }同樣,對於刪除和更新操作,都需要指定要操作的目標私有資料集。
fabric private data鏈碼最佳實踐
當然,我們的資料中有一部分是Hyperledger Fabric網路中的任何人都看得到的。但是,其中某些資料是私有的,並且保存在私有資料集中,因此只能被資料集設定檔中定義的對等節點存取。
我們建議在公開和私人資料集中使用相同的鍵來保存數據,以便更易於資料的提取操作。最後希望本文對你有幫助。
想知道更多相關教學課程,請追蹤PHP中文網!
以上是Fabric private data新手入門實戰的詳細內容。更多資訊請關注PHP中文網其他相關文章!