我们在插入账本上插入数据时,数据块需要根据背书策略进行相应的签名,才能真正的插入数据,下面举例说明
下面是我的链码 及背书策略
peer chaincode upgrade -o orderer.example.com:7050 -C mychannel -n mychaincode01 -v 2.0 -c '{"Args":[]}' -P "AND ('Org1MSP.member','Org2MSP.member')"
可以看到背书策略为 "AND ('Org1MSP.member','Org2MSP.member')"
意思是说,如果想要修改数据需要Org1 的peer 中的任何一个和Org2 的peer的任何一个进行签名才能提交修改数据
下面是我的修改请求:
peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n mychaincode01 --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --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":["addOne","9","cat","class6","77","汉江路"]}'
修改时需要指定要通知的order节点地址(必须指定),以及org1 peer 的地址(必须指定),org1 peer的tls ca.crt(必须指定)和 org2 peer的地址(必须指定),org2 peer的tls ca.crt,因为我的背书策略是org1和org2的成员的任意一个即可,所以需要他们都同意(这里的通以就是用tls ca.crt去签名),完成后才能真正的提交数据 到账本,本组织的节点及别的组织的节点才能同步到数据,
来看看结果,以下是org1和org2共用的couchdb 端口号是5984,实际生产中我们不建议组织之间公用couchdb,而是每个组织一个couchdb或每个组织的peer各一个couchdb,这样在一个peer down了以后能保证服务的正常运行:
在来看看org3用到的couchdb 端口号是6984的内容:
下面我们举个不能够正常插入的例子
还是以上面的链码及背书策略为例:
peer chaincode invoke -C mychannel -n mychaincode01 -c '{"Args":["addOne","10","cat","class7","99","大海路"]}'
看看执行添加学生时操作成功,也没报什么错误,但是当我们查询时却不能查到数据:
刷新couchdb的页面看看数据是否插入也没有插入:
我们再将添加操作的命令改成下面的命令:
peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n mychaincode01 --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":["addOne","11","cat","class8","100","天津路"]}'
执行结果如下:
可以看到还是没能将数据插入到账本中,虽然执行成功,但是没能提交,来看看peer0.org1节点的后台日志:
从内容当中可以看到校验时发现提交家的数据跟背书策略不符。
再看看couchdb:
还是一样数据没能插入进去
下面我们再正常插入数据看看:
peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n mychaincode01 --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --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":["addOne","12","cat","class12","67","正常路"]}'
peer0.org1日志:
couchdb:
可以看到正常插入了数据也同步到了另外的couchdb中即peer的账本中。
这里我只是讲了一种背书策略,大家可以参考下面的文档了解更多的背书策略写法:
https://blog.csdn.net/weixin_43988498/article/details/109129127
"AND ('Org1MSP.member','Org2MSP.member')"