fabric私密資料學習筆記

2022-08-11 05:57:19 字數 4381 閱讀 2626

乙個是真正的key,value,它被存在 peer的私密資料庫(private state)中。

另一部分為公共資料,它是真實的私密資料key,value 雜湊後的值 hash(key),hash(value),它被存在普通的peer資料庫中(state),orderer端可以拿到該值。沒有被分配私密資料許可權的peer,也僅僅可以儲存hash後的key和value。

需要組織間進 資料隔離時,使用channel進行資料隔離。

當需要組織內進 資料隔離時,使用私密資料進行資料隔離。

處於同一channel的多個組織之間進行資料隔離時,也要使用私密資料進行資料隔離。

sdk將交易傳送給背書節點,該背書節點需要通過policy(此

處的policy為instantiation設定的)驗證。

背書節點模擬執行交易 ,並將真實的私密資料 key和value存

儲於瞬時資料庫(private transient db)中。基於collection policy,驗證通過的peer節點,通過gossip同步真實的私密資料,並將其儲存於瞬時資料庫中。

背書節點將模擬執行後的結果返回給sdk,返回的資料中僅有公共資料(hash過的私密資料)。sdk將peer返回的結果打包後傳送給orderer,和普通的區塊一樣,orderer切塊後,將其分發給peer,此時所有的peer都拿到了公共資料,所有的peer都可以去驗證私有資料,沒有通過collection policy的peer,也可以驗證,而且還不擁有真實的私密資料,保證了資料的私密性。

在commit之前,peer首先去判斷自己是否通過collection policy的檢查,若通過,將去檢查自己的瞬時資料庫中是否有真實的私密資料,如果沒有,將嘗試從別的peer處拉取資料。

取到私密資料後,首先去和公共資料的hash去做比對,若一致,此時進行commit操作,將私密資料的hash寫入到公共資料庫中。提交該交易和這個區塊到賬本中,成功提交後,私密資料將會從瞬時資料庫拷貝到私密資料庫中,並從瞬時資料庫中刪除。此時整個交易流程結束,資料成功寫入到賬本內。

乙個collection定義包含乙個或多個collection,在合約例項化

的時候安裝該collection。cli去部署集合時,使用引數 --

collections-config。

peer chaincode instantiate -o orderer.example.com:7050 --tls $core_peer_tls_enabled --cafile $orderer_ca -c mychannel -n marblesp -v 1.0 -c '' -p "or ('org0msp.member','org1msp.member')" --collections-config collections.json

name: 集合名稱。

policy: 語法與簽名policy一致,允許哪些組織的peer儲存私密資料。私有資料的policy成員必須包含在簽名policy的成員內。每個policy都類似於乙個過濾器 ,第一 層過濾為簽名policy,第二層為私密資料policy。若簽名policy未通過驗證,交易將執行失敗,也就不會產生私密資料。第二種情況是當簽名policy通過,但私密資料policy未通過,將沒有peer儲存真正的私密資料,只會將hash過的資料儲存下來,私密資料也將會丟失,這樣的 policy定義是沒有意義的。

requiredpeercount: 配置最小分發私有資料peer的數 ,在 peer背書交易和返回給sdk的時間段。當配置為0時,表示不需要分發,但是當maxpeercount大於0時,還是會分發,分不分發是由這兩個配置項共同決定的。當都是0的情況下,私密資料是存在丟失的可能性。該值必須小於等於maxpeercount。

maxpeercount:基於私密資料冗餘的目的,將資料分發到其他peer的數量 。如果背書節點掛掉,在背書和commit階段,其他處於collection的peer節點將不能接收到該節點的私密資料, 將從其餘已經分發的節點去pull資料。如果這個值設定為0,私密資料在交易背書時間段沒有分發,將強制向所有peer去嘗試pull私密資料。

blocktolive:私密資料生效時長 ,在私密資料庫中儲存的時長,將為特定的幾個塊生效,是時間到達後,將會被清除,再也查不到該資料。 設定為0,將一直被儲存,永不清除。

乙個有許可權儲存私有資料的peer,丟失了私密資料,在將來的交易中引用私密資料時,將報錯,此處體現 requiredpeercount和maxpeercount 的重要性。

collection需要配合chaincode使用,chaincode的shim提供了以下介面:

putprivatedata(collection,key,value) getprivatedata(collection,key) getprivatedatabyrange(collection, startkey, endkey string) getprivatedatabypartialcompositekey(collection, objecttype string, keys string)

couchdb

getprivatedataqueryresult(collection, query string)

1、使用couchdb時,sdk去執行range或富查詢時,可能只返回結果集的子集,有些peer可能不含有私密資料。sdk可以向多個peer去查詢並且比較查詢結果,可以確定某些peer是否缺少資料。

2、chaincode在執行range或富查詢時,不支援在同乙個交易中執行update操作,因為無法判斷peer是否有許可權擁有私密資料許可權,或是否丟失私密資料。如果chaincode在一條交易中包含查詢私密資料和更新私密資料兩步操作,這個proposal將返回 error。如果你的有這個需求,請分為兩條交易去執行。但是乙個chaincode方法中既包含getprivatedata() 和putprivatedata()卻是可以的,因為所有peer都包含有雜湊key的版本號。

3、私密資料collection僅僅定義了組織下的peer能否接收和儲存私密資料,意味著僅有某些peer可以查詢私密資料,collection不能限制誰呼叫chaincode。沒有限制許可權的sdk都可以執行chiancode內部邏輯,最好是在chaincode 內部使用getcreator() 來控制呼叫chaincode的許可權。

想要在peer上永久儲存私密資料,將blocktolive設定為0即可。我們都知道,當一條包含私密資料的交易在fabric中commit之後,私密資料將會在peer的瞬時資料庫中清除,但是若這條交易從不提交,私密資料將會永久儲存在瞬時資料庫中。 這時就用到乙個配置peer.gossip.pvtdata.transientstoremaxblockretention,當符合配置

時,將清除私密資料從瞬時資料庫中。

pullretrythreshold: pull私密資料的超時時間,超時後將提交乙個沒有私

密資料的block。

transientstoremaxblockretention: 當私密資料在瞬時資料庫中儲存時,它與當時賬本中的區塊高度有關,該配置定義了當前區塊的高度與保證不會清除私密資料之間的最大差異。即每當commit的區塊高度達到該配置的倍數時,將觸大發清除瞬時資料庫中的私密資料。

pushacktimeout:在背書交易的時候,將私密資料push到其他區塊的握手超時時間。

btlpullmargin: 作緩衝區的區塊數 量,新增peer時,當peer解析到私密資料的公共資訊時,會得到私密資料所在區塊的編號,這時會去判斷 (賬本高度+ btlpullmargin) > (私密資料所在區塊高度+btl),如果成立,將不會去獲取這個私

密資料,將提交乙個沒有私密資料的block到自己賬本。btlpullmargin預設值是10,若btl小於10,新增peer將不會同步任何私密資料。

Fabric學習筆記

2018.10.29 1 環境配置,doker安裝有點難受 2 搭建好環境後,第一次執行e2e cli專案後,已成生default channel mychannel 如要再次執行e2e cli專案,必須先執行 network setup.sh down 命令,否者提示 error got unex...

Fabric學習筆記 智慧型合約

普通chaincode執行在乙個單獨的容器中,對外提供操作fabric網路的介面,有打包 安裝 例項化和公升級四個生命週期並且有相應的函式提供呼叫,操作更加的靈活也是我們通常所指chaincode。endorser負責執行chaincode。orderer負責對chaincode的執行結果進行共識,...

Fabric學習 Fabric整體專案結構介紹

參考版本較低,建議去看高版本手冊。bccsp 提供了加密標準以及演算法的實現,為整個專案提供統一的加密 簽名 驗籤服務。common common模組提供了通用功能以及一些通用的 實現,包括日誌 錯誤 工具包等,主要包括專案全域性的功能性 core core模組為fabric專案的核心 模組,其中包...