Hyperledger Fabric 私有数据(2)操作流程
1. 私有數據資產轉移的案例
collections_config.json文件定義了3個私有數據集合定義:assetCollection、Org1MSPPrivateCollection和Org2MSPPrivateCollection。
eg. collections_config.json文件內容
[{"name": "assetCollection","policy": "OR('Org1MSP.member', 'Org2MSP.member')","requiredPeerCount": 1,"maxPeerCount": 1,"blockToLive":1000000,"memberOnlyRead": true,"memberOnlyWrite": true},{"name": "Org1MSPPrivateCollection","policy": "OR('Org1MSP.member')","requiredPeerCount": 0,"maxPeerCount": 1,"blockToLive":3,"memberOnlyRead": true,"memberOnlyWrite": false,"endorsementPolicy": {"signaturePolicy": "OR('Org1MSP.member')" }},{"name": "Org2MSPPrivateCollection","policy": "OR('Org2MSP.member')","requiredPeerCount": 0,"maxPeerCount": 1,"blockToLive":3,"memberOnlyRead": true,"memberOnlyWrite": false,"endorsementPolicy": {"signaturePolicy": "OR('Org2MSP.member')" }}]2. 數據結構
2.1 chaincode內部結構體
2.2 物理存儲結構
3. 操作流程
3.1. 鏈碼流程
step1. base64格式化編碼私有數據參數
export private_create=$(echo -n “{“assetID”:“10004” , “objectType”:“1” , “color” : “red” , “appraisedValue” : 1000 , “size”:100 }” | base64 | tr -d \n)
step2. 安裝智能合約
peer lifecycle chaincode install /opt/gopath/src/github.com/chaincode/private.tar.gz
step3. 配置合約參數ID
export CC_PACKAGE_ID=private:939ab0bae5f72a707fffac97f38600db7d4fb116d3d7c45bc0be2082c58f33c0
step4. 導入私有參數的配置路徑
export CC_COLL_CONFIG=/opt/gopath/src/github.com/chaincode/collections_config.json
step5. 節點授權安裝合約
peer lifecycle chaincode approveformyorg --signature-policy “OR(‘Org1MSP.member’,‘Org2MSP.member’,‘Org3MSP.member’)” -o orderer.xxx.com:7050 --channelID mychannel --name private --version 1.0 --package-id $CC_PACKAGE_ID --sequence 10 --collections-config $CC_COLL_CONFIG --tls --cafile $ORDERER_TLSCA
step6. 提交合約
peer lifecycle chaincode commit --signature-policy “OR(‘Org1MSP.member’,‘Org2MSP.member’,‘Org3MSP.member’)” -o orderer.xxx.com:7050 --channelID mychannel --name private --version 1.0 --sequence 11 --tls --cafile $ORDERER_TLSCA --collections-config $CC_COLL_CONFIG --peerAddresses peer0.org1.xxx.com:7051 --tlsRootCertFiles ${PWD}/config/crypto-config/peerOrganizations/org1.xxx.com/peers/peer0.org1.xxx.com/tls/ca.crt --peerAddresses peer0.org2.xxx.com:7051 --tlsRootCertFiles ${PWD}/config/crypto-config/peerOrganizations/org2.xxx.com/peers/peer0.org2.xxx.com/tls/ca.crt --peerAddresses peer0.org3.xxx.com:7051 --tlsRootCertFiles ${PWD}/config/crypto-config/peerOrganizations/org3.xxx.com/peers/peer0.org3.xxx.com/tls/ca.crt
step7. 通過以上參數的設置好后,調用合約的命令就會非常簡潔
peer chaincode invoke -o orderer.xxx.com:7050 --tls --cafile KaTeX parse error: Can't use function '\"' in math mode at position 84: … --transient "{\?"?asset_propertie…private_create"}"
step8. 實例化chaincode時需要指定定義的json文件
注意–collections-config參數
peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C mychannel -n marblesp -v 1.0 -c ‘{“Args”:[“init”]}’ -P “OR(‘Org1MSP.member’,‘Org2MSP.member’)” --collections-config $GOPATH/src/github.com/chaincode/marbles02_private/collections_config.json
3.2. 鏈碼相關操作
step1. 初始化私有數據,不是執行init而是執行invoke的initMarble
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n marblesp -c ‘{“Args”:[“initMarble”,“marble1”,“blue”,“35”,“tom”,“99”]}’
step2.在org1上查詢私有數據
eg.
peer chaincode query -C mychannel -n marblesp -c ‘{“Args”:[“readMarble”,“marble1”]}’
結果
{“color”:“blue”,“docType”:“marble”,“name”:“marble1”,“owner”:“tom”,“size”:35}
eg2.
peer chaincode query -C mychannel -n marblesp -c ‘{“Args”:[“readMarblePrivateDetails”,“marble1”]}’
結果
{“docType”:“marblePrivateDetails”,“name”:“marble1”,“price”:99}
step3. 在org2上查詢私有數據
eg1.
peer chaincode query -C mychannel -n marblesp -c ‘{“Args”:[“readMarble”,“marble1”]}’
結果
{“docType”:“marble”,“name”:“marble1”,“color”:“blue”,“size”:35,“owner”:“tom”}
eg2.
peer chaincode query -C mychannel -n marblesp -c ‘{“Args”:[“readMarblePrivateDetails”,“marble1”]}’
{“Error”:“Failed to get private details for marble1: GET_STATE failed:
transaction ID: b04adebbf165ddc90b4ab897171e1daa7d360079ac18e65fa15d84ddfebfae90:
Private data matching public hash version is not available. Public hash
version = &version.Height{BlockNum:0x6, TxNum:0x0}, Private data version =
(*version.Height)(nil)”}"
step4. 刪除數據
私有數據可以復制到離線數據庫中,同時,可以通過blockToLive這個屬性指定產生幾個塊以后,刪除私有數據,在鏈上只保存hash值。當數據被刪除的時候,再查詢數據時,會發生下面的錯誤
Error: endorsement failure during query. response: status:500
message:"{“Error”:“Marble private details does not exist: marble1”}"
總結
以上是生活随笔為你收集整理的Hyperledger Fabric 私有数据(2)操作流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hyperledger Fabric 私
- 下一篇: Hyperledger Fabric 私