Fabric Hyperledger(2.0 )之隱私數據(Private data)

前言

  自Fabric1.2版本提出了隱私數據,後續版本進行了完善。此篇文章主要針對fabric2.0版本介紹隱私數據。
  1.4.x版本:Fabric Hyperledger之隱私數據(Private data)

隱私數據交易過程

  客戶端提交提案: 客戶端提交提案給背書節點(隱私集合授權的組織節點)注:私有數據通過proposal中的transient字段發送給背書節點
  模擬交易執行: 背書節點模擬交易執行,過程中會將隱私數據存儲在transient data store(Peer節點的臨時本地存儲),通過gossip協議及集合策略分發給其它擁有對應集合隱私數據權限的節點。
  返回背書結果: 背書節點返回模擬執行的提案結果給客戶端,需注意的一點是返回結果的讀寫集中會包含公共數據和隱私數據的hash,隱私數據本身是不返回給客戶端的。
  客戶端提交給排序節點: 客戶端將模擬執行的交易結果提交給排序節點,排序節點會將包含私有數據hash的塊分發給所有背書節點(包括隱私集合授權節點和無權限的組織背書節點),由此通道的所有節點通過一致的方式,也就是隱私數據的hash去驗證交易的合法性,而非隱私數據本身。
  提交塊: 在提交塊時,授權節點通過隱私集合策略確定其是否擁有隱私數據的存儲權限,對於授權節點來說,它們會先檢查本地的臨時存儲來確認在交易背書時是否已接收到隱私數據;如果本地存儲不存在隱私數據,即交易時節點未背書的情形,會嘗試從其它時候節點通過gossip協議拉取隱私數據,然後通過公共塊上的hash驗證交易,驗證通過會提交交易和塊,然後私有數據會寫入邊數據庫(sideDB),與此同時刪除本地對應的臨時存儲。

隱私數據之共享

  對於一些特殊情形,一個集合中的隱私數據可能需要共享給其它通道成員,例如當某個授權節點需要和通道中的某個或是某些未授權成員間進行私有數據的交易時。作爲交易的一部分,會根據鏈上的hash的驗證隱私數據。
  作爲理論支撐:
  1.只要滿足認可策略,非隱私數據集合中的成員也能寫入隱私數據,可以在鏈碼層面(背書策略),key層面(基於key的背書策略,注:狀態數據庫爲key-value數據庫),集合層(2.0新特性)面定義策略.
  2.從1.4.2版本開始,提供了運行非隱私集合授權節點讀取私有數據hash的API: GetPrivateDataHash()
  當然也可以定義各種隱私集合,缺點是可能需要定義很多的隱私集合,fabric2.0爲每個組織提供了隱式集合,無需用戶再次定義,基於隱私數據共享,在一定程度上會減輕工作量。

隱私數據之共享模式

  除定義各種隱私集合外,可以通過多種方式共享和傳輸隱私數據:
  公私鑰加密: 傳統做法,此處不再贅述
  鏈碼層面控制: 可以在鏈碼中實現訪問控制,指定哪些客戶端可以查詢集合中的私有數據。例如,在鏈碼中獲取客戶端提交者的憑據(使用GetCreator()鏈碼API或CID庫API GetID()或GetMSPID())以驗證其權限。
  與其他集合共享私有數據: 可以使用鏈碼在鏈上“共享”私有數據,從而在另一個組織的私有數據集合中創建匹配的鍵/值。 你可以通過transient 字段將私有數據鍵/值傳遞給鏈碼,並且鏈碼可以使用GetPrivateDataHash()確認所傳遞的私有數據的哈希值與你集合中的鏈上哈希值匹配,然後將私有數據寫入其他組織的隱私數據集合。
  隱私數據轉移: 可以使用鏈碼“轉移”私有數據,先通過GetPrivateDataHash() API 進行隱私數據驗證,然後再刪除隱私集合中的數據,在其他隱私集合再次創建,從而實現了隱私數據的轉移。此場景可能需要其它方的認可,例如監管者或審計師。
  key層面的背書策略: 鏈碼提供了相應的API:SetPrivateDataValidationParameter()

隱私數據存活時間考量

  對於非常敏感的數據,即使共享私有數據的各方也可能希望(或政府法規可能要求)定期“清除”其Peer上的數據,僅保留鏈上隱私數據的hash。對於某些情況,隱私數據可能需要短暫存在Peer節點的sideDB,以便將私有數據轉移到外部的數據庫。當然也有些情況下,需要完成相應鏈碼業務流程(交易結算,合同履行等)。
  下面爲一隱私集合定義文件

[{
		"name": "collectionMedium",
		"policy": "OR('Org1MSP.member', 'Org2MSP.member','Org3MSP.member')",
		"requiredPeerCount": 0,
		"maxPeerCount": 3,
		"blockToLive": 1000000,
		"memberOnlyRead": true
	},
	{
		"name": "collectionPrivate",
		"policy": "OR('Org1MSP.member')",
		"requiredPeerCount": 0,
		"maxPeerCount": 3,
		"blockToLive": 5,
		"memberOnlyRead": true
	}
]

  其中blockToLive屬性:以塊爲單位,指定隱私數據再side數據庫的存活時間,隱私數據在指定的塊上保留,此後將被清除,從而在鏈上刪除隱私數據,無法通過鏈碼查詢,也無法在節點上得到隱私數據,如果想無限期地保留隱私數據,可將blockToLive屬性設置成0。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章