2.5 通知智能合约与网络互动

上一节完成智能合约(链码)部署后,我们就可以与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,否则追究其法律责任

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值