网络启动后,默认并不存在任何应用通道,需要手动创建应用通道,并让合作的 Peer 节点加入通道。下面在客户端进行相关操作。
使用加入联盟中的组织管理员身份可以创建应用通道。 在客户端使用 Org1 的管理员身份来创建新的应用通道,需要指定 msp 的 ID 信息、 msp 文件所在路径、Orderering 服务的 tls 证书位置,以及网络中 Ordering 服务地址、应用通道名称和交易文件:
$ CHANNEL_NAME = nusinesschannel
$ CORE_PEER_LOCALMSPID = "Org1MSP" \
CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp \
peer channel create \
-o orderer.example.com:7050 \
-c ${CHANNEL_NAME} \
-f ./businesschannel.tx \
--tls \
--cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
创建通道成功后,会自动在本地生成应用通道同名的初始区块 businesschannel.block 文件。只有拥有该文件才可以加入创建的应用通道中。
应用通道所包含组织的成员节点可以加入通道中。
在客户端使用管理员身份依次让组织 Org1 和 Org2 中的所有节点都加入新的应用通道,需要指定所操作的 Peer 的地址,以及通道的初始区块。
这里以操作 Org1 中的 peer0 节点为例:
$ CORE_PEER_LOCALMSPID="Org1MSP" \
CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp \
peer channel update \
-o orderer.example.com:7050
-c ${CHANNEL_NAME} \
-f ./Org1MSPanchors.tx \
--tls \
--cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
Peer 加入应用通道后,可以执行链码相关操作,进行测试。链码在调用之前,必须先经过安装(Install) 和实例化(Instantiate) 两个步骤,部署到 Peer 节点上。
通过如下命令在客户端安装示例链码 chaincode_example02 到 Org1 的 Peer0 上:
$ CORE_PEER_LOCALMSPID="Org1MSP" \
CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp \
CORE_PEER_ADDRESS=peer0.org1.example.com:7051 \
peer chaincode install \
-n test_cc \
-v 1.0 \
-p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
通过如下命令将链码容器实例化,并注意通过 -P 指定背书策略。此处 OR ('Org1MSP.member','Org2MSP.member')代表 Org1 或 Org2 的任意成员签名的交易即可调用该链码:
$ CORE_PEER_LOCALMSPID="Org1MSP" \
CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp \
CORE_PEER_ADDRESS=peer0.org1.example.com:7051 \
peer chaincode instantiate \
-o orderer.example.com:7050 \
-C ${CHANNEL_NAME} \
-n test_cc \
-v 1.0 \
-c '{"Args":["init":"a","100","b":"200"]}' \
-P "OR ('Org1MSP.member','Org2MSP.member')" \
--tls \
--cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.examle.com-cert.pem
实例化完成后,用户即可向网络中发起交易了。例如,可以通过如下命令来调用链码:
$ CORE_PEER_LOCALMSPID="Org1MSP" \
CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp \
CORE_PEER_ADDRESS=peer0.org1.example.com:7051 \
peer chaincode invoke \
-o orderer.example.com:7050 \
-C $CHANNEL_NAME \
-n test_cc \
-c '{"Args":["invoke","a","b","10"]}' \
--tls \
--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/tlscacerts/tlsca.example.com-cert.pem
通过如下命令查询调用链码后的结果:
$ CORE_PEER_LOCALMSPID="Org1MSP" \
CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp \
CORE_PEER_ADDRESS=peer0.org1.example.com:7051 \
peer chaincode query \
-n test_cc
-C ${CHANNEL_NAME} \
-c '{"Args":["query","a"]}'
Query Result: 90
用户也可以通过 block-listener 工具来监听网络中的事件。该工具支持的命令行选项包括如下几个:
- -events-address "0.0.0.0:7053" : 监听事件的来源地址,一般为 Peer 节点的 7053 端口;
- -events-from-chaincode string: 仅监听与指定链码相关的事件;
- -events-mspdir string: 本地所使用的 MSP 路径,默认在 sampleconfig 下;
- -events-mspid string: 所使用的 MSP 的 ID。
例如,用户可以通过如下命令在客户端节点上监听 peer0.org1 节点的事件:
$ block-listener \
-events-address=peer0.org1.example.com:7053 \
-events-mspdir=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/ \
-events-mspid=Org1MSP
之后, 网络中发生的相关事件(区块、交易、注册、拒绝等)会打印出来,例如当 peer0 加入新建的应用通道时,会发生如下事件:
Event Address: peer0.org1.example.com:7053
Received block
Recevied transaction from channel businesschannel: [...]
注意 目前, block-listener 工具不支持 TLS, 因此相关 Peer 配置需要指定 CORE_PEER_TLS_ENABLED=fals。