zoukankan      html  css  js  c++  java
  • Hyperledger Fabric 1.4 快速环境搭建

    自己的硕士研究方向和区块链有关,工程上一直以IBM的Hyperledger Fabric为基础进行开发,对该项目关注也有两年了。目前迎来了Hyperledger Fabric v1.4,这也是Fabric的第一个长期支持版本,因此也比较有代表性,故在此和大家分享一下自己的环境搭建过程。

    附上v1.4的官方文档:https://hyperledger-fabric.readthedocs.io/en/release-1.4/

    环境说明:

      本人测试环境为腾讯云学生机(1Core/RAM 2G/ROM 50G),CentOS 7.5 64位。

    Golang 安装配置(非必须)

    下载安装包

    mkdir download
    cd download
    # 从国内站点下载合适的安装包
    wget https://studygolang.com/dl/golang/go1.12.4.linux-amd64.tar.gz 

    解压

    tar -C /usr/local/ -xzvf go1.12.4.linux-amd64.tar.gz  #解压到/usr/local/go目录下

    配置

    vim /etc/profile  # 配置系统环境变量
    
    # 在最下方插入
    # Golang 环境变量
    export GOROOT=/usr/local/go
    export GOPATH=/root/go
    export GOBIN=$GOPATH/bin
    export PATH=$PATH:$GOROOT/bin
    export PATH=$PATH:$GOPATH/bin
    
    #使配置的环境变量生效
    source /etc/profile 
    #检查是否配置正确
    go version

    说明:Go的环境并非运行的必须条件,但后期调试智能合约可能会用到,而且官网安装说明也提到了需要安装Go。

    Node.js 安装配置(非必须)

    通过nvm安装Node.js和npm,该步骤也不是运行的必须条件,但后期如果需要node-sdk来开发应用程序的话就需要node环境。(npm源切换可参考npm 淘宝源切换教程)

    安装nvm(官方文档:https://github.com/nvm-sh/nvm)

    # 安装后重启该会话或重新开一个会话即可生效
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash

    通过nvm安装Node.js和npm

    # 查看当前支持的版本,fabricv1.4要求只支持8.x
    nvm ls-remote
    # 安装当前8.x LTS的最新版本(会同时安装npm)
    nvm install 8.16.0
    # 检查node.js安装版本
    node -v
    # 检查npm的安装版本
    npm -v

    Docker 安装

    Docker安装社区版的就可以,参考官方文档:https://docs.docker.com/install/linux/docker-ce/centos/

    参考官方文档的第一种通过仓库安装的方式(傻瓜操作的话第三种直接脚本安装更简单)。

    p.s. 由于docker-hub镜像仓库在国外,可能会被墙或者很慢,建议大家参考daocloud加速器配置一下仓库,或者用云服务器的可以参考各家的docker仓库源(阿里Docker镜像库、腾讯Docker镜像库等)。

    卸载旧版本

    sudo yum remove docker 
                      docker-client 
                      docker-client-latest 
                      docker-common 
                      docker-latest 
                      docker-latest-logrotate 
                      docker-logrotate 
                      docker-engine

    安装docker-ce的必需条件

    sudo yum install -y yum-utils 
      device-mapper-persistent-data 
      lvm2

    设置稳定版的仓库

    sudo yum-config-manager 
        --add-repo 
        https://download.docker.com/linux/centos/docker-ce.repo

    安装docker-ce

    yum install docker-ce docker-ce-cli containerd.io

    启动docker

    sudo systemctl start docker

    测试docker是否安装成功

    sudo docker run hello-world

    Docker Compose 安装

    Fabric中节点容器编排使用的使docker-compose,故需要安装docker-compose。官方文档:https://docs.docker.com/compose/install/

    下载docker-compose

    sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

    为docker-compose配置执行权限

    sudo chmod +x /usr/local/bin/docker-compose

    检查是否安装成功

    docker-compose -v

    源码获取

    通过go get 的方式获取源码,配合git切换分支

    获取fabric源码

    # 获取fabric源码
    go get -u github.com/hyperledger/fabric
    # 进入目录 切换分支
    cd go/src/github.com/hyperledger/fabric
    git checkout v1.4.1

    获取fabric-sample源码

    go get github.com/hyperledger/fabric-samples
    # 进入目录,切换分支
    cd go/src/github.com/hyperledger/fabric-samples/
    git checkout v1.4.1

    获取镜像和二进制文件

    我们通过fabric-sample测试

    通过脚本获取docker镜像和可执行文件(建议事先配置好docker仓库)

    cd go/src/github.com/hyperledger/fabric-samples/scripts/
    #此处可能因为网络问题执行时间比较久
    bash bootstrap.sh

    运行测试

    通过fabric-sample中first-network示例测试,执行了一个A和B转账,中间多次查询余额的一个过程。

    docker运行需要权限,最好用root身份运行。

    找到first-network示例

    cd go/src/github.com/hyperledger/fabric-samples/first-network

    生成密钥文件

    [root@VM_0_39_centos first-network]# bash byfn.sh generate
    Generating certs and genesis block for channel 'mychannel' with CLI timeout of '10' seconds and CLI delay of '3' seconds
    Continue? [Y/n] y
    proceeding ...
    /root/go/src/github.com/hyperledger/fabric-samples/bin/cryptogen

    ##########################################################
    ##### Generate certificates using cryptogen tool #########
    ##########################################################
    + cryptogen generate --config=./crypto-config.yaml
    org1.example.com
    org2.example.com
    + res=0
    + set +x

    /root/go/src/github.com/hyperledger/fabric-samples/bin/configtxgen
    ##########################################################
    #########  Generating Orderer Genesis block ##############
    ##########################################################
    CONSENSUS_TYPE=solo
    + '[' solo == solo ']'
    + configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
    2019-05-03 21:22:43.122 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration
    2019-05-03 21:22:43.232 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 002 orderer type: solo
    2019-05-03 21:22:43.232 CST [common.tools.configtxgen.localconfig] Load -> INFO 003 Loaded configuration: /root/go/src/github.com/hyperledger/fabric-samples/first-network/configtx.yaml
    2019-05-03 21:22:43.338 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 004 orderer type: solo
    2019-05-03 21:22:43.338 CST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 005 Loaded configuration: /root/go/src/github.com/hyperledger/fabric-samples/first-network/configtx.yaml
    2019-05-03 21:22:43.347 CST [common.tools.configtxgen] doOutputBlock -> INFO 006 Generating genesis block
    2019-05-03 21:22:43.347 CST [common.tools.configtxgen] doOutputBlock -> INFO 007 Writing genesis block
    + res=0
    + set +x

    #################################################################
    ### Generating channel configuration transaction 'channel.tx' ###
    #################################################################
    + configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
    2019-05-03 21:22:43.395 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration
    2019-05-03 21:22:43.515 CST [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /root/go/src/github.com/hyperledger/fabric-samples/first-network/configtx.yaml
    2019-05-03 21:22:43.622 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 003 orderer type: solo
    2019-05-03 21:22:43.622 CST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 004 Loaded configuration: /root/go/src/github.com/hyperledger/fabric-samples/first-network/configtx.yaml
    2019-05-03 21:22:43.622 CST [common.tools.configtxgen] doOutputChannelCreateTx -> INFO 005 Generating new channel configtx
    2019-05-03 21:22:43.657 CST [common.tools.configtxgen] doOutputChannelCreateTx -> INFO 006 Writing new channel tx
    + res=0
    + set +x

    #################################################################
    #######    Generating anchor peer update for Org1MSP   ##########
    #################################################################
    + configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
    2019-05-03 21:22:43.714 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration
    2019-05-03 21:22:43.795 CST [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /root/go/src/github.com/hyperledger/fabric-samples/first-network/configtx.yaml
    2019-05-03 21:22:43.876 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 003 orderer type: solo
    2019-05-03 21:22:43.876 CST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 004 Loaded configuration: /root/go/src/github.com/hyperledger/fabric-samples/first-network/configtx.yaml
    2019-05-03 21:22:43.876 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 005 Generating anchor peer update
    2019-05-03 21:22:43.877 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 006 Writing anchor peer update
    + res=0
    + set +x

    #################################################################
    #######    Generating anchor peer update for Org2MSP   ##########
    #################################################################
    + configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
    2019-05-03 21:22:43.913 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration
    2019-05-03 21:22:43.995 CST [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /root/go/src/github.com/hyperledger/fabric-samples/first-network/configtx.yaml
    2019-05-03 21:22:44.073 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 003 orderer type: solo
    2019-05-03 21:22:44.073 CST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 004 Loaded configuration: /root/go/src/github.com/hyperledger/fabric-samples/first-network/configtx.yaml
    2019-05-03 21:22:44.073 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 005 Generating anchor peer update
    2019-05-03 21:22:44.074 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 006 Writing anchor peer update
    + res=0
    + set +x

    启动示例

    [root@VM_0_39_centos first-network]# bash byfn.sh up
    Starting for channel 'mychannel' with CLI timeout of '10' seconds and CLI delay of '3' seconds
    Continue? [Y/n] y
    proceeding ...
    LOCAL_VERSION=1.4.1
    DOCKER_IMAGE_VERSION=1.4.1
    Creating network "net_byfn" with the default driver
    Creating volume "net_orderer.example.com" with default driver
    Creating volume "net_peer0.org1.example.com" with default driver
    Creating volume "net_peer1.org1.example.com" with default driver
    Creating volume "net_peer0.org2.example.com" with default driver
    Creating volume "net_peer1.org2.example.com" with default driver
    Creating orderer.example.com    ... done
    Creating peer1.org2.example.com ... done
    Creating peer1.org1.example.com ... done
    Creating peer0.org2.example.com ... done
    Creating peer0.org1.example.com ... done
    Creating cli                    ... done
    CONTAINER ID        IMAGE                               COMMAND             CREATED             STATUS                  PORTS                      NAMES
    2cf554ced6b0        hyperledger/fabric-tools:latest     "/bin/bash"         1 second ago        Up Less than a second                              cli
    fec18ca70d8d        hyperledger/fabric-peer:latest      "peer node start"   4 seconds ago       Up 1 second             0.0.0.0:7051->7051/tcp     peer0.org1.example.com
    95427a7d76ce        hyperledger/fabric-peer:latest      "peer node start"   4 seconds ago       Up 1 second             0.0.0.0:10051->10051/tcp   peer1.org2.example.com
    8c7084b42ea7        hyperledger/fabric-orderer:latest   "orderer"           4 seconds ago       Up 1 second             0.0.0.0:7050->7050/tcp     orderer.example.com
    3456e8793e46        hyperledger/fabric-peer:latest      "peer node start"   4 seconds ago       Up 1 second             0.0.0.0:8051->8051/tcp     peer1.org1.example.com
    aa167f7fcc27        hyperledger/fabric-peer:latest      "peer node start"   4 seconds ago       Up 1 second             0.0.0.0:9051->9051/tcp     peer0.org2.example.com
    95271becf126        hello-world                         "/hello"            3 days ago          Exited (0) 3 days ago                              pensive_curie
    
     ____    _____      _      ____    _____ 
    / ___|  |_   _|    /     |  _   |_   _|
    \___     | |     / _    | |_) |   | |  
     ___) |   | |    / ___   |  _ <    | |  
    |____/    |_|   /_/   \_ |_| \_   |_|  
    
    Build your first network (BYFN) end-to-end test
    
    Channel name : mychannel
    Creating channel...
    + peer channel create -o orderer.example.com:7050 -c mychannel -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
    # 此处省略日志输出
    Installing chaincode on peer1.org2...
    + peer chaincode install -n mycc -v 1.0 -l golang -p github.com/chaincode/chaincode_example02/go/
    + res=0
    + set +x
    2019-05-03 13:25:47.540 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
    2019-05-03 13:25:47.540 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
    2019-05-03 13:25:47.751 UTC [chaincodeCmd] install -> INFO 003 Installed remotely response:<status:200 payload:"OK" > 
    ===================== Chaincode is installed on peer1.org2 ===================== 
    
    Querying chaincode on peer1.org2...
    ===================== Querying on peer1.org2 on channel 'mychannel'... ===================== 
    Attempting to Query peer1.org2 ...3 secs
    + peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
    + res=0
    + set +x
    
    90
    ===================== Query successful on peer1.org2 on channel 'mychannel' ===================== 
    
    ========= All GOOD, BYFN execution completed =========== 
    
    
     _____   _   _   ____   
    | ____| |  | | |  _   
    |  _|   |  | | | | | | 
    | |___  | |  | | |_| | 
    |_____| |_| \_| |____/  

    清除示例

    执行删除密钥文件,停止并删除容器等操作

    [root@VM_0_39_centos first-network]# bash byfn.sh down
    Stopping for channel 'mychannel' with CLI timeout of '10' seconds and CLI delay of '3' seconds
    Continue? [Y/n] y
    proceeding ...
    Stopping cli                    ... done
    Stopping peer0.org1.example.com ... done
    Stopping peer1.org2.example.com ... done
    Stopping orderer.example.com    ... done
    Stopping peer1.org1.example.com ... done
    Stopping peer0.org2.example.com ... done
    Removing cli                    ... done
    Removing peer0.org1.example.com ... done
    Removing peer1.org2.example.com ... done
    Removing orderer.example.com    ... done
    Removing peer1.org1.example.com ... done
    Removing peer0.org2.example.com ... done
    Removing network net_byfn
    Removing volume net_orderer.example.com
    Removing volume net_peer0.org1.example.com
    Removing volume net_peer1.org1.example.com
    Removing volume net_peer0.org2.example.com
    Removing volume net_peer1.org2.example.com
    Removing volume net_orderer2.example.com
    WARNING: Volume net_orderer2.example.com not found.
    Removing volume net_orderer3.example.com
    WARNING: Volume net_orderer3.example.com not found.
    Removing volume net_orderer4.example.com
    WARNING: Volume net_orderer4.example.com not found.
    Removing volume net_orderer5.example.com
    WARNING: Volume net_orderer5.example.com not found.
    Removing volume net_peer0.org3.example.com
    WARNING: Volume net_peer0.org3.example.com not found.
    Removing volume net_peer1.org3.example.com
    WARNING: Volume net_peer1.org3.example.com not found.
    d58e2eba8e9d
    aa7c6c5dd7f7
    15ef69f6b748
    Untagged: dev-peer1.org2.example.com-mycc-1.0-26c2ef32838554aac4f7ad6f100aca865e87959c9a126e86d764c8d01f8346ab:latest
    Deleted: sha256:044ed90bbd20fbc015f1c75f578d17d327b53c599bfa603cf59f8f2b6a3a2749
    Deleted: sha256:4c90c84d87522dde761b147e98d803d61e8dd113dce2d612bac7683b1e95a0f0
    Deleted: sha256:5916889234775a9d49d5e5f25c5f3e226076e453c7188e3121271c98709c89bc
    Deleted: sha256:7729eea67cc67a9d310f5b53bcb40e83b8496cd954d08230efabaa229cc30c41
    Untagged: dev-peer0.org1.example.com-mycc-1.0-384f11f484b9302df90b453200cfb25174305fce8f53f4e94d45ee3b6cab0ce9:latest
    Deleted: sha256:f214e2732061d2e21dec13fa499296da861eb7da6a29631ee76c139218083197
    Deleted: sha256:a4f9f0680f5b42484c8ae4675aec4d3aaf1c591c27bd375813f71ccbb2afca92
    Deleted: sha256:d786c76106b411dd66b2d57904a215ca1dfce30ae2adca1127dc95b588655f15
    Deleted: sha256:ba3660f49899db646d6b2a2703c4b73cf7a647b1d3a170fb8909a66fccc48c1d
    Untagged: dev-peer0.org2.example.com-mycc-1.0-15b571b3ce849066b7ec74497da3b27e54e0df1345daff3951b94245ce09c42b:latest
    Deleted: sha256:870943518d7142d03509e589e4ea57837c4b092d60dd3097d9f8d113078498a0
    Deleted: sha256:5dc11c2c52f40e2883a450528fdd008b4a372aaebbd9c2aec548eb3b8a0b610a
    Deleted: sha256:528ba6c50b298c20b9a408fda4284372d0d0c031bbc595b8a309d3513497c355
    Deleted: sha256:e85509bd000d5685db47a5031d4e929b08cebdff050f5dd35c903dbd1eabc0a4
  • 相关阅读:
    zabbix agent安装(三)
    获取hudson持续构建编译结果的一种方法
    一些C/C++中的函数
    设置页眉的章节及标题方法
    编译64位geos库的经验总结
    无法定位程序输入点到_ftol2于动态链接库msvcrt.dll的错误的解决
    Java学习笔记(二)
    初学网络协议
    HTTPS与SSL(二)
    HTTPS与SSL(一)
  • 原文地址:https://www.cnblogs.com/xiaoxt/p/10806720.html
Copyright © 2011-2022 走看看