Hyperledger Fabric 私有数据(2)操作流程
1. 私有數(shù)據(jù)資產(chǎn)轉(zhuǎn)移的案例
collections_config.json文件定義了3個(gè)私有數(shù)據(jù)集合定義:assetCollection、Org1MSPPrivateCollection和Org2MSPPrivateCollection。
eg. collections_config.json文件內(nèi)容
[{"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. 數(shù)據(jù)結(jié)構(gòu)
2.1 chaincode內(nèi)部結(jié)構(gòu)體
2.2 物理存儲(chǔ)結(jié)構(gòu)
3. 操作流程
3.1. 鏈碼流程
step1. base64格式化編碼私有數(shù)據(jù)參數(shù)
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. 配置合約參數(shù)ID
export CC_PACKAGE_ID=private:939ab0bae5f72a707fffac97f38600db7d4fb116d3d7c45bc0be2082c58f33c0
step4. 導(dǎo)入私有參數(shù)的配置路徑
export CC_COLL_CONFIG=/opt/gopath/src/github.com/chaincode/collections_config.json
step5. 節(jié)點(diǎn)授權(quán)安裝合約
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. 通過以上參數(shù)的設(shè)置好后,調(diào)用合約的命令就會(huì)非常簡(jiǎn)潔
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. 實(shí)例化chaincode時(shí)需要指定定義的json文件
注意–collections-config參數(shù)
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. 鏈碼相關(guān)操作
step1. 初始化私有數(shù)據(jù),不是執(zhí)行init而是執(zhí)行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上查詢私有數(shù)據(jù)
eg.
peer chaincode query -C mychannel -n marblesp -c ‘{“Args”:[“readMarble”,“marble1”]}’
結(jié)果
{“color”:“blue”,“docType”:“marble”,“name”:“marble1”,“owner”:“tom”,“size”:35}
eg2.
peer chaincode query -C mychannel -n marblesp -c ‘{“Args”:[“readMarblePrivateDetails”,“marble1”]}’
結(jié)果
{“docType”:“marblePrivateDetails”,“name”:“marble1”,“price”:99}
step3. 在org2上查詢私有數(shù)據(jù)
eg1.
peer chaincode query -C mychannel -n marblesp -c ‘{“Args”:[“readMarble”,“marble1”]}’
結(jié)果
{“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. 刪除數(shù)據(jù)
私有數(shù)據(jù)可以復(fù)制到離線數(shù)據(jù)庫中,同時(shí),可以通過blockToLive這個(gè)屬性指定產(chǎn)生幾個(gè)塊以后,刪除私有數(shù)據(jù),在鏈上只保存hash值。當(dāng)數(shù)據(jù)被刪除的時(shí)候,再查詢數(shù)據(jù)時(shí),會(huì)發(fā)生下面的錯(cuò)誤
Error: endorsement failure during query. response: status:500
message:"{“Error”:“Marble private details does not exist: marble1”}"
總結(jié)
以上是生活随笔為你收集整理的Hyperledger Fabric 私有数据(2)操作流程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hyperledger Fabric 私
- 下一篇: Hyperledger Fabric 私