概述
上一节完成智能合约(链码)部署后,我们就可以与Fabric网络进行互动。正常情况这一步是通过编写业务系统代码,然后来与Fabric网络实现互动的,这样用户就可以像正常操作网页一样来操作区块链。但到目前为此我们还没开发网页,因此只能先通过命令行的方式与区块链网络进行互动。
由于智能合约是部署到peer节点上的,因此我们需要通过peer CLI(像windown下的cmd,liunx下的shell)与网络进行交互,peer CLI允许我们从CLI调用已部署的智能合约,更新通道或安装和部署新的智能合约。
接着上一节的环境(如果你重新进来,需要先把之前流程跑一遍,让网络先起来)。由于网络中有两个peer节点(每个组织一个),所以在开始操作之前,我们需要先指定要在哪个peer节点上操作。
环境变量设置
先把Fabric编译后的二进制文件加入PATH
export PATH=${PWD}/../bin:${PWD}:$PATH
接着把fabric-samples的配置文件的目录位置FABRIC_CFG_PATH
设置下
export FABRIC_CFG_PATH=$PWD/../config/
最后就可以通过设置环境变量来指定哪个peer节点了,我们先指定组织1(Org1)的节点0(peer0)
#启用对服务端的TLS身份验证
export CORE_PEER_TLS_ENABLED=true
#要设置节点对应的组织的标识ID
export CORE_PEER_LOCALMSPID="Org1MSP"
#Peer节点证书的验证链根证书文件路径
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
#Peer节点对应的组织的配置文件的路径
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
#同一机构中其他Peer节点要连接此节点需指定的P2P连接地址
export CORE_PEER_ADDRESS=localhost:7051
互动操作
现在,我们就可以在Org1的peer0上操作我们的智能合约了。
查询数据
执行以下命令可以查询智能合约里已增加的汽车信息(同一节最后一节,只不过之前它是自动查询)
peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}'
讲解一下:
peer chaincode query
是查询命令关键词-C mychannel
要查询的通道-n fabcar
要操作的智能合约-c '{"Args":["queryAllCars"]}'
查询的智能合约的参数,一般第一个参数对应的是合约里的方法名,其它参数就是方法的输入参数,例子里只调用合约的queryAllCars方法,它不需要参数
执行成功会返回
[{"Key":"CAR0","Record":{"make":"Toyota","model":"Prius","colour":"blue","owner":"Tomoko"}},{"Key":"CAR1","Record":{"make":"Ford","model":"Mustang","colour":"red","owner":"Brad"}},{"Key":"CAR2","Record":{"make":"Hyundai","model":"Tucson","colour":"green","owner":"Jin Soo"}},{"Key":"CAR3","Record":{"make":"Volkswagen","model":"Passat","colour":"yellow","owner":"Max"}},{"Key":"CAR4","Record":{"make":"Tesla","model":"S","colour":"black","owner":"Adriana"}},{"Key":"CAR5","Record":{"make":"Peugeot","model":"205","colour":"purple","owner":"Michel"}},{"Key":"CAR6","Record":{"make":"Chery","model":"S22L","colour":"white","owner":"Aarav"}},{"Key":"CAR7","Record":{"make":"Fiat","model":"Punto","colour":"violet","owner":"Pari"}},{"Key":"CAR8","Record":{"make":"Tata","model":"Nano","colour":"indigo","owner":"Valeria"}},{"Key":"CAR9","Record":{"make":"Holden","model":"Barina","colour":"brown","owner":"Shotaro"}}]
如果提示这个错误
CST [main] InitCmd -> ERRO 001 Fatal error when initializing core config : Could not find config file. Please make sure that FABRIC_CFG_PATH is set to a path which contains core.yaml
说明上面的环境变量没有执行,先要先执行export FABRIC_CFG_PATH=$PWD/../config/
再试
设置(更新)数据
要更新合约上的数据(或转移资产)时,也需要调用智能合约完成操作。下面命令是调用farcar合约来更改区块链中汽车的主人
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabcar --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":"changeCarOwner","Args":["CAR9","Dave"]}'
讲解一下:
peer chaincode invoke
是执行合约更新的关键词
-o localhost:7050
Orderer排序服务的本地地址,也可以写作--orderer localhost:7050
--ordererTLSHostnameOverride orderer.example.com
当使用TLS连接排序服务时需要使用它替换本地地址localhost:7050
,我想应该是本地地址是无法生成TLS证书,只能使用域名才能使用TLS,这个后面详说--tls true
当与orderer节点通信时要用TLS--cafile .../tlsca.example.com-cert.pem
排序节点的PEM证书文件
-C mychannel
要更新的通道名称-n fabcar
要操作的智能合约
--peerAddresses localhost:7051
第一个peer节点(组织1的节点0)的地址--tlsRootCertFiles .../ca.crt
第一个peer节点的TLS根证书文件的路径,它与peerAddresses
配合使用
--peerAddresses localhost:9051
第二个peer节点(组织2的节点0)的地址--tlsRootCertFiles .../ca.crt
第二个peer节点的TLS根证书文件的路径
-c '{"function":"changeCarOwner","Args":["CAR9","Dave"]}'
调用fabcar合约中的changeCarOwner方法,把CAR9的数据(也叫资产)的所有人(owner)由Shotaro转移到Dave,Args的值就是changeCarOwner方法需要转入的参数
执行成功后会提示
2020-05-06 19:31:25.391 CST [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200
现在我们可以使用上一步的查询数据的接口再看下数据是否更新
peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}'
我们可以看到最后一行的owner值已经更新为Dave
[...{"Key":"CAR9","Record":{"make":"Holden","model":"Barina","colour":"brown","owner":"Dave"}}]
当然,我们目前查询是在组织1的peer0节点上的,如果要查看组织2的peer0节点上的数据是否也更新了,就需要通过更新环境变量来切换到节点。
环境变量说明同上,不再细写,只需要更改到组织2需要的参数就可以
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051
然后再在组织2的节点执行查询看看
peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}'
可以看到它的最后一行的owner值也已经更新为Dave,说明两节点都已经同步完成
[...{"Key":"CAR9","Record":{"make":"Holden","model":"Barina","colour":"brown","owner":"Dave"}}]
总结下,由于是在同一个电脑上部署两个节点,因此只能通过设置环境变量来指定操作哪个节点;peer chaincode query
是查询合约的;peer chaincode invoke
是更新合约的。
留个小疑问,在query和invoke的-c参数的,方法名是放在Args第一个位置与加个function参数指定方法名是相互兼容的写法还是两个分开固定的写法?
本文由小韦云原创,转载请注明出处:https://www.bctos.cn/doc/4/1820,否则追究其法律责任
最后
以上就是魁梧芒果为你收集整理的2.5 通知智能合约与网络互动的全部内容,希望文章能够帮你解决2.5 通知智能合约与网络互动所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复