hyperledger-fabric多机部署体验

hyperledger-fabric多机部署体验

参考

http://www.cnblogs.com/studyzy/p/7237287.html
http://chuansong.me/n/1957487152126

准备

两个装载ubuntu16.04.2 LTS的客户机

要求

两个客户机安装好docker、go等必须的软件和工具,测试byfn.sh例子通过(可参考笔者的另一篇文章“hyperledger-fabric+docker安装体验”)

计划

  • 第一个VM包括节点:orderer.example.com 、peer0.org1.example.com 、peer0.org2.example.com 、cli
  • 第二个VM包括节点:peer1.org1.example.com 、peer1.org2.example.com 、cli

提示

  • 如果orderer.example.com单独部署在一个VM中,那么不需要cli容器,同时以下步骤中的有关cli的全部注释
  • yaml文件中不能有tab键,必须用空格!!!!

步骤

  1. 进入第一个VM的fabric-samples/first-network目录下,运行命令:./byfn.sh -m generate来生成channel-artifacts和crypto-config文件夹,然后复制到另一个VM的同目录下,如果已有,则先删除
    (mychannel是默认的channel名,接下来的channel有关步骤要和mychannel一致,可以通过byfn.sh第299行修改)

    附加
    关于如何把ubuntu的文件复制到另一个上:
    1)测试是否安装ssh服务 ssh localhost
    2)如果出现ssh: connect to host localhost port 22: Connection refused的错误说明没有安装,使用命令安装 sudo apt install openssh-server
    3)安装完之后开始复制 scp -r <要复制的文件夹> <目标用户名>@<目标ip>:<目标路径>

  2. 修改第二个VM的/etc/hosts文件,添加以下几行:
    注:在实际环境中最好使用配置DNS的方式而不是修改hosts的方式

#ip是第一个VM的ip,后面是映射到第一个VM不同节点的域名
192.168.221.130 orderer.example.com
192.168.221.130 peer0.org1.example.com
192.168.221.130 peer0.org2.example.com
  1. 修改第二个VM的docker-compose-cli.yaml脚本文件:

    1)把第二个节点中不存在的节点service都注释了

    2)在cli容器的volume加入以下映射:(挂载/etc/hosts是为了把主机的hosts映射带入cli容器)

    - ./peer/:/opt/gopath/src/github.com/hyperledger/fabric/peer/
    - /etc/hosts:/etc/hosts

    3)注释cli中不存在的depends_on和command(cli的command执行一段chaincode查询和调用,以及打印日志,这些在单机部署中启动network时可以看到)

    4)修改cli的environment,以下句子中在对应的地方改为cli要联系的那个peer:

    - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
    - CORE_PEER_LOCALMSPID=Org1MSP
    - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt
    -CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key
    - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
    - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
  2. 参照3步骤对第一个VM进行操作,其中,有区别的是,不需要挂载/etc/hosts

  3. 对两个VM都修改base/peer-base.yaml,添加volumes:(挂载/etc/hosts是为了把主机的hosts映射带入peer容器)

    volumes:
    -/etc/hosts:/etc/hosts
  4. 运行两个VM上的脚本,启动容器,要先启动VM1,也就是order所在的VM

    docker-compose -f docker-compose-cli.yaml up -d
  5. 进入第一个VM,进入cli(由于环境变量,连接的是peer0.org1.example.com):

    docker exec -it cli bash

    设置cli的环境变量,在对应的地方改为cli要联系的那个peer:

    CORE_PEER_ADDRESS=peer0.org1.example.com:7051
    CORE_PEER_LOCALMSPID=Org1MSP
    CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt
    CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key
    CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
    CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
  6. 创建channel:

    peer channel create -o orderer.example.com:7050 -c  -f ./channel-artifacts/channel.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

    注:在VM当前目录/peer下会有一个.block文件,把它复制到其他的VM中去。需要注意的是,peer目录建立出来的是root权限,需要通过scp复制到其他VM的其他目录,再通过mv命令移动到peer中【笔者是这样做法,不知道有没有直接ssh获得远程机root的方法】

  7. 把cli对应连接的节点加入channel,执行以下命令,然后执行exit退出当前cli

    peer channel join -b block>
  8. 重复执行7和9的步骤,通过改变cli的环境变量把对应的节点加入channel,注意,节点在哪个VM就要进入哪个VM进行操作

  9. 安装chaincode,每个节点都要,需要改变cli环境变量操作,如第七步

    peer chaincode install -n <chaincode_name> -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
  10. 初始化chaincode,只需要在一个节点进行

    peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C -n -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"
  11. 测试chaincode

    1)在第一个VM中进入cli容器,执行invoke交易:(从b转50给a)

    peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C -n -c '{"Args":["invoke","b","a","50"]}'

    2)在第二个VM进入cli容器,中执行query交易:(查询b的余额)

    peer chaincode query -C -n -c '{"Args":["query","b"]}'

    3)发现b的余额为150,说明多机部署成功

笔者实践中发生的错误情况

1)可能出现证书密钥不能识别,这个问题笔者也无法彻底解决,没有完全理解其过程,只能通使用重新生成证书等资料的方式

2)可能出现通道文件或者chancode相关文件没有找到,这个可以通过去对应路径寻找文件是否存在,要特别注意文件名字,注意上述代码中channel_name和chancode_name分别是通道名和链码实例名,因为过程中产生的文件都与这两个名字相关,产生文件的路径为,不同peer节点容器中的/var/hyperledger/production目录下

3)如果出现证书文件没有找到,重新生成并检查

4)可能出现连接错误,这个可以先检查/etc/hosts、docker-compose-cli.yaml和base/peer-base.yaml中的修改有没有出错,特别是hosts文件的挂载,然后再容器中用ping命令检查是否可以连接到,另外,base/docker-compose-base.yaml文件中的端口映射查看下有没有出现端口重复,经过单机测试后没有修改是不会有错的,但是如果经过修改了,一定要保证端口不重复映射,当然,如果一个节点一个VM的话那就没问题了(当然,还有防火墙的问题,要保证对应的端口开启了,或者直接关闭防火墙)

你可能感兴趣的:(区块链)