這篇文章將為大家詳細(xì)講解有關(guān)Fabric2.0如何設(shè)置背書策略,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
為清苑等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及清苑網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站建設(shè)、做網(wǎng)站、清苑網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
智能合約背書策略用來定義交易是否合法的判斷條件,策略以主體的形式表示。主體格式為'MSP.ROLE', MSP代表所要求的MSPID, ROLE表示角色,一共有四種合法角色:member, admin, client, peer。
背書策略的語法如下: EXPR(E[, E...]) EXPR可以是AND、OR、OutOf,E可以是一個上面示例的主體或者是另一個嵌套的EXPR策略。示例如下: AND('Org1.member', 'Org2.member', 'Org3.member') :要求三個主體中每一個主體都要簽名。 OR('Org1.member', 'Org2.member') :要求三個主體中至少有一個主體簽名。 OR('Org1.member', AND('Org2.member', 'Org3.member')):要求同時有主體Org1.member的簽名,以及主體Org2.member與Org3.member中至少一個主體的簽名。 OutOf(2, 'Org1.member', 'Org2.member', 'Org3.member') :要求三個主體中,至少有兩個主體簽名。
fabric2.0智能合約設(shè)置背書策略得方式主要有兩種,一種是通過提交合約的時候設(shè)置,我們稱之為合約級別的背書策略,一種是直接通過合約動態(tài)設(shè)置,我們稱之為鍵級別背書策略。
所謂合約級別背書策略,就是在這個合約的交易都必須遵循這個策略,在默認(rèn)情況下,即不設(shè)置背書策略,合約的背書策略為majority of channel members,過半數(shù)通道成員。
輸入以下命令設(shè)置合約級別背書策略 背書策略"OR('Org1.member', 'Org2.member')" 組織1成員或者組織2成員背書即滿足
peer lifecycle chaincode approveformyorg --signature-policy "OR('Org1MSP.member','Org2MSP.member')" --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --channelID mychannel --name mycc --version 1 --init-required --package-id mycc_1:4ad799ccef18d596f8c175fe1849cadc63f92a5efb1e7332712fbb2827a2ec6f --sequence 2 --waitForEvent
--signature-policy:設(shè)置背書策略
出現(xiàn)以下錯誤: Error: proposal failed with status: 500 - failed to invoke backing implementation of 'ApproveChaincodeDefinitionForMyOrg': currently defined sequence 3 is larger than requested sequence 2
序列號不是當(dāng)前合約序列號,只需要改成最新的序號即可,假如是這里,sequence值改成3即可
Error: proposal failed with status: 500 - failed to invoke backing implementation of 'ApproveChaincodeDefinitionForMyOrg': attempted to redefine uncommitted sequence (4) for namespace mycc with unchanged content
存在當(dāng)前最新的合約沒有commit,無法進(jìn)行新的approve,只需要將最新的commit后再進(jìn)行這次新的approve即可。
切換節(jié)點重復(fù)命令,知道滿足lifecycle策略
假如在操作上都approve成功了,還是出現(xiàn)以下情況:
我的實踐是直接先commit,commit成功就可以繼續(xù)走
每次調(diào)用完approve之后,必須commit才能起效。
控制臺輸入以下命令
peer lifecycle chaincode commit -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --channelID mychannel --name mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --version 1 --sequence 2 --init-required --signature-policy "OR('Org1MSP.member','Org2MSP.member')"
控制臺輸出以下結(jié)果表示成功
此時查詢a的值為90
3.2設(shè)置的背書策略為組織1成員或者組織2成員背書即滿足, 此時指定背書節(jié)點為peer0.org1.example.com
peer chaincode invoke -o orderer.example.com:7050 --tls true --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 mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'
控制臺輸出如下:
重新查詢a的值為80,更新成功
將背書策略修改為 "AND('Org1MSP.member','Org2MSP.member')"
peer lifecycle chaincode approveformyorg --signature-policy "AND('Org1MSP.member','Org2MSP.member')" --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --channelID mychannel --name mycc --version 1 --init-required --package-id mycc_1:4ad799ccef18d596f8c175fe1849cadc63f92a5efb1e7332712fbb2827a2ec6f --sequence 3 --waitForEvent
peer lifecycle chaincode commit -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --channelID mychannel --name mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --version 1 --sequence 3 --init-required --signature-policy "AND('Org1MSP.member','Org2MSP.member')"
同樣只設(shè)置peer0.org1.example.com節(jié)點,重新invoke,查看節(jié)點日志結(jié)果如下:
ERRO 0ed VSCC error: stateBasedValidator.Validate failed, err validation of endorsement policy for chaincode mycc in tx 15:0 failed: signature set did not satisfy policy
不滿足背書策略,因為我們已經(jīng)重新設(shè)置為"AND('Org1MSP.member','Org2MSP.member')"
接下來,我們通過設(shè)置鍵級別背書策略的方法,將上面操作完成
鍵級別的背書策略是通過智能合約內(nèi)部調(diào)用SDK完成
shim包提供了以下的函數(shù)設(shè)置或者恢復(fù)鍵對應(yīng)的背書策略。下面的ep代表是“endorsement policy”的縮寫。
對于私有數(shù)據(jù),以下功能適用:
Go shim提供了擴(kuò)展功能,允許鏈碼開發(fā)人員根據(jù)組織的MSP標(biāo)識符來處理認(rèn)可策略
根據(jù)官方給的說明 假如需要兩個特定組織來批準(zhǔn)key更改,設(shè)置key的背書策略,請將兩個org都傳遞MSPIDs給AddOrgs(),然后調(diào)用Policy()構(gòu)造可以傳遞給的認(rèn)可策略字節(jié)數(shù)組SetStateValidationParameter() 接下來我們進(jìn)行實踐
首先導(dǎo)入相關(guān)依賴包
新增function 設(shè)置背書策略
endorsement具體實現(xiàn)如下:
由于新增了引入包,先下載依賴 進(jìn)入合約目錄輸入以下命令
go mod vendor
參考 Fabric2.0 智能合約實踐- 升級智能合約
設(shè)置a的背書策略為 AND("Org1MSP.member","Org2MSP.member")
peer chaincode invoke -o orderer.example.com:7050 --tls true --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 mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["endorsement","a","Org1MSP","add"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls true --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 mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["endorsement","a","Org2MSP","add"]}'
查看peer日志,交易成功
只設(shè)置peer0.org1節(jié)點作為背書節(jié)點
peer chaincode invoke -o orderer.example.com:7050 --tls true --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 mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt -c '{"Args":["addTen","a"]}'
查看節(jié)點日志如下,提示不滿足策略,因為前面設(shè)置的是AND("Org1MSP.member","Org2MSP.member")
修改背書策略,刪除Org2MSP
peer chaincode invoke -o orderer.example.com:7050 --tls true --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 mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["endorsement","a","Org2MSP","del"]}'
修改成功
重新執(zhí)行以下命令:
peer chaincode invoke -o orderer.example.com:7050 --tls true --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 mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt -c '{"Args":["addTen","a"]}'
修改a值從110變成120,執(zhí)行成功
關(guān)于“Fabric2.0如何設(shè)置背書策略”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
名稱欄目:Fabric2.0如何設(shè)置背書策略
文章源于:http://aaarwkj.com/article28/pjdpjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、云服務(wù)器、品牌網(wǎng)站制作、網(wǎng)站改版、網(wǎng)站維護(hù)、域名注冊
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)