版权声明:本文为博主原创文章,转载注明“龙棠博客”字样和原文链接。
Chaincode如何和外部应用通信?应用如何知道chaincode的执行结果?
上一篇我们介绍了如果预览Fabric 1.0.0 Beta,本次来做事件监听的实验
启动环境
#禁用TLS,因为示例程序暂时没法支持
[root@host1 linux-amd64]# grep -nar TLS_ENABLED *.yaml
docker-compose-cli.yaml:51: - CORE_PEER_TLS_ENABLED=false
docker-compose-e2e-template.yaml:14: - FABRIC_CA_SERVER_TLS_ENABLED=true
docker-compose-e2e-template.yaml:29: - FABRIC_CA_SERVER_TLS_ENABLED=true
docker-compose-e2e.yaml:14: - FABRIC_CA_SERVER_TLS_ENABLED=true
docker-compose-e2e.yaml:29: - FABRIC_CA_SERVER_TLS_ENABLED=true
[root@host1 linux-amd64]# grep -nar TLS_ENABLED */*.yaml
base/docker-compose-base.yaml:21: - ORDERER_GENERAL_TLS_ENABLED=false
base/peer-base.yaml:18: - CORE_PEER_TLS_ENABLED=false
#默认为true,修改为false
- docker-compose-cli.yaml内的CORE_PEER_TLS_ENABLED
- base/docker-compose-base.yaml内的ORDERER_GENERAL_TLS_ENABLED
- base/peer-base.yaml内的CORE_PEER_TLS_ENABLED
#注释自动化,注释docker-compose-cli.yaml 第57行
command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME}; sleep $TIMEOUT'
#如果不想手动可以采用不注释上一句,采用如下会自动进行创建等操作
$./network_setup.sh up king
#自动创建会启动4个peer,1个order,1个cli同时创建名为king(与命令行参数相同)的channel,并将4个peer加入到channel,同时在4个peer上安装chaincode_example02
#宿主机操作,多句并一句执行
#生成组织信息,启动容器4个peer,1个order,1个cli
$CHANNEL_NAME=king && ./generateArtifacts.sh $CHANNEL_NAME && \
CHANNEL_NAME=$CHANNEL_NAME TIMEOUT=1000 docker-compose -f docker-compose-cli.yaml -f docker-compose-couch.yaml up -d
#docker exec -it cli bash后在容器内执行
#创建创世块,并加入channel
$CHANNEL_NAME=king && \
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx && \
peer channel join -b $CHANNEL_NAME.block
安装特定Chaincode
前一篇中我们下载的压缩文件内是不包含eventsender这个chaincode的需要到源码库下载上传至相应位置 下载eventsender目录和内文件 上传到release/linux-amd64/chaincode/go,后续会映射到cli容器内供安装
#下载并上传
[root@host1 go]# pwd
/root/release/linux-amd64/chaincode/go
[root@host1 go]# ls
chaincode_example02 eventsender marbles02
#安装并初始化cc
$peer chaincode install -n eventsender -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/eventsender
$peer chaincode instantiate -o orderer.example.com:7050 -C $CHANNEL_NAME -n eventsender -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/eventsender -c '{"Args":["init"]}'
#相对于前面操作取消了TLS相关信息,完成后生成了dev-peer0.org1.example.com-eventsender-1.0容器实例
#查询和调用
$peer chaincode query -C $CHANNEL_NAME -n eventsender -c '{"Args":["query"]}'
$peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME -n eventsender -c '{"Args":["invoke"]}'
启动监听事件的应用程序
所有fabric和chaincode运行于docker内,应用是启动于宿主机,在宿主机上设置golang环境并将fabric 1.0 beta源码放置于gopath路径
#本次实验环境变量
GOROOT=/opt/go
GOPATH=/root/golang
#应用程序,block-listener
[root@host1 block-listener]# pwd
/root/golang/src/github.com/hyperledger/fabric/examples/events/block-listener
[root@host1 block-listener]# ls
block-listener.go eventsender.go README.md
#另起SSH,监听peer0.org1日志
[root@host1 msp]# docker logs -f peer0.org1.example.com
#block-listener目录
[root@host1 block-listener]# go run block-listener.go -events-address=127.0.0.1:7053 -events-mspdir=/root/release/linux-amd64/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp -events-mspid=Org1MSP -events-from-chaincode=eventsender
......
Event Address: 127.0.0.1:7053
#如果-events-from-chaincode=eventsender 省略,则只显示block信息,不会解析chaincode事件
#同时peer0.org1日志输出
2017-06-13 10:27:13.578 UTC [eventhub_producer] validateEventMessage -> DEBU 911 ValidateEventMessage starts for signed event 0xc420209fb0
2017-06-13 10:27:13.579 UTC [eventhub_producer] registerHandler -> DEBU 912 registering event type: BLOCK
事件发送,观察监听
#发送事件,每次调用都会随着创建块,发送一个事件,此命令在cli容器内执行
$peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME -n eventsender -c '{"Args":["invoke"]}'
#观察block-listener输出
Received block
--------------
Received transaction from channel king:
[header:<channel_header:"\010\003........
Received chaincode event from channel king
------------------------
Chaincode Event:chaincode_id:"eventsender" tx_id:"bc56593d935ab2e005442c7d178f0946a8837bfa95dd7d5602b75f1dcc3f3bed" event_name:"evtsender" payload:"Event 5"
#发送
$peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME -n eventsender -c '{"Args":["invoke","Hello","World!"]}'
#接收
Chaincode Event:chaincode_id:"eventsender" tx_id:"4f0b244b80842875c44f2703b48576cfa6a5a43f12afda89d7c9e2f254ca5560" event_name:"evtsender" payload:"Event 8,Hello,World!"