Hyperledger Fabric V1.0– 开发者快速入门(3)
七、手工创建和加入通道
为了在CLI容器里手动执行创建通道和加入通道API,我们需要编辑Docker Compose文件。用任意文本编辑器打开docker-compose.yml注释掉channel_test.sh脚本,编辑操作如下:
cli:
container_name: cli
<CONTENT REMOVED FOR BREVITY>
working_dir: /opt/gopath/src/
# command: sh -c './channel_test.sh; sleep 1000'
# command: /bin/sh
1)进入cli 容器:
docker exec -it cli sh
2)发送createChannel API 给 Orderer:
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer channel create -c myc1
3)发送joinchannel API 给 Peer0:
CreateChannel执行完毕将返回一个创世区块(myc1.block),然后你可以执行加入通道的指令,把Genesis block作为参数发送joinchannel API给 peer0。
注:通道的定义都保存在创世块内:
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 CORE_PEER_ADDRESS=peer0:7051 peer channel join -b myc1.block
4)如果想要加入其它节点,只需重新发送上述命令给peer1或Peer2即可
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 CORE_PEER_ADDRESS=peer1:7051 peer channel join -b myc1.block
一旦全部Peer节点都加入了通道,你可以查询账本而无需在每个节点都部署智能合约。
八、使用命令行工具部署/调用/查询智能合约
1)运行部署命令:这个命令是在通道myc1上的Peer节点0上部署一个名叫MYCC的智能合约。构造函数把A和B的值分别初始化为100和200。
CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer chaincode deploy -C myc1 -n mycc -p http://github.com/hyperledger/fabric/examples -c '{"Args":["init","a","100","b","200"]}'
2)运行调用命令:这个命令是从A移动10个单位到B
CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer chaincode invoke -C myc1 -n mycc -c '{"function":"invoke","Args":["move","a","b","10"]}'
3)运行查询命令:按照预期,查询a的返回值应该是90
CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer chaincode query -C myc1 -n mycc -c '{"function":"invoke","Args":["query","a"]}'
你可以在任何时间发出exit命令退出CLI容器。
九、故障排除
1)如果已有容器在运行,执行docker-compose命令可能会收到报错,显示端口已被占用。如果发生这种情况,则需要杀死使用该端口的容器。
2)如果发现缺失部分文件,请确保Curl命令成功执行,并确保已经cd到了代码下载的目录。
3)如果你是用自动化步骤创建通道/加入通道的(即没有在yml文件注释channel_test.sh步骤),且通道myc1和创世区块myc1.block已经成功创建。这时,如果你想在CLI容器中手工执行后续的步骤:
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer channel create -c myc1
你可能看到类似的错误信息如下:
<EXACT_TIMESTAMP> UTC [msp] Sign -> DEBU 064 Sign: digest: 5ABA6805B3CDBAF16C6D0DCD6DC439F92793D55C82DB130206E35791BCF18E5F
Error: Got unexpected status: BAD_REQUEST
Usage:
peer channel create [flags]
这是因为你正试图创建一个重名的通道(myc1),这个通道已经存在!有两种解决方法,1)我们可以使用一个不同的通道名称来重新创建通道,例如:
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer channel create -c myc2
然后,执行加入通道指令:
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 CORE_PEER_ADDRESS=peer0:7051 peer channel join -b myc2.block
如果您选择创建一个新的通道,需要在config.json文件编辑“channelid”参数来匹配新的通道名称,例如:
{ "chainName":"fabric-client1", "chaincodeID":"mycc", "channelID":"myc2", "goPath":"../../test/fixtures", "chaincodePath":"github.com/example_cc",
2)如果你想继续使用原有的通道名称(myc1),可以删除所有的容器然后参照手动创建和加入通道部分的步骤继续执行。
十、常用docker命令:
1)删除一个容器
docker rm <containerID>
2)强制删除一个容器
docker rm -f <containerID>
3)强制删除全部容器
docker rm -f $(docker ps -aq)
4)删除一个镜像:
docker rmi <imageID>
5)强制删除一个镜像:
docker rmi -f <imageID>
6)强制删除全部镜像
docker rmi -f $(docker images -q)
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。