Fabric 票据项目(一)搭建环境

一、生成组织结构、通道和锚节点配置文件

步骤与请参考手动启动一个网络

二、下载 安装 Fabric SDK Go

<font color=red>在进行以下操作前,请确保终端可以翻墙 !</font>

安装Hyperledger Fabric SDK Go,可以很容易的与Fabric的组件进行通信。 不需要安装Fabric或Fabric CA框架,因为SDK会自动在本地处理。

安装软件包libltdl-dev

$ sudo apt update
$ sudo apt install libltdl-dev 

将当前用户添加到Docker组

否则在执行make命令时会造成错误: ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?

$ sudo usermod -aG docker kevin

添加成功后必须注销/退出并重新登录(退出终端重新连接即可)

执行以下命令请确保网络通畅及稳定

$ go get -u --tags nopkcs11 github.com/hyperledger/fabric/core/chaincode/shim

下载Fabric SDK Go,因为Fabric SDK Go一直在更新,有些方法可能会被修改,为避免错误,不要从github上直接下载

将fabric-sdk-go目录上传并解压至$GOPATH/src/github.com/hyperledger目录下

$ unzip -d $GOPATH/src/github.com/hyperledger fabric-sdk-go.zip

将如下环境变量设置到用户的环境文件中(.bashrc)中

export PATH=$PATH:$GOPATH/bin

确保有所需的所有依赖关系:

$ cd $GOPATH/src/github.com/hyperledger/fabric-sdk-go 
$ make depend-install 

修改配置文件

$ vim Makefile
fabric-sdk-go/Makefile文件中的 
	1.0   修改为 1.1
	1.0.5 修改为 1.1.0
	0.4.2 修改为 0.4.6

$ vim test/fixtures/dockerenv/.evn
fabric-sdk-go/test/fixtures/dockerenv/.env 文件中
	修改Docker镜像文件的版本为 1.1.0
	0.4.2 修改为 0.4.6

执行make

$ cd $GOPATH/src/github.com/hyperledger/fabric-sdk-go 
$ make

如果下载失败, 则需多尝试几次

该make过程需要一段时间(取决于网络连接情况)。 在这个过程中,虚拟网络已经建成并且已经进行了一些测试以检查您的系统是否准备就绪。 现在我们可以使用我们的第一个应用程序

注意 :有很多的输出内容,但将它放在这里并不重要。 唯一需要关心的是fabsdkgo_integration-tests_1 exited with code 0。 如果你有fabsdkgo_integration-tests_1 exited with code 1那么表示有问题。 在输出的消息中向上滚动以查找错误。

三、创建第一个项目

1、创建go项目,项目名bill

2、项目中新建目录fixtures

fabric-samples/first-network/channel-artifacts(里面包含创世区块、通道、锚节点配置文件)和fabric-samples/first-network/crypto-config(包含组织结构和证书)两个目录拷贝到fixtures目录下

channel-artifacts 文件夹名称修改为 artifacts

$ mv channel-artifacts/ artifacts

移除无用的文件

$ sudo rm -f artifacts/.gitkeep

fabric-samples/basic-network/docker-compose.yml 文件复制至当前的 fixtures 目录下,或者直接新建docker-compose.yml文件名随意, 进行编辑,该文件用于配置节点信息

$ sudo vim docker-compose.yml

  1. network下的basic 修改为 default

    version: '2'
       
    networks:
      default:
       
    services:
    
  2. 编辑 orderer 部分

     orderer.example.com:
        container_name: orderer.example.com
        image: hyperledger/fabric-orderer
        environment:
          - ORDERER_GENERAL_LOGLEVEL=debug
          - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
          - ORDERER_GENERAL_GENESISMETHOD=file
          - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
          - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
          - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
          - ORDERER_GENERAL_LISTENPORT=7050
          # enabled TLS
          - ORDERER_GENERAL_TLS_ENABLED=true
          - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
          - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
          - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt, /var/hyperledger/peerOrg1/tls/ca.crt, /var/hyperledger/peerOrg2/tls/ca.crt]
        working_dir: /opt/gopath/src/github.com/hyperledger/fabric
        command: orderer
        ports:
          - 7050:7050
        volumes:
          - ./artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
          - ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp
          - ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls:/var/hyperledger/orderer/tls
          - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/:/var/hyperledger/peerOrg1
          - ./crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/:/var/hyperledger/peerOrg2
        networks:
          default:
            aliases:
              - orderer.example.com
    
  3. 编辑 ca 部分

      ca.org1.example.com:
        image: hyperledger/fabric-ca
        environment:
          - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
          - FABRIC_CA_SERVER_CA_NAME=ca.org1.example.com
          - FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
          # path: crypto-config\peerOrganizations\org1.example.com\ca\..._sk
          - FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/私钥文件名
          - FABRIC_CA_SERVER_TLS_ENABLED=true
          - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
          - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/私钥文件名
        ports:
          - "7054:7054"
        command: sh -c 'fabric-ca-server start -b admin:adminpw -d'
        volumes:
          - ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
        container_name: ca.org1.example.com
        networks:
          default:
            aliases:
              - ca.org1.example.com
    

<font color=red> 注意: FABRIC_CA_SERVER_CA_KEYFILEFABRIC_CA_SERVER_TLS_KEYFILE对应的私钥要与自己生成的私钥一致,因为当前配置的Org1的CA证书,所以对应的私钥为 fixtures/crypto-config/peerOrganizations/org1.example.com/ca/5839e7c26a2440eac09853ff41e199c28ea2449eed4b2884480b0891c096f58d_sk,将私钥文件名改为5839e7c26a2440eac09853ff41e199c28ea2449eed4b2884480b0891c096f58d_sk即可 </font>

fabric bill(一)1

  1. 编辑Peer部分

    1. peer0.org1.example.com 内容如下

        peer0.org1.example.com:
          image: hyperledger/fabric-peer
          container_name: peer0.org1.example.com
          environment:
            - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
            - CORE_VM_DOCKER_ATTACHSTDOUT=true
            - CORE_LOGGING_LEVEL=DEBUG
            - CORE_PEER_NETWORKID=bill
            - CORE_PEER_PROFILE_ENABLED=true
            - CORE_PEER_TLS_ENABLED=true
            - CORE_PEER_TLS_CERT_FILE=/var/hyperledger/tls/server.crt
            - CORE_PEER_TLS_KEY_FILE=/var/hyperledger/tls/server.key
            - CORE_PEER_TLS_ROOTCERT_FILE=/var/hyperledger/tls/ca.crt
            - CORE_PEER_ID=peer0.org1.example.com
            - CORE_PEER_ADDRESSAUTODETECT=true
            - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
            - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
            - CORE_PEER_GOSSIP_USELEADERELECTION=true
            - CORE_PEER_GOSSIP_ORGLEADER=false
            - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
            - CORE_PEER_LOCALMSPID=Org1MSP
            - CORE_PEER_MSPCONFIGPATH=/var/hyperledger/msp
            - CORE_PEER_TLS_SERVERHOSTOVERRIDE=peer0.org1.example.com
          working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
          command: peer node start
          volumes:
            - /var/run/:/host/var/run/
            - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/var/hyperledger/msp
            - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/var/hyperledger/tls
          ports:
            - 7051:7051
            - 7053:7053
          depends_on:
            - orderer.example.com
          links:
            - orderer.example.com
          networks:
            default:
              aliases:
                - peer0.org1.example.com
      
    2. peer1.org1.example.com 内容如下

        peer1.org1.example.com:
          image: hyperledger/fabric-peer
          container_name: peer1.org1.example.com
          environment:
            - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
            - CORE_VM_DOCKER_ATTACHSTDOUT=true
            - CORE_LOGGING_LEVEL=DEBUG
            - CORE_PEER_NETWORKID=bill
            - CORE_PEER_PROFILE_ENABLED=true
            - CORE_PEER_TLS_ENABLED=true
            - CORE_PEER_TLS_CERT_FILE=/var/hyperledger/tls/server.crt
            - CORE_PEER_TLS_KEY_FILE=/var/hyperledger/tls/server.key
            - CORE_PEER_TLS_ROOTCERT_FILE=/var/hyperledger/tls/ca.crt
            - CORE_PEER_ID=peer1.org1.example.com
            - CORE_PEER_ADDRESSAUTODETECT=true
            - CORE_PEER_ADDRESS=peer1.org1.example.com:7051
            - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:7051
            - CORE_PEER_GOSSIP_USELEADERELECTION=true
            - CORE_PEER_GOSSIP_ORGLEADER=false
            - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
            - CORE_PEER_LOCALMSPID=Org1MSP
            - CORE_PEER_MSPCONFIGPATH=/var/hyperledger/msp
            - CORE_PEER_TLS_SERVERHOSTOVERRIDE=peer1.org1.example.com
          working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
          command: peer node start
          volumes:
            - /var/run/:/host/var/run/
            - ./crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp:/var/hyperledger/msp
            - ./crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls:/var/hyperledger/tls
          ports:
            - 8051:7051
            - 8053:7053
          depends_on:
            - orderer.example.com
          links:
            - orderer.example.com
          networks:
            default:
              aliases:
                - peer1.org1.example.com
      
  2. 其余可根据实际情况进行添加

fixtures 文件的所属修改为当前用户及组

$ sudo chown -R zhqmac:zhqmac ../fixtures

<font color=red>编辑docker-compose.yml文件时注意格式,不要用tab键缩进,为了方便可以到这里下载,替换CA证书即可</font>

3、测试

环境已经搭建完了,接下来测试一下

为了检查网络是否正常工作,使用docker-compose同时启动或停止所有容器。 进入fixtures文件夹,运行:

$ cd $GOPATH/src/github.com/kongyixueyuan.com/bill/fixtures
$ docker-compose up

控制台会输出很多不同颜色的日志(红色不等于错误)。

打开一个新终端并运行:

 $ docker ps 

fabric bill(一)2 将看到:两个peer,orderer和一个CA容器。 代表已成功创建了一个新的网络,可以随SDK一起使用。 要停止网络,请返回到上一个终端,按Ctrl+C并等待所有容器都停止。

提示 :当网络停止时,所有使用的容器都可以访问。 例如,这对检查日志非常有用。 可以用docker ps -a来看它们。 为了清理这些容器,需要使用docker rm $(docker ps -aq)将其删除,或者如果使用了docker-compose文件,请转至此文件的位置并运行docker-compose down

提示 :可以在后台运行docker-compose命令以保持提示。 为此,请使用参数-d ,如下所示: docker-compose up -d 。 要停止容器,请在docker-compose.yaml所在的文件夹中运行命令: docker-compose stop (或docker-compose down进行清理停止所有容器)。

最后执行命令

$ cd $GOPATH/src/github.com/kongyixueyuan.com/bill/fixtures
$ docker-compose down

fabric bill(一)3

执行 docker-compose down可能会有错误,如:ERROR:network fixtures_default has active endpoints

解决方案:

  • 第一种:使用 docker network disconnect -f {network} {endpoint-name},其中的 {endpoint-name} 可以使用命令 docker network inspect {network} 获得。然后再做你想做的操作。

  • 第二种:重启 Docker service:sudo service docker restart。然后再做你想做的操作。

源码下载 https://github.com/sweetMegan/bill

感谢韩晓东(老韩)指导

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦