日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Fabric中的私有数据

發布時間:2024/1/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Fabric中的私有数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考:官方文檔?& 私有數據視頻

代碼參考:智能合約

為什么要使用私有數據?

使用私有數據為的是使數據分享給我們想要共享的組織。比如在我們在網上購物,同一個商品在不同活動時期的成交價格大部分是不相同的。但是我們并不想讓客戶知道彼此之間的成交價格,所以便有了私有數據,比如用戶a和商家在同一個通道,成交價格存儲在private state,只有用戶a和商家可以訪問這個數據,其他用戶也是同理。

在Peer 節點上存儲和檢索私有數據

如下圖,通道1中有機構1和機構2兩個機構,分別對應節點0和節點1,peer0和peer1上各有一個賬本。

其中,peer0節點是已經授權的節點即可以使用私用數據,而peer1是未授權節點,無法訪問私有數據。peer0和peer1的賬本中有都有通道數據,為的是保證賬本數據的不可篡改性,并以key的hash和value的hash存儲,這樣就保證了通道數據的安全性。

peer0中還存有私有數據,是明文存儲,只可以由機構1訪問。

?

使用私有數據

在使用私有數據之前需要定義一個私有數據集的JSON文件

在通道中使用私有數據的第一步是定義集合以決定私有數據的訪問權限

該集合的定義描述了誰可以保存數據,數據要分發給多少個節點,需要多少個節點來進行數據分發,以及私有數據在私有數據庫中的保存時間。

集合定義

這是官網提供的一個集合定義,一般配置在connection_config.json中

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

集合定義由以下幾個屬性組成:

  • name: 集合的名稱。
  • policy: 定義了哪些組織中的 Peer 節點能夠存儲集合數據。
  • requiredPeerCount: 私有數據要分發到的節點數,這是鏈碼背書成功的條件之一。
  • maxPeerCount: 為了數據冗余,當前背書節點將嘗試向其他節點分發數據的數量。如果當前背書節點發生故障,其他的冗余節點可以承擔私有數據查詢的任務。
  • blockToLive: 對于非常敏感的信息,比如價格或者個人信息,這個值代表書庫可以在私有數據庫中保存的時間。數據會在私有數據庫中保存?blockToLive?個區塊,之后就會被清除。如果要永久保留,將此值設置為?0?即可。
  • memberOnlyRead: 設置為?true?時,節點會自動強制集合中定義的成員組織內的客戶端對私有數據僅擁有只讀權限。

升級合約以支持私有數據

首先在項目中添加connection_config.json文件

[{"name": "collectionOrg1Cats","policy": "OR('Org1MSP.member')","requiredPeerCount": 0,"maxPeerCount": 3,"blockToLive": 1000000,"memberOnlyRead": true },{"name": "collectionOrg2Cats","policy": "OR('Org2MSP.member')","requiredPeerCount": 0,"maxPeerCount": 3,"blockToLive": 1,"memberOnlyRead": true} ]

在鏈碼文件中編寫操作私有數據的方法(查詢,跟更新,刪除等等)。

@Transactionpublic byte[] queryPrivateCatHash(final Context ctx, final String collection ,final String key) {ChaincodeStub stub = ctx.getStub();byte[] hash = stub.getPrivateDataHash(collection, key);if (ArrayUtils.isEmpty(hash)) {String errorMessage = String.format("Private Cat %s does not exist", key);log.log(Level.WARNING , errorMessage);throw new ChaincodeException(errorMessage);}return hash;}@Transactionpublic PrivateCat queryPrivateCat(final Context ctx, final String collection , final String key) {ChaincodeStub stub = ctx.getStub();log.info(String.format("查詢私有數據 , collection [%s] key [%s] , mspId [%s] " , collection , stub.getMspId() , key));String catState = stub.getPrivateDataUTF8(collection , key);if (StringUtils.isBlank(catState)) {String errorMessage = String.format("Private Cat %s does not exist", key);log.log(Level.WARNING , errorMessage);throw new ChaincodeException(errorMessage);}return JSON.parseObject(catState , PrivateCat.class);}@Transactionpublic PrivateCat createPrivateCat(final Context ctx, final String collection , final String key , String name , Integer age , String color , String breed) {ChaincodeStub stub = ctx.getStub();log.info(String.format("創建私有數據 , collection [%s] , mspId [%s] , key [%s] , name [%s] age [%s] color [%s] breed [%s] " , collection , stub.getMspId() , key , name , age , color , breed));String catState = stub.getPrivateDataUTF8(collection , key);if (StringUtils.isNotBlank(catState)) {String errorMessage = String.format("Private Cat %s already exists", key);log.log(Level.WARNING , errorMessage);throw new ChaincodeException(errorMessage);}PrivateCat cat = new PrivateCat().setCat(new Cat().setName(name).setAge(age).setBreed(breed).setColor(color)).setCollection(collection);String json = JSON.toJSONString(cat);log.info(String.format("要保存的數據 %s" , json));stub.putPrivateData(collection , key , json);return cat;}@Transactionpublic PrivateCat updatePrivateCat(final Context ctx, final String collection, final String key , String name , Integer age , String color , String breed) {ChaincodeStub stub = ctx.getStub();log.info(String.format("更新私有數據 , collection [%s] , mspId [%s] , key [%s] , name [%s] age [%s] color [%s] breed [%s] " , collection,stub.getMspId() , key , name , age , color , breed));String catState = stub.getPrivateDataUTF8(collection , key);if (StringUtils.isBlank(catState)) {String errorMessage = String.format("Private Cat %s does not exist", key);log.log(Level.WARNING , errorMessage);throw new ChaincodeException(errorMessage);}PrivateCat cat = new PrivateCat().setCat(new Cat().setName(name).setAge(age).setBreed(breed).setColor(color)).setCollection(collection);String json = JSON.toJSONString(cat);log.info(String.format("要保存的數據 %s" , json));stub.putPrivateData(collection , key , json);return cat;}@Transactionpublic PrivateCat deletePrivateCat(final Context ctx, final String collection ,final String key) {ChaincodeStub stub = ctx.getStub();log.info(String.format("刪除私有數據 , collection [%s] , mspId [%s] , key [%s] " , collection , stub.getMspId() , key));String catState = stub.getPrivateDataUTF8(collection , key);if (StringUtils.isBlank(catState)) {String errorMessage = String.format("Private Cat %s does not exist", key);log.log(Level.WARNING , errorMessage);throw new ChaincodeException(errorMessage);}stub.delPrivateData(collection , key);return JSON.parseObject(catState , PrivateCat.class);}

在Ubuntu終端更新智能合約

首先在???????升級智能合約中運行到3.1,緊接著運行下面的3.2.

3.2 Org2 通過鏈碼定義修改為

peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name hyperledger-fabric-contract-java-demo --version 2.0 --collections-config ../chaincode/hyperledger-fabric-contract-java-demo/collections_config.json --signature-policy "OR('Org1MSP.member','Org2MSP.member')" --package-id $NEW_CC_PACKAGE_ID --sequence 2 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

3.3 Org1 通過鏈碼定義

export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt export CORE_PEER_ADDRESS=localhost:7051

用 peer lifecycle chaincode approveformyorg命令通過鏈碼定義

peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name hyperledger-fabric-contract-java-demo --version 2.0 --collections-config ../chaincode/hyperledger-fabric-contract-java-demo/collections_config.json --signature-policy "OR('Org1MSP.member','Org2MSP.member')" --package-id $NEW_CC_PACKAGE_ID --sequence 2 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

3.4 將鏈碼提交到通道

使用peer lifecycle chaincode checkcommitreadiness命令來檢查通道成員是否已批準相同的鏈碼定義:

peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name hyperledger-fabric-contract-java-demo --version 2.0 --collections-config ../chaincode/hyperledger-fabric-contract-java-demo/collections_config.json --signature-policy "OR('Org1MSP.member','Org2MSP.member')" --sequence 2 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json

升級鏈碼:

peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name hyperledger-fabric-contract-java-demo --version 2.0 --collections-config ../chaincode/hyperledger-fabric-contract-java-demo/collections_config.json --signature-policy "OR('Org1MSP.member','Org2MSP.member')" --sequence 2 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt

可以使用peer lifecycle chaincode querycommitted命令來確認鏈碼定義已提交給通道。

peer lifecycle chaincode querycommitted --channelID mychannel --name hyperledger-fabric-contract-java-demo --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

查看到已經升級成功

調用私有方法

首先創建一個私有小貓:

peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n hyperledger-fabric-contract-java-demo --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"createPrivateCat","Args":["collectionOrg1Cats" , "cat-0" , "tom" , "3" , "藍色" , "大懶貓"]}'

然后查詢小貓:

peer chaincode query -C mychannel -n hyperledger-fabric-contract-java-demo -c '{"Args":["queryPrivateCat" , "collectionOrg1Cats" , "cat-0"]}'

查詢結果如下:

總結

以上是生活随笔為你收集整理的Fabric中的私有数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。